| import { createWriteStream, createReadStream } from 'node:fs'; |
| import { readFile, stat, readdir, readlink } from 'node:fs/promises'; |
| import * as path from 'node:path'; |
| import { Readable as Readable$2 } from 'node:stream'; |
| import { pathToFileURL } from 'node:url'; |
| import { createGzip } from 'node:zlib'; |
| import require$$0$1 from 'stream'; |
| import require$$0 from 'buffer'; |
| import require$$2 from 'events'; |
| import require$$13 from 'string_decoder'; |
| import require$$0$2 from 'fs'; |
| |
| var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; |
| |
| function getAugmentedNamespace(n) { |
| var f = n.default; |
| if (typeof f == "function") { |
| var a = function () { |
| return f.apply(this, arguments); |
| }; |
| a.prototype = f.prototype; |
| } else a = {}; |
| Object.defineProperty(a, '__esModule', {value: true}); |
| Object.keys(n).forEach(function (k) { |
| var d = Object.getOwnPropertyDescriptor(n, k); |
| Object.defineProperty(a, k, d.get ? d : { |
| enumerable: true, |
| get: function () { |
| return n[k]; |
| } |
| }); |
| }); |
| return a; |
| } |
| |
| var bl = {exports: {}}; |
| |
| var ours = {exports: {}}; |
| |
| var stream = {exports: {}}; |
| |
| var primordials; |
| var hasRequiredPrimordials; |
| |
| function requirePrimordials () { |
| if (hasRequiredPrimordials) return primordials; |
| hasRequiredPrimordials = 1; |
| |
| /* |
| This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at |
| |
| https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js |
| |
| Don't try to replace with the original file and keep it up to date with the upstream file. |
| */ |
| primordials = { |
| ArrayIsArray(self) { |
| return Array.isArray(self) |
| }, |
| ArrayPrototypeIncludes(self, el) { |
| return self.includes(el) |
| }, |
| ArrayPrototypeIndexOf(self, el) { |
| return self.indexOf(el) |
| }, |
| ArrayPrototypeJoin(self, sep) { |
| return self.join(sep) |
| }, |
| ArrayPrototypeMap(self, fn) { |
| return self.map(fn) |
| }, |
| ArrayPrototypePop(self, el) { |
| return self.pop(el) |
| }, |
| ArrayPrototypePush(self, el) { |
| return self.push(el) |
| }, |
| ArrayPrototypeSlice(self, start, end) { |
| return self.slice(start, end) |
| }, |
| Error, |
| FunctionPrototypeCall(fn, thisArgs, ...args) { |
| return fn.call(thisArgs, ...args) |
| }, |
| FunctionPrototypeSymbolHasInstance(self, instance) { |
| return Function.prototype[Symbol.hasInstance].call(self, instance) |
| }, |
| MathFloor: Math.floor, |
| Number, |
| NumberIsInteger: Number.isInteger, |
| NumberIsNaN: Number.isNaN, |
| NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER, |
| NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER, |
| NumberParseInt: Number.parseInt, |
| ObjectDefineProperties(self, props) { |
| return Object.defineProperties(self, props) |
| }, |
| ObjectDefineProperty(self, name, prop) { |
| return Object.defineProperty(self, name, prop) |
| }, |
| ObjectGetOwnPropertyDescriptor(self, name) { |
| return Object.getOwnPropertyDescriptor(self, name) |
| }, |
| ObjectKeys(obj) { |
| return Object.keys(obj) |
| }, |
| ObjectSetPrototypeOf(target, proto) { |
| return Object.setPrototypeOf(target, proto) |
| }, |
| Promise, |
| PromisePrototypeCatch(self, fn) { |
| return self.catch(fn) |
| }, |
| PromisePrototypeThen(self, thenFn, catchFn) { |
| return self.then(thenFn, catchFn) |
| }, |
| PromiseReject(err) { |
| return Promise.reject(err) |
| }, |
| ReflectApply: Reflect.apply, |
| RegExpPrototypeTest(self, value) { |
| return self.test(value) |
| }, |
| SafeSet: Set, |
| String, |
| StringPrototypeSlice(self, start, end) { |
| return self.slice(start, end) |
| }, |
| StringPrototypeToLowerCase(self) { |
| return self.toLowerCase() |
| }, |
| StringPrototypeToUpperCase(self) { |
| return self.toUpperCase() |
| }, |
| StringPrototypeTrim(self) { |
| return self.trim() |
| }, |
| Symbol, |
| SymbolAsyncIterator: Symbol.asyncIterator, |
| SymbolHasInstance: Symbol.hasInstance, |
| SymbolIterator: Symbol.iterator, |
| TypedArrayPrototypeSet(self, buf, len) { |
| return self.set(buf, len) |
| }, |
| Uint8Array |
| }; |
| return primordials; |
| } |
| |
| var util = {exports: {}}; |
| |
| var hasRequiredUtil; |
| |
| function requireUtil () { |
| if (hasRequiredUtil) return util.exports; |
| hasRequiredUtil = 1; |
| (function (module) { |
| |
| const bufferModule = require$$0; |
| const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor; |
| const Blob = globalThis.Blob || bufferModule.Blob; |
| /* eslint-disable indent */ |
| const isBlob = |
| typeof Blob !== 'undefined' |
| ? function isBlob(b) { |
| // eslint-disable-next-line indent |
| return b instanceof Blob |
| } |
| : function isBlob(b) { |
| return false |
| }; |
| /* eslint-enable indent */ |
| |
| // This is a simplified version of AggregateError |
| class AggregateError extends Error { |
| constructor(errors) { |
| if (!Array.isArray(errors)) { |
| throw new TypeError(`Expected input to be an Array, got ${typeof errors}`) |
| } |
| let message = ''; |
| for (let i = 0; i < errors.length; i++) { |
| message += ` ${errors[i].stack}\n`; |
| } |
| super(message); |
| this.name = 'AggregateError'; |
| this.errors = errors; |
| } |
| } |
| module.exports = { |
| AggregateError, |
| kEmptyObject: Object.freeze({}), |
| once(callback) { |
| let called = false; |
| return function (...args) { |
| if (called) { |
| return |
| } |
| called = true; |
| callback.apply(this, args); |
| } |
| }, |
| createDeferredPromise: function () { |
| let resolve; |
| let reject; |
| |
| // eslint-disable-next-line promise/param-names |
| const promise = new Promise((res, rej) => { |
| resolve = res; |
| reject = rej; |
| }); |
| return { |
| promise, |
| resolve, |
| reject |
| } |
| }, |
| promisify(fn) { |
| return new Promise((resolve, reject) => { |
| fn((err, ...args) => { |
| if (err) { |
| return reject(err) |
| } |
| return resolve(...args) |
| }); |
| }) |
| }, |
| debuglog() { |
| return function () {} |
| }, |
| format(format, ...args) { |
| // Simplified version of https://nodejs.org/api/util.html#utilformatformat-args |
| return format.replace(/%([sdifj])/g, function (...[_unused, type]) { |
| const replacement = args.shift(); |
| if (type === 'f') { |
| return replacement.toFixed(6) |
| } else if (type === 'j') { |
| return JSON.stringify(replacement) |
| } else if (type === 's' && typeof replacement === 'object') { |
| const ctor = replacement.constructor !== Object ? replacement.constructor.name : ''; |
| return `${ctor} {}`.trim() |
| } else { |
| return replacement.toString() |
| } |
| }) |
| }, |
| inspect(value) { |
| // Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options |
| switch (typeof value) { |
| case 'string': |
| if (value.includes("'")) { |
| if (!value.includes('"')) { |
| return `"${value}"` |
| } else if (!value.includes('`') && !value.includes('${')) { |
| return `\`${value}\`` |
| } |
| } |
| return `'${value}'` |
| case 'number': |
| if (isNaN(value)) { |
| return 'NaN' |
| } else if (Object.is(value, -0)) { |
| return String(value) |
| } |
| return value |
| case 'bigint': |
| return `${String(value)}n` |
| case 'boolean': |
| case 'undefined': |
| return String(value) |
| case 'object': |
| return '{}' |
| } |
| }, |
| types: { |
| isAsyncFunction(fn) { |
| return fn instanceof AsyncFunction |
| }, |
| isArrayBufferView(arr) { |
| return ArrayBuffer.isView(arr) |
| } |
| }, |
| isBlob |
| }; |
| module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom'); |
| } (util)); |
| return util.exports; |
| } |
| |
| var operators = {}; |
| |
| /** |
| * @author Toru Nagashima <https://github.com/mysticatea> |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| /** |
| * @typedef {object} PrivateData |
| * @property {EventTarget} eventTarget The event target. |
| * @property {{type:string}} event The original event object. |
| * @property {number} eventPhase The current event phase. |
| * @property {EventTarget|null} currentTarget The current event target. |
| * @property {boolean} canceled The flag to prevent default. |
| * @property {boolean} stopped The flag to stop propagation. |
| * @property {boolean} immediateStopped The flag to stop propagation immediately. |
| * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null. |
| * @property {number} timeStamp The unix time. |
| * @private |
| */ |
| |
| /** |
| * Private data for event wrappers. |
| * @type {WeakMap<Event, PrivateData>} |
| * @private |
| */ |
| const privateData = new WeakMap(); |
| |
| /** |
| * Cache for wrapper classes. |
| * @type {WeakMap<Object, Function>} |
| * @private |
| */ |
| const wrappers = new WeakMap(); |
| |
| /** |
| * Get private data. |
| * @param {Event} event The event object to get private data. |
| * @returns {PrivateData} The private data of the event. |
| * @private |
| */ |
| function pd(event) { |
| const retv = privateData.get(event); |
| console.assert( |
| retv != null, |
| "'this' is expected an Event object, but got", |
| event |
| ); |
| return retv |
| } |
| |
| /** |
| * https://dom.spec.whatwg.org/#set-the-canceled-flag |
| * @param data {PrivateData} private data. |
| */ |
| function setCancelFlag(data) { |
| if (data.passiveListener != null) { |
| if ( |
| typeof console !== "undefined" && |
| typeof console.error === "function" |
| ) { |
| console.error( |
| "Unable to preventDefault inside passive event listener invocation.", |
| data.passiveListener |
| ); |
| } |
| return |
| } |
| if (!data.event.cancelable) { |
| return |
| } |
| |
| data.canceled = true; |
| if (typeof data.event.preventDefault === "function") { |
| data.event.preventDefault(); |
| } |
| } |
| |
| /** |
| * @see https://dom.spec.whatwg.org/#interface-event |
| * @private |
| */ |
| /** |
| * The event wrapper. |
| * @constructor |
| * @param {EventTarget} eventTarget The event target of this dispatching. |
| * @param {Event|{type:string}} event The original event to wrap. |
| */ |
| function Event(eventTarget, event) { |
| privateData.set(this, { |
| eventTarget, |
| event, |
| eventPhase: 2, |
| currentTarget: eventTarget, |
| canceled: false, |
| stopped: false, |
| immediateStopped: false, |
| passiveListener: null, |
| timeStamp: event.timeStamp || Date.now(), |
| }); |
| |
| // https://heycam.github.io/webidl/#Unforgeable |
| Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); |
| |
| // Define accessors |
| const keys = Object.keys(event); |
| for (let i = 0; i < keys.length; ++i) { |
| const key = keys[i]; |
| if (!(key in this)) { |
| Object.defineProperty(this, key, defineRedirectDescriptor(key)); |
| } |
| } |
| } |
| |
| // Should be enumerable, but class methods are not enumerable. |
| Event.prototype = { |
| /** |
| * The type of this event. |
| * @type {string} |
| */ |
| get type() { |
| return pd(this).event.type |
| }, |
| |
| /** |
| * The target of this event. |
| * @type {EventTarget} |
| */ |
| get target() { |
| return pd(this).eventTarget |
| }, |
| |
| /** |
| * The target of this event. |
| * @type {EventTarget} |
| */ |
| get currentTarget() { |
| return pd(this).currentTarget |
| }, |
| |
| /** |
| * @returns {EventTarget[]} The composed path of this event. |
| */ |
| composedPath() { |
| const currentTarget = pd(this).currentTarget; |
| if (currentTarget == null) { |
| return [] |
| } |
| return [currentTarget] |
| }, |
| |
| /** |
| * Constant of NONE. |
| * @type {number} |
| */ |
| get NONE() { |
| return 0 |
| }, |
| |
| /** |
| * Constant of CAPTURING_PHASE. |
| * @type {number} |
| */ |
| get CAPTURING_PHASE() { |
| return 1 |
| }, |
| |
| /** |
| * Constant of AT_TARGET. |
| * @type {number} |
| */ |
| get AT_TARGET() { |
| return 2 |
| }, |
| |
| /** |
| * Constant of BUBBLING_PHASE. |
| * @type {number} |
| */ |
| get BUBBLING_PHASE() { |
| return 3 |
| }, |
| |
| /** |
| * The target of this event. |
| * @type {number} |
| */ |
| get eventPhase() { |
| return pd(this).eventPhase |
| }, |
| |
| /** |
| * Stop event bubbling. |
| * @returns {void} |
| */ |
| stopPropagation() { |
| const data = pd(this); |
| |
| data.stopped = true; |
| if (typeof data.event.stopPropagation === "function") { |
| data.event.stopPropagation(); |
| } |
| }, |
| |
| /** |
| * Stop event bubbling. |
| * @returns {void} |
| */ |
| stopImmediatePropagation() { |
| const data = pd(this); |
| |
| data.stopped = true; |
| data.immediateStopped = true; |
| if (typeof data.event.stopImmediatePropagation === "function") { |
| data.event.stopImmediatePropagation(); |
| } |
| }, |
| |
| /** |
| * The flag to be bubbling. |
| * @type {boolean} |
| */ |
| get bubbles() { |
| return Boolean(pd(this).event.bubbles) |
| }, |
| |
| /** |
| * The flag to be cancelable. |
| * @type {boolean} |
| */ |
| get cancelable() { |
| return Boolean(pd(this).event.cancelable) |
| }, |
| |
| /** |
| * Cancel this event. |
| * @returns {void} |
| */ |
| preventDefault() { |
| setCancelFlag(pd(this)); |
| }, |
| |
| /** |
| * The flag to indicate cancellation state. |
| * @type {boolean} |
| */ |
| get defaultPrevented() { |
| return pd(this).canceled |
| }, |
| |
| /** |
| * The flag to be composed. |
| * @type {boolean} |
| */ |
| get composed() { |
| return Boolean(pd(this).event.composed) |
| }, |
| |
| /** |
| * The unix time of this event. |
| * @type {number} |
| */ |
| get timeStamp() { |
| return pd(this).timeStamp |
| }, |
| |
| /** |
| * The target of this event. |
| * @type {EventTarget} |
| * @deprecated |
| */ |
| get srcElement() { |
| return pd(this).eventTarget |
| }, |
| |
| /** |
| * The flag to stop event bubbling. |
| * @type {boolean} |
| * @deprecated |
| */ |
| get cancelBubble() { |
| return pd(this).stopped |
| }, |
| set cancelBubble(value) { |
| if (!value) { |
| return |
| } |
| const data = pd(this); |
| |
| data.stopped = true; |
| if (typeof data.event.cancelBubble === "boolean") { |
| data.event.cancelBubble = true; |
| } |
| }, |
| |
| /** |
| * The flag to indicate cancellation state. |
| * @type {boolean} |
| * @deprecated |
| */ |
| get returnValue() { |
| return !pd(this).canceled |
| }, |
| set returnValue(value) { |
| if (!value) { |
| setCancelFlag(pd(this)); |
| } |
| }, |
| |
| /** |
| * Initialize this event object. But do nothing under event dispatching. |
| * @param {string} type The event type. |
| * @param {boolean} [bubbles=false] The flag to be possible to bubble up. |
| * @param {boolean} [cancelable=false] The flag to be possible to cancel. |
| * @deprecated |
| */ |
| initEvent() { |
| // Do nothing. |
| }, |
| }; |
| |
| // `constructor` is not enumerable. |
| Object.defineProperty(Event.prototype, "constructor", { |
| value: Event, |
| configurable: true, |
| writable: true, |
| }); |
| |
| // Ensure `event instanceof window.Event` is `true`. |
| if (typeof window !== "undefined" && typeof window.Event !== "undefined") { |
| Object.setPrototypeOf(Event.prototype, window.Event.prototype); |
| |
| // Make association for wrappers. |
| wrappers.set(window.Event.prototype, Event); |
| } |
| |
| /** |
| * Get the property descriptor to redirect a given property. |
| * @param {string} key Property name to define property descriptor. |
| * @returns {PropertyDescriptor} The property descriptor to redirect the property. |
| * @private |
| */ |
| function defineRedirectDescriptor(key) { |
| return { |
| get() { |
| return pd(this).event[key] |
| }, |
| set(value) { |
| pd(this).event[key] = value; |
| }, |
| configurable: true, |
| enumerable: true, |
| } |
| } |
| |
| /** |
| * Get the property descriptor to call a given method property. |
| * @param {string} key Property name to define property descriptor. |
| * @returns {PropertyDescriptor} The property descriptor to call the method property. |
| * @private |
| */ |
| function defineCallDescriptor(key) { |
| return { |
| value() { |
| const event = pd(this).event; |
| return event[key].apply(event, arguments) |
| }, |
| configurable: true, |
| enumerable: true, |
| } |
| } |
| |
| /** |
| * Define new wrapper class. |
| * @param {Function} BaseEvent The base wrapper class. |
| * @param {Object} proto The prototype of the original event. |
| * @returns {Function} The defined wrapper class. |
| * @private |
| */ |
| function defineWrapper(BaseEvent, proto) { |
| const keys = Object.keys(proto); |
| if (keys.length === 0) { |
| return BaseEvent |
| } |
| |
| /** CustomEvent */ |
| function CustomEvent(eventTarget, event) { |
| BaseEvent.call(this, eventTarget, event); |
| } |
| |
| CustomEvent.prototype = Object.create(BaseEvent.prototype, { |
| constructor: { value: CustomEvent, configurable: true, writable: true }, |
| }); |
| |
| // Define accessors. |
| for (let i = 0; i < keys.length; ++i) { |
| const key = keys[i]; |
| if (!(key in BaseEvent.prototype)) { |
| const descriptor = Object.getOwnPropertyDescriptor(proto, key); |
| const isFunc = typeof descriptor.value === "function"; |
| Object.defineProperty( |
| CustomEvent.prototype, |
| key, |
| isFunc |
| ? defineCallDescriptor(key) |
| : defineRedirectDescriptor(key) |
| ); |
| } |
| } |
| |
| return CustomEvent |
| } |
| |
| /** |
| * Get the wrapper class of a given prototype. |
| * @param {Object} proto The prototype of the original event to get its wrapper. |
| * @returns {Function} The wrapper class. |
| * @private |
| */ |
| function getWrapper(proto) { |
| if (proto == null || proto === Object.prototype) { |
| return Event |
| } |
| |
| let wrapper = wrappers.get(proto); |
| if (wrapper == null) { |
| wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); |
| wrappers.set(proto, wrapper); |
| } |
| return wrapper |
| } |
| |
| /** |
| * Wrap a given event to management a dispatching. |
| * @param {EventTarget} eventTarget The event target of this dispatching. |
| * @param {Object} event The event to wrap. |
| * @returns {Event} The wrapper instance. |
| * @private |
| */ |
| function wrapEvent(eventTarget, event) { |
| const Wrapper = getWrapper(Object.getPrototypeOf(event)); |
| return new Wrapper(eventTarget, event) |
| } |
| |
| /** |
| * Get the immediateStopped flag of a given event. |
| * @param {Event} event The event to get. |
| * @returns {boolean} The flag to stop propagation immediately. |
| * @private |
| */ |
| function isStopped(event) { |
| return pd(event).immediateStopped |
| } |
| |
| /** |
| * Set the current event phase of a given event. |
| * @param {Event} event The event to set current target. |
| * @param {number} eventPhase New event phase. |
| * @returns {void} |
| * @private |
| */ |
| function setEventPhase(event, eventPhase) { |
| pd(event).eventPhase = eventPhase; |
| } |
| |
| /** |
| * Set the current target of a given event. |
| * @param {Event} event The event to set current target. |
| * @param {EventTarget|null} currentTarget New current target. |
| * @returns {void} |
| * @private |
| */ |
| function setCurrentTarget(event, currentTarget) { |
| pd(event).currentTarget = currentTarget; |
| } |
| |
| /** |
| * Set a passive listener of a given event. |
| * @param {Event} event The event to set current target. |
| * @param {Function|null} passiveListener New passive listener. |
| * @returns {void} |
| * @private |
| */ |
| function setPassiveListener(event, passiveListener) { |
| pd(event).passiveListener = passiveListener; |
| } |
| |
| /** |
| * @typedef {object} ListenerNode |
| * @property {Function} listener |
| * @property {1|2|3} listenerType |
| * @property {boolean} passive |
| * @property {boolean} once |
| * @property {ListenerNode|null} next |
| * @private |
| */ |
| |
| /** |
| * @type {WeakMap<object, Map<string, ListenerNode>>} |
| * @private |
| */ |
| const listenersMap = new WeakMap(); |
| |
| // Listener types |
| const CAPTURE = 1; |
| const BUBBLE = 2; |
| const ATTRIBUTE = 3; |
| |
| /** |
| * Check whether a given value is an object or not. |
| * @param {any} x The value to check. |
| * @returns {boolean} `true` if the value is an object. |
| */ |
| function isObject(x) { |
| return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax |
| } |
| |
| /** |
| * Get listeners. |
| * @param {EventTarget} eventTarget The event target to get. |
| * @returns {Map<string, ListenerNode>} The listeners. |
| * @private |
| */ |
| function getListeners(eventTarget) { |
| const listeners = listenersMap.get(eventTarget); |
| if (listeners == null) { |
| throw new TypeError( |
| "'this' is expected an EventTarget object, but got another value." |
| ) |
| } |
| return listeners |
| } |
| |
| /** |
| * Get the property descriptor for the event attribute of a given event. |
| * @param {string} eventName The event name to get property descriptor. |
| * @returns {PropertyDescriptor} The property descriptor. |
| * @private |
| */ |
| function defineEventAttributeDescriptor(eventName) { |
| return { |
| get() { |
| const listeners = getListeners(this); |
| let node = listeners.get(eventName); |
| while (node != null) { |
| if (node.listenerType === ATTRIBUTE) { |
| return node.listener |
| } |
| node = node.next; |
| } |
| return null |
| }, |
| |
| set(listener) { |
| if (typeof listener !== "function" && !isObject(listener)) { |
| listener = null; // eslint-disable-line no-param-reassign |
| } |
| const listeners = getListeners(this); |
| |
| // Traverse to the tail while removing old value. |
| let prev = null; |
| let node = listeners.get(eventName); |
| while (node != null) { |
| if (node.listenerType === ATTRIBUTE) { |
| // Remove old value. |
| if (prev !== null) { |
| prev.next = node.next; |
| } else if (node.next !== null) { |
| listeners.set(eventName, node.next); |
| } else { |
| listeners.delete(eventName); |
| } |
| } else { |
| prev = node; |
| } |
| |
| node = node.next; |
| } |
| |
| // Add new value. |
| if (listener !== null) { |
| const newNode = { |
| listener, |
| listenerType: ATTRIBUTE, |
| passive: false, |
| once: false, |
| next: null, |
| }; |
| if (prev === null) { |
| listeners.set(eventName, newNode); |
| } else { |
| prev.next = newNode; |
| } |
| } |
| }, |
| configurable: true, |
| enumerable: true, |
| } |
| } |
| |
| /** |
| * Define an event attribute (e.g. `eventTarget.onclick`). |
| * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite. |
| * @param {string} eventName The event name to define. |
| * @returns {void} |
| */ |
| function defineEventAttribute(eventTargetPrototype, eventName) { |
| Object.defineProperty( |
| eventTargetPrototype, |
| `on${eventName}`, |
| defineEventAttributeDescriptor(eventName) |
| ); |
| } |
| |
| /** |
| * Define a custom EventTarget with event attributes. |
| * @param {string[]} eventNames Event names for event attributes. |
| * @returns {EventTarget} The custom EventTarget. |
| * @private |
| */ |
| function defineCustomEventTarget(eventNames) { |
| /** CustomEventTarget */ |
| function CustomEventTarget() { |
| EventTarget.call(this); |
| } |
| |
| CustomEventTarget.prototype = Object.create(EventTarget.prototype, { |
| constructor: { |
| value: CustomEventTarget, |
| configurable: true, |
| writable: true, |
| }, |
| }); |
| |
| for (let i = 0; i < eventNames.length; ++i) { |
| defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); |
| } |
| |
| return CustomEventTarget |
| } |
| |
| /** |
| * EventTarget. |
| * |
| * - This is constructor if no arguments. |
| * - This is a function which returns a CustomEventTarget constructor if there are arguments. |
| * |
| * For example: |
| * |
| * class A extends EventTarget {} |
| * class B extends EventTarget("message") {} |
| * class C extends EventTarget("message", "error") {} |
| * class D extends EventTarget(["message", "error"]) {} |
| */ |
| function EventTarget() { |
| /*eslint-disable consistent-return */ |
| if (this instanceof EventTarget) { |
| listenersMap.set(this, new Map()); |
| return |
| } |
| if (arguments.length === 1 && Array.isArray(arguments[0])) { |
| return defineCustomEventTarget(arguments[0]) |
| } |
| if (arguments.length > 0) { |
| const types = new Array(arguments.length); |
| for (let i = 0; i < arguments.length; ++i) { |
| types[i] = arguments[i]; |
| } |
| return defineCustomEventTarget(types) |
| } |
| throw new TypeError("Cannot call a class as a function") |
| /*eslint-enable consistent-return */ |
| } |
| |
| // Should be enumerable, but class methods are not enumerable. |
| EventTarget.prototype = { |
| /** |
| * Add a given listener to this event target. |
| * @param {string} eventName The event name to add. |
| * @param {Function} listener The listener to add. |
| * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. |
| * @returns {void} |
| */ |
| addEventListener(eventName, listener, options) { |
| if (listener == null) { |
| return |
| } |
| if (typeof listener !== "function" && !isObject(listener)) { |
| throw new TypeError("'listener' should be a function or an object.") |
| } |
| |
| const listeners = getListeners(this); |
| const optionsIsObj = isObject(options); |
| const capture = optionsIsObj |
| ? Boolean(options.capture) |
| : Boolean(options); |
| const listenerType = capture ? CAPTURE : BUBBLE; |
| const newNode = { |
| listener, |
| listenerType, |
| passive: optionsIsObj && Boolean(options.passive), |
| once: optionsIsObj && Boolean(options.once), |
| next: null, |
| }; |
| |
| // Set it as the first node if the first node is null. |
| let node = listeners.get(eventName); |
| if (node === undefined) { |
| listeners.set(eventName, newNode); |
| return |
| } |
| |
| // Traverse to the tail while checking duplication.. |
| let prev = null; |
| while (node != null) { |
| if ( |
| node.listener === listener && |
| node.listenerType === listenerType |
| ) { |
| // Should ignore duplication. |
| return |
| } |
| prev = node; |
| node = node.next; |
| } |
| |
| // Add it. |
| prev.next = newNode; |
| }, |
| |
| /** |
| * Remove a given listener from this event target. |
| * @param {string} eventName The event name to remove. |
| * @param {Function} listener The listener to remove. |
| * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. |
| * @returns {void} |
| */ |
| removeEventListener(eventName, listener, options) { |
| if (listener == null) { |
| return |
| } |
| |
| const listeners = getListeners(this); |
| const capture = isObject(options) |
| ? Boolean(options.capture) |
| : Boolean(options); |
| const listenerType = capture ? CAPTURE : BUBBLE; |
| |
| let prev = null; |
| let node = listeners.get(eventName); |
| while (node != null) { |
| if ( |
| node.listener === listener && |
| node.listenerType === listenerType |
| ) { |
| if (prev !== null) { |
| prev.next = node.next; |
| } else if (node.next !== null) { |
| listeners.set(eventName, node.next); |
| } else { |
| listeners.delete(eventName); |
| } |
| return |
| } |
| |
| prev = node; |
| node = node.next; |
| } |
| }, |
| |
| /** |
| * Dispatch a given event. |
| * @param {Event|{type:string}} event The event to dispatch. |
| * @returns {boolean} `false` if canceled. |
| */ |
| dispatchEvent(event) { |
| if (event == null || typeof event.type !== "string") { |
| throw new TypeError('"event.type" should be a string.') |
| } |
| |
| // If listeners aren't registered, terminate. |
| const listeners = getListeners(this); |
| const eventName = event.type; |
| let node = listeners.get(eventName); |
| if (node == null) { |
| return true |
| } |
| |
| // Since we cannot rewrite several properties, so wrap object. |
| const wrappedEvent = wrapEvent(this, event); |
| |
| // This doesn't process capturing phase and bubbling phase. |
| // This isn't participating in a tree. |
| let prev = null; |
| while (node != null) { |
| // Remove this listener if it's once |
| if (node.once) { |
| if (prev !== null) { |
| prev.next = node.next; |
| } else if (node.next !== null) { |
| listeners.set(eventName, node.next); |
| } else { |
| listeners.delete(eventName); |
| } |
| } else { |
| prev = node; |
| } |
| |
| // Call this listener |
| setPassiveListener( |
| wrappedEvent, |
| node.passive ? node.listener : null |
| ); |
| if (typeof node.listener === "function") { |
| try { |
| node.listener.call(this, wrappedEvent); |
| } catch (err) { |
| if ( |
| typeof console !== "undefined" && |
| typeof console.error === "function" |
| ) { |
| console.error(err); |
| } |
| } |
| } else if ( |
| node.listenerType !== ATTRIBUTE && |
| typeof node.listener.handleEvent === "function" |
| ) { |
| node.listener.handleEvent(wrappedEvent); |
| } |
| |
| // Break if `event.stopImmediatePropagation` was called. |
| if (isStopped(wrappedEvent)) { |
| break |
| } |
| |
| node = node.next; |
| } |
| setPassiveListener(wrappedEvent, null); |
| setEventPhase(wrappedEvent, 0); |
| setCurrentTarget(wrappedEvent, null); |
| |
| return !wrappedEvent.defaultPrevented |
| }, |
| }; |
| |
| // `constructor` is not enumerable. |
| Object.defineProperty(EventTarget.prototype, "constructor", { |
| value: EventTarget, |
| configurable: true, |
| writable: true, |
| }); |
| |
| // Ensure `eventTarget instanceof window.EventTarget` is `true`. |
| if ( |
| typeof window !== "undefined" && |
| typeof window.EventTarget !== "undefined" |
| ) { |
| Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); |
| } |
| |
| /** |
| * @author Toru Nagashima <https://github.com/mysticatea> |
| * See LICENSE file in root directory for full license. |
| */ |
| |
| /** |
| * The signal class. |
| * @see https://dom.spec.whatwg.org/#abortsignal |
| */ |
| class AbortSignal extends EventTarget { |
| /** |
| * AbortSignal cannot be constructed directly. |
| */ |
| constructor() { |
| super(); |
| throw new TypeError("AbortSignal cannot be constructed directly"); |
| } |
| /** |
| * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. |
| */ |
| get aborted() { |
| const aborted = abortedFlags.get(this); |
| if (typeof aborted !== "boolean") { |
| throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); |
| } |
| return aborted; |
| } |
| } |
| defineEventAttribute(AbortSignal.prototype, "abort"); |
| /** |
| * Create an AbortSignal object. |
| */ |
| function createAbortSignal() { |
| const signal = Object.create(AbortSignal.prototype); |
| EventTarget.call(signal); |
| abortedFlags.set(signal, false); |
| return signal; |
| } |
| /** |
| * Abort a given signal. |
| */ |
| function abortSignal(signal) { |
| if (abortedFlags.get(signal) !== false) { |
| return; |
| } |
| abortedFlags.set(signal, true); |
| signal.dispatchEvent({ type: "abort" }); |
| } |
| /** |
| * Aborted flag for each instances. |
| */ |
| const abortedFlags = new WeakMap(); |
| // Properties should be enumerable. |
| Object.defineProperties(AbortSignal.prototype, { |
| aborted: { enumerable: true }, |
| }); |
| // `toString()` should return `"[object AbortSignal]"` |
| if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { |
| Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { |
| configurable: true, |
| value: "AbortSignal", |
| }); |
| } |
| |
| /** |
| * The AbortController. |
| * @see https://dom.spec.whatwg.org/#abortcontroller |
| */ |
| class AbortController { |
| /** |
| * Initialize this controller. |
| */ |
| constructor() { |
| signals.set(this, createAbortSignal()); |
| } |
| /** |
| * Returns the `AbortSignal` object associated with this object. |
| */ |
| get signal() { |
| return getSignal(this); |
| } |
| /** |
| * Abort and signal to any observers that the associated activity is to be aborted. |
| */ |
| abort() { |
| abortSignal(getSignal(this)); |
| } |
| } |
| /** |
| * Associated signals. |
| */ |
| const signals = new WeakMap(); |
| /** |
| * Get the associated signal of a given controller. |
| */ |
| function getSignal(controller) { |
| const signal = signals.get(controller); |
| if (signal == null) { |
| throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); |
| } |
| return signal; |
| } |
| // Properties should be enumerable. |
| Object.defineProperties(AbortController.prototype, { |
| signal: { enumerable: true }, |
| abort: { enumerable: true }, |
| }); |
| if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { |
| Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { |
| configurable: true, |
| value: "AbortController", |
| }); |
| } |
| |
| var abortController = /*#__PURE__*/Object.freeze({ |
| __proto__: null, |
| 'default': AbortController, |
| AbortController: AbortController, |
| AbortSignal: AbortSignal |
| }); |
| |
| var require$$9 = /*@__PURE__*/getAugmentedNamespace(abortController); |
| |
| var errors; |
| var hasRequiredErrors; |
| |
| function requireErrors () { |
| if (hasRequiredErrors) return errors; |
| hasRequiredErrors = 1; |
| |
| const { format, inspect, AggregateError: CustomAggregateError } = requireUtil(); |
| |
| /* |
| This file is a reduced and adapted version of the main lib/internal/errors.js file defined at |
| |
| https://github.com/nodejs/node/blob/master/lib/internal/errors.js |
| |
| Don't try to replace with the original file and keep it up to date (starting from E(...) definitions) |
| with the upstream file. |
| */ |
| |
| const AggregateError = globalThis.AggregateError || CustomAggregateError; |
| const kIsNodeError = Symbol('kIsNodeError'); |
| const kTypes = [ |
| 'string', |
| 'function', |
| 'number', |
| 'object', |
| // Accept 'Function' and 'Object' as alternative to the lower cased version. |
| 'Function', |
| 'Object', |
| 'boolean', |
| 'bigint', |
| 'symbol' |
| ]; |
| const classRegExp = /^([A-Z][a-z0-9]*)+$/; |
| const nodeInternalPrefix = '__node_internal_'; |
| const codes = {}; |
| function assert(value, message) { |
| if (!value) { |
| throw new codes.ERR_INTERNAL_ASSERTION(message) |
| } |
| } |
| |
| // Only use this for integers! Decimal numbers do not work with this function. |
| function addNumericalSeparator(val) { |
| let res = ''; |
| let i = val.length; |
| const start = val[0] === '-' ? 1 : 0; |
| for (; i >= start + 4; i -= 3) { |
| res = `_${val.slice(i - 3, i)}${res}`; |
| } |
| return `${val.slice(0, i)}${res}` |
| } |
| function getMessage(key, msg, args) { |
| if (typeof msg === 'function') { |
| assert( |
| msg.length <= args.length, |
| // Default options do not count. |
| `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).` |
| ); |
| return msg(...args) |
| } |
| const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length; |
| assert( |
| expectedLength === args.length, |
| `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).` |
| ); |
| if (args.length === 0) { |
| return msg |
| } |
| return format(msg, ...args) |
| } |
| function E(code, message, Base) { |
| if (!Base) { |
| Base = Error; |
| } |
| class NodeError extends Base { |
| constructor(...args) { |
| super(getMessage(code, message, args)); |
| } |
| toString() { |
| return `${this.name} [${code}]: ${this.message}` |
| } |
| } |
| Object.defineProperties(NodeError.prototype, { |
| name: { |
| value: Base.name, |
| writable: true, |
| enumerable: false, |
| configurable: true |
| }, |
| toString: { |
| value() { |
| return `${this.name} [${code}]: ${this.message}` |
| }, |
| writable: true, |
| enumerable: false, |
| configurable: true |
| } |
| }); |
| NodeError.prototype.code = code; |
| NodeError.prototype[kIsNodeError] = true; |
| codes[code] = NodeError; |
| } |
| function hideStackFrames(fn) { |
| // We rename the functions that will be hidden to cut off the stacktrace |
| // at the outermost one |
| const hidden = nodeInternalPrefix + fn.name; |
| Object.defineProperty(fn, 'name', { |
| value: hidden |
| }); |
| return fn |
| } |
| function aggregateTwoErrors(innerError, outerError) { |
| if (innerError && outerError && innerError !== outerError) { |
| if (Array.isArray(outerError.errors)) { |
| // If `outerError` is already an `AggregateError`. |
| outerError.errors.push(innerError); |
| return outerError |
| } |
| const err = new AggregateError([outerError, innerError], outerError.message); |
| err.code = outerError.code; |
| return err |
| } |
| return innerError || outerError |
| } |
| class AbortError extends Error { |
| constructor(message = 'The operation was aborted', options = undefined) { |
| if (options !== undefined && typeof options !== 'object') { |
| throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options) |
| } |
| super(message, options); |
| this.code = 'ABORT_ERR'; |
| this.name = 'AbortError'; |
| } |
| } |
| E('ERR_ASSERTION', '%s', Error); |
| E( |
| 'ERR_INVALID_ARG_TYPE', |
| (name, expected, actual) => { |
| assert(typeof name === 'string', "'name' must be a string"); |
| if (!Array.isArray(expected)) { |
| expected = [expected]; |
| } |
| let msg = 'The '; |
| if (name.endsWith(' argument')) { |
| // For cases like 'first argument' |
| msg += `${name} `; |
| } else { |
| msg += `"${name}" ${name.includes('.') ? 'property' : 'argument'} `; |
| } |
| msg += 'must be '; |
| const types = []; |
| const instances = []; |
| const other = []; |
| for (const value of expected) { |
| assert(typeof value === 'string', 'All expected entries have to be of type string'); |
| if (kTypes.includes(value)) { |
| types.push(value.toLowerCase()); |
| } else if (classRegExp.test(value)) { |
| instances.push(value); |
| } else { |
| assert(value !== 'object', 'The value "object" should be written as "Object"'); |
| other.push(value); |
| } |
| } |
| |
| // Special handle `object` in case other instances are allowed to outline |
| // the differences between each other. |
| if (instances.length > 0) { |
| const pos = types.indexOf('object'); |
| if (pos !== -1) { |
| types.splice(types, pos, 1); |
| instances.push('Object'); |
| } |
| } |
| if (types.length > 0) { |
| switch (types.length) { |
| case 1: |
| msg += `of type ${types[0]}`; |
| break |
| case 2: |
| msg += `one of type ${types[0]} or ${types[1]}`; |
| break |
| default: { |
| const last = types.pop(); |
| msg += `one of type ${types.join(', ')}, or ${last}`; |
| } |
| } |
| if (instances.length > 0 || other.length > 0) { |
| msg += ' or '; |
| } |
| } |
| if (instances.length > 0) { |
| switch (instances.length) { |
| case 1: |
| msg += `an instance of ${instances[0]}`; |
| break |
| case 2: |
| msg += `an instance of ${instances[0]} or ${instances[1]}`; |
| break |
| default: { |
| const last = instances.pop(); |
| msg += `an instance of ${instances.join(', ')}, or ${last}`; |
| } |
| } |
| if (other.length > 0) { |
| msg += ' or '; |
| } |
| } |
| switch (other.length) { |
| case 0: |
| break |
| case 1: |
| if (other[0].toLowerCase() !== other[0]) { |
| msg += 'an '; |
| } |
| msg += `${other[0]}`; |
| break |
| case 2: |
| msg += `one of ${other[0]} or ${other[1]}`; |
| break |
| default: { |
| const last = other.pop(); |
| msg += `one of ${other.join(', ')}, or ${last}`; |
| } |
| } |
| if (actual == null) { |
| msg += `. Received ${actual}`; |
| } else if (typeof actual === 'function' && actual.name) { |
| msg += `. Received function ${actual.name}`; |
| } else if (typeof actual === 'object') { |
| var _actual$constructor; |
| if ( |
| (_actual$constructor = actual.constructor) !== null && |
| _actual$constructor !== undefined && |
| _actual$constructor.name |
| ) { |
| msg += `. Received an instance of ${actual.constructor.name}`; |
| } else { |
| const inspected = inspect(actual, { |
| depth: -1 |
| }); |
| msg += `. Received ${inspected}`; |
| } |
| } else { |
| let inspected = inspect(actual, { |
| colors: false |
| }); |
| if (inspected.length > 25) { |
| inspected = `${inspected.slice(0, 25)}...`; |
| } |
| msg += `. Received type ${typeof actual} (${inspected})`; |
| } |
| return msg |
| }, |
| TypeError |
| ); |
| E( |
| 'ERR_INVALID_ARG_VALUE', |
| (name, value, reason = 'is invalid') => { |
| let inspected = inspect(value); |
| if (inspected.length > 128) { |
| inspected = inspected.slice(0, 128) + '...'; |
| } |
| const type = name.includes('.') ? 'property' : 'argument'; |
| return `The ${type} '${name}' ${reason}. Received ${inspected}` |
| }, |
| TypeError |
| ); |
| E( |
| 'ERR_INVALID_RETURN_VALUE', |
| (input, name, value) => { |
| var _value$constructor; |
| const type = |
| value !== null && |
| value !== undefined && |
| (_value$constructor = value.constructor) !== null && |
| _value$constructor !== undefined && |
| _value$constructor.name |
| ? `instance of ${value.constructor.name}` |
| : `type ${typeof value}`; |
| return `Expected ${input} to be returned from the "${name}"` + ` function but got ${type}.` |
| }, |
| TypeError |
| ); |
| E( |
| 'ERR_MISSING_ARGS', |
| (...args) => { |
| assert(args.length > 0, 'At least one arg needs to be specified'); |
| let msg; |
| const len = args.length; |
| args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(' or '); |
| switch (len) { |
| case 1: |
| msg += `The ${args[0]} argument`; |
| break |
| case 2: |
| msg += `The ${args[0]} and ${args[1]} arguments`; |
| break |
| default: |
| { |
| const last = args.pop(); |
| msg += `The ${args.join(', ')}, and ${last} arguments`; |
| } |
| break |
| } |
| return `${msg} must be specified` |
| }, |
| TypeError |
| ); |
| E( |
| 'ERR_OUT_OF_RANGE', |
| (str, range, input) => { |
| assert(range, 'Missing "range" argument'); |
| let received; |
| if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { |
| received = addNumericalSeparator(String(input)); |
| } else if (typeof input === 'bigint') { |
| received = String(input); |
| if (input > 2n ** 32n || input < -(2n ** 32n)) { |
| received = addNumericalSeparator(received); |
| } |
| received += 'n'; |
| } else { |
| received = inspect(input); |
| } |
| return `The value of "${str}" is out of range. It must be ${range}. Received ${received}` |
| }, |
| RangeError |
| ); |
| E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error); |
| E('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error); |
| E('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error); |
| E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error); |
| E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error); |
| E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); |
| E('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error); |
| E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error); |
| E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error); |
| E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error); |
| E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError); |
| errors = { |
| AbortError, |
| aggregateTwoErrors: hideStackFrames(aggregateTwoErrors), |
| hideStackFrames, |
| codes |
| }; |
| return errors; |
| } |
| |
| var validators; |
| var hasRequiredValidators; |
| |
| function requireValidators () { |
| if (hasRequiredValidators) return validators; |
| hasRequiredValidators = 1; |
| |
| const { |
| ArrayIsArray, |
| ArrayPrototypeIncludes, |
| ArrayPrototypeJoin, |
| ArrayPrototypeMap, |
| NumberIsInteger, |
| NumberIsNaN, |
| NumberMAX_SAFE_INTEGER, |
| NumberMIN_SAFE_INTEGER, |
| NumberParseInt, |
| ObjectPrototypeHasOwnProperty, |
| RegExpPrototypeExec, |
| String, |
| StringPrototypeToUpperCase, |
| StringPrototypeTrim |
| } = requirePrimordials(); |
| const { |
| hideStackFrames, |
| codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL } |
| } = requireErrors(); |
| const { normalizeEncoding } = requireUtil(); |
| const { isAsyncFunction, isArrayBufferView } = requireUtil().types; |
| const signals = {}; |
| |
| /** |
| * @param {*} value |
| * @returns {boolean} |
| */ |
| function isInt32(value) { |
| return value === (value | 0) |
| } |
| |
| /** |
| * @param {*} value |
| * @returns {boolean} |
| */ |
| function isUint32(value) { |
| return value === value >>> 0 |
| } |
| const octalReg = /^[0-7]+$/; |
| const modeDesc = 'must be a 32-bit unsigned integer or an octal string'; |
| |
| /** |
| * Parse and validate values that will be converted into mode_t (the S_* |
| * constants). Only valid numbers and octal strings are allowed. They could be |
| * converted to 32-bit unsigned integers or non-negative signed integers in the |
| * C++ land, but any value higher than 0o777 will result in platform-specific |
| * behaviors. |
| * |
| * @param {*} value Values to be validated |
| * @param {string} name Name of the argument |
| * @param {number} [def] If specified, will be returned for invalid values |
| * @returns {number} |
| */ |
| function parseFileMode(value, name, def) { |
| if (typeof value === 'undefined') { |
| value = def; |
| } |
| if (typeof value === 'string') { |
| if (RegExpPrototypeExec(octalReg, value) === null) { |
| throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc) |
| } |
| value = NumberParseInt(value, 8); |
| } |
| validateUint32(value, name); |
| return value |
| } |
| |
| /** |
| * @callback validateInteger |
| * @param {*} value |
| * @param {string} name |
| * @param {number} [min] |
| * @param {number} [max] |
| * @returns {asserts value is number} |
| */ |
| |
| /** @type {validateInteger} */ |
| const validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => { |
| if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value) |
| if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value) |
| if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value) |
| }); |
| |
| /** |
| * @callback validateInt32 |
| * @param {*} value |
| * @param {string} name |
| * @param {number} [min] |
| * @param {number} [max] |
| * @returns {asserts value is number} |
| */ |
| |
| /** @type {validateInt32} */ |
| const validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => { |
| // The defaults for min and max correspond to the limits of 32-bit integers. |
| if (typeof value !== 'number') { |
| throw new ERR_INVALID_ARG_TYPE(name, 'number', value) |
| } |
| if (!NumberIsInteger(value)) { |
| throw new ERR_OUT_OF_RANGE(name, 'an integer', value) |
| } |
| if (value < min || value > max) { |
| throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value) |
| } |
| }); |
| |
| /** |
| * @callback validateUint32 |
| * @param {*} value |
| * @param {string} name |
| * @param {number|boolean} [positive=false] |
| * @returns {asserts value is number} |
| */ |
| |
| /** @type {validateUint32} */ |
| const validateUint32 = hideStackFrames((value, name, positive = false) => { |
| if (typeof value !== 'number') { |
| throw new ERR_INVALID_ARG_TYPE(name, 'number', value) |
| } |
| if (!NumberIsInteger(value)) { |
| throw new ERR_OUT_OF_RANGE(name, 'an integer', value) |
| } |
| const min = positive ? 1 : 0; |
| // 2 ** 32 === 4294967296 |
| const max = 4294967295; |
| if (value < min || value > max) { |
| throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value) |
| } |
| }); |
| |
| /** |
| * @callback validateString |
| * @param {*} value |
| * @param {string} name |
| * @returns {asserts value is string} |
| */ |
| |
| /** @type {validateString} */ |
| function validateString(value, name) { |
| if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value) |
| } |
| |
| /** |
| * @callback validateNumber |
| * @param {*} value |
| * @param {string} name |
| * @param {number} [min] |
| * @param {number} [max] |
| * @returns {asserts value is number} |
| */ |
| |
| /** @type {validateNumber} */ |
| function validateNumber(value, name, min = undefined, max) { |
| if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value) |
| if ( |
| (min != null && value < min) || |
| (max != null && value > max) || |
| ((min != null || max != null) && NumberIsNaN(value)) |
| ) { |
| throw new ERR_OUT_OF_RANGE( |
| name, |
| `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`, |
| value |
| ) |
| } |
| } |
| |
| /** |
| * @callback validateOneOf |
| * @template T |
| * @param {T} value |
| * @param {string} name |
| * @param {T[]} oneOf |
| */ |
| |
| /** @type {validateOneOf} */ |
| const validateOneOf = hideStackFrames((value, name, oneOf) => { |
| if (!ArrayPrototypeIncludes(oneOf, value)) { |
| const allowed = ArrayPrototypeJoin( |
| ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))), |
| ', ' |
| ); |
| const reason = 'must be one of: ' + allowed; |
| throw new ERR_INVALID_ARG_VALUE(name, value, reason) |
| } |
| }); |
| |
| /** |
| * @callback validateBoolean |
| * @param {*} value |
| * @param {string} name |
| * @returns {asserts value is boolean} |
| */ |
| |
| /** @type {validateBoolean} */ |
| function validateBoolean(value, name) { |
| if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value) |
| } |
| function getOwnPropertyValueOrDefault(options, key, defaultValue) { |
| return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key] |
| } |
| |
| /** |
| * @callback validateObject |
| * @param {*} value |
| * @param {string} name |
| * @param {{ |
| * allowArray?: boolean, |
| * allowFunction?: boolean, |
| * nullable?: boolean |
| * }} [options] |
| */ |
| |
| /** @type {validateObject} */ |
| const validateObject = hideStackFrames((value, name, options = null) => { |
| const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false); |
| const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false); |
| const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false); |
| if ( |
| (!nullable && value === null) || |
| (!allowArray && ArrayIsArray(value)) || |
| (typeof value !== 'object' && (!allowFunction || typeof value !== 'function')) |
| ) { |
| throw new ERR_INVALID_ARG_TYPE(name, 'Object', value) |
| } |
| }); |
| |
| /** |
| * @callback validateArray |
| * @param {*} value |
| * @param {string} name |
| * @param {number} [minLength] |
| * @returns {asserts value is any[]} |
| */ |
| |
| /** @type {validateArray} */ |
| const validateArray = hideStackFrames((value, name, minLength = 0) => { |
| if (!ArrayIsArray(value)) { |
| throw new ERR_INVALID_ARG_TYPE(name, 'Array', value) |
| } |
| if (value.length < minLength) { |
| const reason = `must be longer than ${minLength}`; |
| throw new ERR_INVALID_ARG_VALUE(name, value, reason) |
| } |
| }); |
| |
| // eslint-disable-next-line jsdoc/require-returns-check |
| /** |
| * @param {*} signal |
| * @param {string} [name='signal'] |
| * @returns {asserts signal is keyof signals} |
| */ |
| function validateSignalName(signal, name = 'signal') { |
| validateString(signal, name); |
| if (signals[signal] === undefined) { |
| if (signals[StringPrototypeToUpperCase(signal)] !== undefined) { |
| throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)') |
| } |
| throw new ERR_UNKNOWN_SIGNAL(signal) |
| } |
| } |
| |
| /** |
| * @callback validateBuffer |
| * @param {*} buffer |
| * @param {string} [name='buffer'] |
| * @returns {asserts buffer is ArrayBufferView} |
| */ |
| |
| /** @type {validateBuffer} */ |
| const validateBuffer = hideStackFrames((buffer, name = 'buffer') => { |
| if (!isArrayBufferView(buffer)) { |
| throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer) |
| } |
| }); |
| |
| /** |
| * @param {string} data |
| * @param {string} encoding |
| */ |
| function validateEncoding(data, encoding) { |
| const normalizedEncoding = normalizeEncoding(encoding); |
| const length = data.length; |
| if (normalizedEncoding === 'hex' && length % 2 !== 0) { |
| throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`) |
| } |
| } |
| |
| /** |
| * Check that the port number is not NaN when coerced to a number, |
| * is an integer and that it falls within the legal range of port numbers. |
| * @param {*} port |
| * @param {string} [name='Port'] |
| * @param {boolean} [allowZero=true] |
| * @returns {number} |
| */ |
| function validatePort(port, name = 'Port', allowZero = true) { |
| if ( |
| (typeof port !== 'number' && typeof port !== 'string') || |
| (typeof port === 'string' && StringPrototypeTrim(port).length === 0) || |
| +port !== +port >>> 0 || |
| port > 0xffff || |
| (port === 0 && !allowZero) |
| ) { |
| throw new ERR_SOCKET_BAD_PORT(name, port, allowZero) |
| } |
| return port | 0 |
| } |
| |
| /** |
| * @callback validateAbortSignal |
| * @param {*} signal |
| * @param {string} name |
| */ |
| |
| /** @type {validateAbortSignal} */ |
| const validateAbortSignal = hideStackFrames((signal, name) => { |
| if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) { |
| throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal) |
| } |
| }); |
| |
| /** |
| * @callback validateFunction |
| * @param {*} value |
| * @param {string} name |
| * @returns {asserts value is Function} |
| */ |
| |
| /** @type {validateFunction} */ |
| const validateFunction = hideStackFrames((value, name) => { |
| if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value) |
| }); |
| |
| /** |
| * @callback validatePlainFunction |
| * @param {*} value |
| * @param {string} name |
| * @returns {asserts value is Function} |
| */ |
| |
| /** @type {validatePlainFunction} */ |
| const validatePlainFunction = hideStackFrames((value, name) => { |
| if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value) |
| }); |
| |
| /** |
| * @callback validateUndefined |
| * @param {*} value |
| * @param {string} name |
| * @returns {asserts value is undefined} |
| */ |
| |
| /** @type {validateUndefined} */ |
| const validateUndefined = hideStackFrames((value, name) => { |
| if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value) |
| }); |
| |
| /** |
| * @template T |
| * @param {T} value |
| * @param {string} name |
| * @param {T[]} union |
| */ |
| function validateUnion(value, name, union) { |
| if (!ArrayPrototypeIncludes(union, value)) { |
| throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value) |
| } |
| } |
| validators = { |
| isInt32, |
| isUint32, |
| parseFileMode, |
| validateArray, |
| validateBoolean, |
| validateBuffer, |
| validateEncoding, |
| validateFunction, |
| validateInt32, |
| validateInteger, |
| validateNumber, |
| validateObject, |
| validateOneOf, |
| validatePlainFunction, |
| validatePort, |
| validateSignalName, |
| validateString, |
| validateUint32, |
| validateUndefined, |
| validateUnion, |
| validateAbortSignal |
| }; |
| return validators; |
| } |
| |
| var endOfStream = {exports: {}}; |
| |
| var process$1; |
| var hasRequiredProcess; |
| |
| function requireProcess () { |
| if (hasRequiredProcess) return process$1; |
| hasRequiredProcess = 1; |
| // for now just expose the builtin process global from node.js |
| process$1 = commonjsGlobal.process; |
| return process$1; |
| } |
| |
| var utils; |
| var hasRequiredUtils; |
| |
| function requireUtils () { |
| if (hasRequiredUtils) return utils; |
| hasRequiredUtils = 1; |
| |
| const { Symbol, SymbolAsyncIterator, SymbolIterator } = requirePrimordials(); |
| const kDestroyed = Symbol('kDestroyed'); |
| const kIsErrored = Symbol('kIsErrored'); |
| const kIsReadable = Symbol('kIsReadable'); |
| const kIsDisturbed = Symbol('kIsDisturbed'); |
| function isReadableNodeStream(obj, strict = false) { |
| var _obj$_readableState; |
| return !!( |
| ( |
| obj && |
| typeof obj.pipe === 'function' && |
| typeof obj.on === 'function' && |
| (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) && |
| (!obj._writableState || |
| ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined |
| ? undefined |
| : _obj$_readableState.readable) !== false) && |
| // Duplex |
| (!obj._writableState || obj._readableState) |
| ) // Writable has .pipe. |
| ) |
| } |
| |
| function isWritableNodeStream(obj) { |
| var _obj$_writableState; |
| return !!( |
| ( |
| obj && |
| typeof obj.write === 'function' && |
| typeof obj.on === 'function' && |
| (!obj._readableState || |
| ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined |
| ? undefined |
| : _obj$_writableState.writable) !== false) |
| ) // Duplex |
| ) |
| } |
| |
| function isDuplexNodeStream(obj) { |
| return !!( |
| obj && |
| typeof obj.pipe === 'function' && |
| obj._readableState && |
| typeof obj.on === 'function' && |
| typeof obj.write === 'function' |
| ) |
| } |
| function isNodeStream(obj) { |
| return ( |
| obj && |
| (obj._readableState || |
| obj._writableState || |
| (typeof obj.write === 'function' && typeof obj.on === 'function') || |
| (typeof obj.pipe === 'function' && typeof obj.on === 'function')) |
| ) |
| } |
| function isIterable(obj, isAsync) { |
| if (obj == null) return false |
| if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function' |
| if (isAsync === false) return typeof obj[SymbolIterator] === 'function' |
| return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function' |
| } |
| function isDestroyed(stream) { |
| if (!isNodeStream(stream)) return null |
| const wState = stream._writableState; |
| const rState = stream._readableState; |
| const state = wState || rState; |
| return !!(stream.destroyed || stream[kDestroyed] || (state !== null && state !== undefined && state.destroyed)) |
| } |
| |
| // Have been end():d. |
| function isWritableEnded(stream) { |
| if (!isWritableNodeStream(stream)) return null |
| if (stream.writableEnded === true) return true |
| const wState = stream._writableState; |
| if (wState !== null && wState !== undefined && wState.errored) return false |
| if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null |
| return wState.ended |
| } |
| |
| // Have emitted 'finish'. |
| function isWritableFinished(stream, strict) { |
| if (!isWritableNodeStream(stream)) return null |
| if (stream.writableFinished === true) return true |
| const wState = stream._writableState; |
| if (wState !== null && wState !== undefined && wState.errored) return false |
| if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null |
| return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0)) |
| } |
| |
| // Have been push(null):d. |
| function isReadableEnded(stream) { |
| if (!isReadableNodeStream(stream)) return null |
| if (stream.readableEnded === true) return true |
| const rState = stream._readableState; |
| if (!rState || rState.errored) return false |
| if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null |
| return rState.ended |
| } |
| |
| // Have emitted 'end'. |
| function isReadableFinished(stream, strict) { |
| if (!isReadableNodeStream(stream)) return null |
| const rState = stream._readableState; |
| if (rState !== null && rState !== undefined && rState.errored) return false |
| if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null |
| return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0)) |
| } |
| function isReadable(stream) { |
| if (stream && stream[kIsReadable] != null) return stream[kIsReadable] |
| if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null |
| if (isDestroyed(stream)) return false |
| return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream) |
| } |
| function isWritable(stream) { |
| if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null |
| if (isDestroyed(stream)) return false |
| return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream) |
| } |
| function isFinished(stream, opts) { |
| if (!isNodeStream(stream)) { |
| return null |
| } |
| if (isDestroyed(stream)) { |
| return true |
| } |
| if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) { |
| return false |
| } |
| if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) { |
| return false |
| } |
| return true |
| } |
| function isWritableErrored(stream) { |
| var _stream$_writableStat, _stream$_writableStat2; |
| if (!isNodeStream(stream)) { |
| return null |
| } |
| if (stream.writableErrored) { |
| return stream.writableErrored |
| } |
| return (_stream$_writableStat = |
| (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined |
| ? undefined |
| : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined |
| ? _stream$_writableStat |
| : null |
| } |
| function isReadableErrored(stream) { |
| var _stream$_readableStat, _stream$_readableStat2; |
| if (!isNodeStream(stream)) { |
| return null |
| } |
| if (stream.readableErrored) { |
| return stream.readableErrored |
| } |
| return (_stream$_readableStat = |
| (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined |
| ? undefined |
| : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined |
| ? _stream$_readableStat |
| : null |
| } |
| function isClosed(stream) { |
| if (!isNodeStream(stream)) { |
| return null |
| } |
| if (typeof stream.closed === 'boolean') { |
| return stream.closed |
| } |
| const wState = stream._writableState; |
| const rState = stream._readableState; |
| if ( |
| typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' || |
| typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean' |
| ) { |
| return ( |
| (wState === null || wState === undefined ? undefined : wState.closed) || |
| (rState === null || rState === undefined ? undefined : rState.closed) |
| ) |
| } |
| if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) { |
| return stream._closed |
| } |
| return null |
| } |
| function isOutgoingMessage(stream) { |
| return ( |
| typeof stream._closed === 'boolean' && |
| typeof stream._defaultKeepAlive === 'boolean' && |
| typeof stream._removedConnection === 'boolean' && |
| typeof stream._removedContLen === 'boolean' |
| ) |
| } |
| function isServerResponse(stream) { |
| return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream) |
| } |
| function isServerRequest(stream) { |
| var _stream$req; |
| return ( |
| typeof stream._consuming === 'boolean' && |
| typeof stream._dumped === 'boolean' && |
| ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) === |
| undefined |
| ) |
| } |
| function willEmitClose(stream) { |
| if (!isNodeStream(stream)) return null |
| const wState = stream._writableState; |
| const rState = stream._readableState; |
| const state = wState || rState; |
| return ( |
| (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false) |
| ) |
| } |
| function isDisturbed(stream) { |
| var _stream$kIsDisturbed; |
| return !!( |
| stream && |
| ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined |
| ? _stream$kIsDisturbed |
| : stream.readableDidRead || stream.readableAborted) |
| ) |
| } |
| function isErrored(stream) { |
| var _ref, |
| _ref2, |
| _ref3, |
| _ref4, |
| _ref5, |
| _stream$kIsErrored, |
| _stream$_readableStat3, |
| _stream$_writableStat3, |
| _stream$_readableStat4, |
| _stream$_writableStat4; |
| return !!( |
| stream && |
| ((_ref = |
| (_ref2 = |
| (_ref3 = |
| (_ref4 = |
| (_ref5 = |
| (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined |
| ? _stream$kIsErrored |
| : stream.readableErrored) !== null && _ref5 !== undefined |
| ? _ref5 |
| : stream.writableErrored) !== null && _ref4 !== undefined |
| ? _ref4 |
| : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined |
| ? undefined |
| : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined |
| ? _ref3 |
| : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined |
| ? undefined |
| : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined |
| ? _ref2 |
| : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined |
| ? undefined |
| : _stream$_readableStat4.errored) !== null && _ref !== undefined |
| ? _ref |
| : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined |
| ? undefined |
| : _stream$_writableStat4.errored) |
| ) |
| } |
| utils = { |
| kDestroyed, |
| isDisturbed, |
| kIsDisturbed, |
| isErrored, |
| kIsErrored, |
| isReadable, |
| kIsReadable, |
| isClosed, |
| isDestroyed, |
| isDuplexNodeStream, |
| isFinished, |
| isIterable, |
| isReadableNodeStream, |
| isReadableEnded, |
| isReadableFinished, |
| isReadableErrored, |
| isNodeStream, |
| isWritable, |
| isWritableNodeStream, |
| isWritableEnded, |
| isWritableFinished, |
| isWritableErrored, |
| isServerRequest, |
| isServerResponse, |
| willEmitClose |
| }; |
| return utils; |
| } |
| |
| /* replacement start */ |
| |
| var hasRequiredEndOfStream; |
| |
| function requireEndOfStream () { |
| if (hasRequiredEndOfStream) return endOfStream.exports; |
| hasRequiredEndOfStream = 1; |
| const process = requireProcess() |
| |
| /* replacement end */ |
| // Ported from https://github.com/mafintosh/end-of-stream with |
| // permission from the author, Mathias Buus (@mafintosh). |
| |
| ; const { AbortError, codes } = requireErrors(); |
| const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes; |
| const { kEmptyObject, once } = requireUtil(); |
| const { validateAbortSignal, validateFunction, validateObject } = requireValidators(); |
| const { Promise } = requirePrimordials(); |
| const { |
| isClosed, |
| isReadable, |
| isReadableNodeStream, |
| isReadableFinished, |
| isReadableErrored, |
| isWritable, |
| isWritableNodeStream, |
| isWritableFinished, |
| isWritableErrored, |
| isNodeStream, |
| willEmitClose: _willEmitClose |
| } = requireUtils(); |
| function isRequest(stream) { |
| return stream.setHeader && typeof stream.abort === 'function' |
| } |
| const nop = () => {}; |
| function eos(stream, options, callback) { |
| var _options$readable, _options$writable; |
| if (arguments.length === 2) { |
| callback = options; |
| options = kEmptyObject; |
| } else if (options == null) { |
| options = kEmptyObject; |
| } else { |
| validateObject(options, 'options'); |
| } |
| validateFunction(callback, 'callback'); |
| validateAbortSignal(options.signal, 'options.signal'); |
| callback = once(callback); |
| const readable = |
| (_options$readable = options.readable) !== null && _options$readable !== undefined |
| ? _options$readable |
| : isReadableNodeStream(stream); |
| const writable = |
| (_options$writable = options.writable) !== null && _options$writable !== undefined |
| ? _options$writable |
| : isWritableNodeStream(stream); |
| if (!isNodeStream(stream)) { |
| // TODO: Webstreams. |
| throw new ERR_INVALID_ARG_TYPE('stream', 'Stream', stream) |
| } |
| const wState = stream._writableState; |
| const rState = stream._readableState; |
| const onlegacyfinish = () => { |
| if (!stream.writable) { |
| onfinish(); |
| } |
| }; |
| |
| // TODO (ronag): Improve soft detection to include core modules and |
| // common ecosystem modules that do properly emit 'close' but fail |
| // this generic check. |
| let willEmitClose = |
| _willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable; |
| let writableFinished = isWritableFinished(stream, false); |
| const onfinish = () => { |
| writableFinished = true; |
| // Stream should not be destroyed here. If it is that |
| // means that user space is doing something differently and |
| // we cannot trust willEmitClose. |
| if (stream.destroyed) { |
| willEmitClose = false; |
| } |
| if (willEmitClose && (!stream.readable || readable)) { |
| return |
| } |
| if (!readable || readableFinished) { |
| callback.call(stream); |
| } |
| }; |
| let readableFinished = isReadableFinished(stream, false); |
| const onend = () => { |
| readableFinished = true; |
| // Stream should not be destroyed here. If it is that |
| // means that user space is doing something differently and |
| // we cannot trust willEmitClose. |
| if (stream.destroyed) { |
| willEmitClose = false; |
| } |
| if (willEmitClose && (!stream.writable || writable)) { |
| return |
| } |
| if (!writable || writableFinished) { |
| callback.call(stream); |
| } |
| }; |
| const onerror = (err) => { |
| callback.call(stream, err); |
| }; |
| let closed = isClosed(stream); |
| const onclose = () => { |
| closed = true; |
| const errored = isWritableErrored(stream) || isReadableErrored(stream); |
| if (errored && typeof errored !== 'boolean') { |
| return callback.call(stream, errored) |
| } |
| if (readable && !readableFinished && isReadableNodeStream(stream, true)) { |
| if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()) |
| } |
| if (writable && !writableFinished) { |
| if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()) |
| } |
| callback.call(stream); |
| }; |
| const onrequest = () => { |
| stream.req.on('finish', onfinish); |
| }; |
| if (isRequest(stream)) { |
| stream.on('complete', onfinish); |
| if (!willEmitClose) { |
| stream.on('abort', onclose); |
| } |
| if (stream.req) { |
| onrequest(); |
| } else { |
| stream.on('request', onrequest); |
| } |
| } else if (writable && !wState) { |
| // legacy streams |
| stream.on('end', onlegacyfinish); |
| stream.on('close', onlegacyfinish); |
| } |
| |
| // Not all streams will emit 'close' after 'aborted'. |
| if (!willEmitClose && typeof stream.aborted === 'boolean') { |
| stream.on('aborted', onclose); |
| } |
| stream.on('end', onend); |
| stream.on('finish', onfinish); |
| if (options.error !== false) { |
| stream.on('error', onerror); |
| } |
| stream.on('close', onclose); |
| if (closed) { |
| process.nextTick(onclose); |
| } else if ( |
| (wState !== null && wState !== undefined && wState.errorEmitted) || |
| (rState !== null && rState !== undefined && rState.errorEmitted) |
| ) { |
| if (!willEmitClose) { |
| process.nextTick(onclose); |
| } |
| } else if ( |
| !readable && |
| (!willEmitClose || isReadable(stream)) && |
| (writableFinished || isWritable(stream) === false) |
| ) { |
| process.nextTick(onclose); |
| } else if ( |
| !writable && |
| (!willEmitClose || isWritable(stream)) && |
| (readableFinished || isReadable(stream) === false) |
| ) { |
| process.nextTick(onclose); |
| } else if (rState && stream.req && stream.aborted) { |
| process.nextTick(onclose); |
| } |
| const cleanup = () => { |
| callback = nop; |
| stream.removeListener('aborted', onclose); |
| stream.removeListener('complete', onfinish); |
| stream.removeListener('abort', onclose); |
| stream.removeListener('request', onrequest); |
| if (stream.req) stream.req.removeListener('finish', onfinish); |
| stream.removeListener('end', onlegacyfinish); |
| stream.removeListener('close', onlegacyfinish); |
| stream.removeListener('finish', onfinish); |
| stream.removeListener('end', onend); |
| stream.removeListener('error', onerror); |
| stream.removeListener('close', onclose); |
| }; |
| if (options.signal && !closed) { |
| const abort = () => { |
| // Keep it because cleanup removes it. |
| const endCallback = callback; |
| cleanup(); |
| endCallback.call( |
| stream, |
| new AbortError(undefined, { |
| cause: options.signal.reason |
| }) |
| ); |
| }; |
| if (options.signal.aborted) { |
| process.nextTick(abort); |
| } else { |
| const originalCallback = callback; |
| callback = once((...args) => { |
| options.signal.removeEventListener('abort', abort); |
| originalCallback.apply(stream, args); |
| }); |
| options.signal.addEventListener('abort', abort); |
| } |
| } |
| return cleanup |
| } |
| function finished(stream, opts) { |
| return new Promise((resolve, reject) => { |
| eos(stream, opts, (err) => { |
| if (err) { |
| reject(err); |
| } else { |
| resolve(); |
| } |
| }); |
| }) |
| } |
| endOfStream.exports = eos; |
| endOfStream.exports.finished = finished; |
| return endOfStream.exports; |
| } |
| |
| var hasRequiredOperators; |
| |
| function requireOperators () { |
| if (hasRequiredOperators) return operators; |
| hasRequiredOperators = 1; |
| |
| const AbortController = globalThis.AbortController || require$$9.AbortController; |
| const { |
| codes: { ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE }, |
| AbortError |
| } = requireErrors(); |
| const { validateAbortSignal, validateInteger, validateObject } = requireValidators(); |
| const kWeakHandler = requirePrimordials().Symbol('kWeak'); |
| const { finished } = requireEndOfStream(); |
| const { |
| ArrayPrototypePush, |
| MathFloor, |
| Number, |
| NumberIsNaN, |
| Promise, |
| PromiseReject, |
| PromisePrototypeThen, |
| Symbol |
| } = requirePrimordials(); |
| const kEmpty = Symbol('kEmpty'); |
| const kEof = Symbol('kEof'); |
| function map(fn, options) { |
| if (typeof fn !== 'function') { |
| throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn) |
| } |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| let concurrency = 1; |
| if ((options === null || options === undefined ? undefined : options.concurrency) != null) { |
| concurrency = MathFloor(options.concurrency); |
| } |
| validateInteger(concurrency, 'concurrency', 1); |
| return async function* map() { |
| var _options$signal, _options$signal2; |
| const ac = new AbortController(); |
| const stream = this; |
| const queue = []; |
| const signal = ac.signal; |
| const signalOpt = { |
| signal |
| }; |
| const abort = () => ac.abort(); |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal = options.signal) !== null && |
| _options$signal !== undefined && |
| _options$signal.aborted |
| ) { |
| abort(); |
| } |
| options === null || options === undefined |
| ? undefined |
| : (_options$signal2 = options.signal) === null || _options$signal2 === undefined |
| ? undefined |
| : _options$signal2.addEventListener('abort', abort); |
| let next; |
| let resume; |
| let done = false; |
| function onDone() { |
| done = true; |
| } |
| async function pump() { |
| try { |
| for await (let val of stream) { |
| var _val; |
| if (done) { |
| return |
| } |
| if (signal.aborted) { |
| throw new AbortError() |
| } |
| try { |
| val = fn(val, signalOpt); |
| } catch (err) { |
| val = PromiseReject(err); |
| } |
| if (val === kEmpty) { |
| continue |
| } |
| if (typeof ((_val = val) === null || _val === undefined ? undefined : _val.catch) === 'function') { |
| val.catch(onDone); |
| } |
| queue.push(val); |
| if (next) { |
| next(); |
| next = null; |
| } |
| if (!done && queue.length && queue.length >= concurrency) { |
| await new Promise((resolve) => { |
| resume = resolve; |
| }); |
| } |
| } |
| queue.push(kEof); |
| } catch (err) { |
| const val = PromiseReject(err); |
| PromisePrototypeThen(val, undefined, onDone); |
| queue.push(val); |
| } finally { |
| var _options$signal3; |
| done = true; |
| if (next) { |
| next(); |
| next = null; |
| } |
| options === null || options === undefined |
| ? undefined |
| : (_options$signal3 = options.signal) === null || _options$signal3 === undefined |
| ? undefined |
| : _options$signal3.removeEventListener('abort', abort); |
| } |
| } |
| pump(); |
| try { |
| while (true) { |
| while (queue.length > 0) { |
| const val = await queue[0]; |
| if (val === kEof) { |
| return |
| } |
| if (signal.aborted) { |
| throw new AbortError() |
| } |
| if (val !== kEmpty) { |
| yield val; |
| } |
| queue.shift(); |
| if (resume) { |
| resume(); |
| resume = null; |
| } |
| } |
| await new Promise((resolve) => { |
| next = resolve; |
| }); |
| } |
| } finally { |
| ac.abort(); |
| done = true; |
| if (resume) { |
| resume(); |
| resume = null; |
| } |
| } |
| }.call(this) |
| } |
| function asIndexedPairs(options = undefined) { |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| return async function* asIndexedPairs() { |
| let index = 0; |
| for await (const val of this) { |
| var _options$signal4; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal4 = options.signal) !== null && |
| _options$signal4 !== undefined && |
| _options$signal4.aborted |
| ) { |
| throw new AbortError({ |
| cause: options.signal.reason |
| }) |
| } |
| yield [index++, val]; |
| } |
| }.call(this) |
| } |
| async function some(fn, options = undefined) { |
| for await (const unused of filter.call(this, fn, options)) { |
| return true |
| } |
| return false |
| } |
| async function every(fn, options = undefined) { |
| if (typeof fn !== 'function') { |
| throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn) |
| } |
| // https://en.wikipedia.org/wiki/De_Morgan%27s_laws |
| return !(await some.call( |
| this, |
| async (...args) => { |
| return !(await fn(...args)) |
| }, |
| options |
| )) |
| } |
| async function find(fn, options) { |
| for await (const result of filter.call(this, fn, options)) { |
| return result |
| } |
| return undefined |
| } |
| async function forEach(fn, options) { |
| if (typeof fn !== 'function') { |
| throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn) |
| } |
| async function forEachFn(value, options) { |
| await fn(value, options); |
| return kEmpty |
| } |
| // eslint-disable-next-line no-unused-vars |
| for await (const unused of map.call(this, forEachFn, options)); |
| } |
| function filter(fn, options) { |
| if (typeof fn !== 'function') { |
| throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn) |
| } |
| async function filterFn(value, options) { |
| if (await fn(value, options)) { |
| return value |
| } |
| return kEmpty |
| } |
| return map.call(this, filterFn, options) |
| } |
| |
| // Specific to provide better error to reduce since the argument is only |
| // missing if the stream has no items in it - but the code is still appropriate |
| class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS { |
| constructor() { |
| super('reduce'); |
| this.message = 'Reduce of an empty stream requires an initial value'; |
| } |
| } |
| async function reduce(reducer, initialValue, options) { |
| var _options$signal5; |
| if (typeof reducer !== 'function') { |
| throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer) |
| } |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| let hasInitialValue = arguments.length > 1; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal5 = options.signal) !== null && |
| _options$signal5 !== undefined && |
| _options$signal5.aborted |
| ) { |
| const err = new AbortError(undefined, { |
| cause: options.signal.reason |
| }); |
| this.once('error', () => {}); // The error is already propagated |
| await finished(this.destroy(err)); |
| throw err |
| } |
| const ac = new AbortController(); |
| const signal = ac.signal; |
| if (options !== null && options !== undefined && options.signal) { |
| const opts = { |
| once: true, |
| [kWeakHandler]: this |
| }; |
| options.signal.addEventListener('abort', () => ac.abort(), opts); |
| } |
| let gotAnyItemFromStream = false; |
| try { |
| for await (const value of this) { |
| var _options$signal6; |
| gotAnyItemFromStream = true; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal6 = options.signal) !== null && |
| _options$signal6 !== undefined && |
| _options$signal6.aborted |
| ) { |
| throw new AbortError() |
| } |
| if (!hasInitialValue) { |
| initialValue = value; |
| hasInitialValue = true; |
| } else { |
| initialValue = await reducer(initialValue, value, { |
| signal |
| }); |
| } |
| } |
| if (!gotAnyItemFromStream && !hasInitialValue) { |
| throw new ReduceAwareErrMissingArgs() |
| } |
| } finally { |
| ac.abort(); |
| } |
| return initialValue |
| } |
| async function toArray(options) { |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| const result = []; |
| for await (const val of this) { |
| var _options$signal7; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal7 = options.signal) !== null && |
| _options$signal7 !== undefined && |
| _options$signal7.aborted |
| ) { |
| throw new AbortError(undefined, { |
| cause: options.signal.reason |
| }) |
| } |
| ArrayPrototypePush(result, val); |
| } |
| return result |
| } |
| function flatMap(fn, options) { |
| const values = map.call(this, fn, options); |
| return async function* flatMap() { |
| for await (const val of values) { |
| yield* val; |
| } |
| }.call(this) |
| } |
| function toIntegerOrInfinity(number) { |
| // We coerce here to align with the spec |
| // https://github.com/tc39/proposal-iterator-helpers/issues/169 |
| number = Number(number); |
| if (NumberIsNaN(number)) { |
| return 0 |
| } |
| if (number < 0) { |
| throw new ERR_OUT_OF_RANGE('number', '>= 0', number) |
| } |
| return number |
| } |
| function drop(number, options = undefined) { |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| number = toIntegerOrInfinity(number); |
| return async function* drop() { |
| var _options$signal8; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal8 = options.signal) !== null && |
| _options$signal8 !== undefined && |
| _options$signal8.aborted |
| ) { |
| throw new AbortError() |
| } |
| for await (const val of this) { |
| var _options$signal9; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal9 = options.signal) !== null && |
| _options$signal9 !== undefined && |
| _options$signal9.aborted |
| ) { |
| throw new AbortError() |
| } |
| if (number-- <= 0) { |
| yield val; |
| } |
| } |
| }.call(this) |
| } |
| function take(number, options = undefined) { |
| if (options != null) { |
| validateObject(options, 'options'); |
| } |
| if ((options === null || options === undefined ? undefined : options.signal) != null) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| } |
| number = toIntegerOrInfinity(number); |
| return async function* take() { |
| var _options$signal10; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal10 = options.signal) !== null && |
| _options$signal10 !== undefined && |
| _options$signal10.aborted |
| ) { |
| throw new AbortError() |
| } |
| for await (const val of this) { |
| var _options$signal11; |
| if ( |
| options !== null && |
| options !== undefined && |
| (_options$signal11 = options.signal) !== null && |
| _options$signal11 !== undefined && |
| _options$signal11.aborted |
| ) { |
| throw new AbortError() |
| } |
| if (number-- > 0) { |
| yield val; |
| } else { |
| return |
| } |
| } |
| }.call(this) |
| } |
| operators.streamReturningOperators = { |
| asIndexedPairs, |
| drop, |
| filter, |
| flatMap, |
| map, |
| take |
| }; |
| operators.promiseReturningOperators = { |
| every, |
| forEach, |
| reduce, |
| toArray, |
| some, |
| find |
| }; |
| return operators; |
| } |
| |
| var destroy_1; |
| var hasRequiredDestroy; |
| |
| function requireDestroy () { |
| if (hasRequiredDestroy) return destroy_1; |
| hasRequiredDestroy = 1; |
| |
| /* replacement start */ |
| |
| const process = requireProcess(); |
| |
| /* replacement end */ |
| |
| const { |
| aggregateTwoErrors, |
| codes: { ERR_MULTIPLE_CALLBACK }, |
| AbortError |
| } = requireErrors(); |
| const { Symbol } = requirePrimordials(); |
| const { kDestroyed, isDestroyed, isFinished, isServerRequest } = requireUtils(); |
| const kDestroy = Symbol('kDestroy'); |
| const kConstruct = Symbol('kConstruct'); |
| function checkError(err, w, r) { |
| if (err) { |
| // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 |
| err.stack; // eslint-disable-line no-unused-expressions |
| |
| if (w && !w.errored) { |
| w.errored = err; |
| } |
| if (r && !r.errored) { |
| r.errored = err; |
| } |
| } |
| } |
| |
| // Backwards compat. cb() is undocumented and unused in core but |
| // unfortunately might be used by modules. |
| function destroy(err, cb) { |
| const r = this._readableState; |
| const w = this._writableState; |
| // With duplex streams we use the writable side for state. |
| const s = w || r; |
| if ((w && w.destroyed) || (r && r.destroyed)) { |
| if (typeof cb === 'function') { |
| cb(); |
| } |
| return this |
| } |
| |
| // We set destroyed to true before firing error callbacks in order |
| // to make it re-entrance safe in case destroy() is called within callbacks |
| checkError(err, w, r); |
| if (w) { |
| w.destroyed = true; |
| } |
| if (r) { |
| r.destroyed = true; |
| } |
| |
| // If still constructing then defer calling _destroy. |
| if (!s.constructed) { |
| this.once(kDestroy, function (er) { |
| _destroy(this, aggregateTwoErrors(er, err), cb); |
| }); |
| } else { |
| _destroy(this, err, cb); |
| } |
| return this |
| } |
| function _destroy(self, err, cb) { |
| let called = false; |
| function onDestroy(err) { |
| if (called) { |
| return |
| } |
| called = true; |
| const r = self._readableState; |
| const w = self._writableState; |
| checkError(err, w, r); |
| if (w) { |
| w.closed = true; |
| } |
| if (r) { |
| r.closed = true; |
| } |
| if (typeof cb === 'function') { |
| cb(err); |
| } |
| if (err) { |
| process.nextTick(emitErrorCloseNT, self, err); |
| } else { |
| process.nextTick(emitCloseNT, self); |
| } |
| } |
| try { |
| self._destroy(err || null, onDestroy); |
| } catch (err) { |
| onDestroy(err); |
| } |
| } |
| function emitErrorCloseNT(self, err) { |
| emitErrorNT(self, err); |
| emitCloseNT(self); |
| } |
| function emitCloseNT(self) { |
| const r = self._readableState; |
| const w = self._writableState; |
| if (w) { |
| w.closeEmitted = true; |
| } |
| if (r) { |
| r.closeEmitted = true; |
| } |
| if ((w && w.emitClose) || (r && r.emitClose)) { |
| self.emit('close'); |
| } |
| } |
| function emitErrorNT(self, err) { |
| const r = self._readableState; |
| const w = self._writableState; |
| if ((w && w.errorEmitted) || (r && r.errorEmitted)) { |
| return |
| } |
| if (w) { |
| w.errorEmitted = true; |
| } |
| if (r) { |
| r.errorEmitted = true; |
| } |
| self.emit('error', err); |
| } |
| function undestroy() { |
| const r = this._readableState; |
| const w = this._writableState; |
| if (r) { |
| r.constructed = true; |
| r.closed = false; |
| r.closeEmitted = false; |
| r.destroyed = false; |
| r.errored = null; |
| r.errorEmitted = false; |
| r.reading = false; |
| r.ended = r.readable === false; |
| r.endEmitted = r.readable === false; |
| } |
| if (w) { |
| w.constructed = true; |
| w.destroyed = false; |
| w.closed = false; |
| w.closeEmitted = false; |
| w.errored = null; |
| w.errorEmitted = false; |
| w.finalCalled = false; |
| w.prefinished = false; |
| w.ended = w.writable === false; |
| w.ending = w.writable === false; |
| w.finished = w.writable === false; |
| } |
| } |
| function errorOrDestroy(stream, err, sync) { |
| // We have tests that rely on errors being emitted |
| // in the same tick, so changing this is semver major. |
| // For now when you opt-in to autoDestroy we allow |
| // the error to be emitted nextTick. In a future |
| // semver major update we should change the default to this. |
| |
| const r = stream._readableState; |
| const w = stream._writableState; |
| if ((w && w.destroyed) || (r && r.destroyed)) { |
| return this |
| } |
| if ((r && r.autoDestroy) || (w && w.autoDestroy)) stream.destroy(err); |
| else if (err) { |
| // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 |
| err.stack; // eslint-disable-line no-unused-expressions |
| |
| if (w && !w.errored) { |
| w.errored = err; |
| } |
| if (r && !r.errored) { |
| r.errored = err; |
| } |
| if (sync) { |
| process.nextTick(emitErrorNT, stream, err); |
| } else { |
| emitErrorNT(stream, err); |
| } |
| } |
| } |
| function construct(stream, cb) { |
| if (typeof stream._construct !== 'function') { |
| return |
| } |
| const r = stream._readableState; |
| const w = stream._writableState; |
| if (r) { |
| r.constructed = false; |
| } |
| if (w) { |
| w.constructed = false; |
| } |
| stream.once(kConstruct, cb); |
| if (stream.listenerCount(kConstruct) > 1) { |
| // Duplex |
| return |
| } |
| process.nextTick(constructNT, stream); |
| } |
| function constructNT(stream) { |
| let called = false; |
| function onConstruct(err) { |
| if (called) { |
| errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK()); |
| return |
| } |
| called = true; |
| const r = stream._readableState; |
| const w = stream._writableState; |
| const s = w || r; |
| if (r) { |
| r.constructed = true; |
| } |
| if (w) { |
| w.constructed = true; |
| } |
| if (s.destroyed) { |
| stream.emit(kDestroy, err); |
| } else if (err) { |
| errorOrDestroy(stream, err, true); |
| } else { |
| process.nextTick(emitConstructNT, stream); |
| } |
| } |
| try { |
| stream._construct(onConstruct); |
| } catch (err) { |
| onConstruct(err); |
| } |
| } |
| function emitConstructNT(stream) { |
| stream.emit(kConstruct); |
| } |
| function isRequest(stream) { |
| return stream && stream.setHeader && typeof stream.abort === 'function' |
| } |
| function emitCloseLegacy(stream) { |
| stream.emit('close'); |
| } |
| function emitErrorCloseLegacy(stream, err) { |
| stream.emit('error', err); |
| process.nextTick(emitCloseLegacy, stream); |
| } |
| |
| // Normalize destroy for legacy. |
| function destroyer(stream, err) { |
| if (!stream || isDestroyed(stream)) { |
| return |
| } |
| if (!err && !isFinished(stream)) { |
| err = new AbortError(); |
| } |
| |
| // TODO: Remove isRequest branches. |
| if (isServerRequest(stream)) { |
| stream.socket = null; |
| stream.destroy(err); |
| } else if (isRequest(stream)) { |
| stream.abort(); |
| } else if (isRequest(stream.req)) { |
| stream.req.abort(); |
| } else if (typeof stream.destroy === 'function') { |
| stream.destroy(err); |
| } else if (typeof stream.close === 'function') { |
| // TODO: Don't lose err? |
| stream.close(); |
| } else if (err) { |
| process.nextTick(emitErrorCloseLegacy, stream, err); |
| } else { |
| process.nextTick(emitCloseLegacy, stream); |
| } |
| if (!stream.destroyed) { |
| stream[kDestroyed] = true; |
| } |
| } |
| destroy_1 = { |
| construct, |
| destroyer, |
| destroy, |
| undestroy, |
| errorOrDestroy |
| }; |
| return destroy_1; |
| } |
| |
| var legacy; |
| var hasRequiredLegacy; |
| |
| function requireLegacy () { |
| if (hasRequiredLegacy) return legacy; |
| hasRequiredLegacy = 1; |
| |
| const { ArrayIsArray, ObjectSetPrototypeOf } = requirePrimordials(); |
| const { EventEmitter: EE } = require$$2; |
| function Stream(opts) { |
| EE.call(this, opts); |
| } |
| ObjectSetPrototypeOf(Stream.prototype, EE.prototype); |
| ObjectSetPrototypeOf(Stream, EE); |
| Stream.prototype.pipe = function (dest, options) { |
| const source = this; |
| function ondata(chunk) { |
| if (dest.writable && dest.write(chunk) === false && source.pause) { |
| source.pause(); |
| } |
| } |
| source.on('data', ondata); |
| function ondrain() { |
| if (source.readable && source.resume) { |
| source.resume(); |
| } |
| } |
| dest.on('drain', ondrain); |
| |
| // If the 'end' option is not supplied, dest.end() will be called when |
| // source gets the 'end' or 'close' events. Only dest.end() once. |
| if (!dest._isStdio && (!options || options.end !== false)) { |
| source.on('end', onend); |
| source.on('close', onclose); |
| } |
| let didOnEnd = false; |
| function onend() { |
| if (didOnEnd) return |
| didOnEnd = true; |
| dest.end(); |
| } |
| function onclose() { |
| if (didOnEnd) return |
| didOnEnd = true; |
| if (typeof dest.destroy === 'function') dest.destroy(); |
| } |
| |
| // Don't leave dangling pipes when there are errors. |
| function onerror(er) { |
| cleanup(); |
| if (EE.listenerCount(this, 'error') === 0) { |
| this.emit('error', er); |
| } |
| } |
| prependListener(source, 'error', onerror); |
| prependListener(dest, 'error', onerror); |
| |
| // Remove all the event listeners that were added. |
| function cleanup() { |
| source.removeListener('data', ondata); |
| dest.removeListener('drain', ondrain); |
| source.removeListener('end', onend); |
| source.removeListener('close', onclose); |
| source.removeListener('error', onerror); |
| dest.removeListener('error', onerror); |
| source.removeListener('end', cleanup); |
| source.removeListener('close', cleanup); |
| dest.removeListener('close', cleanup); |
| } |
| source.on('end', cleanup); |
| source.on('close', cleanup); |
| dest.on('close', cleanup); |
| dest.emit('pipe', source); |
| |
| // Allow for unix-like usage: A.pipe(B).pipe(C) |
| return dest |
| }; |
| function prependListener(emitter, event, fn) { |
| // Sadly this is not cacheable as some libraries bundle their own |
| // event emitter implementation with them. |
| if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn) |
| |
| // This is a hack to make sure that our error handler is attached before any |
| // userland ones. NEVER DO THIS. This is here only because this code needs |
| // to continue to work with older versions of Node.js that do not include |
| // the prependListener() method. The goal is to eventually remove this hack. |
| if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); |
| else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn); |
| else emitter._events[event] = [fn, emitter._events[event]]; |
| } |
| legacy = { |
| Stream, |
| prependListener |
| }; |
| return legacy; |
| } |
| |
| var addAbortSignal = {exports: {}}; |
| |
| var hasRequiredAddAbortSignal; |
| |
| function requireAddAbortSignal () { |
| if (hasRequiredAddAbortSignal) return addAbortSignal.exports; |
| hasRequiredAddAbortSignal = 1; |
| (function (module) { |
| |
| const { AbortError, codes } = requireErrors(); |
| const eos = requireEndOfStream(); |
| const { ERR_INVALID_ARG_TYPE } = codes; |
| |
| // This method is inlined here for readable-stream |
| // It also does not allow for signal to not exist on the stream |
| // https://github.com/nodejs/node/pull/36061#discussion_r533718029 |
| const validateAbortSignal = (signal, name) => { |
| if (typeof signal !== 'object' || !('aborted' in signal)) { |
| throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal) |
| } |
| }; |
| function isNodeStream(obj) { |
| return !!(obj && typeof obj.pipe === 'function') |
| } |
| module.exports.addAbortSignal = function addAbortSignal(signal, stream) { |
| validateAbortSignal(signal, 'signal'); |
| if (!isNodeStream(stream)) { |
| throw new ERR_INVALID_ARG_TYPE('stream', 'stream.Stream', stream) |
| } |
| return module.exports.addAbortSignalNoValidate(signal, stream) |
| }; |
| module.exports.addAbortSignalNoValidate = function (signal, stream) { |
| if (typeof signal !== 'object' || !('aborted' in signal)) { |
| return stream |
| } |
| const onAbort = () => { |
| stream.destroy( |
| new AbortError(undefined, { |
| cause: signal.reason |
| }) |
| ); |
| }; |
| if (signal.aborted) { |
| onAbort(); |
| } else { |
| signal.addEventListener('abort', onAbort); |
| eos(stream, () => signal.removeEventListener('abort', onAbort)); |
| } |
| return stream |
| }; |
| } (addAbortSignal)); |
| return addAbortSignal.exports; |
| } |
| |
| var buffer_list; |
| var hasRequiredBuffer_list; |
| |
| function requireBuffer_list () { |
| if (hasRequiredBuffer_list) return buffer_list; |
| hasRequiredBuffer_list = 1; |
| |
| const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = requirePrimordials(); |
| const { Buffer } = require$$0; |
| const { inspect } = requireUtil(); |
| buffer_list = class BufferList { |
| constructor() { |
| this.head = null; |
| this.tail = null; |
| this.length = 0; |
| } |
| push(v) { |
| const entry = { |
| data: v, |
| next: null |
| }; |
| if (this.length > 0) this.tail.next = entry; |
| else this.head = entry; |
| this.tail = entry; |
| ++this.length; |
| } |
| unshift(v) { |
| const entry = { |
| data: v, |
| next: this.head |
| }; |
| if (this.length === 0) this.tail = entry; |
| this.head = entry; |
| ++this.length; |
| } |
| shift() { |
| if (this.length === 0) return |
| const ret = this.head.data; |
| if (this.length === 1) this.head = this.tail = null; |
| else this.head = this.head.next; |
| --this.length; |
| return ret |
| } |
| clear() { |
| this.head = this.tail = null; |
| this.length = 0; |
| } |
| join(s) { |
| if (this.length === 0) return '' |
| let p = this.head; |
| let ret = '' + p.data; |
| while ((p = p.next) !== null) ret += s + p.data; |
| return ret |
| } |
| concat(n) { |
| if (this.length === 0) return Buffer.alloc(0) |
| const ret = Buffer.allocUnsafe(n >>> 0); |
| let p = this.head; |
| let i = 0; |
| while (p) { |
| TypedArrayPrototypeSet(ret, p.data, i); |
| i += p.data.length; |
| p = p.next; |
| } |
| return ret |
| } |
| |
| // Consumes a specified amount of bytes or characters from the buffered data. |
| consume(n, hasStrings) { |
| const data = this.head.data; |
| if (n < data.length) { |
| // `slice` is the same for buffers and strings. |
| const slice = data.slice(0, n); |
| this.head.data = data.slice(n); |
| return slice |
| } |
| if (n === data.length) { |
| // First chunk is a perfect match. |
| return this.shift() |
| } |
| // Result spans more than one buffer. |
| return hasStrings ? this._getString(n) : this._getBuffer(n) |
| } |
| first() { |
| return this.head.data |
| } |
| *[SymbolIterator]() { |
| for (let p = this.head; p; p = p.next) { |
| yield p.data; |
| } |
| } |
| |
| // Consumes a specified amount of characters from the buffered data. |
| _getString(n) { |
| let ret = ''; |
| let p = this.head; |
| let c = 0; |
| do { |
| const str = p.data; |
| if (n > str.length) { |
| ret += str; |
| n -= str.length; |
| } else { |
| if (n === str.length) { |
| ret += str; |
| ++c; |
| if (p.next) this.head = p.next; |
| else this.head = this.tail = null; |
| } else { |
| ret += StringPrototypeSlice(str, 0, n); |
| this.head = p; |
| p.data = StringPrototypeSlice(str, n); |
| } |
| break |
| } |
| ++c; |
| } while ((p = p.next) !== null) |
| this.length -= c; |
| return ret |
| } |
| |
| // Consumes a specified amount of bytes from the buffered data. |
| _getBuffer(n) { |
| const ret = Buffer.allocUnsafe(n); |
| const retLen = n; |
| let p = this.head; |
| let c = 0; |
| do { |
| const buf = p.data; |
| if (n > buf.length) { |
| TypedArrayPrototypeSet(ret, buf, retLen - n); |
| n -= buf.length; |
| } else { |
| if (n === buf.length) { |
| TypedArrayPrototypeSet(ret, buf, retLen - n); |
| ++c; |
| if (p.next) this.head = p.next; |
| else this.head = this.tail = null; |
| } else { |
| TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n); |
| this.head = p; |
| p.data = buf.slice(n); |
| } |
| break |
| } |
| ++c; |
| } while ((p = p.next) !== null) |
| this.length -= c; |
| return ret |
| } |
| |
| // Make sure the linked list only shows the minimal necessary information. |
| [Symbol.for('nodejs.util.inspect.custom')](_, options) { |
| return inspect(this, { |
| ...options, |
| // Only inspect one level. |
| depth: 0, |
| // It should not recurse. |
| customInspect: false |
| }) |
| } |
| }; |
| return buffer_list; |
| } |
| |
| var state; |
| var hasRequiredState; |
| |
| function requireState () { |
| if (hasRequiredState) return state; |
| hasRequiredState = 1; |
| |
| const { MathFloor, NumberIsInteger } = requirePrimordials(); |
| const { ERR_INVALID_ARG_VALUE } = requireErrors().codes; |
| function highWaterMarkFrom(options, isDuplex, duplexKey) { |
| return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null |
| } |
| function getDefaultHighWaterMark(objectMode) { |
| return objectMode ? 16 : 16 * 1024 |
| } |
| function getHighWaterMark(state, options, duplexKey, isDuplex) { |
| const hwm = highWaterMarkFrom(options, isDuplex, duplexKey); |
| if (hwm != null) { |
| if (!NumberIsInteger(hwm) || hwm < 0) { |
| const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark'; |
| throw new ERR_INVALID_ARG_VALUE(name, hwm) |
| } |
| return MathFloor(hwm) |
| } |
| |
| // Default value |
| return getDefaultHighWaterMark(state.objectMode) |
| } |
| state = { |
| getHighWaterMark, |
| getDefaultHighWaterMark |
| }; |
| return state; |
| } |
| |
| var from_1; |
| var hasRequiredFrom; |
| |
| function requireFrom () { |
| if (hasRequiredFrom) return from_1; |
| hasRequiredFrom = 1; |
| |
| /* replacement start */ |
| |
| const process = requireProcess(); |
| |
| /* replacement end */ |
| |
| const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = requirePrimordials(); |
| const { Buffer } = require$$0; |
| const { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = requireErrors().codes; |
| function from(Readable, iterable, opts) { |
| let iterator; |
| if (typeof iterable === 'string' || iterable instanceof Buffer) { |
| return new Readable({ |
| objectMode: true, |
| ...opts, |
| read() { |
| this.push(iterable); |
| this.push(null); |
| } |
| }) |
| } |
| let isAsync; |
| if (iterable && iterable[SymbolAsyncIterator]) { |
| isAsync = true; |
| iterator = iterable[SymbolAsyncIterator](); |
| } else if (iterable && iterable[SymbolIterator]) { |
| isAsync = false; |
| iterator = iterable[SymbolIterator](); |
| } else { |
| throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable) |
| } |
| const readable = new Readable({ |
| objectMode: true, |
| highWaterMark: 1, |
| // TODO(ronag): What options should be allowed? |
| ...opts |
| }); |
| |
| // Flag to protect against _read |
| // being called before last iteration completion. |
| let reading = false; |
| readable._read = function () { |
| if (!reading) { |
| reading = true; |
| next(); |
| } |
| }; |
| readable._destroy = function (error, cb) { |
| PromisePrototypeThen( |
| close(error), |
| () => process.nextTick(cb, error), |
| // nextTick is here in case cb throws |
| (e) => process.nextTick(cb, e || error) |
| ); |
| }; |
| async function close(error) { |
| const hadError = error !== undefined && error !== null; |
| const hasThrow = typeof iterator.throw === 'function'; |
| if (hadError && hasThrow) { |
| const { value, done } = await iterator.throw(error); |
| await value; |
| if (done) { |
| return |
| } |
| } |
| if (typeof iterator.return === 'function') { |
| const { value } = await iterator.return(); |
| await value; |
| } |
| } |
| async function next() { |
| for (;;) { |
| try { |
| const { value, done } = isAsync ? await iterator.next() : iterator.next(); |
| if (done) { |
| readable.push(null); |
| } else { |
| const res = value && typeof value.then === 'function' ? await value : value; |
| if (res === null) { |
| reading = false; |
| throw new ERR_STREAM_NULL_VALUES() |
| } else if (readable.push(res)) { |
| continue |
| } else { |
| reading = false; |
| } |
| } |
| } catch (err) { |
| readable.destroy(err); |
| } |
| break |
| } |
| } |
| return readable |
| } |
| from_1 = from; |
| return from_1; |
| } |
| |
| /* replacement start */ |
| |
| var readable; |
| var hasRequiredReadable; |
| |
| function requireReadable () { |
| if (hasRequiredReadable) return readable; |
| hasRequiredReadable = 1; |
| const process = requireProcess() |
| |
| /* replacement end */ |
| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // 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. |
| |
| ; const { |
| ArrayPrototypeIndexOf, |
| NumberIsInteger, |
| NumberIsNaN, |
| NumberParseInt, |
| ObjectDefineProperties, |
| ObjectKeys, |
| ObjectSetPrototypeOf, |
| Promise, |
| SafeSet, |
| SymbolAsyncIterator, |
| Symbol |
| } = requirePrimordials(); |
| readable = Readable; |
| Readable.ReadableState = ReadableState; |
| const { EventEmitter: EE } = require$$2; |
| const { Stream, prependListener } = requireLegacy(); |
| const { Buffer } = require$$0; |
| const { addAbortSignal } = requireAddAbortSignal(); |
| const eos = requireEndOfStream(); |
| let debug = requireUtil().debuglog('stream', (fn) => { |
| debug = fn; |
| }); |
| const BufferList = requireBuffer_list(); |
| const destroyImpl = requireDestroy(); |
| const { getHighWaterMark, getDefaultHighWaterMark } = requireState(); |
| const { |
| aggregateTwoErrors, |
| codes: { |
| ERR_INVALID_ARG_TYPE, |
| ERR_METHOD_NOT_IMPLEMENTED, |
| ERR_OUT_OF_RANGE, |
| ERR_STREAM_PUSH_AFTER_EOF, |
| ERR_STREAM_UNSHIFT_AFTER_END_EVENT |
| } |
| } = requireErrors(); |
| const { validateObject } = requireValidators(); |
| const kPaused = Symbol('kPaused'); |
| const { StringDecoder } = require$$13; |
| const from = requireFrom(); |
| ObjectSetPrototypeOf(Readable.prototype, Stream.prototype); |
| ObjectSetPrototypeOf(Readable, Stream); |
| const nop = () => {}; |
| const { errorOrDestroy } = destroyImpl; |
| function ReadableState(options, stream, isDuplex) { |
| // Duplex streams are both readable and writable, but share |
| // the same options object. |
| // However, some cases require setting options to different |
| // values for the readable and the writable sides of the duplex stream. |
| // These options can be provided separately as readableXXX and writableXXX. |
| if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex(); |
| |
| // Object stream flag. Used to make read(n) ignore n and to |
| // make all the buffer merging and length checks go away. |
| this.objectMode = !!(options && options.objectMode); |
| if (isDuplex) this.objectMode = this.objectMode || !!(options && options.readableObjectMode); |
| |
| // The point at which it stops calling _read() to fill the buffer |
| // Note: 0 is a valid value, means "don't call _read preemptively ever" |
| this.highWaterMark = options |
| ? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex) |
| : getDefaultHighWaterMark(false); |
| |
| // A linked list is used to store data chunks instead of an array because the |
| // linked list can remove elements from the beginning faster than |
| // array.shift(). |
| this.buffer = new BufferList(); |
| this.length = 0; |
| this.pipes = []; |
| this.flowing = null; |
| this.ended = false; |
| this.endEmitted = false; |
| this.reading = false; |
| |
| // Stream is still being constructed and cannot be |
| // destroyed until construction finished or failed. |
| // Async construction is opt in, therefore we start as |
| // constructed. |
| this.constructed = true; |
| |
| // A flag to be able to tell if the event 'readable'/'data' is emitted |
| // immediately, or on a later tick. We set this to true at first, because |
| // any actions that shouldn't happen until "later" should generally also |
| // not happen before the first read call. |
| this.sync = true; |
| |
| // Whenever we return null, then we set a flag to say |
| // that we're awaiting a 'readable' event emission. |
| this.needReadable = false; |
| this.emittedReadable = false; |
| this.readableListening = false; |
| this.resumeScheduled = false; |
| this[kPaused] = null; |
| |
| // True if the error was already emitted and should not be thrown again. |
| this.errorEmitted = false; |
| |
| // Should close be emitted on destroy. Defaults to true. |
| this.emitClose = !options || options.emitClose !== false; |
| |
| // Should .destroy() be called after 'end' (and potentially 'finish'). |
| this.autoDestroy = !options || options.autoDestroy !== false; |
| |
| // Has it been destroyed. |
| this.destroyed = false; |
| |
| // Indicates whether the stream has errored. When true no further |
| // _read calls, 'data' or 'readable' events should occur. This is needed |
| // since when autoDestroy is disabled we need a way to tell whether the |
| // stream has failed. |
| this.errored = null; |
| |
| // Indicates whether the stream has finished destroying. |
| this.closed = false; |
| |
| // True if close has been emitted or would have been emitted |
| // depending on emitClose. |
| this.closeEmitted = false; |
| |
| // Crypto is kind of old and crusty. Historically, its default string |
| // encoding is 'binary' so we have to make this configurable. |
| // Everything else in the universe uses 'utf8', though. |
| this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'; |
| |
| // Ref the piped dest which we need a drain event on it |
| // type: null | Writable | Set<Writable>. |
| this.awaitDrainWriters = null; |
| this.multiAwaitDrain = false; |
| |
| // If true, a maybeReadMore has been scheduled. |
| this.readingMore = false; |
| this.dataEmitted = false; |
| this.decoder = null; |
| this.encoding = null; |
| if (options && options.encoding) { |
| this.decoder = new StringDecoder(options.encoding); |
| this.encoding = options.encoding; |
| } |
| } |
| function Readable(options) { |
| if (!(this instanceof Readable)) return new Readable(options) |
| |
| // Checking for a Stream.Duplex instance is faster here instead of inside |
| // the ReadableState constructor, at least with V8 6.5. |
| const isDuplex = this instanceof requireDuplex(); |
| this._readableState = new ReadableState(options, this, isDuplex); |
| if (options) { |
| if (typeof options.read === 'function') this._read = options.read; |
| if (typeof options.destroy === 'function') this._destroy = options.destroy; |
| if (typeof options.construct === 'function') this._construct = options.construct; |
| if (options.signal && !isDuplex) addAbortSignal(options.signal, this); |
| } |
| Stream.call(this, options); |
| destroyImpl.construct(this, () => { |
| if (this._readableState.needReadable) { |
| maybeReadMore(this, this._readableState); |
| } |
| }); |
| } |
| Readable.prototype.destroy = destroyImpl.destroy; |
| Readable.prototype._undestroy = destroyImpl.undestroy; |
| Readable.prototype._destroy = function (err, cb) { |
| cb(err); |
| }; |
| Readable.prototype[EE.captureRejectionSymbol] = function (err) { |
| this.destroy(err); |
| }; |
| |
| // Manually shove something into the read() buffer. |
| // This returns true if the highWaterMark has not been hit yet, |
| // similar to how Writable.write() returns true if you should |
| // write() some more. |
| Readable.prototype.push = function (chunk, encoding) { |
| return readableAddChunk(this, chunk, encoding, false) |
| }; |
| |
| // Unshift should *always* be something directly out of read(). |
| Readable.prototype.unshift = function (chunk, encoding) { |
| return readableAddChunk(this, chunk, encoding, true) |
| }; |
| function readableAddChunk(stream, chunk, encoding, addToFront) { |
| debug('readableAddChunk', chunk); |
| const state = stream._readableState; |
| let err; |
| if (!state.objectMode) { |
| if (typeof chunk === 'string') { |
| encoding = encoding || state.defaultEncoding; |
| if (state.encoding !== encoding) { |
| if (addToFront && state.encoding) { |
| // When unshifting, if state.encoding is set, we have to save |
| // the string in the BufferList with the state encoding. |
| chunk = Buffer.from(chunk, encoding).toString(state.encoding); |
| } else { |
| chunk = Buffer.from(chunk, encoding); |
| encoding = ''; |
| } |
| } |
| } else if (chunk instanceof Buffer) { |
| encoding = ''; |
| } else if (Stream._isUint8Array(chunk)) { |
| chunk = Stream._uint8ArrayToBuffer(chunk); |
| encoding = ''; |
| } else if (chunk != null) { |
| err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); |
| } |
| } |
| if (err) { |
| errorOrDestroy(stream, err); |
| } else if (chunk === null) { |
| state.reading = false; |
| onEofChunk(stream, state); |
| } else if (state.objectMode || (chunk && chunk.length > 0)) { |
| if (addToFront) { |
| if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); |
| else if (state.destroyed || state.errored) return false |
| else addChunk(stream, state, chunk, true); |
| } else if (state.ended) { |
| errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); |
| } else if (state.destroyed || state.errored) { |
| return false |
| } else { |
| state.reading = false; |
| if (state.decoder && !encoding) { |
| chunk = state.decoder.write(chunk); |
| if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false); |
| else maybeReadMore(stream, state); |
| } else { |
| addChunk(stream, state, chunk, false); |
| } |
| } |
| } else if (!addToFront) { |
| state.reading = false; |
| maybeReadMore(stream, state); |
| } |
| |
| // We can push more data if we are below the highWaterMark. |
| // Also, if we have no data yet, we can stand some more bytes. |
| // This is to work around cases where hwm=0, such as the repl. |
| return !state.ended && (state.length < state.highWaterMark || state.length === 0) |
| } |
| function addChunk(stream, state, chunk, addToFront) { |
| if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) { |
| // Use the guard to avoid creating `Set()` repeatedly |
| // when we have multiple pipes. |
| if (state.multiAwaitDrain) { |
| state.awaitDrainWriters.clear(); |
| } else { |
| state.awaitDrainWriters = null; |
| } |
| state.dataEmitted = true; |
| stream.emit('data', chunk); |
| } else { |
| // Update the buffer info. |
| state.length += state.objectMode ? 1 : chunk.length; |
| if (addToFront) state.buffer.unshift(chunk); |
| else state.buffer.push(chunk); |
| if (state.needReadable) emitReadable(stream); |
| } |
| maybeReadMore(stream, state); |
| } |
| Readable.prototype.isPaused = function () { |
| const state = this._readableState; |
| return state[kPaused] === true || state.flowing === false |
| }; |
| |
| // Backwards compatibility. |
| Readable.prototype.setEncoding = function (enc) { |
| const decoder = new StringDecoder(enc); |
| this._readableState.decoder = decoder; |
| // If setEncoding(null), decoder.encoding equals utf8. |
| this._readableState.encoding = this._readableState.decoder.encoding; |
| const buffer = this._readableState.buffer; |
| // Iterate over current buffer to convert already stored Buffers: |
| let content = ''; |
| for (const data of buffer) { |
| content += decoder.write(data); |
| } |
| buffer.clear(); |
| if (content !== '') buffer.push(content); |
| this._readableState.length = content.length; |
| return this |
| }; |
| |
| // Don't raise the hwm > 1GB. |
| const MAX_HWM = 0x40000000; |
| function computeNewHighWaterMark(n) { |
| if (n > MAX_HWM) { |
| throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n) |
| } else { |
| // Get the next highest power of 2 to prevent increasing hwm excessively in |
| // tiny amounts. |
| n--; |
| n |= n >>> 1; |
| n |= n >>> 2; |
| n |= n >>> 4; |
| n |= n >>> 8; |
| n |= n >>> 16; |
| n++; |
| } |
| return n |
| } |
| |
| // This function is designed to be inlinable, so please take care when making |
| // changes to the function body. |
| function howMuchToRead(n, state) { |
| if (n <= 0 || (state.length === 0 && state.ended)) return 0 |
| if (state.objectMode) return 1 |
| if (NumberIsNaN(n)) { |
| // Only flow one buffer at a time. |
| if (state.flowing && state.length) return state.buffer.first().length |
| return state.length |
| } |
| if (n <= state.length) return n |
| return state.ended ? state.length : 0 |
| } |
| |
| // You can override either this method, or the async _read(n) below. |
| Readable.prototype.read = function (n) { |
| debug('read', n); |
| // Same as parseInt(undefined, 10), however V8 7.3 performance regressed |
| // in this scenario, so we are doing it manually. |
| if (n === undefined) { |
| n = NaN; |
| } else if (!NumberIsInteger(n)) { |
| n = NumberParseInt(n, 10); |
| } |
| const state = this._readableState; |
| const nOrig = n; |
| |
| // If we're asking for more than the current hwm, then raise the hwm. |
| if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); |
| if (n !== 0) state.emittedReadable = false; |
| |
| // If we're doing read(0) to trigger a readable event, but we |
| // already have a bunch of data in the buffer, then just trigger |
| // the 'readable' event and move on. |
| if ( |
| n === 0 && |
| state.needReadable && |
| ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended) |
| ) { |
| debug('read: emitReadable', state.length, state.ended); |
| if (state.length === 0 && state.ended) endReadable(this); |
| else emitReadable(this); |
| return null |
| } |
| n = howMuchToRead(n, state); |
| |
| // If we've ended, and we're now clear, then finish it up. |
| if (n === 0 && state.ended) { |
| if (state.length === 0) endReadable(this); |
| return null |
| } |
| |
| // All the actual chunk generation logic needs to be |
| // *below* the call to _read. The reason is that in certain |
| // synthetic stream cases, such as passthrough streams, _read |
| // may be a completely synchronous operation which may change |
| // the state of the read buffer, providing enough data when |
| // before there was *not* enough. |
| // |
| // So, the steps are: |
| // 1. Figure out what the state of things will be after we do |
| // a read from the buffer. |
| // |
| // 2. If that resulting state will trigger a _read, then call _read. |
| // Note that this may be asynchronous, or synchronous. Yes, it is |
| // deeply ugly to write APIs this way, but that still doesn't mean |
| // that the Readable class should behave improperly, as streams are |
| // designed to be sync/async agnostic. |
| // Take note if the _read call is sync or async (ie, if the read call |
| // has returned yet), so that we know whether or not it's safe to emit |
| // 'readable' etc. |
| // |
| // 3. Actually pull the requested chunks out of the buffer and return. |
| |
| // if we need a readable event, then we need to do some reading. |
| let doRead = state.needReadable; |
| debug('need readable', doRead); |
| |
| // If we currently have less than the highWaterMark, then also read some. |
| if (state.length === 0 || state.length - n < state.highWaterMark) { |
| doRead = true; |
| debug('length less than watermark', doRead); |
| } |
| |
| // However, if we've ended, then there's no point, if we're already |
| // reading, then it's unnecessary, if we're constructing we have to wait, |
| // and if we're destroyed or errored, then it's not allowed, |
| if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) { |
| doRead = false; |
| debug('reading, ended or constructing', doRead); |
| } else if (doRead) { |
| debug('do read'); |
| state.reading = true; |
| state.sync = true; |
| // If the length is currently zero, then we *need* a readable event. |
| if (state.length === 0) state.needReadable = true; |
| |
| // Call internal read method |
| try { |
| this._read(state.highWaterMark); |
| } catch (err) { |
| errorOrDestroy(this, err); |
| } |
| state.sync = false; |
| // If _read pushed data synchronously, then `reading` will be false, |
| // and we need to re-evaluate how much data we can return to the user. |
| if (!state.reading) n = howMuchToRead(nOrig, state); |
| } |
| let ret; |
| if (n > 0) ret = fromList(n, state); |
| else ret = null; |
| if (ret === null) { |
| state.needReadable = state.length <= state.highWaterMark; |
| n = 0; |
| } else { |
| state.length -= n; |
| if (state.multiAwaitDrain) { |
| state.awaitDrainWriters.clear(); |
| } else { |
| state.awaitDrainWriters = null; |
| } |
| } |
| if (state.length === 0) { |
| // If we have nothing in the buffer, then we want to know |
| // as soon as we *do* get something into the buffer. |
| if (!state.ended) state.needReadable = true; |
| |
| // If we tried to read() past the EOF, then emit end on the next tick. |
| if (nOrig !== n && state.ended) endReadable(this); |
| } |
| if (ret !== null && !state.errorEmitted && !state.closeEmitted) { |
| state.dataEmitted = true; |
| this.emit('data', ret); |
| } |
| return ret |
| }; |
| function onEofChunk(stream, state) { |
| debug('onEofChunk'); |
| if (state.ended) return |
| if (state.decoder) { |
| const chunk = state.decoder.end(); |
| if (chunk && chunk.length) { |
| state.buffer.push(chunk); |
| state.length += state.objectMode ? 1 : chunk.length; |
| } |
| } |
| state.ended = true; |
| if (state.sync) { |
| // If we are sync, wait until next tick to emit the data. |
| // Otherwise we risk emitting data in the flow() |
| // the readable code triggers during a read() call. |
| emitReadable(stream); |
| } else { |
| // Emit 'readable' now to make sure it gets picked up. |
| state.needReadable = false; |
| state.emittedReadable = true; |
| // We have to emit readable now that we are EOF. Modules |
| // in the ecosystem (e.g. dicer) rely on this event being sync. |
| emitReadable_(stream); |
| } |
| } |
| |
| // Don't emit readable right away in sync mode, because this can trigger |
| // another read() call => stack overflow. This way, it might trigger |
| // a nextTick recursion warning, but that's not so bad. |
| function emitReadable(stream) { |
| const state = stream._readableState; |
| debug('emitReadable', state.needReadable, state.emittedReadable); |
| state.needReadable = false; |
| if (!state.emittedReadable) { |
| debug('emitReadable', state.flowing); |
| state.emittedReadable = true; |
| process.nextTick(emitReadable_, stream); |
| } |
| } |
| function emitReadable_(stream) { |
| const state = stream._readableState; |
| debug('emitReadable_', state.destroyed, state.length, state.ended); |
| if (!state.destroyed && !state.errored && (state.length || state.ended)) { |
| stream.emit('readable'); |
| state.emittedReadable = false; |
| } |
| |
| // The stream needs another readable event if: |
| // 1. It is not flowing, as the flow mechanism will take |
| // care of it. |
| // 2. It is not ended. |
| // 3. It is below the highWaterMark, so we can schedule |
| // another readable later. |
| state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; |
| flow(stream); |
| } |
| |
| // At this point, the user has presumably seen the 'readable' event, |
| // and called read() to consume some data. that may have triggered |
| // in turn another _read(n) call, in which case reading = true if |
| // it's in progress. |
| // However, if we're not ended, or reading, and the length < hwm, |
| // then go ahead and try to read some more preemptively. |
| function maybeReadMore(stream, state) { |
| if (!state.readingMore && state.constructed) { |
| state.readingMore = true; |
| process.nextTick(maybeReadMore_, stream, state); |
| } |
| } |
| function maybeReadMore_(stream, state) { |
| // Attempt to read more data if we should. |
| // |
| // The conditions for reading more data are (one of): |
| // - Not enough data buffered (state.length < state.highWaterMark). The loop |
| // is responsible for filling the buffer with enough data if such data |
| // is available. If highWaterMark is 0 and we are not in the flowing mode |
| // we should _not_ attempt to buffer any extra data. We'll get more data |
| // when the stream consumer calls read() instead. |
| // - No data in the buffer, and the stream is in flowing mode. In this mode |
| // the loop below is responsible for ensuring read() is called. Failing to |
| // call read here would abort the flow and there's no other mechanism for |
| // continuing the flow if the stream consumer has just subscribed to the |
| // 'data' event. |
| // |
| // In addition to the above conditions to keep reading data, the following |
| // conditions prevent the data from being read: |
| // - The stream has ended (state.ended). |
| // - There is already a pending 'read' operation (state.reading). This is a |
| // case where the stream has called the implementation defined _read() |
| // method, but they are processing the call asynchronously and have _not_ |
| // called push() with new data. In this case we skip performing more |
| // read()s. The execution ends in this method again after the _read() ends |
| // up calling push() with more data. |
| while ( |
| !state.reading && |
| !state.ended && |
| (state.length < state.highWaterMark || (state.flowing && state.length === 0)) |
| ) { |
| const len = state.length; |
| debug('maybeReadMore read 0'); |
| stream.read(0); |
| if (len === state.length) |
| // Didn't get any data, stop spinning. |
| break |
| } |
| state.readingMore = false; |
| } |
| |
| // Abstract method. to be overridden in specific implementation classes. |
| // call cb(er, data) where data is <= n in length. |
| // for virtual (non-string, non-buffer) streams, "length" is somewhat |
| // arbitrary, and perhaps not very meaningful. |
| Readable.prototype._read = function (n) { |
| throw new ERR_METHOD_NOT_IMPLEMENTED('_read()') |
| }; |
| Readable.prototype.pipe = function (dest, pipeOpts) { |
| const src = this; |
| const state = this._readableState; |
| if (state.pipes.length === 1) { |
| if (!state.multiAwaitDrain) { |
| state.multiAwaitDrain = true; |
| state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : []); |
| } |
| } |
| state.pipes.push(dest); |
| debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts); |
| const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; |
| const endFn = doEnd ? onend : unpipe; |
| if (state.endEmitted) process.nextTick(endFn); |
| else src.once('end', endFn); |
| dest.on('unpipe', onunpipe); |
| function onunpipe(readable, unpipeInfo) { |
| debug('onunpipe'); |
| if (readable === src) { |
| if (unpipeInfo && unpipeInfo.hasUnpiped === false) { |
| unpipeInfo.hasUnpiped = true; |
| cleanup(); |
| } |
| } |
| } |
| function onend() { |
| debug('onend'); |
| dest.end(); |
| } |
| let ondrain; |
| let cleanedUp = false; |
| function cleanup() { |
| debug('cleanup'); |
| // Cleanup event handlers once the pipe is broken. |
| dest.removeListener('close', onclose); |
| dest.removeListener('finish', onfinish); |
| if (ondrain) { |
| dest.removeListener('drain', ondrain); |
| } |
| dest.removeListener('error', onerror); |
| dest.removeListener('unpipe', onunpipe); |
| src.removeListener('end', onend); |
| src.removeListener('end', unpipe); |
| src.removeListener('data', ondata); |
| cleanedUp = true; |
| |
| // If the reader is waiting for a drain event from this |
| // specific writer, then it would cause it to never start |
| // flowing again. |
| // So, if this is awaiting a drain, then we just call it now. |
| // If we don't know, then assume that we are waiting for one. |
| if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain(); |
| } |
| function pause() { |
| // If the user unpiped during `dest.write()`, it is possible |
| // to get stuck in a permanently paused state if that write |
| // also returned false. |
| // => Check whether `dest` is still a piping destination. |
| if (!cleanedUp) { |
| if (state.pipes.length === 1 && state.pipes[0] === dest) { |
| debug('false write response, pause', 0); |
| state.awaitDrainWriters = dest; |
| state.multiAwaitDrain = false; |
| } else if (state.pipes.length > 1 && state.pipes.includes(dest)) { |
| debug('false write response, pause', state.awaitDrainWriters.size); |
| state.awaitDrainWriters.add(dest); |
| } |
| src.pause(); |
| } |
| if (!ondrain) { |
| // When the dest drains, it reduces the awaitDrain counter |
| // on the source. This would be more elegant with a .once() |
| // handler in flow(), but adding and removing repeatedly is |
| // too slow. |
| ondrain = pipeOnDrain(src, dest); |
| dest.on('drain', ondrain); |
| } |
| } |
| src.on('data', ondata); |
| function ondata(chunk) { |
| debug('ondata'); |
| const ret = dest.write(chunk); |
| debug('dest.write', ret); |
| if (ret === false) { |
| pause(); |
| } |
| } |
| |
| // If the dest has an error, then stop piping into it. |
| // However, don't suppress the throwing behavior for this. |
| function onerror(er) { |
| debug('onerror', er); |
| unpipe(); |
| dest.removeListener('error', onerror); |
| if (dest.listenerCount('error') === 0) { |
| const s = dest._writableState || dest._readableState; |
| if (s && !s.errorEmitted) { |
| // User incorrectly emitted 'error' directly on the stream. |
| errorOrDestroy(dest, er); |
| } else { |
| dest.emit('error', er); |
| } |
| } |
| } |
| |
| // Make sure our error handler is attached before userland ones. |
| prependListener(dest, 'error', onerror); |
| |
| // Both close and finish should trigger unpipe, but only once. |
| function onclose() { |
| dest.removeListener('finish', onfinish); |
| unpipe(); |
| } |
| dest.once('close', onclose); |
| function onfinish() { |
| debug('onfinish'); |
| dest.removeListener('close', onclose); |
| unpipe(); |
| } |
| dest.once('finish', onfinish); |
| function unpipe() { |
| debug('unpipe'); |
| src.unpipe(dest); |
| } |
| |
| // Tell the dest that it's being piped to. |
| dest.emit('pipe', src); |
| |
| // Start the flow if it hasn't been started already. |
| |
| if (dest.writableNeedDrain === true) { |
| if (state.flowing) { |
| pause(); |
| } |
| } else if (!state.flowing) { |
| debug('pipe resume'); |
| src.resume(); |
| } |
| return dest |
| }; |
| function pipeOnDrain(src, dest) { |
| return function pipeOnDrainFunctionResult() { |
| const state = src._readableState; |
| |
| // `ondrain` will call directly, |
| // `this` maybe not a reference to dest, |
| // so we use the real dest here. |
| if (state.awaitDrainWriters === dest) { |
| debug('pipeOnDrain', 1); |
| state.awaitDrainWriters = null; |
| } else if (state.multiAwaitDrain) { |
| debug('pipeOnDrain', state.awaitDrainWriters.size); |
| state.awaitDrainWriters.delete(dest); |
| } |
| if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) { |
| src.resume(); |
| } |
| } |
| } |
| Readable.prototype.unpipe = function (dest) { |
| const state = this._readableState; |
| const unpipeInfo = { |
| hasUnpiped: false |
| }; |
| |
| // If we're not piping anywhere, then do nothing. |
| if (state.pipes.length === 0) return this |
| if (!dest) { |
| // remove all. |
| const dests = state.pipes; |
| state.pipes = []; |
| this.pause(); |
| for (let i = 0; i < dests.length; i++) |
| dests[i].emit('unpipe', this, { |
| hasUnpiped: false |
| }); |
| return this |
| } |
| |
| // Try to find the right one. |
| const index = ArrayPrototypeIndexOf(state.pipes, dest); |
| if (index === -1) return this |
| state.pipes.splice(index, 1); |
| if (state.pipes.length === 0) this.pause(); |
| dest.emit('unpipe', this, unpipeInfo); |
| return this |
| }; |
| |
| // Set up data events if they are asked for |
| // Ensure readable listeners eventually get something. |
| Readable.prototype.on = function (ev, fn) { |
| const res = Stream.prototype.on.call(this, ev, fn); |
| const state = this._readableState; |
| if (ev === 'data') { |
| // Update readableListening so that resume() may be a no-op |
| // a few lines down. This is needed to support once('readable'). |
| state.readableListening = this.listenerCount('readable') > 0; |
| |
| // Try start flowing on next tick if stream isn't explicitly paused. |
| if (state.flowing !== false) this.resume(); |
| } else if (ev === 'readable') { |
| if (!state.endEmitted && !state.readableListening) { |
| state.readableListening = state.needReadable = true; |
| state.flowing = false; |
| state.emittedReadable = false; |
| debug('on readable', state.length, state.reading); |
| if (state.length) { |
| emitReadable(this); |
| } else if (!state.reading) { |
| process.nextTick(nReadingNextTick, this); |
| } |
| } |
| } |
| return res |
| }; |
| Readable.prototype.addListener = Readable.prototype.on; |
| Readable.prototype.removeListener = function (ev, fn) { |
| const res = Stream.prototype.removeListener.call(this, ev, fn); |
| if (ev === 'readable') { |
| // We need to check if there is someone still listening to |
| // readable and reset the state. However this needs to happen |
| // after readable has been emitted but before I/O (nextTick) to |
| // support once('readable', fn) cycles. This means that calling |
| // resume within the same tick will have no |
| // effect. |
| process.nextTick(updateReadableListening, this); |
| } |
| return res |
| }; |
| Readable.prototype.off = Readable.prototype.removeListener; |
| Readable.prototype.removeAllListeners = function (ev) { |
| const res = Stream.prototype.removeAllListeners.apply(this, arguments); |
| if (ev === 'readable' || ev === undefined) { |
| // We need to check if there is someone still listening to |
| // readable and reset the state. However this needs to happen |
| // after readable has been emitted but before I/O (nextTick) to |
| // support once('readable', fn) cycles. This means that calling |
| // resume within the same tick will have no |
| // effect. |
| process.nextTick(updateReadableListening, this); |
| } |
| return res |
| }; |
| function updateReadableListening(self) { |
| const state = self._readableState; |
| state.readableListening = self.listenerCount('readable') > 0; |
| if (state.resumeScheduled && state[kPaused] === false) { |
| // Flowing needs to be set to true now, otherwise |
| // the upcoming resume will not flow. |
| state.flowing = true; |
| |
| // Crude way to check if we should resume. |
| } else if (self.listenerCount('data') > 0) { |
| self.resume(); |
| } else if (!state.readableListening) { |
| state.flowing = null; |
| } |
| } |
| function nReadingNextTick(self) { |
| debug('readable nexttick read 0'); |
| self.read(0); |
| } |
| |
| // pause() and resume() are remnants of the legacy readable stream API |
| // If the user uses them, then switch into old mode. |
| Readable.prototype.resume = function () { |
| const state = this._readableState; |
| if (!state.flowing) { |
| debug('resume'); |
| // We flow only if there is no one listening |
| // for readable, but we still have to call |
| // resume(). |
| state.flowing = !state.readableListening; |
| resume(this, state); |
| } |
| state[kPaused] = false; |
| return this |
| }; |
| function resume(stream, state) { |
| if (!state.resumeScheduled) { |
| state.resumeScheduled = true; |
| process.nextTick(resume_, stream, state); |
| } |
| } |
| function resume_(stream, state) { |
| debug('resume', state.reading); |
| if (!state.reading) { |
| stream.read(0); |
| } |
| state.resumeScheduled = false; |
| stream.emit('resume'); |
| flow(stream); |
| if (state.flowing && !state.reading) stream.read(0); |
| } |
| Readable.prototype.pause = function () { |
| debug('call pause flowing=%j', this._readableState.flowing); |
| if (this._readableState.flowing !== false) { |
| debug('pause'); |
| this._readableState.flowing = false; |
| this.emit('pause'); |
| } |
| this._readableState[kPaused] = true; |
| return this |
| }; |
| function flow(stream) { |
| const state = stream._readableState; |
| debug('flow', state.flowing); |
| while (state.flowing && stream.read() !== null); |
| } |
| |
| // Wrap an old-style stream as the async data source. |
| // This is *not* part of the readable stream interface. |
| // It is an ugly unfortunate mess of history. |
| Readable.prototype.wrap = function (stream) { |
| let paused = false; |
| |
| // TODO (ronag): Should this.destroy(err) emit |
| // 'error' on the wrapped stream? Would require |
| // a static factory method, e.g. Readable.wrap(stream). |
| |
| stream.on('data', (chunk) => { |
| if (!this.push(chunk) && stream.pause) { |
| paused = true; |
| stream.pause(); |
| } |
| }); |
| stream.on('end', () => { |
| this.push(null); |
| }); |
| stream.on('error', (err) => { |
| errorOrDestroy(this, err); |
| }); |
| stream.on('close', () => { |
| this.destroy(); |
| }); |
| stream.on('destroy', () => { |
| this.destroy(); |
| }); |
| this._read = () => { |
| if (paused && stream.resume) { |
| paused = false; |
| stream.resume(); |
| } |
| }; |
| |
| // Proxy all the other methods. Important when wrapping filters and duplexes. |
| const streamKeys = ObjectKeys(stream); |
| for (let j = 1; j < streamKeys.length; j++) { |
| const i = streamKeys[j]; |
| if (this[i] === undefined && typeof stream[i] === 'function') { |
| this[i] = stream[i].bind(stream); |
| } |
| } |
| return this |
| }; |
| Readable.prototype[SymbolAsyncIterator] = function () { |
| return streamToAsyncIterator(this) |
| }; |
| Readable.prototype.iterator = function (options) { |
| if (options !== undefined) { |
| validateObject(options, 'options'); |
| } |
| return streamToAsyncIterator(this, options) |
| }; |
| function streamToAsyncIterator(stream, options) { |
| if (typeof stream.read !== 'function') { |
| stream = Readable.wrap(stream, { |
| objectMode: true |
| }); |
| } |
| const iter = createAsyncIterator(stream, options); |
| iter.stream = stream; |
| return iter |
| } |
| async function* createAsyncIterator(stream, options) { |
| let callback = nop; |
| function next(resolve) { |
| if (this === stream) { |
| callback(); |
| callback = nop; |
| } else { |
| callback = resolve; |
| } |
| } |
| stream.on('readable', next); |
| let error; |
| const cleanup = eos( |
| stream, |
| { |
| writable: false |
| }, |
| (err) => { |
| error = err ? aggregateTwoErrors(error, err) : null; |
| callback(); |
| callback = nop; |
| } |
| ); |
| try { |
| while (true) { |
| const chunk = stream.destroyed ? null : stream.read(); |
| if (chunk !== null) { |
| yield chunk; |
| } else if (error) { |
| throw error |
| } else if (error === null) { |
| return |
| } else { |
| await new Promise(next); |
| } |
| } |
| } catch (err) { |
| error = aggregateTwoErrors(error, err); |
| throw error |
| } finally { |
| if ( |
| (error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) && |
| (error === undefined || stream._readableState.autoDestroy) |
| ) { |
| destroyImpl.destroyer(stream, null); |
| } else { |
| stream.off('readable', next); |
| cleanup(); |
| } |
| } |
| } |
| |
| // Making it explicit these properties are not enumerable |
| // because otherwise some prototype manipulation in |
| // userland will fail. |
| ObjectDefineProperties(Readable.prototype, { |
| readable: { |
| __proto__: null, |
| get() { |
| const r = this._readableState; |
| // r.readable === false means that this is part of a Duplex stream |
| // where the readable side was disabled upon construction. |
| // Compat. The user might manually disable readable side through |
| // deprecated setter. |
| return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted |
| }, |
| set(val) { |
| // Backwards compat. |
| if (this._readableState) { |
| this._readableState.readable = !!val; |
| } |
| } |
| }, |
| readableDidRead: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return this._readableState.dataEmitted |
| } |
| }, |
| readableAborted: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return !!( |
| this._readableState.readable !== false && |
| (this._readableState.destroyed || this._readableState.errored) && |
| !this._readableState.endEmitted |
| ) |
| } |
| }, |
| readableHighWaterMark: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return this._readableState.highWaterMark |
| } |
| }, |
| readableBuffer: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return this._readableState && this._readableState.buffer |
| } |
| }, |
| readableFlowing: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return this._readableState.flowing |
| }, |
| set: function (state) { |
| if (this._readableState) { |
| this._readableState.flowing = state; |
| } |
| } |
| }, |
| readableLength: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState.length |
| } |
| }, |
| readableObjectMode: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState ? this._readableState.objectMode : false |
| } |
| }, |
| readableEncoding: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState ? this._readableState.encoding : null |
| } |
| }, |
| errored: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState ? this._readableState.errored : null |
| } |
| }, |
| closed: { |
| __proto__: null, |
| get() { |
| return this._readableState ? this._readableState.closed : false |
| } |
| }, |
| destroyed: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState ? this._readableState.destroyed : false |
| }, |
| set(value) { |
| // We ignore the value if the stream |
| // has not been initialized yet. |
| if (!this._readableState) { |
| return |
| } |
| |
| // Backward compatibility, the user is explicitly |
| // managing destroyed. |
| this._readableState.destroyed = value; |
| } |
| }, |
| readableEnded: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._readableState ? this._readableState.endEmitted : false |
| } |
| } |
| }); |
| ObjectDefineProperties(ReadableState.prototype, { |
| // Legacy getter for `pipesCount`. |
| pipesCount: { |
| __proto__: null, |
| get() { |
| return this.pipes.length |
| } |
| }, |
| // Legacy property for `paused`. |
| paused: { |
| __proto__: null, |
| get() { |
| return this[kPaused] !== false |
| }, |
| set(value) { |
| this[kPaused] = !!value; |
| } |
| } |
| }); |
| |
| // Exposed for testing purposes only. |
| Readable._fromList = fromList; |
| |
| // Pluck off n bytes from an array of buffers. |
| // Length is the combined lengths of all the buffers in the list. |
| // This function is designed to be inlinable, so please take care when making |
| // changes to the function body. |
| function fromList(n, state) { |
| // nothing buffered. |
| if (state.length === 0) return null |
| let ret; |
| if (state.objectMode) ret = state.buffer.shift(); |
| else if (!n || n >= state.length) { |
| // Read it all, truncate the list. |
| if (state.decoder) ret = state.buffer.join(''); |
| else if (state.buffer.length === 1) ret = state.buffer.first(); |
| else ret = state.buffer.concat(state.length); |
| state.buffer.clear(); |
| } else { |
| // read part of list. |
| ret = state.buffer.consume(n, state.decoder); |
| } |
| return ret |
| } |
| function endReadable(stream) { |
| const state = stream._readableState; |
| debug('endReadable', state.endEmitted); |
| if (!state.endEmitted) { |
| state.ended = true; |
| process.nextTick(endReadableNT, state, stream); |
| } |
| } |
| function endReadableNT(state, stream) { |
| debug('endReadableNT', state.endEmitted, state.length); |
| |
| // Check that we didn't get one last unshift. |
| if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) { |
| state.endEmitted = true; |
| stream.emit('end'); |
| if (stream.writable && stream.allowHalfOpen === false) { |
| process.nextTick(endWritableNT, stream); |
| } else if (state.autoDestroy) { |
| // In case of duplex streams we need a way to detect |
| // if the writable side is ready for autoDestroy as well. |
| const wState = stream._writableState; |
| const autoDestroy = |
| !wState || |
| (wState.autoDestroy && |
| // We don't expect the writable to ever 'finish' |
| // if writable is explicitly set to false. |
| (wState.finished || wState.writable === false)); |
| if (autoDestroy) { |
| stream.destroy(); |
| } |
| } |
| } |
| } |
| function endWritableNT(stream) { |
| const writable = stream.writable && !stream.writableEnded && !stream.destroyed; |
| if (writable) { |
| stream.end(); |
| } |
| } |
| Readable.from = function (iterable, opts) { |
| return from(Readable, iterable, opts) |
| }; |
| let webStreamsAdapters; |
| |
| // Lazy to avoid circular references |
| function lazyWebStreams() { |
| if (webStreamsAdapters === undefined) webStreamsAdapters = {}; |
| return webStreamsAdapters |
| } |
| Readable.fromWeb = function (readableStream, options) { |
| return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options) |
| }; |
| Readable.toWeb = function (streamReadable, options) { |
| return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options) |
| }; |
| Readable.wrap = function (src, options) { |
| var _ref, _src$readableObjectMo; |
| return new Readable({ |
| objectMode: |
| (_ref = |
| (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined |
| ? _src$readableObjectMo |
| : src.objectMode) !== null && _ref !== undefined |
| ? _ref |
| : true, |
| ...options, |
| destroy(err, callback) { |
| destroyImpl.destroyer(src, err); |
| callback(err); |
| } |
| }).wrap(src) |
| }; |
| return readable; |
| } |
| |
| /* replacement start */ |
| |
| var writable; |
| var hasRequiredWritable; |
| |
| function requireWritable () { |
| if (hasRequiredWritable) return writable; |
| hasRequiredWritable = 1; |
| const process = requireProcess() |
| |
| /* replacement end */ |
| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // 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. |
| |
| // A bit simpler than readable streams. |
| // Implement an async ._write(chunk, encoding, cb), and it'll handle all |
| // the drain event emission and buffering. |
| |
| ; const { |
| ArrayPrototypeSlice, |
| Error, |
| FunctionPrototypeSymbolHasInstance, |
| ObjectDefineProperty, |
| ObjectDefineProperties, |
| ObjectSetPrototypeOf, |
| StringPrototypeToLowerCase, |
| Symbol, |
| SymbolHasInstance |
| } = requirePrimordials(); |
| writable = Writable; |
| Writable.WritableState = WritableState; |
| const { EventEmitter: EE } = require$$2; |
| const Stream = requireLegacy().Stream; |
| const { Buffer } = require$$0; |
| const destroyImpl = requireDestroy(); |
| const { addAbortSignal } = requireAddAbortSignal(); |
| const { getHighWaterMark, getDefaultHighWaterMark } = requireState(); |
| const { |
| ERR_INVALID_ARG_TYPE, |
| ERR_METHOD_NOT_IMPLEMENTED, |
| ERR_MULTIPLE_CALLBACK, |
| ERR_STREAM_CANNOT_PIPE, |
| ERR_STREAM_DESTROYED, |
| ERR_STREAM_ALREADY_FINISHED, |
| ERR_STREAM_NULL_VALUES, |
| ERR_STREAM_WRITE_AFTER_END, |
| ERR_UNKNOWN_ENCODING |
| } = requireErrors().codes; |
| const { errorOrDestroy } = destroyImpl; |
| ObjectSetPrototypeOf(Writable.prototype, Stream.prototype); |
| ObjectSetPrototypeOf(Writable, Stream); |
| function nop() {} |
| const kOnFinished = Symbol('kOnFinished'); |
| function WritableState(options, stream, isDuplex) { |
| // Duplex streams are both readable and writable, but share |
| // the same options object. |
| // However, some cases require setting options to different |
| // values for the readable and the writable sides of the duplex stream, |
| // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. |
| if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex(); |
| |
| // Object stream flag to indicate whether or not this stream |
| // contains buffers or objects. |
| this.objectMode = !!(options && options.objectMode); |
| if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode); |
| |
| // The point at which write() starts returning false |
| // Note: 0 is a valid value, means that we always return false if |
| // the entire buffer is not flushed immediately on write(). |
| this.highWaterMark = options |
| ? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex) |
| : getDefaultHighWaterMark(false); |
| |
| // if _final has been called. |
| this.finalCalled = false; |
| |
| // drain event flag. |
| this.needDrain = false; |
| // At the start of calling end() |
| this.ending = false; |
| // When end() has been called, and returned. |
| this.ended = false; |
| // When 'finish' is emitted. |
| this.finished = false; |
| |
| // Has it been destroyed |
| this.destroyed = false; |
| |
| // Should we decode strings into buffers before passing to _write? |
| // this is here so that some node-core streams can optimize string |
| // handling at a lower level. |
| const noDecode = !!(options && options.decodeStrings === false); |
| this.decodeStrings = !noDecode; |
| |
| // Crypto is kind of old and crusty. Historically, its default string |
| // encoding is 'binary' so we have to make this configurable. |
| // Everything else in the universe uses 'utf8', though. |
| this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'; |
| |
| // Not an actual buffer we keep track of, but a measurement |
| // of how much we're waiting to get pushed to some underlying |
| // socket or file. |
| this.length = 0; |
| |
| // A flag to see when we're in the middle of a write. |
| this.writing = false; |
| |
| // When true all writes will be buffered until .uncork() call. |
| this.corked = 0; |
| |
| // A flag to be able to tell if the onwrite cb is called immediately, |
| // or on a later tick. We set this to true at first, because any |
| // actions that shouldn't happen until "later" should generally also |
| // not happen before the first write call. |
| this.sync = true; |
| |
| // A flag to know if we're processing previously buffered items, which |
| // may call the _write() callback in the same tick, so that we don't |
| // end up in an overlapped onwrite situation. |
| this.bufferProcessing = false; |
| |
| // The callback that's passed to _write(chunk, cb). |
| this.onwrite = onwrite.bind(undefined, stream); |
| |
| // The callback that the user supplies to write(chunk, encoding, cb). |
| this.writecb = null; |
| |
| // The amount that is being written when _write is called. |
| this.writelen = 0; |
| |
| // Storage for data passed to the afterWrite() callback in case of |
| // synchronous _write() completion. |
| this.afterWriteTickInfo = null; |
| resetBuffer(this); |
| |
| // Number of pending user-supplied write callbacks |
| // this must be 0 before 'finish' can be emitted. |
| this.pendingcb = 0; |
| |
| // Stream is still being constructed and cannot be |
| // destroyed until construction finished or failed. |
| // Async construction is opt in, therefore we start as |
| // constructed. |
| this.constructed = true; |
| |
| // Emit prefinish if the only thing we're waiting for is _write cbs |
| // This is relevant for synchronous Transform streams. |
| this.prefinished = false; |
| |
| // True if the error was already emitted and should not be thrown again. |
| this.errorEmitted = false; |
| |
| // Should close be emitted on destroy. Defaults to true. |
| this.emitClose = !options || options.emitClose !== false; |
| |
| // Should .destroy() be called after 'finish' (and potentially 'end'). |
| this.autoDestroy = !options || options.autoDestroy !== false; |
| |
| // Indicates whether the stream has errored. When true all write() calls |
| // should return false. This is needed since when autoDestroy |
| // is disabled we need a way to tell whether the stream has failed. |
| this.errored = null; |
| |
| // Indicates whether the stream has finished destroying. |
| this.closed = false; |
| |
| // True if close has been emitted or would have been emitted |
| // depending on emitClose. |
| this.closeEmitted = false; |
| this[kOnFinished] = []; |
| } |
| function resetBuffer(state) { |
| state.buffered = []; |
| state.bufferedIndex = 0; |
| state.allBuffers = true; |
| state.allNoop = true; |
| } |
| WritableState.prototype.getBuffer = function getBuffer() { |
| return ArrayPrototypeSlice(this.buffered, this.bufferedIndex) |
| }; |
| ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', { |
| __proto__: null, |
| get() { |
| return this.buffered.length - this.bufferedIndex |
| } |
| }); |
| function Writable(options) { |
| // Writable ctor is applied to Duplexes, too. |
| // `realHasInstance` is necessary because using plain `instanceof` |
| // would return false, as no `_writableState` property is attached. |
| |
| // Trying to use the custom `instanceof` for Writable here will also break the |
| // Node.js LazyTransform implementation, which has a non-trivial getter for |
| // `_writableState` that would lead to infinite recursion. |
| |
| // Checking for a Stream.Duplex instance is faster here instead of inside |
| // the WritableState constructor, at least with V8 6.5. |
| const isDuplex = this instanceof requireDuplex(); |
| if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options) |
| this._writableState = new WritableState(options, this, isDuplex); |
| if (options) { |
| if (typeof options.write === 'function') this._write = options.write; |
| if (typeof options.writev === 'function') this._writev = options.writev; |
| if (typeof options.destroy === 'function') this._destroy = options.destroy; |
| if (typeof options.final === 'function') this._final = options.final; |
| if (typeof options.construct === 'function') this._construct = options.construct; |
| if (options.signal) addAbortSignal(options.signal, this); |
| } |
| Stream.call(this, options); |
| destroyImpl.construct(this, () => { |
| const state = this._writableState; |
| if (!state.writing) { |
| clearBuffer(this, state); |
| } |
| finishMaybe(this, state); |
| }); |
| } |
| ObjectDefineProperty(Writable, SymbolHasInstance, { |
| __proto__: null, |
| value: function (object) { |
| if (FunctionPrototypeSymbolHasInstance(this, object)) return true |
| if (this !== Writable) return false |
| return object && object._writableState instanceof WritableState |
| } |
| }); |
| |
| // Otherwise people can pipe Writable streams, which is just wrong. |
| Writable.prototype.pipe = function () { |
| errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); |
| }; |
| function _write(stream, chunk, encoding, cb) { |
| const state = stream._writableState; |
| if (typeof encoding === 'function') { |
| cb = encoding; |
| encoding = state.defaultEncoding; |
| } else { |
| if (!encoding) encoding = state.defaultEncoding; |
| else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding) |
| if (typeof cb !== 'function') cb = nop; |
| } |
| if (chunk === null) { |
| throw new ERR_STREAM_NULL_VALUES() |
| } else if (!state.objectMode) { |
| if (typeof chunk === 'string') { |
| if (state.decodeStrings !== false) { |
| chunk = Buffer.from(chunk, encoding); |
| encoding = 'buffer'; |
| } |
| } else if (chunk instanceof Buffer) { |
| encoding = 'buffer'; |
| } else if (Stream._isUint8Array(chunk)) { |
| chunk = Stream._uint8ArrayToBuffer(chunk); |
| encoding = 'buffer'; |
| } else { |
| throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk) |
| } |
| } |
| let err; |
| if (state.ending) { |
| err = new ERR_STREAM_WRITE_AFTER_END(); |
| } else if (state.destroyed) { |
| err = new ERR_STREAM_DESTROYED('write'); |
| } |
| if (err) { |
| process.nextTick(cb, err); |
| errorOrDestroy(stream, err, true); |
| return err |
| } |
| state.pendingcb++; |
| return writeOrBuffer(stream, state, chunk, encoding, cb) |
| } |
| Writable.prototype.write = function (chunk, encoding, cb) { |
| return _write(this, chunk, encoding, cb) === true |
| }; |
| Writable.prototype.cork = function () { |
| this._writableState.corked++; |
| }; |
| Writable.prototype.uncork = function () { |
| const state = this._writableState; |
| if (state.corked) { |
| state.corked--; |
| if (!state.writing) clearBuffer(this, state); |
| } |
| }; |
| Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { |
| // node::ParseEncoding() requires lower case. |
| if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding); |
| if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding) |
| this._writableState.defaultEncoding = encoding; |
| return this |
| }; |
| |
| // If we're already writing something, then just put this |
| // in the queue, and wait our turn. Otherwise, call _write |
| // If we return false, then we need a drain event, so set that flag. |
| function writeOrBuffer(stream, state, chunk, encoding, callback) { |
| const len = state.objectMode ? 1 : chunk.length; |
| state.length += len; |
| |
| // stream._write resets state.length |
| const ret = state.length < state.highWaterMark; |
| // We must ensure that previous needDrain will not be reset to false. |
| if (!ret) state.needDrain = true; |
| if (state.writing || state.corked || state.errored || !state.constructed) { |
| state.buffered.push({ |
| chunk, |
| encoding, |
| callback |
| }); |
| if (state.allBuffers && encoding !== 'buffer') { |
| state.allBuffers = false; |
| } |
| if (state.allNoop && callback !== nop) { |
| state.allNoop = false; |
| } |
| } else { |
| state.writelen = len; |
| state.writecb = callback; |
| state.writing = true; |
| state.sync = true; |
| stream._write(chunk, encoding, state.onwrite); |
| state.sync = false; |
| } |
| |
| // Return false if errored or destroyed in order to break |
| // any synchronous while(stream.write(data)) loops. |
| return ret && !state.errored && !state.destroyed |
| } |
| function doWrite(stream, state, writev, len, chunk, encoding, cb) { |
| state.writelen = len; |
| state.writecb = cb; |
| state.writing = true; |
| state.sync = true; |
| if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write')); |
| else if (writev) stream._writev(chunk, state.onwrite); |
| else stream._write(chunk, encoding, state.onwrite); |
| state.sync = false; |
| } |
| function onwriteError(stream, state, er, cb) { |
| --state.pendingcb; |
| cb(er); |
| // Ensure callbacks are invoked even when autoDestroy is |
| // not enabled. Passing `er` here doesn't make sense since |
| // it's related to one specific write, not to the buffered |
| // writes. |
| errorBuffer(state); |
| // This can emit error, but error must always follow cb. |
| errorOrDestroy(stream, er); |
| } |
| function onwrite(stream, er) { |
| const state = stream._writableState; |
| const sync = state.sync; |
| const cb = state.writecb; |
| if (typeof cb !== 'function') { |
| errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK()); |
| return |
| } |
| state.writing = false; |
| state.writecb = null; |
| state.length -= state.writelen; |
| state.writelen = 0; |
| if (er) { |
| // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 |
| er.stack; // eslint-disable-line no-unused-expressions |
| |
| if (!state.errored) { |
| state.errored = er; |
| } |
| |
| // In case of duplex streams we need to notify the readable side of the |
| // error. |
| if (stream._readableState && !stream._readableState.errored) { |
| stream._readableState.errored = er; |
| } |
| if (sync) { |
| process.nextTick(onwriteError, stream, state, er, cb); |
| } else { |
| onwriteError(stream, state, er, cb); |
| } |
| } else { |
| if (state.buffered.length > state.bufferedIndex) { |
| clearBuffer(stream, state); |
| } |
| if (sync) { |
| // It is a common case that the callback passed to .write() is always |
| // the same. In that case, we do not schedule a new nextTick(), but |
| // rather just increase a counter, to improve performance and avoid |
| // memory allocations. |
| if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) { |
| state.afterWriteTickInfo.count++; |
| } else { |
| state.afterWriteTickInfo = { |
| count: 1, |
| cb, |
| stream, |
| state |
| }; |
| process.nextTick(afterWriteTick, state.afterWriteTickInfo); |
| } |
| } else { |
| afterWrite(stream, state, 1, cb); |
| } |
| } |
| } |
| function afterWriteTick({ stream, state, count, cb }) { |
| state.afterWriteTickInfo = null; |
| return afterWrite(stream, state, count, cb) |
| } |
| function afterWrite(stream, state, count, cb) { |
| const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain; |
| if (needDrain) { |
| state.needDrain = false; |
| stream.emit('drain'); |
| } |
| while (count-- > 0) { |
| state.pendingcb--; |
| cb(); |
| } |
| if (state.destroyed) { |
| errorBuffer(state); |
| } |
| finishMaybe(stream, state); |
| } |
| |
| // If there's something in the buffer waiting, then invoke callbacks. |
| function errorBuffer(state) { |
| if (state.writing) { |
| return |
| } |
| for (let n = state.bufferedIndex; n < state.buffered.length; ++n) { |
| var _state$errored; |
| const { chunk, callback } = state.buffered[n]; |
| const len = state.objectMode ? 1 : chunk.length; |
| state.length -= len; |
| callback( |
| (_state$errored = state.errored) !== null && _state$errored !== undefined |
| ? _state$errored |
| : new ERR_STREAM_DESTROYED('write') |
| ); |
| } |
| const onfinishCallbacks = state[kOnFinished].splice(0); |
| for (let i = 0; i < onfinishCallbacks.length; i++) { |
| var _state$errored2; |
| onfinishCallbacks[i]( |
| (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined |
| ? _state$errored2 |
| : new ERR_STREAM_DESTROYED('end') |
| ); |
| } |
| resetBuffer(state); |
| } |
| |
| // If there's something in the buffer waiting, then process it. |
| function clearBuffer(stream, state) { |
| if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) { |
| return |
| } |
| const { buffered, bufferedIndex, objectMode } = state; |
| const bufferedLength = buffered.length - bufferedIndex; |
| if (!bufferedLength) { |
| return |
| } |
| let i = bufferedIndex; |
| state.bufferProcessing = true; |
| if (bufferedLength > 1 && stream._writev) { |
| state.pendingcb -= bufferedLength - 1; |
| const callback = state.allNoop |
| ? nop |
| : (err) => { |
| for (let n = i; n < buffered.length; ++n) { |
| buffered[n].callback(err); |
| } |
| }; |
| // Make a copy of `buffered` if it's going to be used by `callback` above, |
| // since `doWrite` will mutate the array. |
| const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i); |
| chunks.allBuffers = state.allBuffers; |
| doWrite(stream, state, true, state.length, chunks, '', callback); |
| resetBuffer(state); |
| } else { |
| do { |
| const { chunk, encoding, callback } = buffered[i]; |
| buffered[i++] = null; |
| const len = objectMode ? 1 : chunk.length; |
| doWrite(stream, state, false, len, chunk, encoding, callback); |
| } while (i < buffered.length && !state.writing) |
| if (i === buffered.length) { |
| resetBuffer(state); |
| } else if (i > 256) { |
| buffered.splice(0, i); |
| state.bufferedIndex = 0; |
| } else { |
| state.bufferedIndex = i; |
| } |
| } |
| state.bufferProcessing = false; |
| } |
| Writable.prototype._write = function (chunk, encoding, cb) { |
| if (this._writev) { |
| this._writev( |
| [ |
| { |
| chunk, |
| encoding |
| } |
| ], |
| cb |
| ); |
| } else { |
| throw new ERR_METHOD_NOT_IMPLEMENTED('_write()') |
| } |
| }; |
| Writable.prototype._writev = null; |
| Writable.prototype.end = function (chunk, encoding, cb) { |
| const state = this._writableState; |
| if (typeof chunk === 'function') { |
| cb = chunk; |
| chunk = null; |
| encoding = null; |
| } else if (typeof encoding === 'function') { |
| cb = encoding; |
| encoding = null; |
| } |
| let err; |
| if (chunk !== null && chunk !== undefined) { |
| const ret = _write(this, chunk, encoding); |
| if (ret instanceof Error) { |
| err = ret; |
| } |
| } |
| |
| // .end() fully uncorks. |
| if (state.corked) { |
| state.corked = 1; |
| this.uncork(); |
| } |
| if (err) ; else if (!state.errored && !state.ending) { |
| // This is forgiving in terms of unnecessary calls to end() and can hide |
| // logic errors. However, usually such errors are harmless and causing a |
| // hard error can be disproportionately destructive. It is not always |
| // trivial for the user to determine whether end() needs to be called |
| // or not. |
| |
| state.ending = true; |
| finishMaybe(this, state, true); |
| state.ended = true; |
| } else if (state.finished) { |
| err = new ERR_STREAM_ALREADY_FINISHED('end'); |
| } else if (state.destroyed) { |
| err = new ERR_STREAM_DESTROYED('end'); |
| } |
| if (typeof cb === 'function') { |
| if (err || state.finished) { |
| process.nextTick(cb, err); |
| } else { |
| state[kOnFinished].push(cb); |
| } |
| } |
| return this |
| }; |
| function needFinish(state) { |
| return ( |
| state.ending && |
| !state.destroyed && |
| state.constructed && |
| state.length === 0 && |
| !state.errored && |
| state.buffered.length === 0 && |
| !state.finished && |
| !state.writing && |
| !state.errorEmitted && |
| !state.closeEmitted |
| ) |
| } |
| function callFinal(stream, state) { |
| let called = false; |
| function onFinish(err) { |
| if (called) { |
| errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK()); |
| return |
| } |
| called = true; |
| state.pendingcb--; |
| if (err) { |
| const onfinishCallbacks = state[kOnFinished].splice(0); |
| for (let i = 0; i < onfinishCallbacks.length; i++) { |
| onfinishCallbacks[i](err); |
| } |
| errorOrDestroy(stream, err, state.sync); |
| } else if (needFinish(state)) { |
| state.prefinished = true; |
| stream.emit('prefinish'); |
| // Backwards compat. Don't check state.sync here. |
| // Some streams assume 'finish' will be emitted |
| // asynchronously relative to _final callback. |
| state.pendingcb++; |
| process.nextTick(finish, stream, state); |
| } |
| } |
| state.sync = true; |
| state.pendingcb++; |
| try { |
| stream._final(onFinish); |
| } catch (err) { |
| onFinish(err); |
| } |
| state.sync = false; |
| } |
| function prefinish(stream, state) { |
| if (!state.prefinished && !state.finalCalled) { |
| if (typeof stream._final === 'function' && !state.destroyed) { |
| state.finalCalled = true; |
| callFinal(stream, state); |
| } else { |
| state.prefinished = true; |
| stream.emit('prefinish'); |
| } |
| } |
| } |
| function finishMaybe(stream, state, sync) { |
| if (needFinish(state)) { |
| prefinish(stream, state); |
| if (state.pendingcb === 0) { |
| if (sync) { |
| state.pendingcb++; |
| process.nextTick( |
| (stream, state) => { |
| if (needFinish(state)) { |
| finish(stream, state); |
| } else { |
| state.pendingcb--; |
| } |
| }, |
| stream, |
| state |
| ); |
| } else if (needFinish(state)) { |
| state.pendingcb++; |
| finish(stream, state); |
| } |
| } |
| } |
| } |
| function finish(stream, state) { |
| state.pendingcb--; |
| state.finished = true; |
| const onfinishCallbacks = state[kOnFinished].splice(0); |
| for (let i = 0; i < onfinishCallbacks.length; i++) { |
| onfinishCallbacks[i](); |
| } |
| stream.emit('finish'); |
| if (state.autoDestroy) { |
| // In case of duplex streams we need a way to detect |
| // if the readable side is ready for autoDestroy as well. |
| const rState = stream._readableState; |
| const autoDestroy = |
| !rState || |
| (rState.autoDestroy && |
| // We don't expect the readable to ever 'end' |
| // if readable is explicitly set to false. |
| (rState.endEmitted || rState.readable === false)); |
| if (autoDestroy) { |
| stream.destroy(); |
| } |
| } |
| } |
| ObjectDefineProperties(Writable.prototype, { |
| closed: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.closed : false |
| } |
| }, |
| destroyed: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.destroyed : false |
| }, |
| set(value) { |
| // Backward compatibility, the user is explicitly managing destroyed. |
| if (this._writableState) { |
| this._writableState.destroyed = value; |
| } |
| } |
| }, |
| writable: { |
| __proto__: null, |
| get() { |
| const w = this._writableState; |
| // w.writable === false means that this is part of a Duplex stream |
| // where the writable side was disabled upon construction. |
| // Compat. The user might manually disable writable side through |
| // deprecated setter. |
| return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended |
| }, |
| set(val) { |
| // Backwards compatible. |
| if (this._writableState) { |
| this._writableState.writable = !!val; |
| } |
| } |
| }, |
| writableFinished: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.finished : false |
| } |
| }, |
| writableObjectMode: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.objectMode : false |
| } |
| }, |
| writableBuffer: { |
| __proto__: null, |
| get() { |
| return this._writableState && this._writableState.getBuffer() |
| } |
| }, |
| writableEnded: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.ending : false |
| } |
| }, |
| writableNeedDrain: { |
| __proto__: null, |
| get() { |
| const wState = this._writableState; |
| if (!wState) return false |
| return !wState.destroyed && !wState.ending && wState.needDrain |
| } |
| }, |
| writableHighWaterMark: { |
| __proto__: null, |
| get() { |
| return this._writableState && this._writableState.highWaterMark |
| } |
| }, |
| writableCorked: { |
| __proto__: null, |
| get() { |
| return this._writableState ? this._writableState.corked : 0 |
| } |
| }, |
| writableLength: { |
| __proto__: null, |
| get() { |
| return this._writableState && this._writableState.length |
| } |
| }, |
| errored: { |
| __proto__: null, |
| enumerable: false, |
| get() { |
| return this._writableState ? this._writableState.errored : null |
| } |
| }, |
| writableAborted: { |
| __proto__: null, |
| enumerable: false, |
| get: function () { |
| return !!( |
| this._writableState.writable !== false && |
| (this._writableState.destroyed || this._writableState.errored) && |
| !this._writableState.finished |
| ) |
| } |
| } |
| }); |
| const destroy = destroyImpl.destroy; |
| Writable.prototype.destroy = function (err, cb) { |
| const state = this._writableState; |
| |
| // Invoke pending callbacks. |
| if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) { |
| process.nextTick(errorBuffer, state); |
| } |
| destroy.call(this, err, cb); |
| return this |
| }; |
| Writable.prototype._undestroy = destroyImpl.undestroy; |
| Writable.prototype._destroy = function (err, cb) { |
| cb(err); |
| }; |
| Writable.prototype[EE.captureRejectionSymbol] = function (err) { |
| this.destroy(err); |
| }; |
| let webStreamsAdapters; |
| |
| // Lazy to avoid circular references |
| function lazyWebStreams() { |
| if (webStreamsAdapters === undefined) webStreamsAdapters = {}; |
| return webStreamsAdapters |
| } |
| Writable.fromWeb = function (writableStream, options) { |
| return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options) |
| }; |
| Writable.toWeb = function (streamWritable) { |
| return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable) |
| }; |
| return writable; |
| } |
| |
| /* replacement start */ |
| |
| var duplexify; |
| var hasRequiredDuplexify; |
| |
| function requireDuplexify () { |
| if (hasRequiredDuplexify) return duplexify; |
| hasRequiredDuplexify = 1; |
| const process = requireProcess() |
| |
| /* replacement end */ |
| |
| ; const bufferModule = require$$0; |
| const { |
| isReadable, |
| isWritable, |
| isIterable, |
| isNodeStream, |
| isReadableNodeStream, |
| isWritableNodeStream, |
| isDuplexNodeStream |
| } = requireUtils(); |
| const eos = requireEndOfStream(); |
| const { |
| AbortError, |
| codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE } |
| } = requireErrors(); |
| const { destroyer } = requireDestroy(); |
| const Duplex = requireDuplex(); |
| const Readable = requireReadable(); |
| const { createDeferredPromise } = requireUtil(); |
| const from = requireFrom(); |
| const Blob = globalThis.Blob || bufferModule.Blob; |
| const isBlob = |
| typeof Blob !== 'undefined' |
| ? function isBlob(b) { |
| return b instanceof Blob |
| } |
| : function isBlob(b) { |
| return false |
| }; |
| const AbortController = globalThis.AbortController || require$$9.AbortController; |
| const { FunctionPrototypeCall } = requirePrimordials(); |
| |
| // This is needed for pre node 17. |
| class Duplexify extends Duplex { |
| constructor(options) { |
| super(options); |
| |
| // https://github.com/nodejs/node/pull/34385 |
| |
| if ((options === null || options === undefined ? undefined : options.readable) === false) { |
| this._readableState.readable = false; |
| this._readableState.ended = true; |
| this._readableState.endEmitted = true; |
| } |
| if ((options === null || options === undefined ? undefined : options.writable) === false) { |
| this._writableState.writable = false; |
| this._writableState.ending = true; |
| this._writableState.ended = true; |
| this._writableState.finished = true; |
| } |
| } |
| } |
| duplexify = function duplexify(body, name) { |
| if (isDuplexNodeStream(body)) { |
| return body |
| } |
| if (isReadableNodeStream(body)) { |
| return _duplexify({ |
| readable: body |
| }) |
| } |
| if (isWritableNodeStream(body)) { |
| return _duplexify({ |
| writable: body |
| }) |
| } |
| if (isNodeStream(body)) { |
| return _duplexify({ |
| writable: false, |
| readable: false |
| }) |
| } |
| |
| // TODO: Webstreams |
| // if (isReadableStream(body)) { |
| // return _duplexify({ readable: Readable.fromWeb(body) }); |
| // } |
| |
| // TODO: Webstreams |
| // if (isWritableStream(body)) { |
| // return _duplexify({ writable: Writable.fromWeb(body) }); |
| // } |
| |
| if (typeof body === 'function') { |
| const { value, write, final, destroy } = fromAsyncGen(body); |
| if (isIterable(value)) { |
| return from(Duplexify, value, { |
| // TODO (ronag): highWaterMark? |
| objectMode: true, |
| write, |
| final, |
| destroy |
| }) |
| } |
| const then = value === null || value === undefined ? undefined : value.then; |
| if (typeof then === 'function') { |
| let d; |
| const promise = FunctionPrototypeCall( |
| then, |
| value, |
| (val) => { |
| if (val != null) { |
| throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val) |
| } |
| }, |
| (err) => { |
| destroyer(d, err); |
| } |
| ); |
| return (d = new Duplexify({ |
| // TODO (ronag): highWaterMark? |
| objectMode: true, |
| readable: false, |
| write, |
| final(cb) { |
| final(async () => { |
| try { |
| await promise; |
| process.nextTick(cb, null); |
| } catch (err) { |
| process.nextTick(cb, err); |
| } |
| }); |
| }, |
| destroy |
| })) |
| } |
| throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value) |
| } |
| if (isBlob(body)) { |
| return duplexify(body.arrayBuffer()) |
| } |
| if (isIterable(body)) { |
| return from(Duplexify, body, { |
| // TODO (ronag): highWaterMark? |
| objectMode: true, |
| writable: false |
| }) |
| } |
| |
| // TODO: Webstreams. |
| // if ( |
| // isReadableStream(body?.readable) && |
| // isWritableStream(body?.writable) |
| // ) { |
| // return Duplexify.fromWeb(body); |
| // } |
| |
| if ( |
| typeof (body === null || body === undefined ? undefined : body.writable) === 'object' || |
| typeof (body === null || body === undefined ? undefined : body.readable) === 'object' |
| ) { |
| const readable = |
| body !== null && body !== undefined && body.readable |
| ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable) |
| ? body === null || body === undefined |
| ? undefined |
| : body.readable |
| : duplexify(body.readable) |
| : undefined; |
| const writable = |
| body !== null && body !== undefined && body.writable |
| ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable) |
| ? body === null || body === undefined |
| ? undefined |
| : body.writable |
| : duplexify(body.writable) |
| : undefined; |
| return _duplexify({ |
| readable, |
| writable |
| }) |
| } |
| const then = body === null || body === undefined ? undefined : body.then; |
| if (typeof then === 'function') { |
| let d; |
| FunctionPrototypeCall( |
| then, |
| body, |
| (val) => { |
| if (val != null) { |
| d.push(val); |
| } |
| d.push(null); |
| }, |
| (err) => { |
| destroyer(d, err); |
| } |
| ); |
| return (d = new Duplexify({ |
| objectMode: true, |
| writable: false, |
| read() {} |
| })) |
| } |
| throw new ERR_INVALID_ARG_TYPE( |
| name, |
| [ |
| 'Blob', |
| 'ReadableStream', |
| 'WritableStream', |
| 'Stream', |
| 'Iterable', |
| 'AsyncIterable', |
| 'Function', |
| '{ readable, writable } pair', |
| 'Promise' |
| ], |
| body |
| ) |
| }; |
| function fromAsyncGen(fn) { |
| let { promise, resolve } = createDeferredPromise(); |
| const ac = new AbortController(); |
| const signal = ac.signal; |
| const value = fn( |
| (async function* () { |
| while (true) { |
| const _promise = promise; |
| promise = null; |
| const { chunk, done, cb } = await _promise; |
| process.nextTick(cb); |
| if (done) return |
| if (signal.aborted) |
| throw new AbortError(undefined, { |
| cause: signal.reason |
| }) |
| ;({ promise, resolve } = createDeferredPromise()); |
| yield chunk; |
| } |
| })(), |
| { |
| signal |
| } |
| ); |
| return { |
| value, |
| write(chunk, encoding, cb) { |
| const _resolve = resolve; |
| resolve = null; |
| _resolve({ |
| chunk, |
| done: false, |
| cb |
| }); |
| }, |
| final(cb) { |
| const _resolve = resolve; |
| resolve = null; |
| _resolve({ |
| done: true, |
| cb |
| }); |
| }, |
| destroy(err, cb) { |
| ac.abort(); |
| cb(err); |
| } |
| } |
| } |
| function _duplexify(pair) { |
| const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable; |
| const w = pair.writable; |
| let readable = !!isReadable(r); |
| let writable = !!isWritable(w); |
| let ondrain; |
| let onfinish; |
| let onreadable; |
| let onclose; |
| let d; |
| function onfinished(err) { |
| const cb = onclose; |
| onclose = null; |
| if (cb) { |
| cb(err); |
| } else if (err) { |
| d.destroy(err); |
| } else if (!readable && !writable) { |
| d.destroy(); |
| } |
| } |
| |
| // TODO(ronag): Avoid double buffering. |
| // Implement Writable/Readable/Duplex traits. |
| // See, https://github.com/nodejs/node/pull/33515. |
| d = new Duplexify({ |
| // TODO (ronag): highWaterMark? |
| readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode), |
| writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode), |
| readable, |
| writable |
| }); |
| if (writable) { |
| eos(w, (err) => { |
| writable = false; |
| if (err) { |
| destroyer(r, err); |
| } |
| onfinished(err); |
| }); |
| d._write = function (chunk, encoding, callback) { |
| if (w.write(chunk, encoding)) { |
| callback(); |
| } else { |
| ondrain = callback; |
| } |
| }; |
| d._final = function (callback) { |
| w.end(); |
| onfinish = callback; |
| }; |
| w.on('drain', function () { |
| if (ondrain) { |
| const cb = ondrain; |
| ondrain = null; |
| cb(); |
| } |
| }); |
| w.on('finish', function () { |
| if (onfinish) { |
| const cb = onfinish; |
| onfinish = null; |
| cb(); |
| } |
| }); |
| } |
| if (readable) { |
| eos(r, (err) => { |
| readable = false; |
| if (err) { |
| destroyer(r, err); |
| } |
| onfinished(err); |
| }); |
| r.on('readable', function () { |
| if (onreadable) { |
| const cb = onreadable; |
| onreadable = null; |
| cb(); |
| } |
| }); |
| r.on('end', function () { |
| d.push(null); |
| }); |
| d._read = function () { |
| while (true) { |
| const buf = r.read(); |
| if (buf === null) { |
| onreadable = d._read; |
| return |
| } |
| if (!d.push(buf)) { |
| return |
| } |
| } |
| }; |
| } |
| d._destroy = function (err, callback) { |
| if (!err && onclose !== null) { |
| err = new AbortError(); |
| } |
| onreadable = null; |
| ondrain = null; |
| onfinish = null; |
| if (onclose === null) { |
| callback(err); |
| } else { |
| onclose = callback; |
| destroyer(w, err); |
| destroyer(r, err); |
| } |
| }; |
| return d |
| } |
| return duplexify; |
| } |
| |
| var duplex; |
| var hasRequiredDuplex; |
| |
| function requireDuplex () { |
| if (hasRequiredDuplex) return duplex; |
| hasRequiredDuplex = 1; |
| |
| const { |
| ObjectDefineProperties, |
| ObjectGetOwnPropertyDescriptor, |
| ObjectKeys, |
| ObjectSetPrototypeOf |
| } = requirePrimordials(); |
| duplex = Duplex; |
| const Readable = requireReadable(); |
| const Writable = requireWritable(); |
| ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype); |
| ObjectSetPrototypeOf(Duplex, Readable); |
| { |
| const keys = ObjectKeys(Writable.prototype); |
| // Allow the keys array to be GC'ed. |
| for (let i = 0; i < keys.length; i++) { |
| const method = keys[i]; |
| if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; |
| } |
| } |
| function Duplex(options) { |
| if (!(this instanceof Duplex)) return new Duplex(options) |
| Readable.call(this, options); |
| Writable.call(this, options); |
| if (options) { |
| this.allowHalfOpen = options.allowHalfOpen !== false; |
| if (options.readable === false) { |
| this._readableState.readable = false; |
| this._readableState.ended = true; |
| this._readableState.endEmitted = true; |
| } |
| if (options.writable === false) { |
| this._writableState.writable = false; |
| this._writableState.ending = true; |
| this._writableState.ended = true; |
| this._writableState.finished = true; |
| } |
| } else { |
| this.allowHalfOpen = true; |
| } |
| } |
| ObjectDefineProperties(Duplex.prototype, { |
| writable: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable') |
| }, |
| writableHighWaterMark: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark') |
| }, |
| writableObjectMode: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode') |
| }, |
| writableBuffer: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer') |
| }, |
| writableLength: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength') |
| }, |
| writableFinished: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished') |
| }, |
| writableCorked: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked') |
| }, |
| writableEnded: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded') |
| }, |
| writableNeedDrain: { |
| __proto__: null, |
| ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain') |
| }, |
| destroyed: { |
| __proto__: null, |
| get() { |
| if (this._readableState === undefined || this._writableState === undefined) { |
| return false |
| } |
| return this._readableState.destroyed && this._writableState.destroyed |
| }, |
| set(value) { |
| // Backward compatibility, the user is explicitly |
| // managing destroyed. |
| if (this._readableState && this._writableState) { |
| this._readableState.destroyed = value; |
| this._writableState.destroyed = value; |
| } |
| } |
| } |
| }); |
| let webStreamsAdapters; |
| |
| // Lazy to avoid circular references |
| function lazyWebStreams() { |
| if (webStreamsAdapters === undefined) webStreamsAdapters = {}; |
| return webStreamsAdapters |
| } |
| Duplex.fromWeb = function (pair, options) { |
| return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options) |
| }; |
| Duplex.toWeb = function (duplex) { |
| return lazyWebStreams().newReadableWritablePairFromDuplex(duplex) |
| }; |
| let duplexify; |
| Duplex.from = function (body) { |
| if (!duplexify) { |
| duplexify = requireDuplexify(); |
| } |
| return duplexify(body, 'body') |
| }; |
| return duplex; |
| } |
| |
| var transform; |
| var hasRequiredTransform; |
| |
| function requireTransform () { |
| if (hasRequiredTransform) return transform; |
| hasRequiredTransform = 1; |
| |
| const { ObjectSetPrototypeOf, Symbol } = requirePrimordials(); |
| transform = Transform; |
| const { ERR_METHOD_NOT_IMPLEMENTED } = requireErrors().codes; |
| const Duplex = requireDuplex(); |
| const { getHighWaterMark } = requireState(); |
| ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); |
| ObjectSetPrototypeOf(Transform, Duplex); |
| const kCallback = Symbol('kCallback'); |
| function Transform(options) { |
| if (!(this instanceof Transform)) return new Transform(options) |
| |
| // TODO (ronag): This should preferably always be |
| // applied but would be semver-major. Or even better; |
| // make Transform a Readable with the Writable interface. |
| const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null; |
| if (readableHighWaterMark === 0) { |
| // A Duplex will buffer both on the writable and readable side while |
| // a Transform just wants to buffer hwm number of elements. To avoid |
| // buffering twice we disable buffering on the writable side. |
| options = { |
| ...options, |
| highWaterMark: null, |
| readableHighWaterMark, |
| // TODO (ronag): 0 is not optimal since we have |
| // a "bug" where we check needDrain before calling _write and not after. |
| // Refs: https://github.com/nodejs/node/pull/32887 |
| // Refs: https://github.com/nodejs/node/pull/35941 |
| writableHighWaterMark: options.writableHighWaterMark || 0 |
| }; |
| } |
| Duplex.call(this, options); |
| |
| // We have implemented the _read method, and done the other things |
| // that Readable wants before the first _read call, so unset the |
| // sync guard flag. |
| this._readableState.sync = false; |
| this[kCallback] = null; |
| if (options) { |
| if (typeof options.transform === 'function') this._transform = options.transform; |
| if (typeof options.flush === 'function') this._flush = options.flush; |
| } |
| |
| // When the writable side finishes, then flush out anything remaining. |
| // Backwards compat. Some Transform streams incorrectly implement _final |
| // instead of or in addition to _flush. By using 'prefinish' instead of |
| // implementing _final we continue supporting this unfortunate use case. |
| this.on('prefinish', prefinish); |
| } |
| function final(cb) { |
| if (typeof this._flush === 'function' && !this.destroyed) { |
| this._flush((er, data) => { |
| if (er) { |
| if (cb) { |
| cb(er); |
| } else { |
| this.destroy(er); |
| } |
| return |
| } |
| if (data != null) { |
| this.push(data); |
| } |
| this.push(null); |
| if (cb) { |
| cb(); |
| } |
| }); |
| } else { |
| this.push(null); |
| if (cb) { |
| cb(); |
| } |
| } |
| } |
| function prefinish() { |
| if (this._final !== final) { |
| final.call(this); |
| } |
| } |
| Transform.prototype._final = final; |
| Transform.prototype._transform = function (chunk, encoding, callback) { |
| throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()') |
| }; |
| Transform.prototype._write = function (chunk, encoding, callback) { |
| const rState = this._readableState; |
| const wState = this._writableState; |
| const length = rState.length; |
| this._transform(chunk, encoding, (err, val) => { |
| if (err) { |
| callback(err); |
| return |
| } |
| if (val != null) { |
| this.push(val); |
| } |
| if ( |
| wState.ended || |
| // Backwards compat. |
| length === rState.length || |
| // Backwards compat. |
| rState.length < rState.highWaterMark |
| ) { |
| callback(); |
| } else { |
| this[kCallback] = callback; |
| } |
| }); |
| }; |
| Transform.prototype._read = function () { |
| if (this[kCallback]) { |
| const callback = this[kCallback]; |
| this[kCallback] = null; |
| callback(); |
| } |
| }; |
| return transform; |
| } |
| |
| var passthrough; |
| var hasRequiredPassthrough; |
| |
| function requirePassthrough () { |
| if (hasRequiredPassthrough) return passthrough; |
| hasRequiredPassthrough = 1; |
| |
| const { ObjectSetPrototypeOf } = requirePrimordials(); |
| passthrough = PassThrough; |
| const Transform = requireTransform(); |
| ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype); |
| ObjectSetPrototypeOf(PassThrough, Transform); |
| function PassThrough(options) { |
| if (!(this instanceof PassThrough)) return new PassThrough(options) |
| Transform.call(this, options); |
| } |
| PassThrough.prototype._transform = function (chunk, encoding, cb) { |
| cb(null, chunk); |
| }; |
| return passthrough; |
| } |
| |
| /* replacement start */ |
| |
| var pipeline_1; |
| var hasRequiredPipeline; |
| |
| function requirePipeline () { |
| if (hasRequiredPipeline) return pipeline_1; |
| hasRequiredPipeline = 1; |
| const process = requireProcess() |
| |
| /* replacement end */ |
| // Ported from https://github.com/mafintosh/pump with |
| // permission from the author, Mathias Buus (@mafintosh). |
| |
| ; const { ArrayIsArray, Promise, SymbolAsyncIterator } = requirePrimordials(); |
| const eos = requireEndOfStream(); |
| const { once } = requireUtil(); |
| const destroyImpl = requireDestroy(); |
| const Duplex = requireDuplex(); |
| const { |
| aggregateTwoErrors, |
| codes: { |
| ERR_INVALID_ARG_TYPE, |
| ERR_INVALID_RETURN_VALUE, |
| ERR_MISSING_ARGS, |
| ERR_STREAM_DESTROYED, |
| ERR_STREAM_PREMATURE_CLOSE |
| }, |
| AbortError |
| } = requireErrors(); |
| const { validateFunction, validateAbortSignal } = requireValidators(); |
| const { isIterable, isReadable, isReadableNodeStream, isNodeStream } = requireUtils(); |
| const AbortController = globalThis.AbortController || require$$9.AbortController; |
| let PassThrough; |
| let Readable; |
| function destroyer(stream, reading, writing) { |
| let finished = false; |
| stream.on('close', () => { |
| finished = true; |
| }); |
| const cleanup = eos( |
| stream, |
| { |
| readable: reading, |
| writable: writing |
| }, |
| (err) => { |
| finished = !err; |
| } |
| ); |
| return { |
| destroy: (err) => { |
| if (finished) return |
| finished = true; |
| destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe')); |
| }, |
| cleanup |
| } |
| } |
| function popCallback(streams) { |
| // Streams should never be an empty array. It should always contain at least |
| // a single stream. Therefore optimize for the average case instead of |
| // checking for length === 0 as well. |
| validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]'); |
| return streams.pop() |
| } |
| function makeAsyncIterable(val) { |
| if (isIterable(val)) { |
| return val |
| } else if (isReadableNodeStream(val)) { |
| // Legacy streams are not Iterable. |
| return fromReadable(val) |
| } |
| throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val) |
| } |
| async function* fromReadable(val) { |
| if (!Readable) { |
| Readable = requireReadable(); |
| } |
| yield* Readable.prototype[SymbolAsyncIterator].call(val); |
| } |
| async function pump(iterable, writable, finish, { end }) { |
| let error; |
| let onresolve = null; |
| const resume = (err) => { |
| if (err) { |
| error = err; |
| } |
| if (onresolve) { |
| const callback = onresolve; |
| onresolve = null; |
| callback(); |
| } |
| }; |
| const wait = () => |
| new Promise((resolve, reject) => { |
| if (error) { |
| reject(error); |
| } else { |
| onresolve = () => { |
| if (error) { |
| reject(error); |
| } else { |
| resolve(); |
| } |
| }; |
| } |
| }); |
| writable.on('drain', resume); |
| const cleanup = eos( |
| writable, |
| { |
| readable: false |
| }, |
| resume |
| ); |
| try { |
| if (writable.writableNeedDrain) { |
| await wait(); |
| } |
| for await (const chunk of iterable) { |
| if (!writable.write(chunk)) { |
| await wait(); |
| } |
| } |
| if (end) { |
| writable.end(); |
| } |
| await wait(); |
| finish(); |
| } catch (err) { |
| finish(error !== err ? aggregateTwoErrors(error, err) : err); |
| } finally { |
| cleanup(); |
| writable.off('drain', resume); |
| } |
| } |
| function pipeline(...streams) { |
| return pipelineImpl(streams, once(popCallback(streams))) |
| } |
| function pipelineImpl(streams, callback, opts) { |
| if (streams.length === 1 && ArrayIsArray(streams[0])) { |
| streams = streams[0]; |
| } |
| if (streams.length < 2) { |
| throw new ERR_MISSING_ARGS('streams') |
| } |
| const ac = new AbortController(); |
| const signal = ac.signal; |
| const outerSignal = opts === null || opts === undefined ? undefined : opts.signal; |
| |
| // Need to cleanup event listeners if last stream is readable |
| // https://github.com/nodejs/node/issues/35452 |
| const lastStreamCleanup = []; |
| validateAbortSignal(outerSignal, 'options.signal'); |
| function abort() { |
| finishImpl(new AbortError()); |
| } |
| outerSignal === null || outerSignal === undefined ? undefined : outerSignal.addEventListener('abort', abort); |
| let error; |
| let value; |
| const destroys = []; |
| let finishCount = 0; |
| function finish(err) { |
| finishImpl(err, --finishCount === 0); |
| } |
| function finishImpl(err, final) { |
| if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) { |
| error = err; |
| } |
| if (!error && !final) { |
| return |
| } |
| while (destroys.length) { |
| destroys.shift()(error); |
| } |
| outerSignal === null || outerSignal === undefined ? undefined : outerSignal.removeEventListener('abort', abort); |
| ac.abort(); |
| if (final) { |
| if (!error) { |
| lastStreamCleanup.forEach((fn) => fn()); |
| } |
| process.nextTick(callback, error, value); |
| } |
| } |
| let ret; |
| for (let i = 0; i < streams.length; i++) { |
| const stream = streams[i]; |
| const reading = i < streams.length - 1; |
| const writing = i > 0; |
| const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false; |
| const isLastStream = i === streams.length - 1; |
| if (isNodeStream(stream)) { |
| if (end) { |
| const { destroy, cleanup } = destroyer(stream, reading, writing); |
| destroys.push(destroy); |
| if (isReadable(stream) && isLastStream) { |
| lastStreamCleanup.push(cleanup); |
| } |
| } |
| |
| // Catch stream errors that occur after pipe/pump has completed. |
| function onError(err) { |
| if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { |
| finish(err); |
| } |
| } |
| stream.on('error', onError); |
| if (isReadable(stream) && isLastStream) { |
| lastStreamCleanup.push(() => { |
| stream.removeListener('error', onError); |
| }); |
| } |
| } |
| if (i === 0) { |
| if (typeof stream === 'function') { |
| ret = stream({ |
| signal |
| }); |
| if (!isIterable(ret)) { |
| throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret) |
| } |
| } else if (isIterable(stream) || isReadableNodeStream(stream)) { |
| ret = stream; |
| } else { |
| ret = Duplex.from(stream); |
| } |
| } else if (typeof stream === 'function') { |
| ret = makeAsyncIterable(ret); |
| ret = stream(ret, { |
| signal |
| }); |
| if (reading) { |
| if (!isIterable(ret, true)) { |
| throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret) |
| } |
| } else { |
| var _ret; |
| if (!PassThrough) { |
| PassThrough = requirePassthrough(); |
| } |
| |
| // If the last argument to pipeline is not a stream |
| // we must create a proxy stream so that pipeline(...) |
| // always returns a stream which can be further |
| // composed through `.pipe(stream)`. |
| |
| const pt = new PassThrough({ |
| objectMode: true |
| }); |
| |
| // Handle Promises/A+ spec, `then` could be a getter that throws on |
| // second use. |
| const then = (_ret = ret) === null || _ret === undefined ? undefined : _ret.then; |
| if (typeof then === 'function') { |
| finishCount++; |
| then.call( |
| ret, |
| (val) => { |
| value = val; |
| if (val != null) { |
| pt.write(val); |
| } |
| if (end) { |
| pt.end(); |
| } |
| process.nextTick(finish); |
| }, |
| (err) => { |
| pt.destroy(err); |
| process.nextTick(finish, err); |
| } |
| ); |
| } else if (isIterable(ret, true)) { |
| finishCount++; |
| pump(ret, pt, finish, { |
| end |
| }); |
| } else { |
| throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret) |
| } |
| ret = pt; |
| const { destroy, cleanup } = destroyer(ret, false, true); |
| destroys.push(destroy); |
| if (isLastStream) { |
| lastStreamCleanup.push(cleanup); |
| } |
| } |
| } else if (isNodeStream(stream)) { |
| if (isReadableNodeStream(ret)) { |
| finishCount += 2; |
| const cleanup = pipe(ret, stream, finish, { |
| end |
| }); |
| if (isReadable(stream) && isLastStream) { |
| lastStreamCleanup.push(cleanup); |
| } |
| } else if (isIterable(ret)) { |
| finishCount++; |
| pump(ret, stream, finish, { |
| end |
| }); |
| } else { |
| throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], ret) |
| } |
| ret = stream; |
| } else { |
| ret = Duplex.from(stream); |
| } |
| } |
| if ( |
| (signal !== null && signal !== undefined && signal.aborted) || |
| (outerSignal !== null && outerSignal !== undefined && outerSignal.aborted) |
| ) { |
| process.nextTick(abort); |
| } |
| return ret |
| } |
| function pipe(src, dst, finish, { end }) { |
| let ended = false; |
| dst.on('close', () => { |
| if (!ended) { |
| // Finish if the destination closes before the source has completed. |
| finish(new ERR_STREAM_PREMATURE_CLOSE()); |
| } |
| }); |
| src.pipe(dst, { |
| end |
| }); |
| if (end) { |
| // Compat. Before node v10.12.0 stdio used to throw an error so |
| // pipe() did/does not end() stdio destinations. |
| // Now they allow it but "secretly" don't close the underlying fd. |
| src.once('end', () => { |
| ended = true; |
| dst.end(); |
| }); |
| } else { |
| finish(); |
| } |
| eos( |
| src, |
| { |
| readable: true, |
| writable: false |
| }, |
| (err) => { |
| const rState = src._readableState; |
| if ( |
| err && |
| err.code === 'ERR_STREAM_PREMATURE_CLOSE' && |
| rState && |
| rState.ended && |
| !rState.errored && |
| !rState.errorEmitted |
| ) { |
| // Some readable streams will emit 'close' before 'end'. However, since |
| // this is on the readable side 'end' should still be emitted if the |
| // stream has been ended and no error emitted. This should be allowed in |
| // favor of backwards compatibility. Since the stream is piped to a |
| // destination this should not result in any observable difference. |
| // We don't need to check if this is a writable premature close since |
| // eos will only fail with premature close on the reading side for |
| // duplex streams. |
| src.once('end', finish).once('error', finish); |
| } else { |
| finish(err); |
| } |
| } |
| ); |
| return eos( |
| dst, |
| { |
| readable: false, |
| writable: true |
| }, |
| finish |
| ) |
| } |
| pipeline_1 = { |
| pipelineImpl, |
| pipeline |
| }; |
| return pipeline_1; |
| } |
| |
| var compose; |
| var hasRequiredCompose; |
| |
| function requireCompose () { |
| if (hasRequiredCompose) return compose; |
| hasRequiredCompose = 1; |
| |
| const { pipeline } = requirePipeline(); |
| const Duplex = requireDuplex(); |
| const { destroyer } = requireDestroy(); |
| const { isNodeStream, isReadable, isWritable } = requireUtils(); |
| const { |
| AbortError, |
| codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS } |
| } = requireErrors(); |
| compose = function compose(...streams) { |
| if (streams.length === 0) { |
| throw new ERR_MISSING_ARGS('streams') |
| } |
| if (streams.length === 1) { |
| return Duplex.from(streams[0]) |
| } |
| const orgStreams = [...streams]; |
| if (typeof streams[0] === 'function') { |
| streams[0] = Duplex.from(streams[0]); |
| } |
| if (typeof streams[streams.length - 1] === 'function') { |
| const idx = streams.length - 1; |
| streams[idx] = Duplex.from(streams[idx]); |
| } |
| for (let n = 0; n < streams.length; ++n) { |
| if (!isNodeStream(streams[n])) { |
| // TODO(ronag): Add checks for non streams. |
| continue |
| } |
| if (n < streams.length - 1 && !isReadable(streams[n])) { |
| throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable') |
| } |
| if (n > 0 && !isWritable(streams[n])) { |
| throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable') |
| } |
| } |
| let ondrain; |
| let onfinish; |
| let onreadable; |
| let onclose; |
| let d; |
| function onfinished(err) { |
| const cb = onclose; |
| onclose = null; |
| if (cb) { |
| cb(err); |
| } else if (err) { |
| d.destroy(err); |
| } else if (!readable && !writable) { |
| d.destroy(); |
| } |
| } |
| const head = streams[0]; |
| const tail = pipeline(streams, onfinished); |
| const writable = !!isWritable(head); |
| const readable = !!isReadable(tail); |
| |
| // TODO(ronag): Avoid double buffering. |
| // Implement Writable/Readable/Duplex traits. |
| // See, https://github.com/nodejs/node/pull/33515. |
| d = new Duplex({ |
| // TODO (ronag): highWaterMark? |
| writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode), |
| readableObjectMode: !!(tail !== null && tail !== undefined && tail.writableObjectMode), |
| writable, |
| readable |
| }); |
| if (writable) { |
| d._write = function (chunk, encoding, callback) { |
| if (head.write(chunk, encoding)) { |
| callback(); |
| } else { |
| ondrain = callback; |
| } |
| }; |
| d._final = function (callback) { |
| head.end(); |
| onfinish = callback; |
| }; |
| head.on('drain', function () { |
| if (ondrain) { |
| const cb = ondrain; |
| ondrain = null; |
| cb(); |
| } |
| }); |
| tail.on('finish', function () { |
| if (onfinish) { |
| const cb = onfinish; |
| onfinish = null; |
| cb(); |
| } |
| }); |
| } |
| if (readable) { |
| tail.on('readable', function () { |
| if (onreadable) { |
| const cb = onreadable; |
| onreadable = null; |
| cb(); |
| } |
| }); |
| tail.on('end', function () { |
| d.push(null); |
| }); |
| d._read = function () { |
| while (true) { |
| const buf = tail.read(); |
| if (buf === null) { |
| onreadable = d._read; |
| return |
| } |
| if (!d.push(buf)) { |
| return |
| } |
| } |
| }; |
| } |
| d._destroy = function (err, callback) { |
| if (!err && onclose !== null) { |
| err = new AbortError(); |
| } |
| onreadable = null; |
| ondrain = null; |
| onfinish = null; |
| if (onclose === null) { |
| callback(err); |
| } else { |
| onclose = callback; |
| destroyer(tail, err); |
| } |
| }; |
| return d |
| }; |
| return compose; |
| } |
| |
| var promises; |
| var hasRequiredPromises; |
| |
| function requirePromises () { |
| if (hasRequiredPromises) return promises; |
| hasRequiredPromises = 1; |
| |
| const { ArrayPrototypePop, Promise } = requirePrimordials(); |
| const { isIterable, isNodeStream } = requireUtils(); |
| const { pipelineImpl: pl } = requirePipeline(); |
| const { finished } = requireEndOfStream(); |
| function pipeline(...streams) { |
| return new Promise((resolve, reject) => { |
| let signal; |
| let end; |
| const lastArg = streams[streams.length - 1]; |
| if (lastArg && typeof lastArg === 'object' && !isNodeStream(lastArg) && !isIterable(lastArg)) { |
| const options = ArrayPrototypePop(streams); |
| signal = options.signal; |
| end = options.end; |
| } |
| pl( |
| streams, |
| (err, value) => { |
| if (err) { |
| reject(err); |
| } else { |
| resolve(value); |
| } |
| }, |
| { |
| signal, |
| end |
| } |
| ); |
| }) |
| } |
| promises = { |
| finished, |
| pipeline |
| }; |
| return promises; |
| } |
| |
| /* replacement start */ |
| |
| var hasRequiredStream; |
| |
| function requireStream () { |
| if (hasRequiredStream) return stream.exports; |
| hasRequiredStream = 1; |
| const { Buffer } = require$$0 |
| |
| /* replacement end */ |
| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // 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. |
| |
| ; const { ObjectDefineProperty, ObjectKeys, ReflectApply } = requirePrimordials(); |
| const { |
| promisify: { custom: customPromisify } |
| } = requireUtil(); |
| const { streamReturningOperators, promiseReturningOperators } = requireOperators(); |
| const { |
| codes: { ERR_ILLEGAL_CONSTRUCTOR } |
| } = requireErrors(); |
| const compose = requireCompose(); |
| const { pipeline } = requirePipeline(); |
| const { destroyer } = requireDestroy(); |
| const eos = requireEndOfStream(); |
| const promises = requirePromises(); |
| const utils = requireUtils(); |
| const Stream = (stream.exports = requireLegacy().Stream); |
| Stream.isDisturbed = utils.isDisturbed; |
| Stream.isErrored = utils.isErrored; |
| Stream.isReadable = utils.isReadable; |
| Stream.Readable = requireReadable(); |
| for (const key of ObjectKeys(streamReturningOperators)) { |
| const op = streamReturningOperators[key]; |
| function fn(...args) { |
| if (new.target) { |
| throw ERR_ILLEGAL_CONSTRUCTOR() |
| } |
| return Stream.Readable.from(ReflectApply(op, this, args)) |
| } |
| ObjectDefineProperty(fn, 'name', { |
| __proto__: null, |
| value: op.name |
| }); |
| ObjectDefineProperty(fn, 'length', { |
| __proto__: null, |
| value: op.length |
| }); |
| ObjectDefineProperty(Stream.Readable.prototype, key, { |
| __proto__: null, |
| value: fn, |
| enumerable: false, |
| configurable: true, |
| writable: true |
| }); |
| } |
| for (const key of ObjectKeys(promiseReturningOperators)) { |
| const op = promiseReturningOperators[key]; |
| function fn(...args) { |
| if (new.target) { |
| throw ERR_ILLEGAL_CONSTRUCTOR() |
| } |
| return ReflectApply(op, this, args) |
| } |
| ObjectDefineProperty(fn, 'name', { |
| __proto__: null, |
| value: op.name |
| }); |
| ObjectDefineProperty(fn, 'length', { |
| __proto__: null, |
| value: op.length |
| }); |
| ObjectDefineProperty(Stream.Readable.prototype, key, { |
| __proto__: null, |
| value: fn, |
| enumerable: false, |
| configurable: true, |
| writable: true |
| }); |
| } |
| Stream.Writable = requireWritable(); |
| Stream.Duplex = requireDuplex(); |
| Stream.Transform = requireTransform(); |
| Stream.PassThrough = requirePassthrough(); |
| Stream.pipeline = pipeline; |
| const { addAbortSignal } = requireAddAbortSignal(); |
| Stream.addAbortSignal = addAbortSignal; |
| Stream.finished = eos; |
| Stream.destroy = destroyer; |
| Stream.compose = compose; |
| ObjectDefineProperty(Stream, 'promises', { |
| __proto__: null, |
| configurable: true, |
| enumerable: true, |
| get() { |
| return promises |
| } |
| }); |
| ObjectDefineProperty(pipeline, customPromisify, { |
| __proto__: null, |
| enumerable: true, |
| get() { |
| return promises.pipeline |
| } |
| }); |
| ObjectDefineProperty(eos, customPromisify, { |
| __proto__: null, |
| enumerable: true, |
| get() { |
| return promises.finished |
| } |
| }); |
| |
| // Backwards-compat with node 0.4.x |
| Stream.Stream = Stream; |
| Stream._isUint8Array = function isUint8Array(value) { |
| return value instanceof Uint8Array |
| }; |
| Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) { |
| return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength) |
| }; |
| return stream.exports; |
| } |
| |
| (function (module) { |
| |
| const Stream = require$$0$1; |
| if (Stream && process.env.READABLE_STREAM === 'disable') { |
| const promises = Stream.promises; |
| |
| // Explicit export naming is needed for ESM |
| module.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer; |
| module.exports._isUint8Array = Stream._isUint8Array; |
| module.exports.isDisturbed = Stream.isDisturbed; |
| module.exports.isErrored = Stream.isErrored; |
| module.exports.isReadable = Stream.isReadable; |
| module.exports.Readable = Stream.Readable; |
| module.exports.Writable = Stream.Writable; |
| module.exports.Duplex = Stream.Duplex; |
| module.exports.Transform = Stream.Transform; |
| module.exports.PassThrough = Stream.PassThrough; |
| module.exports.addAbortSignal = Stream.addAbortSignal; |
| module.exports.finished = Stream.finished; |
| module.exports.destroy = Stream.destroy; |
| module.exports.pipeline = Stream.pipeline; |
| module.exports.compose = Stream.compose; |
| Object.defineProperty(Stream, 'promises', { |
| configurable: true, |
| enumerable: true, |
| get() { |
| return promises |
| } |
| }); |
| module.exports.Stream = Stream.Stream; |
| } else { |
| const CustomStream = requireStream(); |
| const promises = requirePromises(); |
| const originalDestroy = CustomStream.Readable.destroy; |
| module.exports = CustomStream.Readable; |
| |
| // Explicit export naming is needed for ESM |
| module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer; |
| module.exports._isUint8Array = CustomStream._isUint8Array; |
| module.exports.isDisturbed = CustomStream.isDisturbed; |
| module.exports.isErrored = CustomStream.isErrored; |
| module.exports.isReadable = CustomStream.isReadable; |
| module.exports.Readable = CustomStream.Readable; |
| module.exports.Writable = CustomStream.Writable; |
| module.exports.Duplex = CustomStream.Duplex; |
| module.exports.Transform = CustomStream.Transform; |
| module.exports.PassThrough = CustomStream.PassThrough; |
| module.exports.addAbortSignal = CustomStream.addAbortSignal; |
| module.exports.finished = CustomStream.finished; |
| module.exports.destroy = CustomStream.destroy; |
| module.exports.destroy = originalDestroy; |
| module.exports.pipeline = CustomStream.pipeline; |
| module.exports.compose = CustomStream.compose; |
| Object.defineProperty(CustomStream, 'promises', { |
| configurable: true, |
| enumerable: true, |
| get() { |
| return promises |
| } |
| }); |
| module.exports.Stream = CustomStream.Stream; |
| } |
| |
| // Allow default importing |
| module.exports.default = module.exports; |
| } (ours)); |
| |
| var inherits$1 = {exports: {}}; |
| |
| var inherits_browser = {exports: {}}; |
| |
| var hasRequiredInherits_browser; |
| |
| function requireInherits_browser () { |
| if (hasRequiredInherits_browser) return inherits_browser.exports; |
| hasRequiredInherits_browser = 1; |
| if (typeof Object.create === 'function') { |
| // implementation from standard node.js 'util' module |
| inherits_browser.exports = function inherits(ctor, superCtor) { |
| if (superCtor) { |
| ctor.super_ = superCtor; |
| ctor.prototype = Object.create(superCtor.prototype, { |
| constructor: { |
| value: ctor, |
| enumerable: false, |
| writable: true, |
| configurable: true |
| } |
| }); |
| } |
| }; |
| } else { |
| // old school shim for old browsers |
| inherits_browser.exports = function inherits(ctor, superCtor) { |
| if (superCtor) { |
| ctor.super_ = superCtor; |
| var TempCtor = function () {}; |
| TempCtor.prototype = superCtor.prototype; |
| ctor.prototype = new TempCtor(); |
| ctor.prototype.constructor = ctor; |
| } |
| }; |
| } |
| return inherits_browser.exports; |
| } |
| |
| (function (module) { |
| try { |
| var util = require('util'); |
| /* istanbul ignore next */ |
| if (typeof util.inherits !== 'function') throw ''; |
| module.exports = util.inherits; |
| } catch (e) { |
| /* istanbul ignore next */ |
| module.exports = requireInherits_browser(); |
| } |
| } (inherits$1)); |
| |
| const { Buffer: Buffer$1 } = require$$0; |
| const symbol = Symbol.for('BufferList'); |
| |
| function BufferList$1 (buf) { |
| if (!(this instanceof BufferList$1)) { |
| return new BufferList$1(buf) |
| } |
| |
| BufferList$1._init.call(this, buf); |
| } |
| |
| BufferList$1._init = function _init (buf) { |
| Object.defineProperty(this, symbol, { value: true }); |
| |
| this._bufs = []; |
| this.length = 0; |
| |
| if (buf) { |
| this.append(buf); |
| } |
| }; |
| |
| BufferList$1.prototype._new = function _new (buf) { |
| return new BufferList$1(buf) |
| }; |
| |
| BufferList$1.prototype._offset = function _offset (offset) { |
| if (offset === 0) { |
| return [0, 0] |
| } |
| |
| let tot = 0; |
| |
| for (let i = 0; i < this._bufs.length; i++) { |
| const _t = tot + this._bufs[i].length; |
| if (offset < _t || i === this._bufs.length - 1) { |
| return [i, offset - tot] |
| } |
| tot = _t; |
| } |
| }; |
| |
| BufferList$1.prototype._reverseOffset = function (blOffset) { |
| const bufferId = blOffset[0]; |
| let offset = blOffset[1]; |
| |
| for (let i = 0; i < bufferId; i++) { |
| offset += this._bufs[i].length; |
| } |
| |
| return offset |
| }; |
| |
| BufferList$1.prototype.get = function get (index) { |
| if (index > this.length || index < 0) { |
| return undefined |
| } |
| |
| const offset = this._offset(index); |
| |
| return this._bufs[offset[0]][offset[1]] |
| }; |
| |
| BufferList$1.prototype.slice = function slice (start, end) { |
| if (typeof start === 'number' && start < 0) { |
| start += this.length; |
| } |
| |
| if (typeof end === 'number' && end < 0) { |
| end += this.length; |
| } |
| |
| return this.copy(null, 0, start, end) |
| }; |
| |
| BufferList$1.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { |
| if (typeof srcStart !== 'number' || srcStart < 0) { |
| srcStart = 0; |
| } |
| |
| if (typeof srcEnd !== 'number' || srcEnd > this.length) { |
| srcEnd = this.length; |
| } |
| |
| if (srcStart >= this.length) { |
| return dst || Buffer$1.alloc(0) |
| } |
| |
| if (srcEnd <= 0) { |
| return dst || Buffer$1.alloc(0) |
| } |
| |
| const copy = !!dst; |
| const off = this._offset(srcStart); |
| const len = srcEnd - srcStart; |
| let bytes = len; |
| let bufoff = (copy && dstStart) || 0; |
| let start = off[1]; |
| |
| // copy/slice everything |
| if (srcStart === 0 && srcEnd === this.length) { |
| if (!copy) { |
| // slice, but full concat if multiple buffers |
| return this._bufs.length === 1 |
| ? this._bufs[0] |
| : Buffer$1.concat(this._bufs, this.length) |
| } |
| |
| // copy, need to copy individual buffers |
| for (let i = 0; i < this._bufs.length; i++) { |
| this._bufs[i].copy(dst, bufoff); |
| bufoff += this._bufs[i].length; |
| } |
| |
| return dst |
| } |
| |
| // easy, cheap case where it's a subset of one of the buffers |
| if (bytes <= this._bufs[off[0]].length - start) { |
| return copy |
| ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) |
| : this._bufs[off[0]].slice(start, start + bytes) |
| } |
| |
| if (!copy) { |
| // a slice, we need something to copy in to |
| dst = Buffer$1.allocUnsafe(len); |
| } |
| |
| for (let i = off[0]; i < this._bufs.length; i++) { |
| const l = this._bufs[i].length - start; |
| |
| if (bytes > l) { |
| this._bufs[i].copy(dst, bufoff, start); |
| bufoff += l; |
| } else { |
| this._bufs[i].copy(dst, bufoff, start, start + bytes); |
| bufoff += l; |
| break |
| } |
| |
| bytes -= l; |
| |
| if (start) { |
| start = 0; |
| } |
| } |
| |
| // safeguard so that we don't return uninitialized memory |
| if (dst.length > bufoff) return dst.slice(0, bufoff) |
| |
| return dst |
| }; |
| |
| BufferList$1.prototype.shallowSlice = function shallowSlice (start, end) { |
| start = start || 0; |
| end = typeof end !== 'number' ? this.length : end; |
| |
| if (start < 0) { |
| start += this.length; |
| } |
| |
| if (end < 0) { |
| end += this.length; |
| } |
| |
| if (start === end) { |
| return this._new() |
| } |
| |
| const startOffset = this._offset(start); |
| const endOffset = this._offset(end); |
| const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1); |
| |
| if (endOffset[1] === 0) { |
| buffers.pop(); |
| } else { |
| buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]); |
| } |
| |
| if (startOffset[1] !== 0) { |
| buffers[0] = buffers[0].slice(startOffset[1]); |
| } |
| |
| return this._new(buffers) |
| }; |
| |
| BufferList$1.prototype.toString = function toString (encoding, start, end) { |
| return this.slice(start, end).toString(encoding) |
| }; |
| |
| BufferList$1.prototype.consume = function consume (bytes) { |
| // first, normalize the argument, in accordance with how Buffer does it |
| bytes = Math.trunc(bytes); |
| // do nothing if not a positive number |
| if (Number.isNaN(bytes) || bytes <= 0) return this |
| |
| while (this._bufs.length) { |
| if (bytes >= this._bufs[0].length) { |
| bytes -= this._bufs[0].length; |
| this.length -= this._bufs[0].length; |
| this._bufs.shift(); |
| } else { |
| this._bufs[0] = this._bufs[0].slice(bytes); |
| this.length -= bytes; |
| break |
| } |
| } |
| |
| return this |
| }; |
| |
| BufferList$1.prototype.duplicate = function duplicate () { |
| const copy = this._new(); |
| |
| for (let i = 0; i < this._bufs.length; i++) { |
| copy.append(this._bufs[i]); |
| } |
| |
| return copy |
| }; |
| |
| BufferList$1.prototype.append = function append (buf) { |
| if (buf == null) { |
| return this |
| } |
| |
| if (buf.buffer) { |
| // append a view of the underlying ArrayBuffer |
| this._appendBuffer(Buffer$1.from(buf.buffer, buf.byteOffset, buf.byteLength)); |
| } else if (Array.isArray(buf)) { |
| for (let i = 0; i < buf.length; i++) { |
| this.append(buf[i]); |
| } |
| } else if (this._isBufferList(buf)) { |
| // unwrap argument into individual BufferLists |
| for (let i = 0; i < buf._bufs.length; i++) { |
| this.append(buf._bufs[i]); |
| } |
| } else { |
| // coerce number arguments to strings, since Buffer(number) does |
| // uninitialized memory allocation |
| if (typeof buf === 'number') { |
| buf = buf.toString(); |
| } |
| |
| this._appendBuffer(Buffer$1.from(buf)); |
| } |
| |
| return this |
| }; |
| |
| BufferList$1.prototype._appendBuffer = function appendBuffer (buf) { |
| this._bufs.push(buf); |
| this.length += buf.length; |
| }; |
| |
| BufferList$1.prototype.indexOf = function (search, offset, encoding) { |
| if (encoding === undefined && typeof offset === 'string') { |
| encoding = offset; |
| offset = undefined; |
| } |
| |
| if (typeof search === 'function' || Array.isArray(search)) { |
| throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.') |
| } else if (typeof search === 'number') { |
| search = Buffer$1.from([search]); |
| } else if (typeof search === 'string') { |
| search = Buffer$1.from(search, encoding); |
| } else if (this._isBufferList(search)) { |
| search = search.slice(); |
| } else if (Array.isArray(search.buffer)) { |
| search = Buffer$1.from(search.buffer, search.byteOffset, search.byteLength); |
| } else if (!Buffer$1.isBuffer(search)) { |
| search = Buffer$1.from(search); |
| } |
| |
| offset = Number(offset || 0); |
| |
| if (isNaN(offset)) { |
| offset = 0; |
| } |
| |
| if (offset < 0) { |
| offset = this.length + offset; |
| } |
| |
| if (offset < 0) { |
| offset = 0; |
| } |
| |
| if (search.length === 0) { |
| return offset > this.length ? this.length : offset |
| } |
| |
| const blOffset = this._offset(offset); |
| let blIndex = blOffset[0]; // index of which internal buffer we're working on |
| let buffOffset = blOffset[1]; // offset of the internal buffer we're working on |
| |
| // scan over each buffer |
| for (; blIndex < this._bufs.length; blIndex++) { |
| const buff = this._bufs[blIndex]; |
| |
| while (buffOffset < buff.length) { |
| const availableWindow = buff.length - buffOffset; |
| |
| if (availableWindow >= search.length) { |
| const nativeSearchResult = buff.indexOf(search, buffOffset); |
| |
| if (nativeSearchResult !== -1) { |
| return this._reverseOffset([blIndex, nativeSearchResult]) |
| } |
| |
| buffOffset = buff.length - search.length + 1; // end of native search window |
| } else { |
| const revOffset = this._reverseOffset([blIndex, buffOffset]); |
| |
| if (this._match(revOffset, search)) { |
| return revOffset |
| } |
| |
| buffOffset++; |
| } |
| } |
| |
| buffOffset = 0; |
| } |
| |
| return -1 |
| }; |
| |
| BufferList$1.prototype._match = function (offset, search) { |
| if (this.length - offset < search.length) { |
| return false |
| } |
| |
| for (let searchOffset = 0; searchOffset < search.length; searchOffset++) { |
| if (this.get(offset + searchOffset) !== search[searchOffset]) { |
| return false |
| } |
| } |
| return true |
| } |
| |
| ;(function () { |
| const methods = { |
| readDoubleBE: 8, |
| readDoubleLE: 8, |
| readFloatBE: 4, |
| readFloatLE: 4, |
| readBigInt64BE: 8, |
| readBigInt64LE: 8, |
| readBigUInt64BE: 8, |
| readBigUInt64LE: 8, |
| readInt32BE: 4, |
| readInt32LE: 4, |
| readUInt32BE: 4, |
| readUInt32LE: 4, |
| readInt16BE: 2, |
| readInt16LE: 2, |
| readUInt16BE: 2, |
| readUInt16LE: 2, |
| readInt8: 1, |
| readUInt8: 1, |
| readIntBE: null, |
| readIntLE: null, |
| readUIntBE: null, |
| readUIntLE: null |
| }; |
| |
| for (const m in methods) { |
| (function (m) { |
| if (methods[m] === null) { |
| BufferList$1.prototype[m] = function (offset, byteLength) { |
| return this.slice(offset, offset + byteLength)[m](0, byteLength) |
| }; |
| } else { |
| BufferList$1.prototype[m] = function (offset = 0) { |
| return this.slice(offset, offset + methods[m])[m](0) |
| }; |
| } |
| }(m)); |
| } |
| }()); |
| |
| // Used internally by the class and also as an indicator of this object being |
| // a `BufferList`. It's not possible to use `instanceof BufferList` in a browser |
| // environment because there could be multiple different copies of the |
| // BufferList class and some `BufferList`s might be `BufferList`s. |
| BufferList$1.prototype._isBufferList = function _isBufferList (b) { |
| return b instanceof BufferList$1 || BufferList$1.isBufferList(b) |
| }; |
| |
| BufferList$1.isBufferList = function isBufferList (b) { |
| return b != null && b[symbol] |
| }; |
| |
| var BufferList_1 = BufferList$1; |
| |
| const DuplexStream = ours.exports.Duplex; |
| const inherits = inherits$1.exports; |
| const BufferList = BufferList_1; |
| |
| function BufferListStream (callback) { |
| if (!(this instanceof BufferListStream)) { |
| return new BufferListStream(callback) |
| } |
| |
| if (typeof callback === 'function') { |
| this._callback = callback; |
| |
| const piper = function piper (err) { |
| if (this._callback) { |
| this._callback(err); |
| this._callback = null; |
| } |
| }.bind(this); |
| |
| this.on('pipe', function onPipe (src) { |
| src.on('error', piper); |
| }); |
| this.on('unpipe', function onUnpipe (src) { |
| src.removeListener('error', piper); |
| }); |
| |
| callback = null; |
| } |
| |
| BufferList._init.call(this, callback); |
| DuplexStream.call(this); |
| } |
| |
| inherits(BufferListStream, DuplexStream); |
| Object.assign(BufferListStream.prototype, BufferList.prototype); |
| |
| BufferListStream.prototype._new = function _new (callback) { |
| return new BufferListStream(callback) |
| }; |
| |
| BufferListStream.prototype._write = function _write (buf, encoding, callback) { |
| this._appendBuffer(buf); |
| |
| if (typeof callback === 'function') { |
| callback(); |
| } |
| }; |
| |
| BufferListStream.prototype._read = function _read (size) { |
| if (!this.length) { |
| return this.push(null) |
| } |
| |
| size = Math.min(size, this.length); |
| this.push(this.slice(0, size)); |
| this.consume(size); |
| }; |
| |
| BufferListStream.prototype.end = function end (chunk) { |
| DuplexStream.prototype.end.call(this, chunk); |
| |
| if (this._callback) { |
| this._callback(null, this.slice()); |
| this._callback = null; |
| } |
| }; |
| |
| BufferListStream.prototype._destroy = function _destroy (err, cb) { |
| this._bufs.length = 0; |
| this.length = 0; |
| cb(err); |
| }; |
| |
| BufferListStream.prototype._isBufferList = function _isBufferList (b) { |
| return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b) |
| }; |
| |
| BufferListStream.isBufferList = BufferList.isBufferList; |
| |
| bl.exports = BufferListStream; |
| bl.exports.BufferListStream = BufferListStream; |
| bl.exports.BufferList = BufferList; |
| |
| var queueMicrotask_1; |
| var hasRequiredQueueMicrotask; |
| |
| function requireQueueMicrotask () { |
| if (hasRequiredQueueMicrotask) return queueMicrotask_1; |
| hasRequiredQueueMicrotask = 1; |
| queueMicrotask_1 = typeof queueMicrotask === 'function' ? queueMicrotask : (fn) => Promise.resolve().then(fn); |
| return queueMicrotask_1; |
| } |
| |
| var processNextTick = (typeof process !== 'undefined' && typeof process.nextTick === 'function') |
| ? process.nextTick.bind(process) |
| : requireQueueMicrotask(); |
| |
| var fixedSize = class FixedFIFO { |
| constructor (hwm) { |
| if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) throw new Error('Max size for a FixedFIFO should be a power of two') |
| this.buffer = new Array(hwm); |
| this.mask = hwm - 1; |
| this.top = 0; |
| this.btm = 0; |
| this.next = null; |
| } |
| |
| push (data) { |
| if (this.buffer[this.top] !== undefined) return false |
| this.buffer[this.top] = data; |
| this.top = (this.top + 1) & this.mask; |
| return true |
| } |
| |
| shift () { |
| const last = this.buffer[this.btm]; |
| if (last === undefined) return undefined |
| this.buffer[this.btm] = undefined; |
| this.btm = (this.btm + 1) & this.mask; |
| return last |
| } |
| |
| peek () { |
| return this.buffer[this.btm] |
| } |
| |
| isEmpty () { |
| return this.buffer[this.btm] === undefined |
| } |
| }; |
| |
| const FixedFIFO = fixedSize; |
| |
| var fastFifo = class FastFIFO { |
| constructor (hwm) { |
| this.hwm = hwm || 16; |
| this.head = new FixedFIFO(this.hwm); |
| this.tail = this.head; |
| } |
| |
| push (val) { |
| if (!this.head.push(val)) { |
| const prev = this.head; |
| this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length); |
| this.head.push(val); |
| } |
| } |
| |
| shift () { |
| const val = this.tail.shift(); |
| if (val === undefined && this.tail.next) { |
| const next = this.tail.next; |
| this.tail.next = null; |
| this.tail = next; |
| return this.tail.shift() |
| } |
| return val |
| } |
| |
| peek () { |
| return this.tail.peek() |
| } |
| |
| isEmpty () { |
| return this.head.isEmpty() |
| } |
| }; |
| |
| const { EventEmitter } = require$$2; |
| const STREAM_DESTROYED = new Error('Stream was destroyed'); |
| const PREMATURE_CLOSE = new Error('Premature close'); |
| |
| const queueTick = processNextTick; |
| const FIFO = fastFifo; |
| |
| /* eslint-disable no-multi-spaces */ |
| |
| // 26 bits used total (4 from shared, 13 from read, and 9 from write) |
| const MAX = ((1 << 26) - 1); |
| |
| // Shared state |
| const OPENING = 0b0001; |
| const PREDESTROYING = 0b0010; |
| const DESTROYING = 0b0100; |
| const DESTROYED = 0b1000; |
| |
| const NOT_OPENING = MAX ^ OPENING; |
| const NOT_PREDESTROYING = MAX ^ PREDESTROYING; |
| |
| // Read state (4 bit offset from shared state) |
| const READ_ACTIVE = 0b0000000000001 << 4; |
| const READ_PRIMARY = 0b0000000000010 << 4; |
| const READ_SYNC = 0b0000000000100 << 4; |
| const READ_QUEUED = 0b0000000001000 << 4; |
| const READ_RESUMED = 0b0000000010000 << 4; |
| const READ_PIPE_DRAINED = 0b0000000100000 << 4; |
| const READ_ENDING = 0b0000001000000 << 4; |
| const READ_EMIT_DATA = 0b0000010000000 << 4; |
| const READ_EMIT_READABLE = 0b0000100000000 << 4; |
| const READ_EMITTED_READABLE = 0b0001000000000 << 4; |
| const READ_DONE = 0b0010000000000 << 4; |
| const READ_NEXT_TICK = 0b0100000000001 << 4; // also active |
| const READ_NEEDS_PUSH = 0b1000000000000 << 4; |
| |
| // Combined read state |
| const READ_FLOWING = READ_RESUMED | READ_PIPE_DRAINED; |
| const READ_ACTIVE_AND_SYNC = READ_ACTIVE | READ_SYNC; |
| const READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH = READ_ACTIVE | READ_SYNC | READ_NEEDS_PUSH; |
| const READ_PRIMARY_AND_ACTIVE = READ_PRIMARY | READ_ACTIVE; |
| const READ_EMIT_READABLE_AND_QUEUED = READ_EMIT_READABLE | READ_QUEUED; |
| |
| const READ_NOT_ACTIVE = MAX ^ READ_ACTIVE; |
| const READ_NON_PRIMARY = MAX ^ READ_PRIMARY; |
| const READ_NON_PRIMARY_AND_PUSHED = MAX ^ (READ_PRIMARY | READ_NEEDS_PUSH); |
| const READ_NOT_SYNC = MAX ^ READ_SYNC; |
| const READ_PUSHED = MAX ^ READ_NEEDS_PUSH; |
| const READ_PAUSED = MAX ^ READ_RESUMED; |
| const READ_NOT_QUEUED = MAX ^ (READ_QUEUED | READ_EMITTED_READABLE); |
| const READ_NOT_ENDING = MAX ^ READ_ENDING; |
| const READ_PIPE_NOT_DRAINED = MAX ^ READ_FLOWING; |
| const READ_NOT_NEXT_TICK = MAX ^ READ_NEXT_TICK; |
| |
| // Write state (17 bit offset, 4 bit offset from shared state and 13 from read state) |
| const WRITE_ACTIVE = 0b000000001 << 17; |
| const WRITE_PRIMARY = 0b000000010 << 17; |
| const WRITE_SYNC = 0b000000100 << 17; |
| const WRITE_QUEUED = 0b000001000 << 17; |
| const WRITE_UNDRAINED = 0b000010000 << 17; |
| const WRITE_DONE = 0b000100000 << 17; |
| const WRITE_EMIT_DRAIN = 0b001000000 << 17; |
| const WRITE_NEXT_TICK = 0b010000001 << 17; // also active |
| const WRITE_FINISHING = 0b100000000 << 17; |
| |
| const WRITE_NOT_ACTIVE = MAX ^ WRITE_ACTIVE; |
| const WRITE_NOT_SYNC = MAX ^ WRITE_SYNC; |
| const WRITE_NON_PRIMARY = MAX ^ WRITE_PRIMARY; |
| const WRITE_NOT_FINISHING = MAX ^ WRITE_FINISHING; |
| const WRITE_DRAINED = MAX ^ WRITE_UNDRAINED; |
| const WRITE_NOT_QUEUED = MAX ^ WRITE_QUEUED; |
| const WRITE_NOT_NEXT_TICK = MAX ^ WRITE_NEXT_TICK; |
| |
| // Combined shared state |
| const ACTIVE = READ_ACTIVE | WRITE_ACTIVE; |
| const NOT_ACTIVE = MAX ^ ACTIVE; |
| const DONE = READ_DONE | WRITE_DONE; |
| const DESTROY_STATUS = DESTROYING | DESTROYED | PREDESTROYING; |
| const OPEN_STATUS = DESTROY_STATUS | OPENING; |
| const AUTO_DESTROY = DESTROY_STATUS | DONE; |
| const NON_PRIMARY = WRITE_NON_PRIMARY & READ_NON_PRIMARY; |
| const ACTIVE_OR_TICKING = WRITE_NEXT_TICK | READ_NEXT_TICK; |
| const TICKING = ACTIVE_OR_TICKING & NOT_ACTIVE; |
| const IS_OPENING = OPEN_STATUS | TICKING; |
| |
| // Combined shared state and read state |
| const READ_PRIMARY_STATUS = OPEN_STATUS | READ_ENDING | READ_DONE; |
| const READ_STATUS = OPEN_STATUS | READ_DONE | READ_QUEUED; |
| const READ_ENDING_STATUS = OPEN_STATUS | READ_ENDING | READ_QUEUED; |
| const READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | READ_EMITTED_READABLE; |
| const SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH; |
| const READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE; |
| |
| // Combined write state |
| const WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE; |
| const WRITE_QUEUED_AND_UNDRAINED = WRITE_QUEUED | WRITE_UNDRAINED; |
| const WRITE_QUEUED_AND_ACTIVE = WRITE_QUEUED | WRITE_ACTIVE; |
| const WRITE_DRAIN_STATUS = WRITE_QUEUED | WRITE_UNDRAINED | OPEN_STATUS | WRITE_ACTIVE; |
| const WRITE_STATUS = OPEN_STATUS | WRITE_ACTIVE | WRITE_QUEUED; |
| const WRITE_PRIMARY_AND_ACTIVE = WRITE_PRIMARY | WRITE_ACTIVE; |
| const WRITE_ACTIVE_AND_SYNC = WRITE_ACTIVE | WRITE_SYNC; |
| const WRITE_FINISHING_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_QUEUED_AND_ACTIVE | WRITE_DONE; |
| const WRITE_BACKPRESSURE_STATUS = WRITE_UNDRAINED | DESTROY_STATUS | WRITE_FINISHING | WRITE_DONE; |
| |
| const asyncIterator = Symbol.asyncIterator || Symbol('asyncIterator'); |
| |
| class WritableState { |
| constructor (stream, { highWaterMark = 16384, map = null, mapWritable, byteLength, byteLengthWritable } = {}) { |
| this.stream = stream; |
| this.queue = new FIFO(); |
| this.highWaterMark = highWaterMark; |
| this.buffered = 0; |
| this.error = null; |
| this.pipeline = null; |
| this.byteLength = byteLengthWritable || byteLength || defaultByteLength; |
| this.map = mapWritable || map; |
| this.afterWrite = afterWrite.bind(this); |
| this.afterUpdateNextTick = updateWriteNT.bind(this); |
| } |
| |
| get ended () { |
| return (this.stream._duplexState & WRITE_DONE) !== 0 |
| } |
| |
| push (data) { |
| if (this.map !== null) data = this.map(data); |
| |
| this.buffered += this.byteLength(data); |
| this.queue.push(data); |
| |
| if (this.buffered < this.highWaterMark) { |
| this.stream._duplexState |= WRITE_QUEUED; |
| return true |
| } |
| |
| this.stream._duplexState |= WRITE_QUEUED_AND_UNDRAINED; |
| return false |
| } |
| |
| shift () { |
| const data = this.queue.shift(); |
| const stream = this.stream; |
| |
| this.buffered -= this.byteLength(data); |
| if (this.buffered === 0) stream._duplexState &= WRITE_NOT_QUEUED; |
| |
| return data |
| } |
| |
| end (data) { |
| if (typeof data === 'function') this.stream.once('finish', data); |
| else if (data !== undefined && data !== null) this.push(data); |
| this.stream._duplexState = (this.stream._duplexState | WRITE_FINISHING) & WRITE_NON_PRIMARY; |
| } |
| |
| autoBatch (data, cb) { |
| const buffer = []; |
| const stream = this.stream; |
| |
| buffer.push(data); |
| while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED_AND_ACTIVE) { |
| buffer.push(stream._writableState.shift()); |
| } |
| |
| if ((stream._duplexState & OPEN_STATUS) !== 0) return cb(null) |
| stream._writev(buffer, cb); |
| } |
| |
| update () { |
| const stream = this.stream; |
| |
| while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED) { |
| const data = this.shift(); |
| stream._duplexState |= WRITE_ACTIVE_AND_SYNC; |
| stream._write(data, this.afterWrite); |
| stream._duplexState &= WRITE_NOT_SYNC; |
| } |
| |
| if ((stream._duplexState & WRITE_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary(); |
| } |
| |
| updateNonPrimary () { |
| const stream = this.stream; |
| |
| if ((stream._duplexState & WRITE_FINISHING_STATUS) === WRITE_FINISHING) { |
| stream._duplexState = (stream._duplexState | WRITE_ACTIVE) & WRITE_NOT_FINISHING; |
| stream._final(afterFinal.bind(this)); |
| return |
| } |
| |
| if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) { |
| if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) { |
| stream._duplexState |= ACTIVE; |
| stream._destroy(afterDestroy.bind(this)); |
| } |
| return |
| } |
| |
| if ((stream._duplexState & IS_OPENING) === OPENING) { |
| stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING; |
| stream._open(afterOpen.bind(this)); |
| } |
| } |
| |
| updateNextTick () { |
| if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return |
| this.stream._duplexState |= WRITE_NEXT_TICK; |
| queueTick(this.afterUpdateNextTick); |
| } |
| } |
| |
| class ReadableState { |
| constructor (stream, { highWaterMark = 16384, map = null, mapReadable, byteLength, byteLengthReadable } = {}) { |
| this.stream = stream; |
| this.queue = new FIFO(); |
| this.highWaterMark = highWaterMark; |
| this.buffered = 0; |
| this.error = null; |
| this.pipeline = null; |
| this.byteLength = byteLengthReadable || byteLength || defaultByteLength; |
| this.map = mapReadable || map; |
| this.pipeTo = null; |
| this.afterRead = afterRead.bind(this); |
| this.afterUpdateNextTick = updateReadNT.bind(this); |
| } |
| |
| get ended () { |
| return (this.stream._duplexState & READ_DONE) !== 0 |
| } |
| |
| pipe (pipeTo, cb) { |
| if (this.pipeTo !== null) throw new Error('Can only pipe to one destination') |
| if (typeof cb !== 'function') cb = null; |
| |
| this.stream._duplexState |= READ_PIPE_DRAINED; |
| this.pipeTo = pipeTo; |
| this.pipeline = new Pipeline(this.stream, pipeTo, cb); |
| |
| if (cb) this.stream.on('error', noop$1); // We already error handle this so supress crashes |
| |
| if (isStreamx(pipeTo)) { |
| pipeTo._writableState.pipeline = this.pipeline; |
| if (cb) pipeTo.on('error', noop$1); // We already error handle this so supress crashes |
| pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline)); // TODO: just call finished from pipeTo itself |
| } else { |
| const onerror = this.pipeline.done.bind(this.pipeline, pipeTo); |
| const onclose = this.pipeline.done.bind(this.pipeline, pipeTo, null); // onclose has a weird bool arg |
| pipeTo.on('error', onerror); |
| pipeTo.on('close', onclose); |
| pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline)); |
| } |
| |
| pipeTo.on('drain', afterDrain.bind(this)); |
| this.stream.emit('piping', pipeTo); |
| pipeTo.emit('pipe', this.stream); |
| } |
| |
| push (data) { |
| const stream = this.stream; |
| |
| if (data === null) { |
| this.highWaterMark = 0; |
| stream._duplexState = (stream._duplexState | READ_ENDING) & READ_NON_PRIMARY_AND_PUSHED; |
| return false |
| } |
| |
| if (this.map !== null) data = this.map(data); |
| this.buffered += this.byteLength(data); |
| this.queue.push(data); |
| |
| stream._duplexState = (stream._duplexState | READ_QUEUED) & READ_PUSHED; |
| |
| return this.buffered < this.highWaterMark |
| } |
| |
| shift () { |
| const data = this.queue.shift(); |
| |
| this.buffered -= this.byteLength(data); |
| if (this.buffered === 0) this.stream._duplexState &= READ_NOT_QUEUED; |
| return data |
| } |
| |
| unshift (data) { |
| let tail; |
| const pending = []; |
| |
| while ((tail = this.queue.shift()) !== undefined) { |
| pending.push(tail); |
| } |
| |
| this.push(data); |
| |
| for (let i = 0; i < pending.length; i++) { |
| this.queue.push(pending[i]); |
| } |
| } |
| |
| read () { |
| const stream = this.stream; |
| |
| if ((stream._duplexState & READ_STATUS) === READ_QUEUED) { |
| const data = this.shift(); |
| if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED; |
| if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data); |
| return data |
| } |
| |
| return null |
| } |
| |
| drain () { |
| const stream = this.stream; |
| |
| while ((stream._duplexState & READ_STATUS) === READ_QUEUED && (stream._duplexState & READ_FLOWING) !== 0) { |
| const data = this.shift(); |
| if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED; |
| if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data); |
| } |
| } |
| |
| update () { |
| const stream = this.stream; |
| |
| this.drain(); |
| |
| while (this.buffered < this.highWaterMark && (stream._duplexState & SHOULD_NOT_READ) === 0) { |
| stream._duplexState |= READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH; |
| stream._read(this.afterRead); |
| stream._duplexState &= READ_NOT_SYNC; |
| if ((stream._duplexState & READ_ACTIVE) === 0) this.drain(); |
| } |
| |
| if ((stream._duplexState & READ_READABLE_STATUS) === READ_EMIT_READABLE_AND_QUEUED) { |
| stream._duplexState |= READ_EMITTED_READABLE; |
| stream.emit('readable'); |
| } |
| |
| if ((stream._duplexState & READ_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary(); |
| } |
| |
| updateNonPrimary () { |
| const stream = this.stream; |
| |
| if ((stream._duplexState & READ_ENDING_STATUS) === READ_ENDING) { |
| stream._duplexState = (stream._duplexState | READ_DONE) & READ_NOT_ENDING; |
| stream.emit('end'); |
| if ((stream._duplexState & AUTO_DESTROY) === DONE) stream._duplexState |= DESTROYING; |
| if (this.pipeTo !== null) this.pipeTo.end(); |
| } |
| |
| if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) { |
| if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) { |
| stream._duplexState |= ACTIVE; |
| stream._destroy(afterDestroy.bind(this)); |
| } |
| return |
| } |
| |
| if ((stream._duplexState & IS_OPENING) === OPENING) { |
| stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING; |
| stream._open(afterOpen.bind(this)); |
| } |
| } |
| |
| updateNextTick () { |
| if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return |
| this.stream._duplexState |= READ_NEXT_TICK; |
| queueTick(this.afterUpdateNextTick); |
| } |
| } |
| |
| class TransformState { |
| constructor (stream) { |
| this.data = null; |
| this.afterTransform = afterTransform.bind(stream); |
| this.afterFinal = null; |
| } |
| } |
| |
| class Pipeline { |
| constructor (src, dst, cb) { |
| this.from = src; |
| this.to = dst; |
| this.afterPipe = cb; |
| this.error = null; |
| this.pipeToFinished = false; |
| } |
| |
| finished () { |
| this.pipeToFinished = true; |
| } |
| |
| done (stream, err) { |
| if (err) this.error = err; |
| |
| if (stream === this.to) { |
| this.to = null; |
| |
| if (this.from !== null) { |
| if ((this.from._duplexState & READ_DONE) === 0 || !this.pipeToFinished) { |
| this.from.destroy(this.error || new Error('Writable stream closed prematurely')); |
| } |
| return |
| } |
| } |
| |
| if (stream === this.from) { |
| this.from = null; |
| |
| if (this.to !== null) { |
| if ((stream._duplexState & READ_DONE) === 0) { |
| this.to.destroy(this.error || new Error('Readable stream closed before ending')); |
| } |
| return |
| } |
| } |
| |
| if (this.afterPipe !== null) this.afterPipe(this.error); |
| this.to = this.from = this.afterPipe = null; |
| } |
| } |
| |
| function afterDrain () { |
| this.stream._duplexState |= READ_PIPE_DRAINED; |
| if ((this.stream._duplexState & READ_ACTIVE_AND_SYNC) === 0) this.updateNextTick(); |
| else this.drain(); |
| } |
| |
| function afterFinal (err) { |
| const stream = this.stream; |
| if (err) stream.destroy(err); |
| if ((stream._duplexState & DESTROY_STATUS) === 0) { |
| stream._duplexState |= WRITE_DONE; |
| stream.emit('finish'); |
| } |
| if ((stream._duplexState & AUTO_DESTROY) === DONE) { |
| stream._duplexState |= DESTROYING; |
| } |
| |
| stream._duplexState &= WRITE_NOT_ACTIVE; |
| this.update(); |
| } |
| |
| function afterDestroy (err) { |
| const stream = this.stream; |
| |
| if (!err && this.error !== STREAM_DESTROYED) err = this.error; |
| if (err) stream.emit('error', err); |
| stream._duplexState |= DESTROYED; |
| stream.emit('close'); |
| |
| const rs = stream._readableState; |
| const ws = stream._writableState; |
| |
| if (rs !== null && rs.pipeline !== null) rs.pipeline.done(stream, err); |
| if (ws !== null && ws.pipeline !== null) ws.pipeline.done(stream, err); |
| } |
| |
| function afterWrite (err) { |
| const stream = this.stream; |
| |
| if (err) stream.destroy(err); |
| stream._duplexState &= WRITE_NOT_ACTIVE; |
| |
| if ((stream._duplexState & WRITE_DRAIN_STATUS) === WRITE_UNDRAINED) { |
| stream._duplexState &= WRITE_DRAINED; |
| if ((stream._duplexState & WRITE_EMIT_DRAIN) === WRITE_EMIT_DRAIN) { |
| stream.emit('drain'); |
| } |
| } |
| |
| if ((stream._duplexState & WRITE_SYNC) === 0) this.update(); |
| } |
| |
| function afterRead (err) { |
| if (err) this.stream.destroy(err); |
| this.stream._duplexState &= READ_NOT_ACTIVE; |
| if ((this.stream._duplexState & READ_SYNC) === 0) this.update(); |
| } |
| |
| function updateReadNT () { |
| this.stream._duplexState &= READ_NOT_NEXT_TICK; |
| this.update(); |
| } |
| |
| function updateWriteNT () { |
| this.stream._duplexState &= WRITE_NOT_NEXT_TICK; |
| this.update(); |
| } |
| |
| function afterOpen (err) { |
| const stream = this.stream; |
| |
| if (err) stream.destroy(err); |
| |
| if ((stream._duplexState & DESTROYING) === 0) { |
| if ((stream._duplexState & READ_PRIMARY_STATUS) === 0) stream._duplexState |= READ_PRIMARY; |
| if ((stream._duplexState & WRITE_PRIMARY_STATUS) === 0) stream._duplexState |= WRITE_PRIMARY; |
| stream.emit('open'); |
| } |
| |
| stream._duplexState &= NOT_ACTIVE; |
| |
| if (stream._writableState !== null) { |
| stream._writableState.update(); |
| } |
| |
| if (stream._readableState !== null) { |
| stream._readableState.update(); |
| } |
| } |
| |
| function afterTransform (err, data) { |
| if (data !== undefined && data !== null) this.push(data); |
| this._writableState.afterWrite(err); |
| } |
| |
| class Stream extends EventEmitter { |
| constructor (opts) { |
| super(); |
| |
| this._duplexState = 0; |
| this._readableState = null; |
| this._writableState = null; |
| |
| if (opts) { |
| if (opts.open) this._open = opts.open; |
| if (opts.destroy) this._destroy = opts.destroy; |
| if (opts.predestroy) this._predestroy = opts.predestroy; |
| if (opts.signal) { |
| opts.signal.addEventListener('abort', abort.bind(this)); |
| } |
| } |
| } |
| |
| _open (cb) { |
| cb(null); |
| } |
| |
| _destroy (cb) { |
| cb(null); |
| } |
| |
| _predestroy () { |
| // does nothing |
| } |
| |
| get readable () { |
| return this._readableState !== null ? true : undefined |
| } |
| |
| get writable () { |
| return this._writableState !== null ? true : undefined |
| } |
| |
| get destroyed () { |
| return (this._duplexState & DESTROYED) !== 0 |
| } |
| |
| get destroying () { |
| return (this._duplexState & DESTROY_STATUS) !== 0 |
| } |
| |
| destroy (err) { |
| if ((this._duplexState & DESTROY_STATUS) === 0) { |
| if (!err) err = STREAM_DESTROYED; |
| this._duplexState = (this._duplexState | DESTROYING) & NON_PRIMARY; |
| |
| if (this._readableState !== null) this._readableState.error = err; |
| if (this._writableState !== null) this._writableState.error = err; |
| |
| this._duplexState |= PREDESTROYING; |
| this._predestroy(); |
| this._duplexState &= NOT_PREDESTROYING; |
| |
| if (this._readableState !== null) this._readableState.updateNextTick(); |
| if (this._writableState !== null) this._writableState.updateNextTick(); |
| } |
| } |
| |
| on (name, fn) { |
| if (this._readableState !== null) { |
| if (name === 'data') { |
| this._duplexState |= (READ_EMIT_DATA | READ_RESUMED); |
| this._readableState.updateNextTick(); |
| } |
| if (name === 'readable') { |
| this._duplexState |= READ_EMIT_READABLE; |
| this._readableState.updateNextTick(); |
| } |
| } |
| |
| if (this._writableState !== null) { |
| if (name === 'drain') { |
| this._duplexState |= WRITE_EMIT_DRAIN; |
| this._writableState.updateNextTick(); |
| } |
| } |
| |
| return super.on(name, fn) |
| } |
| } |
| |
| class Readable$1 extends Stream { |
| constructor (opts) { |
| super(opts); |
| |
| this._duplexState |= OPENING | WRITE_DONE; |
| this._readableState = new ReadableState(this, opts); |
| |
| if (opts) { |
| if (opts.read) this._read = opts.read; |
| if (opts.eagerOpen) this.resume().pause(); |
| } |
| } |
| |
| _read (cb) { |
| cb(null); |
| } |
| |
| pipe (dest, cb) { |
| this._readableState.pipe(dest, cb); |
| this._readableState.updateNextTick(); |
| return dest |
| } |
| |
| read () { |
| this._readableState.updateNextTick(); |
| return this._readableState.read() |
| } |
| |
| push (data) { |
| this._readableState.updateNextTick(); |
| return this._readableState.push(data) |
| } |
| |
| unshift (data) { |
| this._readableState.updateNextTick(); |
| return this._readableState.unshift(data) |
| } |
| |
| resume () { |
| this._duplexState |= READ_RESUMED; |
| this._readableState.updateNextTick(); |
| return this |
| } |
| |
| pause () { |
| this._duplexState &= READ_PAUSED; |
| return this |
| } |
| |
| static _fromAsyncIterator (ite, opts) { |
| let destroy; |
| |
| const rs = new Readable$1({ |
| ...opts, |
| read (cb) { |
| ite.next().then(push).then(cb.bind(null, null)).catch(cb); |
| }, |
| predestroy () { |
| destroy = ite.return(); |
| }, |
| destroy (cb) { |
| if (!destroy) return cb(null) |
| destroy.then(cb.bind(null, null)).catch(cb); |
| } |
| }); |
| |
| return rs |
| |
| function push (data) { |
| if (data.done) rs.push(null); |
| else rs.push(data.value); |
| } |
| } |
| |
| static from (data, opts) { |
| if (isReadStreamx(data)) return data |
| if (data[asyncIterator]) return this._fromAsyncIterator(data[asyncIterator](), opts) |
| if (!Array.isArray(data)) data = data === undefined ? [] : [data]; |
| |
| let i = 0; |
| return new Readable$1({ |
| ...opts, |
| read (cb) { |
| this.push(i === data.length ? null : data[i++]); |
| cb(null); |
| } |
| }) |
| } |
| |
| static isBackpressured (rs) { |
| return (rs._duplexState & READ_BACKPRESSURE_STATUS) !== 0 || rs._readableState.buffered >= rs._readableState.highWaterMark |
| } |
| |
| static isPaused (rs) { |
| return (rs._duplexState & READ_RESUMED) === 0 |
| } |
| |
| [asyncIterator] () { |
| const stream = this; |
| |
| let error = null; |
| let promiseResolve = null; |
| let promiseReject = null; |
| |
| this.on('error', (err) => { error = err; }); |
| this.on('readable', onreadable); |
| this.on('close', onclose); |
| |
| return { |
| [asyncIterator] () { |
| return this |
| }, |
| next () { |
| return new Promise(function (resolve, reject) { |
| promiseResolve = resolve; |
| promiseReject = reject; |
| const data = stream.read(); |
| if (data !== null) ondata(data); |
| else if ((stream._duplexState & DESTROYED) !== 0) ondata(null); |
| }) |
| }, |
| return () { |
| return destroy(null) |
| }, |
| throw (err) { |
| return destroy(err) |
| } |
| } |
| |
| function onreadable () { |
| if (promiseResolve !== null) ondata(stream.read()); |
| } |
| |
| function onclose () { |
| if (promiseResolve !== null) ondata(null); |
| } |
| |
| function ondata (data) { |
| if (promiseReject === null) return |
| if (error) promiseReject(error); |
| else if (data === null && (stream._duplexState & READ_DONE) === 0) promiseReject(STREAM_DESTROYED); |
| else promiseResolve({ value: data, done: data === null }); |
| promiseReject = promiseResolve = null; |
| } |
| |
| function destroy (err) { |
| stream.destroy(err); |
| return new Promise((resolve, reject) => { |
| if (stream._duplexState & DESTROYED) return resolve({ value: undefined, done: true }) |
| stream.once('close', function () { |
| if (err) reject(err); |
| else resolve({ value: undefined, done: true }); |
| }); |
| }) |
| } |
| } |
| } |
| |
| class Writable$1 extends Stream { |
| constructor (opts) { |
| super(opts); |
| |
| this._duplexState |= OPENING | READ_DONE; |
| this._writableState = new WritableState(this, opts); |
| |
| if (opts) { |
| if (opts.writev) this._writev = opts.writev; |
| if (opts.write) this._write = opts.write; |
| if (opts.final) this._final = opts.final; |
| } |
| } |
| |
| _writev (batch, cb) { |
| cb(null); |
| } |
| |
| _write (data, cb) { |
| this._writableState.autoBatch(data, cb); |
| } |
| |
| _final (cb) { |
| cb(null); |
| } |
| |
| static isBackpressured (ws) { |
| return (ws._duplexState & WRITE_BACKPRESSURE_STATUS) !== 0 |
| } |
| |
| write (data) { |
| this._writableState.updateNextTick(); |
| return this._writableState.push(data) |
| } |
| |
| end (data) { |
| this._writableState.updateNextTick(); |
| this._writableState.end(data); |
| return this |
| } |
| } |
| |
| class Duplex extends Readable$1 { // and Writable |
| constructor (opts) { |
| super(opts); |
| |
| this._duplexState = OPENING; |
| this._writableState = new WritableState(this, opts); |
| |
| if (opts) { |
| if (opts.writev) this._writev = opts.writev; |
| if (opts.write) this._write = opts.write; |
| if (opts.final) this._final = opts.final; |
| } |
| } |
| |
| _writev (batch, cb) { |
| cb(null); |
| } |
| |
| _write (data, cb) { |
| this._writableState.autoBatch(data, cb); |
| } |
| |
| _final (cb) { |
| cb(null); |
| } |
| |
| write (data) { |
| this._writableState.updateNextTick(); |
| return this._writableState.push(data) |
| } |
| |
| end (data) { |
| this._writableState.updateNextTick(); |
| this._writableState.end(data); |
| return this |
| } |
| } |
| |
| class Transform extends Duplex { |
| constructor (opts) { |
| super(opts); |
| this._transformState = new TransformState(this); |
| |
| if (opts) { |
| if (opts.transform) this._transform = opts.transform; |
| if (opts.flush) this._flush = opts.flush; |
| } |
| } |
| |
| _write (data, cb) { |
| if (this._readableState.buffered >= this._readableState.highWaterMark) { |
| this._transformState.data = data; |
| } else { |
| this._transform(data, this._transformState.afterTransform); |
| } |
| } |
| |
| _read (cb) { |
| if (this._transformState.data !== null) { |
| const data = this._transformState.data; |
| this._transformState.data = null; |
| cb(null); |
| this._transform(data, this._transformState.afterTransform); |
| } else { |
| cb(null); |
| } |
| } |
| |
| _transform (data, cb) { |
| cb(null, data); |
| } |
| |
| _flush (cb) { |
| cb(null); |
| } |
| |
| _final (cb) { |
| this._transformState.afterFinal = cb; |
| this._flush(transformAfterFlush.bind(this)); |
| } |
| } |
| |
| class PassThrough extends Transform {} |
| |
| function transformAfterFlush (err, data) { |
| const cb = this._transformState.afterFinal; |
| if (err) return cb(err) |
| if (data !== null && data !== undefined) this.push(data); |
| this.push(null); |
| cb(null); |
| } |
| |
| function pipelinePromise (...streams) { |
| return new Promise((resolve, reject) => { |
| return pipeline(...streams, (err) => { |
| if (err) return reject(err) |
| resolve(); |
| }) |
| }) |
| } |
| |
| function pipeline (stream, ...streams) { |
| const all = Array.isArray(stream) ? [...stream, ...streams] : [stream, ...streams]; |
| const done = (all.length && typeof all[all.length - 1] === 'function') ? all.pop() : null; |
| |
| if (all.length < 2) throw new Error('Pipeline requires at least 2 streams') |
| |
| let src = all[0]; |
| let dest = null; |
| let error = null; |
| |
| for (let i = 1; i < all.length; i++) { |
| dest = all[i]; |
| |
| if (isStreamx(src)) { |
| src.pipe(dest, onerror); |
| } else { |
| errorHandle(src, true, i > 1, onerror); |
| src.pipe(dest); |
| } |
| |
| src = dest; |
| } |
| |
| if (done) { |
| let fin = false; |
| |
| dest.on('finish', () => { fin = true; }); |
| dest.on('error', err => { error = error || err; }); |
| dest.on('close', () => done(error || (fin ? null : PREMATURE_CLOSE))); |
| } |
| |
| return dest |
| |
| function errorHandle (s, rd, wr, onerror) { |
| s.on('error', onerror); |
| s.on('close', onclose); |
| |
| function onclose () { |
| if (rd && s._readableState && !s._readableState.ended) return onerror(PREMATURE_CLOSE) |
| if (wr && s._writableState && !s._writableState.ended) return onerror(PREMATURE_CLOSE) |
| } |
| } |
| |
| function onerror (err) { |
| if (!err || error) return |
| error = err; |
| |
| for (const s of all) { |
| s.destroy(err); |
| } |
| } |
| } |
| |
| function isStream (stream) { |
| return !!stream._readableState || !!stream._writableState |
| } |
| |
| function isStreamx (stream) { |
| return typeof stream._duplexState === 'number' && isStream(stream) |
| } |
| |
| function getStreamError (stream) { |
| return (stream._readableState && stream._readableState.error) || (stream._writableState && stream._writableState.error) |
| } |
| |
| function isReadStreamx (stream) { |
| return isStreamx(stream) && stream.readable |
| } |
| |
| function isTypedArray (data) { |
| return typeof data === 'object' && data !== null && typeof data.byteLength === 'number' |
| } |
| |
| function defaultByteLength (data) { |
| return isTypedArray(data) ? data.byteLength : 1024 |
| } |
| |
| function noop$1 () {} |
| |
| function abort () { |
| this.destroy(new Error('Stream aborted.')); |
| } |
| |
| var streamx = { |
| pipeline, |
| pipelinePromise, |
| isStream, |
| isStreamx, |
| getStreamError, |
| Stream, |
| Writable: Writable$1, |
| Readable: Readable$1, |
| Duplex, |
| Transform, |
| // Export PassThrough for compatibility with Node.js core's stream module |
| PassThrough |
| }; |
| |
| var headers$1 = {}; |
| |
| function isBuffer (value) { |
| return Buffer.isBuffer(value) || value instanceof Uint8Array |
| } |
| |
| function isEncoding (encoding) { |
| return Buffer.isEncoding(encoding) |
| } |
| |
| function alloc (size, fill, encoding) { |
| return Buffer.alloc(size, fill, encoding) |
| } |
| |
| function allocUnsafe (size) { |
| return Buffer.allocUnsafe(size) |
| } |
| |
| function allocUnsafeSlow (size) { |
| return Buffer.allocUnsafeSlow(size) |
| } |
| |
| function byteLength (string, encoding) { |
| return Buffer.byteLength(string, encoding) |
| } |
| |
| function compare (a, b) { |
| return Buffer.compare(a, b) |
| } |
| |
| function concat (buffers, totalLength) { |
| return Buffer.concat(buffers, totalLength) |
| } |
| |
| function copy (source, target, targetStart, start, end) { |
| return toBuffer(source).copy(target, targetStart, start, end) |
| } |
| |
| function equals (a, b) { |
| return toBuffer(a).equals(b) |
| } |
| |
| function fill (buffer, value, offset, end, encoding) { |
| return toBuffer(buffer).fill(value, offset, end, encoding) |
| } |
| |
| function from (value, encodingOrOffset, length) { |
| return Buffer.from(value, encodingOrOffset, length) |
| } |
| |
| function includes (buffer, value, byteOffset, encoding) { |
| return toBuffer(buffer).includes(value, byteOffset, encoding) |
| } |
| |
| function indexOf$1 (buffer, value, byfeOffset, encoding) { |
| return toBuffer(buffer).indexOf(value, byfeOffset, encoding) |
| } |
| |
| function lastIndexOf (buffer, value, byteOffset, encoding) { |
| return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding) |
| } |
| |
| function swap16 (buffer) { |
| return toBuffer(buffer).swap16() |
| } |
| |
| function swap32 (buffer) { |
| return toBuffer(buffer).swap32() |
| } |
| |
| function swap64 (buffer) { |
| return toBuffer(buffer).swap64() |
| } |
| |
| function toBuffer (buffer) { |
| if (Buffer.isBuffer(buffer)) return buffer |
| return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength) |
| } |
| |
| function toString (buffer, encoding, start, end) { |
| return toBuffer(buffer).toString(encoding, start, end) |
| } |
| |
| function write (buffer, string, offset, length, encoding) { |
| return toBuffer(buffer).write(string, offset, length, encoding) |
| } |
| |
| function writeDoubleLE (buffer, value, offset) { |
| return toBuffer(buffer).writeDoubleLE(value, offset) |
| } |
| |
| function writeFloatLE (buffer, value, offset) { |
| return toBuffer(buffer).writeFloatLE(value, offset) |
| } |
| |
| function writeUInt32LE (buffer, value, offset) { |
| return toBuffer(buffer).writeUInt32LE(value, offset) |
| } |
| |
| function writeInt32LE (buffer, value, offset) { |
| return toBuffer(buffer).writeInt32LE(value, offset) |
| } |
| |
| function readDoubleLE (buffer, offset) { |
| return toBuffer(buffer).readDoubleLE(offset) |
| } |
| |
| function readFloatLE (buffer, offset) { |
| return toBuffer(buffer).readFloatLE(offset) |
| } |
| |
| function readUInt32LE (buffer, offset) { |
| return toBuffer(buffer).readUInt32LE(offset) |
| } |
| |
| function readInt32LE (buffer, offset) { |
| return toBuffer(buffer).readInt32LE(offset) |
| } |
| |
| var b4a$2 = { |
| isBuffer, |
| isEncoding, |
| alloc, |
| allocUnsafe, |
| allocUnsafeSlow, |
| byteLength, |
| compare, |
| concat, |
| copy, |
| equals, |
| fill, |
| from, |
| includes, |
| indexOf: indexOf$1, |
| lastIndexOf, |
| swap16, |
| swap32, |
| swap64, |
| toBuffer, |
| toString, |
| write, |
| writeDoubleLE, |
| writeFloatLE, |
| writeUInt32LE, |
| writeInt32LE, |
| readDoubleLE, |
| readFloatLE, |
| readUInt32LE, |
| readInt32LE |
| }; |
| |
| const b4a$1 = b4a$2; |
| |
| const ZEROS = '0000000000000000000'; |
| const SEVENS = '7777777777777777777'; |
| const ZERO_OFFSET = '0'.charCodeAt(0); |
| const USTAR_MAGIC = b4a$1.from('ustar\x00', 'binary'); |
| const USTAR_VER = b4a$1.from('00', 'binary'); |
| const GNU_MAGIC = b4a$1.from('ustar\x20', 'binary'); |
| const GNU_VER = b4a$1.from('\x20\x00', 'binary'); |
| const MASK = 0o7777; |
| const MAGIC_OFFSET = 257; |
| const VERSION_OFFSET = 263; |
| |
| const clamp = function (index, len, defaultValue) { |
| if (typeof index !== 'number') return defaultValue |
| index = ~~index; // Coerce to integer. |
| if (index >= len) return len |
| if (index >= 0) return index |
| index += len; |
| if (index >= 0) return index |
| return 0 |
| }; |
| |
| const toType = function (flag) { |
| switch (flag) { |
| case 0: |
| return 'file' |
| case 1: |
| return 'link' |
| case 2: |
| return 'symlink' |
| case 3: |
| return 'character-device' |
| case 4: |
| return 'block-device' |
| case 5: |
| return 'directory' |
| case 6: |
| return 'fifo' |
| case 7: |
| return 'contiguous-file' |
| case 72: |
| return 'pax-header' |
| case 55: |
| return 'pax-global-header' |
| case 27: |
| return 'gnu-long-link-path' |
| case 28: |
| case 30: |
| return 'gnu-long-path' |
| } |
| |
| return null |
| }; |
| |
| const toTypeflag = function (flag) { |
| switch (flag) { |
| case 'file': |
| return 0 |
| case 'link': |
| return 1 |
| case 'symlink': |
| return 2 |
| case 'character-device': |
| return 3 |
| case 'block-device': |
| return 4 |
| case 'directory': |
| return 5 |
| case 'fifo': |
| return 6 |
| case 'contiguous-file': |
| return 7 |
| case 'pax-header': |
| return 72 |
| } |
| |
| return 0 |
| }; |
| |
| const indexOf = function (block, num, offset, end) { |
| for (; offset < end; offset++) { |
| if (block[offset] === num) return offset |
| } |
| return end |
| }; |
| |
| const cksum = function (block) { |
| let sum = 8 * 32; |
| for (let i = 0; i < 148; i++) sum += block[i]; |
| for (let j = 156; j < 512; j++) sum += block[j]; |
| return sum |
| }; |
| |
| const encodeOct = function (val, n) { |
| val = val.toString(8); |
| if (val.length > n) return SEVENS.slice(0, n) + ' ' |
| else return ZEROS.slice(0, n - val.length) + val + ' ' |
| }; |
| |
| /* Copied from the node-tar repo and modified to meet |
| * tar-stream coding standard. |
| * |
| * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349 |
| */ |
| function parse256 (buf) { |
| // first byte MUST be either 80 or FF |
| // 80 for positive, FF for 2's comp |
| let positive; |
| if (buf[0] === 0x80) positive = true; |
| else if (buf[0] === 0xFF) positive = false; |
| else return null |
| |
| // build up a base-256 tuple from the least sig to the highest |
| const tuple = []; |
| let i; |
| for (i = buf.length - 1; i > 0; i--) { |
| const byte = buf[i]; |
| if (positive) tuple.push(byte); |
| else tuple.push(0xFF - byte); |
| } |
| |
| let sum = 0; |
| const l = tuple.length; |
| for (i = 0; i < l; i++) { |
| sum += tuple[i] * Math.pow(256, i); |
| } |
| |
| return positive ? sum : -1 * sum |
| } |
| |
| const decodeOct = function (val, offset, length) { |
| val = val.slice(offset, offset + length); |
| offset = 0; |
| |
| // If prefixed with 0x80 then parse as a base-256 integer |
| if (val[offset] & 0x80) { |
| return parse256(val) |
| } else { |
| // Older versions of tar can prefix with spaces |
| while (offset < val.length && val[offset] === 32) offset++; |
| const end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length); |
| while (offset < end && val[offset] === 0) offset++; |
| if (end === offset) return 0 |
| return parseInt(val.slice(offset, end).toString(), 8) |
| } |
| }; |
| |
| const decodeStr = function (val, offset, length, encoding) { |
| return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding) |
| }; |
| |
| const addLength = function (str) { |
| const len = b4a$1.byteLength(str); |
| let digits = Math.floor(Math.log(len) / Math.log(10)) + 1; |
| if (len + digits >= Math.pow(10, digits)) digits++; |
| |
| return (len + digits) + str |
| }; |
| |
| headers$1.decodeLongPath = function (buf, encoding) { |
| return decodeStr(buf, 0, buf.length, encoding) |
| }; |
| |
| headers$1.encodePax = function (opts) { // TODO: encode more stuff in pax |
| let result = ''; |
| if (opts.name) result += addLength(' path=' + opts.name + '\n'); |
| if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n'); |
| const pax = opts.pax; |
| if (pax) { |
| for (const key in pax) { |
| result += addLength(' ' + key + '=' + pax[key] + '\n'); |
| } |
| } |
| return b4a$1.from(result) |
| }; |
| |
| headers$1.decodePax = function (buf) { |
| const result = {}; |
| |
| while (buf.length) { |
| let i = 0; |
| while (i < buf.length && buf[i] !== 32) i++; |
| const len = parseInt(buf.slice(0, i).toString(), 10); |
| if (!len) return result |
| |
| const b = buf.slice(i + 1, len - 1).toString(); |
| const keyIndex = b.indexOf('='); |
| if (keyIndex === -1) return result |
| result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1); |
| |
| buf = buf.slice(len); |
| } |
| |
| return result |
| }; |
| |
| headers$1.encode = function (opts) { |
| const buf = b4a$1.alloc(512); |
| let name = opts.name; |
| let prefix = ''; |
| |
| if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/'; |
| if (b4a$1.byteLength(name) !== name.length) return null // utf-8 |
| |
| while (b4a$1.byteLength(name) > 100) { |
| const i = name.indexOf('/'); |
| if (i === -1) return null |
| prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i); |
| name = name.slice(i + 1); |
| } |
| |
| if (b4a$1.byteLength(name) > 100 || b4a$1.byteLength(prefix) > 155) return null |
| if (opts.linkname && b4a$1.byteLength(opts.linkname) > 100) return null |
| |
| b4a$1.write(buf, name); |
| b4a$1.write(buf, encodeOct(opts.mode & MASK, 6), 100); |
| b4a$1.write(buf, encodeOct(opts.uid, 6), 108); |
| b4a$1.write(buf, encodeOct(opts.gid, 6), 116); |
| b4a$1.write(buf, encodeOct(opts.size, 11), 124); |
| b4a$1.write(buf, encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136); |
| |
| buf[156] = ZERO_OFFSET + toTypeflag(opts.type); |
| |
| if (opts.linkname) b4a$1.write(buf, opts.linkname, 157); |
| |
| b4a$1.copy(USTAR_MAGIC, buf, MAGIC_OFFSET); |
| b4a$1.copy(USTAR_VER, buf, VERSION_OFFSET); |
| if (opts.uname) b4a$1.write(buf, opts.uname, 265); |
| if (opts.gname) b4a$1.write(buf, opts.gname, 297); |
| b4a$1.write(buf, encodeOct(opts.devmajor || 0, 6), 329); |
| b4a$1.write(buf, encodeOct(opts.devminor || 0, 6), 337); |
| |
| if (prefix) b4a$1.write(buf, prefix, 345); |
| |
| b4a$1.write(buf, encodeOct(cksum(buf), 6), 148); |
| |
| return buf |
| }; |
| |
| headers$1.decode = function (buf, filenameEncoding, allowUnknownFormat) { |
| let typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET; |
| |
| let name = decodeStr(buf, 0, 100, filenameEncoding); |
| const mode = decodeOct(buf, 100, 8); |
| const uid = decodeOct(buf, 108, 8); |
| const gid = decodeOct(buf, 116, 8); |
| const size = decodeOct(buf, 124, 12); |
| const mtime = decodeOct(buf, 136, 12); |
| const type = toType(typeflag); |
| const linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding); |
| const uname = decodeStr(buf, 265, 32); |
| const gname = decodeStr(buf, 297, 32); |
| const devmajor = decodeOct(buf, 329, 8); |
| const devminor = decodeOct(buf, 337, 8); |
| |
| const c = cksum(buf); |
| |
| // checksum is still initial value if header was null. |
| if (c === 8 * 32) return null |
| |
| // valid checksum |
| if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?') |
| |
| if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) { |
| // ustar (posix) format. |
| // prepend prefix, if present. |
| if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name; |
| } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 && |
| GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) ; else { |
| if (!allowUnknownFormat) { |
| throw new Error('Invalid tar header: unknown format.') |
| } |
| } |
| |
| // to support old tar versions that use trailing / to indicate dirs |
| if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5; |
| |
| return { |
| name, |
| mode, |
| uid, |
| gid, |
| size, |
| mtime: new Date(1000 * mtime), |
| type, |
| linkname, |
| uname, |
| gname, |
| devmajor, |
| devminor |
| } |
| }; |
| |
| const { constants } = require$$0$2; |
| const { Readable, Writable } = streamx; |
| const { StringDecoder } = require$$13; |
| const b4a = b4a$2; |
| |
| const headers = headers$1; |
| |
| const DMODE = 0o755; |
| const FMODE = 0o644; |
| |
| const END_OF_TAR = b4a.alloc(1024); |
| |
| const noop = function () {}; |
| |
| const overflow = function (self, size) { |
| size &= 511; |
| if (size) self.push(END_OF_TAR.subarray(0, 512 - size)); |
| }; |
| |
| function modeToType (mode) { |
| switch (mode & constants.S_IFMT) { |
| case constants.S_IFBLK: return 'block-device' |
| case constants.S_IFCHR: return 'character-device' |
| case constants.S_IFDIR: return 'directory' |
| case constants.S_IFIFO: return 'fifo' |
| case constants.S_IFLNK: return 'symlink' |
| } |
| |
| return 'file' |
| } |
| |
| class Sink extends Writable { |
| constructor (to) { |
| super(); |
| this.written = 0; |
| this._to = to; |
| } |
| |
| _write (data, cb) { |
| this.written += data.byteLength; |
| if (this._to.push(data)) return cb() |
| this._to._drain = cb; |
| } |
| } |
| |
| class LinkSink extends Writable { |
| constructor () { |
| super(); |
| this.linkname = ''; |
| this._decoder = new StringDecoder('utf-8'); |
| } |
| |
| _write (data, cb) { |
| this.linkname += this._decoder.write(data); |
| cb(); |
| } |
| } |
| |
| class Void extends Writable { |
| _write (data, cb) { |
| cb(new Error('No body allowed for this entry')); |
| } |
| } |
| |
| class Pack extends Readable { |
| constructor (opts) { |
| super(opts); |
| this._drain = noop; |
| this._finalized = false; |
| this._finalizing = false; |
| this._stream = null; |
| } |
| |
| entry (header, buffer, callback) { |
| if (this._stream) throw new Error('already piping an entry') |
| if (this._finalized || this.destroyed) return |
| |
| if (typeof buffer === 'function') { |
| callback = buffer; |
| buffer = null; |
| } |
| |
| if (!callback) callback = noop; |
| |
| const self = this; |
| |
| if (!header.size || header.type === 'symlink') header.size = 0; |
| if (!header.type) header.type = modeToType(header.mode); |
| if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE; |
| if (!header.uid) header.uid = 0; |
| if (!header.gid) header.gid = 0; |
| if (!header.mtime) header.mtime = new Date(); |
| |
| if (typeof buffer === 'string') buffer = b4a.from(buffer); |
| if (b4a.isBuffer(buffer)) { |
| header.size = buffer.byteLength; |
| this._encode(header); |
| const ok = this.push(buffer); |
| overflow(self, header.size); |
| if (ok) process.nextTick(callback); |
| else this._drain = callback; |
| return new Void() |
| } |
| |
| if (header.type === 'symlink' && !header.linkname) { |
| const linkSink = new LinkSink(); |
| linkSink |
| .on('error', function (err) { |
| self.destroy(); |
| callback(err); |
| }) |
| .on('close', function () { |
| header.linkname = linkSink.linkname; |
| self._encode(header); |
| callback(); |
| }); |
| |
| return linkSink |
| } |
| |
| this._encode(header); |
| |
| if (header.type !== 'file' && header.type !== 'contiguous-file') { |
| process.nextTick(callback); |
| return new Void() |
| } |
| |
| const sink = new Sink(this); |
| sink |
| .on('error', function (err) { |
| self._stream = null; |
| self.destroy(); |
| callback(err); |
| }) |
| .on('close', function () { |
| self._stream = null; |
| |
| if (sink.written !== header.size) ; |
| |
| overflow(self, header.size); |
| if (self._finalizing) { self.finalize(); } |
| callback(); |
| }); |
| |
| this._stream = sink; |
| |
| return sink |
| } |
| |
| finalize () { |
| if (this._stream) { |
| this._finalizing = true; |
| return |
| } |
| |
| if (this._finalized) return |
| this._finalized = true; |
| this.push(END_OF_TAR); |
| this.push(null); |
| } |
| |
| _encode (header) { |
| if (!header.pax) { |
| const buf = headers.encode(header); |
| if (buf) { |
| this.push(buf); |
| return |
| } |
| } |
| this._encodePax(header); |
| } |
| |
| _encodePax (header) { |
| const paxHeader = headers.encodePax({ |
| name: header.name, |
| linkname: header.linkname, |
| pax: header.pax |
| }); |
| |
| const newHeader = { |
| name: 'PaxHeader', |
| mode: header.mode, |
| uid: header.uid, |
| gid: header.gid, |
| size: paxHeader.byteLength, |
| mtime: header.mtime, |
| type: 'pax-header', |
| linkname: header.linkname && 'PaxHeader', |
| uname: header.uname, |
| gname: header.gname, |
| devmajor: header.devmajor, |
| devminor: header.devminor |
| }; |
| |
| this.push(headers.encode(newHeader)); |
| this.push(paxHeader); |
| overflow(this, paxHeader.byteLength); |
| |
| newHeader.size = header.size; |
| newHeader.type = header.type; |
| this.push(headers.encode(newHeader)); |
| } |
| |
| _read (cb) { |
| const drain = this._drain; |
| this._drain = noop; |
| drain(); |
| cb(); |
| } |
| } |
| |
| var pack$1 = function pack (opts) { |
| return new Pack(opts) |
| }; |
| |
| var pack = pack$1; |
| |
| const MTIME = new Date(0); |
| const MODE_FOR_DIR = 0o755; |
| const MODE_FOR_FILE = 0o555; |
| const MODE_FOR_SYMLINK = 0o775; |
| function findKeyByValue(entries, value) { |
| for (const [key, { dest: val }] of Object.entries(entries)) { |
| if (val == value) { |
| return key; |
| } |
| } |
| return undefined; |
| } |
| async function readlinkSafe(p) { |
| try { |
| const link = await readlink(p); |
| return path.resolve(path.dirname(p), link); |
| } |
| catch (e) { |
| if (e.code == 'EINVAL') { |
| return p; |
| } |
| throw e; |
| } |
| } |
| async function resolveSymlink(p) { |
| let prevHop = path.resolve(p); |
| let hopped = false; |
| while (true) { |
| // /output-base/sandbox/4/execroot/wksp/bazel-out |
| // /output-base/execroot/wksp/bazel-out |
| let nextHop = await readlinkSafe(prevHop); |
| if (!nextHop.startsWith(process.env.JS_BINARY__EXECROOT)) { |
| return hopped ? prevHop : undefined; |
| } |
| if (nextHop != prevHop) { |
| prevHop = nextHop; |
| hopped = true; |
| } |
| else if (!hopped) { |
| return undefined; |
| } |
| else { |
| return nextHop; |
| } |
| } |
| } |
| async function* walk(dir, accumulate = '') { |
| const dirents = await readdir(dir, { withFileTypes: true }); |
| for (const dirent of dirents) { |
| let isDirectory = dirent.isDirectory(); |
| if (dirent.isSymbolicLink() && |
| !dirent.isDirectory() && |
| !dirent.isFile()) { |
| // On OSX we sometimes encounter this bug: https://github.com/nodejs/node/issues/30646 |
| // The entry is apparently a symlink, but it's ambiguous whether it's a symlink to a |
| // file or to a directory, and lstat doesn't tell us either. Determine the type by |
| // attempting to read it as a directory. |
| try { |
| await readdir(path.join(dir, dirent.name)); |
| isDirectory = true; |
| } |
| catch (error) { |
| if (error.code === 'ENOTDIR') { |
| isDirectory = false; |
| } |
| else { |
| throw error; |
| } |
| } |
| } |
| if (isDirectory) { |
| yield* walk(path.join(dir, dirent.name), path.join(accumulate, dirent.name)); |
| } |
| else { |
| yield path.join(accumulate, dirent.name); |
| } |
| } |
| } |
| function add_parents(name, pkg, existing_paths, owner) { |
| const segments = path.dirname(name).split('/'); |
| let prev = ''; |
| const stats = { |
| // this is an intermediate directory and bazel does not allow specifying |
| // modes for intermediate directories. |
| mode: MODE_FOR_DIR, |
| mtime: MTIME, |
| }; |
| for (const part of segments) { |
| if (!part) { |
| continue; |
| } |
| prev = path.join(prev, part); |
| // check if the directory has been has been created before. |
| if (existing_paths.has(prev)) { |
| continue; |
| } |
| existing_paths.add(prev); |
| add_directory(prev, pkg, owner, stats); |
| } |
| } |
| function add_directory(name, pkg, owner, stats) { |
| pkg.entry({ |
| type: 'directory', |
| name: name.replace(/^\//, ''), |
| mode: stats.mode, |
| mtime: MTIME, |
| gid: owner.gid, |
| uid: owner.uid, |
| }).end(); |
| } |
| function add_symlink(name, linkname, pkg, owner, stats) { |
| const link_parent = path.dirname(name); |
| pkg.entry({ |
| type: 'symlink', |
| name: name.replace(/^\//, ''), |
| linkname: path.relative(link_parent, linkname), |
| mode: stats.mode, |
| mtime: MTIME, |
| uid: owner.uid, |
| gid: owner.gid, |
| }).end(); |
| } |
| function add_file(name, content, pkg, owner, stats) { |
| return new Promise((resolve, reject) => { |
| const entry = pkg.entry({ |
| type: 'file', |
| name: name.replace(/^\//, ''), |
| mode: stats.mode, |
| size: stats.size, |
| mtime: MTIME, |
| uid: owner.uid, |
| gid: owner.gid, |
| }, (err) => { |
| if (err) { |
| reject(err); |
| } |
| else { |
| resolve(undefined); |
| } |
| }); |
| content.pipe(entry); |
| }); |
| } |
| async function build(entries, outputPath, compression, owner) { |
| const output = pack(); |
| const existing_paths = new Set(); |
| let write = output; |
| if (compression == 'gzip') { |
| write = write.pipe(createGzip()); |
| } |
| write.pipe(createWriteStream(outputPath)); |
| for (const key of Object.keys(entries).sort()) { |
| const { dest, is_directory, is_source, is_external, root, remove_non_hermetic_lines, } = entries[key]; |
| // its a treeartifact. expand it and add individual entries. |
| if (is_directory) { |
| for await (const sub_key of walk(dest)) { |
| const new_key = path.join(key, sub_key); |
| const new_dest = path.join(dest, sub_key); |
| add_parents(new_key, output, existing_paths, owner); |
| const stats = await stat(new_dest); |
| await add_file(new_key, createReadStream(new_dest), output, owner, stats); |
| } |
| continue; |
| } |
| // create parents of current path. |
| add_parents(key, output, existing_paths, owner); |
| // A source file from workspace, not an output of a target. |
| if (is_source) { |
| const originalStat = await stat(dest); |
| // use stable mode bits instead of preserving the one from file. |
| const stats = { |
| mode: MODE_FOR_FILE, |
| mtime: MTIME, |
| size: originalStat.size, |
| }; |
| await add_file(key, createReadStream(dest), output, owner, stats); |
| continue; |
| } |
| // root indicates where the generated source comes from. it looks like |
| // `bazel-out/darwin_arm64-fastbuild` when there's no transition. |
| if (!root) { |
| // everything except sources should have |
| throw new Error(`unexpected entry format. ${JSON.stringify(entries[key])}. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose`); |
| } |
| const realp = await resolveSymlink(dest); |
| // it's important that we don't treat any symlink pointing out of execroot since |
| // bazel symlinks external files into sandbox to make them available to us. |
| if (realp && !is_external) { |
| const output_path = realp.slice(realp.indexOf(root)); |
| // interestingly, bazel 5 and 6 sets different mode bits on symlinks. |
| // well use `0o755` to allow owner&group to `rwx` and others `rx` |
| // see: https://chmodcommand.com/chmod-775/ |
| // const stats = await stat(dest) |
| const stats = { mode: MODE_FOR_SYMLINK, mtime: MTIME }; |
| const linkname = findKeyByValue(entries, output_path); |
| if (linkname == undefined) { |
| throw new Error(`Couldn't map symbolic link ${output_path} to a path. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose\n\n` + |
| `dest: ${dest}\n` + |
| `realpath: ${realp}\n` + |
| `outputpath: ${output_path}\n` + |
| `root: ${root}\n` + |
| `runfiles: ${key}\n\n`); |
| } |
| add_symlink(key, linkname, output, owner, stats); |
| } |
| else { |
| // Due to filesystems setting different bits depending on the os we have to opt-in |
| // to use a stable mode for files. |
| // In the future, we might want to hand off fine-grained control of these to users |
| // see: https://chmodcommand.com/chmod-0555/ |
| const originalStat = await stat(dest); |
| const stats = { |
| mode: MODE_FOR_FILE, |
| mtime: MTIME, |
| size: originalStat.size, |
| }; |
| let stream = createReadStream(dest); |
| if (remove_non_hermetic_lines) { |
| const content = await readFile(dest); |
| const replaced = Buffer.from(content |
| .toString() |
| .replace(/.*JS_BINARY__TARGET_CPU=".*?"/g, `export JS_BINARY__TARGET_CPU="$(uname -m)"`) |
| .replace(/.*JS_BINARY__BINDIR=".*"/g, `export JS_BINARY__BINDIR="$(pwd)"`)); |
| stream = Readable$2.from(replaced); |
| stats.size = replaced.byteLength; |
| } |
| await add_file(key, stream, output, owner, stats); |
| } |
| } |
| output.finalize(); |
| } |
| if (import.meta.url === pathToFileURL(process.argv[1]).href) { |
| const [entriesPath, outputPath, compression, owner,] = process.argv.slice(2); |
| const raw_entries = await readFile(entriesPath); |
| const entries = JSON.parse(raw_entries.toString()); |
| const [uid, gid] = owner.split(':').map(Number); |
| build(entries, outputPath, compression, { uid, gid }); |
| } |
| |
| export { build }; |
| //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9wcmltb3JkaWFscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL3V0aWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ldmVudC10YXJnZXQtc2hpbUA1LjAuMS9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vZGlzdC9ldmVudC10YXJnZXQtc2hpbS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9hYm9ydC1jb250cm9sbGVyQDMuMC4wL25vZGVfbW9kdWxlcy9hYm9ydC1jb250cm9sbGVyL2Rpc3QvYWJvcnQtY29udHJvbGxlci5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9lcnJvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvdmFsaWRhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3Byb2Nlc3NAMC4xMS4xMC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL29wZXJhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hZGQtYWJvcnQtc2lnbmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4aWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGFzc3Rocm91Z2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvc3RyZWFtL3Byb21pc2VzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL3N0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvaW5oZXJpdHNAMi4wLjQvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9pbmhlcml0c0AyLjAuNC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ibEA2LjAuMC9ub2RlX21vZHVsZXMvYmwvQnVmZmVyTGlzdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2JsQDYuMC4wL25vZGVfbW9kdWxlcy9ibC9ibC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3F1ZXVlLXRpY2tAMS4wLjEvbm9kZV9tb2R1bGVzL3F1ZXVlLXRpY2svcXVldWUtbWljcm90YXNrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcXVldWUtdGlja0AxLjAuMS9ub2RlX21vZHVsZXMvcXVldWUtdGljay9wcm9jZXNzLW5leHQtdGljay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2Zhc3QtZmlmb0AxLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2ZpeGVkLXNpemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9mYXN0LWZpZm9AMS4xLjAvbm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3N0cmVhbXhAMi4xMy4yL25vZGVfbW9kdWxlcy9zdHJlYW14L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvYjRhQDEuNi4xL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL3BhY2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2luZGV4LmpzIiwiaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvcGVyX2NvbnRleHQvcHJpbW9yZGlhbHMuanMgZmlsZSBkZWZpbmVkIGF0XG5cbiAgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9wZXJfY29udGV4dC9wcmltb3JkaWFscy5qc1xuXG4gIERvbid0IHRyeSB0byByZXBsYWNlIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZSB3aXRoIHRoZSB1cHN0cmVhbSBmaWxlLlxuKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcnJheUlzQXJyYXkoc2VsZikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlbGYpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlSW5jbHVkZXMoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5pbmNsdWRlcyhlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVJbmRleE9mKHNlbGYsIGVsKSB7XG4gICAgcmV0dXJuIHNlbGYuaW5kZXhPZihlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVKb2luKHNlbGYsIHNlcCkge1xuICAgIHJldHVybiBzZWxmLmpvaW4oc2VwKVxuICB9LFxuICBBcnJheVByb3RvdHlwZU1hcChzZWxmLCBmbikge1xuICAgIHJldHVybiBzZWxmLm1hcChmbilcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVQb3Aoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5wb3AoZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlUHVzaChzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLnB1c2goZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlU2xpY2Uoc2VsZiwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzZWxmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0sXG4gIEVycm9yLFxuICBGdW5jdGlvblByb3RvdHlwZUNhbGwoZm4sIHRoaXNBcmdzLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpc0FyZ3MsIC4uLmFyZ3MpXG4gIH0sXG4gIEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbChzZWxmLCBpbnN0YW5jZSlcbiAgfSxcbiAgTWF0aEZsb29yOiBNYXRoLmZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzSW50ZWdlcjogTnVtYmVyLmlzSW50ZWdlcixcbiAgTnVtYmVySXNOYU46IE51bWJlci5pc05hTixcbiAgTnVtYmVyTUFYX1NBRkVfSU5URUdFUjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gIE51bWJlck1JTl9TQUZFX0lOVEVHRVI6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludDogTnVtYmVyLnBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKVxuICB9LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKVxuICB9LFxuICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwgbmFtZSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIG5hbWUpXG4gIH0sXG4gIE9iamVjdEtleXMob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgfSxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbiAgfSxcbiAgUHJvbWlzZSxcbiAgUHJvbWlzZVByb3RvdHlwZUNhdGNoKHNlbGYsIGZuKSB7XG4gICAgcmV0dXJuIHNlbGYuY2F0Y2goZm4pXG4gIH0sXG4gIFByb21pc2VQcm90b3R5cGVUaGVuKHNlbGYsIHRoZW5GbiwgY2F0Y2hGbikge1xuICAgIHJldHVybiBzZWxmLnRoZW4odGhlbkZuLCBjYXRjaEZuKVxuICB9LFxuICBQcm9taXNlUmVqZWN0KGVycikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpXG4gIH0sXG4gIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSxcbiAgUmVnRXhwUHJvdG90eXBlVGVzdChzZWxmLCB2YWx1ZSkge1xuICAgIHJldHVybiBzZWxmLnRlc3QodmFsdWUpXG4gIH0sXG4gIFNhZmVTZXQ6IFNldCxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvTG93ZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvVXBwZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYudHJpbSgpXG4gIH0sXG4gIFN5bWJvbCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcjogU3ltYm9sLmFzeW5jSXRlcmF0b3IsXG4gIFN5bWJvbEhhc0luc3RhbmNlOiBTeW1ib2wuaGFzSW5zdGFuY2UsXG4gIFN5bWJvbEl0ZXJhdG9yOiBTeW1ib2wuaXRlcmF0b3IsXG4gIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQoc2VsZiwgYnVmLCBsZW4pIHtcbiAgICByZXR1cm4gc2VsZi5zZXQoYnVmLCBsZW4pXG4gIH0sXG4gIFVpbnQ4QXJyYXlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBidWZmZXJNb2R1bGUgPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiAoKSB7fSkuY29uc3RydWN0b3JcbmNvbnN0IEJsb2IgPSBnbG9iYWxUaGlzLkJsb2IgfHwgYnVmZmVyTW9kdWxlLkJsb2Jcbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuY29uc3QgaXNCbG9iID1cbiAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnXG4gICAgPyBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW5kZW50XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4vKiBlc2xpbnQtZW5hYmxlIGluZGVudCAqL1xuXG4vLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIEFnZ3JlZ2F0ZUVycm9yXG5jbGFzcyBBZ2dyZWdhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZXJyb3JzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9ycykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGlucHV0IHRvIGJlIGFuIEFycmF5LCBnb3QgJHt0eXBlb2YgZXJyb3JzfWApXG4gICAgfVxuICAgIGxldCBtZXNzYWdlID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgbWVzc2FnZSArPSBgICAgICR7ZXJyb3JzW2ldLnN0YWNrfVxcbmBcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQWdncmVnYXRlRXJyb3InXG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnNcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFnZ3JlZ2F0ZUVycm9yLFxuICBrRW1wdHlPYmplY3Q6IE9iamVjdC5mcmVlemUoe30pLFxuICBvbmNlKGNhbGxiYWNrKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJncylcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZTogZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXNvbHZlXG4gICAgbGV0IHJlamVjdFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICByZXNvbHZlID0gcmVzXG4gICAgICByZWplY3QgPSByZWpcbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdFxuICAgIH1cbiAgfSxcbiAgcHJvbWlzaWZ5KGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZuKChlcnIsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlKC4uLmFyZ3MpXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG4gIGRlYnVnbG9nKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICB9LFxuICBmb3JtYXQoZm9ybWF0LCAuLi5hcmdzKSB7XG4gICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdXRpbC5odG1sI3V0aWxmb3JtYXRmb3JtYXQtYXJnc1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvJShbc2RpZmpdKS9nLCBmdW5jdGlvbiAoLi4uW191bnVzZWQsIHR5cGVdKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGFyZ3Muc2hpZnQoKVxuICAgICAgaWYgKHR5cGUgPT09ICdmJykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQudG9GaXhlZCg2KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaicpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncycgJiYgdHlwZW9mIHJlcGxhY2VtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjdG9yID0gcmVwbGFjZW1lbnQuY29uc3RydWN0b3IgIT09IE9iamVjdCA/IHJlcGxhY2VtZW50LmNvbnN0cnVjdG9yLm5hbWUgOiAnJ1xuICAgICAgICByZXR1cm4gYCR7Y3Rvcn0ge31gLnRyaW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50LnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBpbnNwZWN0KHZhbHVlKSB7XG4gICAgLy8gVmFzdGx5IHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL25vZGVqcy5vcmcvYXBpL3V0aWwuaHRtbCN1dGlsaW5zcGVjdG9iamVjdC1vcHRpb25zXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5pbmNsdWRlcygnYCcpICYmICF2YWx1ZS5pbmNsdWRlcygnJHsnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcXGAke3ZhbHVlfVxcYGBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAnJHt2YWx1ZX0nYFxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAnTmFOJ1xuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5pcyh2YWx1ZSwgLTApKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfW5gXG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ3t9J1xuICAgIH1cbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBpc0FzeW5jRnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiBmbiBpbnN0YW5jZW9mIEFzeW5jRnVuY3Rpb25cbiAgICB9LFxuICAgIGlzQXJyYXlCdWZmZXJWaWV3KGFycikge1xuICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpXG4gICAgfVxuICB9LFxuICBpc0Jsb2Jcbn1cbm1vZHVsZS5leHBvcnRzLnByb21pc2lmeS5jdXN0b20gPSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5wcm9taXNpZnkuY3VzdG9tJylcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpdmF0ZURhdGFcbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3t0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnRQaGFzZSBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBUaGUgY3VycmVudCBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbmNlbGVkIFRoZSBmbGFnIHRvIHByZXZlbnQgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW1lZGlhdGVTdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBUaGUgbGlzdGVuZXIgaWYgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZS4gT3RoZXJ3aXNlIHRoaXMgaXMgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3RhbXAgVGhlIHVuaXggdGltZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICogQHR5cGUge1dlYWtNYXA8RXZlbnQsIFByaXZhdGVEYXRhPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHByaXZhdGVEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVycyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIHtQcml2YXRlRGF0YX0gVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwZChldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBwcml2YXRlRGF0YS5nZXQoZXZlbnQpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICByZXR2ICE9IG51bGwsXG4gICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50IG9iamVjdCwgYnV0IGdvdFwiLFxuICAgICAgICBldmVudFxuICAgICk7XG4gICAgcmV0dXJuIHJldHZcbn1cblxuLyoqXG4gKiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3NldC10aGUtY2FuY2VsZWQtZmxhZ1xuICogQHBhcmFtIGRhdGEge1ByaXZhdGVEYXRhfSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLnBhc3NpdmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiLFxuICAgICAgICAgICAgICAgIGRhdGEucGFzc2l2ZUxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIWRhdGEuZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkYXRhLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbi8qKlxuICogVGhlIGV2ZW50IHdyYXBwZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIHByaXZhdGVEYXRhLnNldCh0aGlzLCB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgZXZlbnRQaGFzZTogMixcbiAgICAgICAgY3VycmVudFRhcmdldDogZXZlbnRUYXJnZXQsXG4gICAgICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICAgICAgc3RvcHBlZDogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlTGlzdGVuZXI6IG51bGwsXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCksXG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNVbmZvcmdlYWJsZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVHJ1c3RlZFwiLCB7IHZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudC50eXBlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtFdmVudFRhcmdldFtdfSBUaGUgY29tcG9zZWQgcGF0aCBvZiB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGNvbXBvc2VkUGF0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3VycmVudFRhcmdldF1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgTk9ORS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBDQVBUVVJJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBBVF9UQVJHRVQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gMlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBCVUJCTElOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDNcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFBoYXNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZGF0YS5pbW1lZGlhdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5idWJibGVzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjYW5jZWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jYW5jZWxhYmxlKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhpcyBldmVudC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNvbXBvc2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY29tcG9zZWQpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bml4IHRpbWUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS50aW1lU3RhbXBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gc3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5zdG9wcGVkXG4gICAgfSxcbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICFwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBvYmplY3QuIEJ1dCBkbyBub3RoaW5nIHVuZGVyIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGJ1YmJsZSB1cC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5jZWxhYmxlPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBjYW5jZWwuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbml0RXZlbnQoKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnQucHJvdG90eXBlKTtcblxuICAgIC8vIE1ha2UgYXNzb2NpYXRpb24gZm9yIHdyYXBwZXJzLlxuICAgIHdyYXBwZXJzLnNldCh3aW5kb3cuRXZlbnQucHJvdG90eXBlLCBFdmVudCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCB0aGUgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50W2tleV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBwZCh0aGlzKS5ldmVudFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgYSBnaXZlbiBtZXRob2QgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIHRoZSBtZXRob2QgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGQodGhpcykuZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRba2V5XS5hcHBseShldmVudCwgYXJndW1lbnRzKVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IEJhc2VFdmVudCBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgZGVmaW5lZCB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lV3JhcHBlcihCYXNlRXZlbnQsIHByb3RvKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3RvKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJhc2VFdmVudFxuICAgIH1cblxuICAgIC8qKiBDdXN0b21FdmVudCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgICAgICBCYXNlRXZlbnQuY2FsbCh0aGlzLCBldmVudFRhcmdldCwgZXZlbnQpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogQ3VzdG9tRXZlbnQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiBCYXNlRXZlbnQucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBpc0Z1bmMgPSB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgaXNGdW5jXG4gICAgICAgICAgICAgICAgICAgID8gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgICAgICAgICA6IGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50XG59XG5cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGdldCBpdHMgd3JhcHBlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKHByb3RvKSB7XG4gICAgaWYgKHByb3RvID09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXIgPSB3cmFwcGVycy5nZXQocHJvdG8pO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKSwgcHJvdG8pO1xuICAgICAgICB3cmFwcGVycy5zZXQocHJvdG8sIHdyYXBwZXIpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlclxufVxuXG4vKipcbiAqIFdyYXAgYSBnaXZlbiBldmVudCB0byBtYW5hZ2VtZW50IGEgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RXZlbnR9IFRoZSB3cmFwcGVyIGluc3RhbmNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIGNvbnN0IFdyYXBwZXIgPSBnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkpO1xuICAgIHJldHVybiBuZXcgV3JhcHBlcihldmVudFRhcmdldCwgZXZlbnQpXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGVTdG9wcGVkIGZsYWcgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBwZChldmVudCkuaW1tZWRpYXRlU3RvcHBlZFxufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBldmVudCBwaGFzZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBldmVudFBoYXNlIE5ldyBldmVudCBwaGFzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRQaGFzZShldmVudCwgZXZlbnRQaGFzZSkge1xuICAgIHBkKGV2ZW50KS5ldmVudFBoYXNlID0gZXZlbnRQaGFzZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IE5ldyBjdXJyZW50IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0Q3VycmVudFRhcmdldChldmVudCwgY3VycmVudFRhcmdldCkge1xuICAgIHBkKGV2ZW50KS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbn1cblxuLyoqXG4gKiBTZXQgYSBwYXNzaXZlIGxpc3RlbmVyIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgTmV3IHBhc3NpdmUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldFBhc3NpdmVMaXN0ZW5lcihldmVudCwgcGFzc2l2ZUxpc3RlbmVyKSB7XG4gICAgcGQoZXZlbnQpLnBhc3NpdmVMaXN0ZW5lciA9IHBhc3NpdmVMaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcHJvcGVydHkgezF8MnwzfSBsaXN0ZW5lclR5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc2l2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmNlXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyTm9kZXxudWxsfSBuZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+Pn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8vIExpc3RlbmVyIHR5cGVzXG5jb25zdCBDQVBUVVJFID0gMTtcbmNvbnN0IEJVQkJMRSA9IDI7XG5jb25zdCBBVFRSSUJVVEUgPSAzO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQHBhcmFtIHthbnl9IHggVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG59XG5cbi8qKlxuICogR2V0IGxpc3RlbmVycy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgdG8gZ2V0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT59IFRoZSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZXZlbnRUYXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50VGFyZ2V0KTtcbiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50VGFyZ2V0IG9iamVjdCwgYnV0IGdvdCBhbm90aGVyIHZhbHVlLlwiXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RlbmVyc1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGV2ZW50IGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBnZXQgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgcmVtb3Zpbmcgb2xkIHZhbHVlLlxuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGU6IEFUVFJJQlVURSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUgKGUuZy4gYGV2ZW50VGFyZ2V0Lm9uY2xpY2tgKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFRhcmdldFByb3RvdHlwZSBUaGUgZXZlbnQgdGFyZ2V0IHByb3RvdHlwZSB0byBkZWZpbmUgYW4gZXZlbnQgYXR0cmJpdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGRlZmluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZShldmVudFRhcmdldFByb3RvdHlwZSwgZXZlbnROYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBldmVudFRhcmdldFByb3RvdHlwZSxcbiAgICAgICAgYG9uJHtldmVudE5hbWV9YCxcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSlcbiAgICApO1xufVxuXG4vKipcbiAqIERlZmluZSBhIGN1c3RvbSBFdmVudFRhcmdldCB3aXRoIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudE5hbWVzIEV2ZW50IG5hbWVzIGZvciBldmVudCBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgY3VzdG9tIEV2ZW50VGFyZ2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoZXZlbnROYW1lcykge1xuICAgIC8qKiBDdXN0b21FdmVudFRhcmdldCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50VGFyZ2V0KCkge1xuICAgICAgICBFdmVudFRhcmdldC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogQ3VzdG9tRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldFxufVxuXG4vKipcbiAqIEV2ZW50VGFyZ2V0LlxuICpcbiAqIC0gVGhpcyBpcyBjb25zdHJ1Y3RvciBpZiBubyBhcmd1bWVudHMuXG4gKiAtIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgQ3VzdG9tRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgaWYgdGhlcmUgYXJlIGFyZ3VtZW50cy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgY2xhc3MgQSBleHRlbmRzIEV2ZW50VGFyZ2V0IHt9XG4gKiAgICAgY2xhc3MgQiBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiKSB7fVxuICogICAgIGNsYXNzIEMgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIiwgXCJlcnJvclwiKSB7fVxuICogICAgIGNsYXNzIEQgZXh0ZW5kcyBFdmVudFRhcmdldChbXCJtZXNzYWdlXCIsIFwiZXJyb3JcIl0pIHt9XG4gKi9cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoYXJndW1lbnRzWzBdKVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQodHlwZXMpXG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcbiAgICAvKmVzbGludC1lbmFibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidsaXN0ZW5lcicgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zSXNPYmogPSBpc09iamVjdChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnNJc09ialxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgIGxpc3RlbmVyVHlwZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaXQgYXMgdGhlIGZpcnN0IG5vZGUgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbnVsbC5cbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgY2hlY2tpbmcgZHVwbGljYXRpb24uLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpZ25vcmUgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaXQuXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKVxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgZmFsc2VgIGlmIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09IG51bGwgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXZlbnQudHlwZVwiIHNob3VsZCBiZSBhIHN0cmluZy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnQudHlwZTtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW5ub3QgcmV3cml0ZSBzZXZlcmFsIHByb3BlcnRpZXMsIHNvIHdyYXAgb2JqZWN0LlxuICAgICAgICBjb25zdCB3cmFwcGVkRXZlbnQgPSB3cmFwRXZlbnQodGhpcywgZXZlbnQpO1xuXG4gICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgcGFydGljaXBhdGluZyBpbiBhIHRyZWUuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaXQncyBvbmNlXG4gICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzaXZlID8gbm9kZS5saXN0ZW5lciA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUubGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuY2FsbCh0aGlzLCB3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgIT09IEFUVFJJQlVURSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQod3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgaWYgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgIGlmIChpc1N0b3BwZWQod3JhcHBlZEV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKHdyYXBwZWRFdmVudCwgbnVsbCk7XG4gICAgICAgIHNldEV2ZW50UGhhc2Uod3JhcHBlZEV2ZW50LCAwKTtcbiAgICAgICAgc2V0Q3VycmVudFRhcmdldCh3cmFwcGVkRXZlbnQsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiAhd3JhcHBlZEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2Ygd2luZG93LkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiXG4pIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRUYXJnZXQ7XG5leHBvcnQgeyBkZWZpbmVFdmVudEF0dHJpYnV0ZSwgRXZlbnRUYXJnZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LXRhcmdldC1zaGltLm1qcy5tYXBcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEV2ZW50VGFyZ2V0LCBkZWZpbmVFdmVudEF0dHJpYnV0ZSB9IGZyb20gJ2V2ZW50LXRhcmdldC1zaGltJztcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBgQWJvcnRTaWduYWxgJ3MgYEFib3J0Q29udHJvbGxlcmAgaGFzIHNpZ25hbGVkIHRvIGFib3J0LCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ZWQgPSBhYm9ydGVkRmxhZ3MuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGFib3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0U2lnbmFsJyBvYmplY3QsIGJ1dCBnb3QgJHt0aGlzID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdGhpc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZDtcbiAgICB9XG59XG5kZWZpbmVFdmVudEF0dHJpYnV0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwiYWJvcnRcIik7XG4vKipcbiAqIENyZWF0ZSBhbiBBYm9ydFNpZ25hbCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IE9iamVjdC5jcmVhdGUoQWJvcnRTaWduYWwucHJvdG90eXBlKTtcbiAgICBFdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRTaWduYWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0LWNvbnRyb2xsZXIubWpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZm9ybWF0LCBpbnNwZWN0LCBBZ2dyZWdhdGVFcnJvcjogQ3VzdG9tQWdncmVnYXRlRXJyb3IgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvZXJyb3JzLmpzIGZpbGUgZGVmaW5lZCBhdFxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvZXJyb3JzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIChzdGFydGluZyBmcm9tIEUoLi4uKSBkZWZpbml0aW9ucylcbiAgd2l0aCB0aGUgdXBzdHJlYW0gZmlsZS5cbiovXG5cbmNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsVGhpcy5BZ2dyZWdhdGVFcnJvciB8fCBDdXN0b21BZ2dyZWdhdGVFcnJvclxuY29uc3Qga0lzTm9kZUVycm9yID0gU3ltYm9sKCdrSXNOb2RlRXJyb3InKVxuY29uc3Qga1R5cGVzID0gW1xuICAnc3RyaW5nJyxcbiAgJ2Z1bmN0aW9uJyxcbiAgJ251bWJlcicsXG4gICdvYmplY3QnLFxuICAvLyBBY2NlcHQgJ0Z1bmN0aW9uJyBhbmQgJ09iamVjdCcgYXMgYWx0ZXJuYXRpdmUgdG8gdGhlIGxvd2VyIGNhc2VkIHZlcnNpb24uXG4gICdGdW5jdGlvbicsXG4gICdPYmplY3QnLFxuICAnYm9vbGVhbicsXG4gICdiaWdpbnQnLFxuICAnc3ltYm9sJ1xuXVxuY29uc3QgY2xhc3NSZWdFeHAgPSAvXihbQS1aXVthLXowLTldKikrJC9cbmNvbnN0IG5vZGVJbnRlcm5hbFByZWZpeCA9ICdfX25vZGVfaW50ZXJuYWxfJ1xuY29uc3QgY29kZXMgPSB7fVxuZnVuY3Rpb24gYXNzZXJ0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgY29kZXMuRVJSX0lOVEVSTkFMX0FTU0VSVElPTihtZXNzYWdlKVxuICB9XG59XG5cbi8vIE9ubHkgdXNlIHRoaXMgZm9yIGludGVnZXJzISBEZWNpbWFsIG51bWJlcnMgZG8gbm90IHdvcmsgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoa2V5LCBtc2csIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NlcnQoXG4gICAgICBtc2cubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoLFxuICAgICAgLy8gRGVmYXVsdCBvcHRpb25zIGRvIG5vdCBjb3VudC5cbiAgICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7bXNnLmxlbmd0aH0pLmBcbiAgICApXG4gICAgcmV0dXJuIG1zZyguLi5hcmdzKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gKG1zZy5tYXRjaCgvJVtkZmlqb09zXS9nKSB8fCBbXSkubGVuZ3RoXG4gIGFzc2VydChcbiAgICBleHBlY3RlZExlbmd0aCA9PT0gYXJncy5sZW5ndGgsXG4gICAgYENvZGU6ICR7a2V5fTsgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBsZW5ndGggKCR7YXJncy5sZW5ndGh9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHtleHBlY3RlZExlbmd0aH0pLmBcbiAgKVxuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbXNnXG4gIH1cbiAgcmV0dXJuIGZvcm1hdChtc2csIC4uLmFyZ3MpXG59XG5mdW5jdGlvbiBFKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yXG4gIH1cbiAgY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgc3VwZXIoZ2V0TWVzc2FnZShjb2RlLCBtZXNzYWdlLCBhcmdzKSlcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtjb2RlfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTm9kZUVycm9yLnByb3RvdHlwZSwge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBCYXNlLm5hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICB0b1N0cmluZzoge1xuICAgICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske2NvZGV9XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pXG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGVcbiAgTm9kZUVycm9yLnByb3RvdHlwZVtrSXNOb2RlRXJyb3JdID0gdHJ1ZVxuICBjb2Rlc1tjb2RlXSA9IE5vZGVFcnJvclxufVxuZnVuY3Rpb24gaGlkZVN0YWNrRnJhbWVzKGZuKSB7XG4gIC8vIFdlIHJlbmFtZSB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBoaWRkZW4gdG8gY3V0IG9mZiB0aGUgc3RhY2t0cmFjZVxuICAvLyBhdCB0aGUgb3V0ZXJtb3N0IG9uZVxuICBjb25zdCBoaWRkZW4gPSBub2RlSW50ZXJuYWxQcmVmaXggKyBmbi5uYW1lXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6IGhpZGRlblxuICB9KVxuICByZXR1cm4gZm5cbn1cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhpbm5lckVycm9yLCBvdXRlckVycm9yKSB7XG4gIGlmIChpbm5lckVycm9yICYmIG91dGVyRXJyb3IgJiYgaW5uZXJFcnJvciAhPT0gb3V0ZXJFcnJvcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGVyRXJyb3IuZXJyb3JzKSkge1xuICAgICAgLy8gSWYgYG91dGVyRXJyb3JgIGlzIGFscmVhZHkgYW4gYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICAgIG91dGVyRXJyb3IuZXJyb3JzLnB1c2goaW5uZXJFcnJvcilcbiAgICAgIHJldHVybiBvdXRlckVycm9yXG4gICAgfVxuICAgIGNvbnN0IGVyciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihbb3V0ZXJFcnJvciwgaW5uZXJFcnJvcl0sIG91dGVyRXJyb3IubWVzc2FnZSlcbiAgICBlcnIuY29kZSA9IG91dGVyRXJyb3IuY29kZVxuICAgIHJldHVybiBlcnJcbiAgfVxuICByZXR1cm4gaW5uZXJFcnJvciB8fCBvdXRlckVycm9yXG59XG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnb3B0aW9ucycsICdPYmplY3QnLCBvcHRpb25zKVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMuY29kZSA9ICdBQk9SVF9FUlInXG4gICAgdGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InXG4gIH1cbn1cbkUoJ0VSUl9BU1NFUlRJT04nLCAnJXMnLCBFcnJvcilcbkUoXG4gICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSA9PiB7XG4gICAgYXNzZXJ0KHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJywgXCInbmFtZScgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICAgIGV4cGVjdGVkID0gW2V4cGVjdGVkXVxuICAgIH1cbiAgICBsZXQgbXNnID0gJ1RoZSAnXG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoJyBhcmd1bWVudCcpKSB7XG4gICAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgICBtc2cgKz0gYCR7bmFtZX0gYFxuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYFwiJHtuYW1lfVwiICR7bmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCd9IGBcbiAgICB9XG4gICAgbXNnICs9ICdtdXN0IGJlICdcbiAgICBjb25zdCB0eXBlcyA9IFtdXG4gICAgY29uc3QgaW5zdGFuY2VzID0gW11cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBleHBlY3RlZCkge1xuICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsICdBbGwgZXhwZWN0ZWQgZW50cmllcyBoYXZlIHRvIGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICAgIGlmIChrVHlwZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIHR5cGVzLnB1c2godmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodmFsdWUgIT09ICdvYmplY3QnLCAnVGhlIHZhbHVlIFwib2JqZWN0XCIgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgXCJPYmplY3RcIicpXG4gICAgICAgIG90aGVyLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGUgYG9iamVjdGAgaW4gY2FzZSBvdGhlciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQgdG8gb3V0bGluZVxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2ggb3RoZXIuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0eXBlcy5pbmRleE9mKCdvYmplY3QnKVxuICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgdHlwZXMuc3BsaWNlKHR5cGVzLCBwb3MsIDEpXG4gICAgICAgIGluc3RhbmNlcy5wdXNoKCdPYmplY3QnKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoICh0eXBlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1zZyArPSBgb2YgdHlwZSAke3R5cGVzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzWzBdfSBvciAke3R5cGVzWzFdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHR5cGVzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzLmpvaW4oJywgJyl9LCBvciAke2xhc3R9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA+IDAgfHwgb3RoZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2cgKz0gJyBvciAnXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoIChpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtc2cgKz0gYGFuIGluc3RhbmNlIG9mICR7aW5zdGFuY2VzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlc1swXX0gb3IgJHtpbnN0YW5jZXNbMV19YFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gaW5zdGFuY2VzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlcy5qb2luKCcsICcpfSwgb3IgJHtsYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnICs9ICcgb3IgJ1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKG90aGVyLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAob3RoZXJbMF0udG9Mb3dlckNhc2UoKSAhPT0gb3RoZXJbMF0pIHtcbiAgICAgICAgICBtc2cgKz0gJ2FuICdcbiAgICAgICAgfVxuICAgICAgICBtc2cgKz0gYCR7b3RoZXJbMF19YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYG9uZSBvZiAke290aGVyWzBdfSBvciAke290aGVyWzFdfWBcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG90aGVyLnBvcCgpXG4gICAgICAgIG1zZyArPSBgb25lIG9mICR7b3RoZXIuam9pbignLCAnKX0sIG9yICR7bGFzdH1gXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3R1YWwgPT0gbnVsbCkge1xuICAgICAgbXNnICs9IGAuIFJlY2VpdmVkICR7YWN0dWFsfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdmdW5jdGlvbicgJiYgYWN0dWFsLm5hbWUpIHtcbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBmdW5jdGlvbiAke2FjdHVhbC5uYW1lfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2FjdHVhbCRjb25zdHJ1Y3RvclxuICAgICAgaWYgKFxuICAgICAgICAoX2FjdHVhbCRjb25zdHJ1Y3RvciA9IGFjdHVhbC5jb25zdHJ1Y3RvcikgIT09IG51bGwgJiZcbiAgICAgICAgX2FjdHVhbCRjb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9hY3R1YWwkY29uc3RydWN0b3IubmFtZVxuICAgICAgKSB7XG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2FjdHVhbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluc3BlY3RlZCA9IGluc3BlY3QoYWN0dWFsLCB7XG4gICAgICAgICAgZGVwdGg6IC0xXG4gICAgICAgIH0pXG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCAke2luc3BlY3RlZH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpbnNwZWN0ZWQgPSBpbnNwZWN0KGFjdHVhbCwge1xuICAgICAgICBjb2xvcnM6IGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluc3BlY3RlZC5sZW5ndGggPiAyNSkge1xuICAgICAgICBpbnNwZWN0ZWQgPSBgJHtpbnNwZWN0ZWQuc2xpY2UoMCwgMjUpfS4uLmBcbiAgICAgIH1cbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH0gKCR7aW5zcGVjdGVkfSlgXG4gICAgfVxuICAgIHJldHVybiBtc2dcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfQVJHX1ZBTFVFJyxcbiAgKG5hbWUsIHZhbHVlLCByZWFzb24gPSAnaXMgaW52YWxpZCcpID0+IHtcbiAgICBsZXQgaW5zcGVjdGVkID0gaW5zcGVjdCh2YWx1ZSlcbiAgICBpZiAoaW5zcGVjdGVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgaW5zcGVjdGVkID0gaW5zcGVjdGVkLnNsaWNlKDAsIDEyOCkgKyAnLi4uJ1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gbmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCdcbiAgICByZXR1cm4gYFRoZSAke3R5cGV9ICcke25hbWV9JyAke3JlYXNvbn0uIFJlY2VpdmVkICR7aW5zcGVjdGVkfWBcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJyxcbiAgKGlucHV0LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIHZhciBfdmFsdWUkY29uc3RydWN0b3JcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX3ZhbHVlJGNvbnN0cnVjdG9yID0gdmFsdWUuY29uc3RydWN0b3IpICE9PSBudWxsICYmXG4gICAgICBfdmFsdWUkY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgX3ZhbHVlJGNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgPyBgaW5zdGFuY2Ugb2YgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgOiBgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke2lucHV0fSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBcIiR7bmFtZX1cImAgKyBgIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlfS5gXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9NSVNTSU5HX0FSR1MnLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGFzc2VydChhcmdzLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgYXJnIG5lZWRzIHRvIGJlIHNwZWNpZmllZCcpXG4gICAgbGV0IG1zZ1xuICAgIGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoXG4gICAgYXJncyA9IChBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSkubWFwKChhKSA9PiBgXCIke2F9XCJgKS5qb2luKCcgb3IgJylcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFyZ3VtZW50YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFuZCAke2FyZ3NbMV19IGFyZ3VtZW50c2BcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgVGhlICR7YXJncy5qb2luKCcsICcpfSwgYW5kICR7bGFzdH0gYXJndW1lbnRzYFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJldHVybiBgJHttc2d9IG11c3QgYmUgc3BlY2lmaWVkYFxuICB9LFxuICBUeXBlRXJyb3JcbilcbkUoXG4gICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgKHN0ciwgcmFuZ2UsIGlucHV0KSA9PiB7XG4gICAgYXNzZXJ0KHJhbmdlLCAnTWlzc2luZyBcInJhbmdlXCIgYXJndW1lbnQnKVxuICAgIGxldCByZWNlaXZlZFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiAybiAqKiAzMm4gfHwgaW5wdXQgPCAtKDJuICoqIDMybikpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjZWl2ZWQgPSBpbnNwZWN0KGlucHV0KVxuICAgIH1cbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBvZiBcIiR7c3RyfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gIH0sXG4gIFJhbmdlRXJyb3JcbilcbkUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnLCBFcnJvcilcbkUoJ0VSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJywgJ1RoZSAlcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQnLCAnQ2Fubm90IGNhbGwgJXMgYWZ0ZXIgYSBzdHJlYW0gd2FzIGZpbmlzaGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgJ0Nhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScsICdQcmVtYXR1cmUgY2xvc2UnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcsIEVycm9yKVxuRSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCAnVW5rbm93biBlbmNvZGluZzogJXMnLCBUeXBlRXJyb3IpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWJvcnRFcnJvcixcbiAgYWdncmVnYXRlVHdvRXJyb3JzOiBoaWRlU3RhY2tGcmFtZXMoYWdncmVnYXRlVHdvRXJyb3JzKSxcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2Rlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgQXJyYXlJc0FycmF5LFxuICBBcnJheVByb3RvdHlwZUluY2x1ZGVzLFxuICBBcnJheVByb3RvdHlwZUpvaW4sXG4gIEFycmF5UHJvdG90eXBlTWFwLFxuICBOdW1iZXJJc0ludGVnZXIsXG4gIE51bWJlcklzTmFOLFxuICBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludCxcbiAgT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHksXG4gIFJlZ0V4cFByb3RvdHlwZUV4ZWMsXG4gIFN0cmluZyxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2UsXG4gIFN0cmluZ1Byb3RvdHlwZVRyaW1cbn0gPSByZXF1aXJlKCcuLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2RlczogeyBFUlJfU09DS0VUX0JBRF9QT1JULCBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX0lOVkFMSURfQVJHX1ZBTFVFLCBFUlJfT1VUX09GX1JBTkdFLCBFUlJfVU5LTk9XTl9TSUdOQUwgfVxufSA9IHJlcXVpcmUoJy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgbm9ybWFsaXplRW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpXG5jb25zdCB7IGlzQXN5bmNGdW5jdGlvbiwgaXNBcnJheUJ1ZmZlclZpZXcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpLnR5cGVzXG5jb25zdCBzaWduYWxzID0ge31cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNJbnQzMih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICh2YWx1ZSB8IDApXG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVWludDMyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPj4+IDBcbn1cbmNvbnN0IG9jdGFsUmVnID0gL15bMC03XSskL1xuY29uc3QgbW9kZURlc2MgPSAnbXVzdCBiZSBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9yIGFuIG9jdGFsIHN0cmluZydcblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBtb2RlX3QgKHRoZSBTXypcbiAqIGNvbnN0YW50cykuIE9ubHkgdmFsaWQgbnVtYmVycyBhbmQgb2N0YWwgc3RyaW5ncyBhcmUgYWxsb3dlZC4gVGhleSBjb3VsZCBiZVxuICogY29udmVydGVkIHRvIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyBvciBub24tbmVnYXRpdmUgc2lnbmVkIGludGVnZXJzIGluIHRoZVxuICogQysrIGxhbmQsIGJ1dCBhbnkgdmFsdWUgaGlnaGVyIHRoYW4gMG83Nzcgd2lsbCByZXN1bHQgaW4gcGxhdGZvcm0tc3BlY2lmaWNcbiAqIGJlaGF2aW9ycy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGFyZ3VtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZl0gSWYgc3BlY2lmaWVkLCB3aWxsIGJlIHJldHVybmVkIGZvciBpbnZhbGlkIHZhbHVlc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VGaWxlTW9kZSh2YWx1ZSwgbmFtZSwgZGVmKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFsdWUgPSBkZWZcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChSZWdFeHBQcm90b3R5cGVFeGVjKG9jdGFsUmVnLCB2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgdmFsdWUsIG1vZGVEZXNjKVxuICAgIH1cbiAgICB2YWx1ZSA9IE51bWJlclBhcnNlSW50KHZhbHVlLCA4KVxuICB9XG4gIHZhbGlkYXRlVWludDMyKHZhbHVlLCBuYW1lKVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnRlZ2VyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlSW50ZWdlcn0gKi9cbmNvbnN0IHZhbGlkYXRlSW50ZWdlciA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IE51bWJlck1JTl9TQUZFX0lOVEVHRVIsIG1heCA9IE51bWJlck1BWF9TQUZFX0lOVEVHRVIpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnQzMlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUludDMyfSAqL1xuY29uc3QgdmFsaWRhdGVJbnQzMiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IC0yMTQ3NDgzNjQ4LCBtYXggPSAyMTQ3NDgzNjQ3KSA9PiB7XG4gIC8vIFRoZSBkZWZhdWx0cyBmb3IgbWluIGFuZCBtYXggY29ycmVzcG9uZCB0byB0aGUgbGltaXRzIG9mIDMyLWJpdCBpbnRlZ2Vycy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVaW50MzJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbcG9zaXRpdmU9ZmFsc2VdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVpbnQzMn0gKi9cbmNvbnN0IHZhbGlkYXRlVWludDMyID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgcG9zaXRpdmUgPSBmYWxzZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbiAgaWYgKCFOdW1iZXJJc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuICBjb25zdCBtaW4gPSBwb3NpdGl2ZSA/IDEgOiAwXG4gIC8vIDIgKiogMzIgPT09IDQyOTQ5NjcyOTZcbiAgY29uc3QgbWF4ID0gNDI5NDk2NzI5NVxuICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZVN0cmluZ1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIHN0cmluZ31cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlU3RyaW5nfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnc3RyaW5nJywgdmFsdWUpXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlTnVtYmVyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlTnVtYmVyfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIodmFsdWUsIG5hbWUsIG1pbiA9IHVuZGVmaW5lZCwgbWF4KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICBpZiAoXG4gICAgKG1pbiAhPSBudWxsICYmIHZhbHVlIDwgbWluKSB8fFxuICAgIChtYXggIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkgfHxcbiAgICAoKG1pbiAhPSBudWxsIHx8IG1heCAhPSBudWxsKSAmJiBOdW1iZXJJc05hTih2YWx1ZSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKFxuICAgICAgbmFtZSxcbiAgICAgIGAke21pbiAhPSBudWxsID8gYD49ICR7bWlufWAgOiAnJ30ke21pbiAhPSBudWxsICYmIG1heCAhPSBudWxsID8gJyAmJiAnIDogJyd9JHttYXggIT0gbnVsbCA/IGA8PSAke21heH1gIDogJyd9YCxcbiAgICAgIHZhbHVlXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlT25lT2ZcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtUW119IG9uZU9mXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9uZU9mfSAqL1xuY29uc3QgdmFsaWRhdGVPbmVPZiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG9uZU9mKSA9PiB7XG4gIGlmICghQXJyYXlQcm90b3R5cGVJbmNsdWRlcyhvbmVPZiwgdmFsdWUpKSB7XG4gICAgY29uc3QgYWxsb3dlZCA9IEFycmF5UHJvdG90eXBlSm9pbihcbiAgICAgIEFycmF5UHJvdG90eXBlTWFwKG9uZU9mLCAodikgPT4gKHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGAnJHt2fSdgIDogU3RyaW5nKHYpKSksXG4gICAgICAnLCAnXG4gICAgKVxuICAgIGNvbnN0IHJlYXNvbiA9ICdtdXN0IGJlIG9uZSBvZjogJyArIGFsbG93ZWRcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIHZhbHVlLCByZWFzb24pXG4gIH1cbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUJvb2xlYW59ICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4odmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ2Jvb2xlYW4nLCB2YWx1ZSlcbn1cbmZ1bmN0aW9uIGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIG9wdGlvbnMgPT0gbnVsbCB8fCAhT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHkob3B0aW9ucywga2V5KSA/IGRlZmF1bHRWYWx1ZSA6IG9wdGlvbnNba2V5XVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU9iamVjdFxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7e1xuICogICBhbGxvd0FycmF5PzogYm9vbGVhbixcbiAqICAgYWxsb3dGdW5jdGlvbj86IGJvb2xlYW4sXG4gKiAgIG51bGxhYmxlPzogYm9vbGVhblxuICogfX0gW29wdGlvbnNdXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9iamVjdH0gKi9cbmNvbnN0IHZhbGlkYXRlT2JqZWN0ID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgb3B0aW9ucyA9IG51bGwpID0+IHtcbiAgY29uc3QgYWxsb3dBcnJheSA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93QXJyYXknLCBmYWxzZSlcbiAgY29uc3QgYWxsb3dGdW5jdGlvbiA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93RnVuY3Rpb24nLCBmYWxzZSlcbiAgY29uc3QgbnVsbGFibGUgPSBnZXRPd25Qcm9wZXJ0eVZhbHVlT3JEZWZhdWx0KG9wdGlvbnMsICdudWxsYWJsZScsIGZhbHNlKVxuICBpZiAoXG4gICAgKCFudWxsYWJsZSAmJiB2YWx1ZSA9PT0gbnVsbCkgfHxcbiAgICAoIWFsbG93QXJyYXkgJiYgQXJyYXlJc0FycmF5KHZhbHVlKSkgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiAoIWFsbG93RnVuY3Rpb24gfHwgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdPYmplY3QnLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluTGVuZ3RoXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgYW55W119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFycmF5fSAqL1xuY29uc3QgdmFsaWRhdGVBcnJheSA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbkxlbmd0aCA9IDApID0+IHtcbiAgaWYgKCFBcnJheUlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBcnJheScsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICBjb25zdCByZWFzb24gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke21pbkxlbmd0aH1gXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrXG4vKipcbiAqIEBwYXJhbSB7Kn0gc2lnbmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J3NpZ25hbCddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzaWduYWwgaXMga2V5b2Ygc2lnbmFsc31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTaWduYWxOYW1lKHNpZ25hbCwgbmFtZSA9ICdzaWduYWwnKSB7XG4gIHZhbGlkYXRlU3RyaW5nKHNpZ25hbCwgbmFtZSlcbiAgaWYgKHNpZ25hbHNbc2lnbmFsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNpZ25hbHNbU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2lnbmFsKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwgKyAnIChzaWduYWxzIG11c3QgdXNlIGFsbCBjYXBpdGFsIGxldHRlcnMpJylcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwpXG4gIH1cbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVCdWZmZXJcbiAqIEBwYXJhbSB7Kn0gYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J2J1ZmZlciddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBidWZmZXIgaXMgQXJyYXlCdWZmZXJWaWV3fVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVCdWZmZXJ9ICovXG5jb25zdCB2YWxpZGF0ZUJ1ZmZlciA9IGhpZGVTdGFja0ZyYW1lcygoYnVmZmVyLCBuYW1lID0gJ2J1ZmZlcicpID0+IHtcbiAgaWYgKCFpc0FycmF5QnVmZmVyVmlldyhidWZmZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsIFsnQnVmZmVyJywgJ1R5cGVkQXJyYXknLCAnRGF0YVZpZXcnXSwgYnVmZmVyKVxuICB9XG59KVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbmNvZGluZyhkYXRhLCBlbmNvZGluZykge1xuICBjb25zdCBub3JtYWxpemVkRW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZylcbiAgY29uc3QgbGVuZ3RoID0gZGF0YS5sZW5ndGhcbiAgaWYgKG5vcm1hbGl6ZWRFbmNvZGluZyA9PT0gJ2hleCcgJiYgbGVuZ3RoICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoJ2VuY29kaW5nJywgZW5jb2RpbmcsIGBpcyBpbnZhbGlkIGZvciBkYXRhIG9mIGxlbmd0aCAke2xlbmd0aH1gKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgcG9ydCBudW1iZXIgaXMgbm90IE5hTiB3aGVuIGNvZXJjZWQgdG8gYSBudW1iZXIsXG4gKiBpcyBhbiBpbnRlZ2VyIGFuZCB0aGF0IGl0IGZhbGxzIHdpdGhpbiB0aGUgbGVnYWwgcmFuZ2Ugb2YgcG9ydCBudW1iZXJzLlxuICogQHBhcmFtIHsqfSBwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J1BvcnQnXVxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3daZXJvPXRydWVdXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBvcnQocG9ydCwgbmFtZSA9ICdQb3J0JywgYWxsb3daZXJvID0gdHJ1ZSkge1xuICBpZiAoXG4gICAgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgcG9ydCAhPT0gJ3N0cmluZycpIHx8XG4gICAgKHR5cGVvZiBwb3J0ID09PSAnc3RyaW5nJyAmJiBTdHJpbmdQcm90b3R5cGVUcmltKHBvcnQpLmxlbmd0aCA9PT0gMCkgfHxcbiAgICArcG9ydCAhPT0gK3BvcnQgPj4+IDAgfHxcbiAgICBwb3J0ID4gMHhmZmZmIHx8XG4gICAgKHBvcnQgPT09IDAgJiYgIWFsbG93WmVybylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9TT0NLRVRfQkFEX1BPUlQobmFtZSwgcG9ydCwgYWxsb3daZXJvKVxuICB9XG4gIHJldHVybiBwb3J0IHwgMFxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUFib3J0U2lnbmFsXG4gKiBAcGFyYW0geyp9IHNpZ25hbFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQWJvcnRTaWduYWx9ICovXG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gaGlkZVN0YWNrRnJhbWVzKChzaWduYWwsIG5hbWUpID0+IHtcbiAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIChzaWduYWwgPT09IG51bGwgfHwgdHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUZ1bmN0aW9ufSAqL1xuY29uc3QgdmFsaWRhdGVGdW5jdGlvbiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVBsYWluRnVuY3Rpb259ICovXG5jb25zdCB2YWxpZGF0ZVBsYWluRnVuY3Rpb24gPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgfHwgaXNBc3luY0Z1bmN0aW9uKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVbmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVuZGVmaW5lZH0gKi9cbmNvbnN0IHZhbGlkYXRlVW5kZWZpbmVkID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICd1bmRlZmluZWQnLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1RbXX0gdW5pb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVVbmlvbih2YWx1ZSwgbmFtZSwgdW5pb24pIHtcbiAgaWYgKCFBcnJheVByb3RvdHlwZUluY2x1ZGVzKHVuaW9uLCB2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgYCgnJHtBcnJheVByb3RvdHlwZUpvaW4odW5pb24sICd8Jyl9JylgLCB2YWx1ZSlcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzSW50MzIsXG4gIGlzVWludDMyLFxuICBwYXJzZUZpbGVNb2RlLFxuICB2YWxpZGF0ZUFycmF5LFxuICB2YWxpZGF0ZUJvb2xlYW4sXG4gIHZhbGlkYXRlQnVmZmVyLFxuICB2YWxpZGF0ZUVuY29kaW5nLFxuICB2YWxpZGF0ZUZ1bmN0aW9uLFxuICB2YWxpZGF0ZUludDMyLFxuICB2YWxpZGF0ZUludGVnZXIsXG4gIHZhbGlkYXRlTnVtYmVyLFxuICB2YWxpZGF0ZU9iamVjdCxcbiAgdmFsaWRhdGVPbmVPZixcbiAgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uLFxuICB2YWxpZGF0ZVBvcnQsXG4gIHZhbGlkYXRlU2lnbmFsTmFtZSxcbiAgdmFsaWRhdGVTdHJpbmcsXG4gIHZhbGlkYXRlVWludDMyLFxuICB2YWxpZGF0ZVVuZGVmaW5lZCxcbiAgdmFsaWRhdGVVbmlvbixcbiAgdmFsaWRhdGVBYm9ydFNpZ25hbFxufVxuIiwiLy8gZm9yIG5vdyBqdXN0IGV4cG9zZSB0aGUgYnVpbHRpbiBwcm9jZXNzIGdsb2JhbCBmcm9tIG5vZGUuanNcbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLnByb2Nlc3M7XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBTeW1ib2wsIFN5bWJvbEFzeW5jSXRlcmF0b3IsIFN5bWJvbEl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2tEZXN0cm95ZWQnKVxuY29uc3Qga0lzRXJyb3JlZCA9IFN5bWJvbCgna0lzRXJyb3JlZCcpXG5jb25zdCBrSXNSZWFkYWJsZSA9IFN5bWJvbCgna0lzUmVhZGFibGUnKVxuY29uc3Qga0lzRGlzdHVyYmVkID0gU3ltYm9sKCdrSXNEaXN0dXJiZWQnKVxuZnVuY3Rpb24gaXNSZWFkYWJsZU5vZGVTdHJlYW0ob2JqLCBzdHJpY3QgPSBmYWxzZSkge1xuICB2YXIgX29iaiRfcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICghc3RyaWN0IHx8ICh0eXBlb2Ygb2JqLnBhdXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoucmVzdW1lID09PSAnZnVuY3Rpb24nKSkgJiZcbiAgICAgICghb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAgICgoX29iaiRfcmVhZGFibGVTdGF0ZSA9IG9iai5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX29iaiRfcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IF9vYmokX3JlYWRhYmxlU3RhdGUucmVhZGFibGUpICE9PSBmYWxzZSkgJiZcbiAgICAgIC8vIER1cGxleFxuICAgICAgKCFvYmouX3dyaXRhYmxlU3RhdGUgfHwgb2JqLl9yZWFkYWJsZVN0YXRlKVxuICAgICkgLy8gV3JpdGFibGUgaGFzIC5waXBlLlxuICApXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGFibGVOb2RlU3RyZWFtKG9iaikge1xuICB2YXIgX29iaiRfd3JpdGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoIW9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgICAoKF9vYmokX3dyaXRhYmxlU3RhdGUgPSBvYmouX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9vYmokX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb2JqJF93cml0YWJsZVN0YXRlLndyaXRhYmxlKSAhPT0gZmFsc2UpXG4gICAgKSAvLyBEdXBsZXhcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0R1cGxleE5vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShcbiAgICBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICBvYmouX3JlYWRhYmxlU3RhdGUgJiZcbiAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5mdW5jdGlvbiBpc05vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgKG9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAodHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSlcbiAgKVxufVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmosIGlzQXN5bmMpIHtcbiAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKGlzQXN5bmMgPT09IHRydWUpIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIGlmIChpc0FzeW5jID09PSBmYWxzZSkgcmV0dXJuIHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBpc0Rlc3Ryb3llZChzdHJlYW0pIHtcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBzdGF0ZSA9IHdTdGF0ZSB8fCByU3RhdGVcbiAgcmV0dXJuICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdIHx8IChzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLmRlc3Ryb3llZCkpXG59XG5cbi8vIEhhdmUgYmVlbiBlbmQoKTpkLlxuZnVuY3Rpb24gaXNXcml0YWJsZUVuZGVkKHN0cmVhbSkge1xuICBpZiAoIWlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGlmIChzdHJlYW0ud3JpdGFibGVFbmRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWVcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh3U3RhdGUgIT09IG51bGwgJiYgd1N0YXRlICE9PSB1bmRlZmluZWQgJiYgd1N0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiB3U3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdmaW5pc2gnLlxuZnVuY3Rpb24gaXNXcml0YWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS53cml0YWJsZUZpbmlzaGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5maW5pc2hlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHdTdGF0ZS5maW5pc2hlZCB8fCAoc3RyaWN0ID09PSBmYWxzZSAmJiB3U3RhdGUuZW5kZWQgPT09IHRydWUgJiYgd1N0YXRlLmxlbmd0aCA9PT0gMCkpXG59XG5cbi8vIEhhdmUgYmVlbiBwdXNoKG51bGwpOmQuXG5mdW5jdGlvbiBpc1JlYWRhYmxlRW5kZWQoc3RyZWFtKSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS5yZWFkYWJsZUVuZGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiByU3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdlbmQnLlxuZnVuY3Rpb24gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kRW1pdHRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHJTdGF0ZS5lbmRFbWl0dGVkIHx8IChzdHJpY3QgPT09IGZhbHNlICYmIHJTdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiByU3RhdGUubGVuZ3RoID09PSAwKSlcbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyZWFtKSB7XG4gIGlmIChzdHJlYW0gJiYgc3RyZWFtW2tJc1JlYWRhYmxlXSAhPSBudWxsKSByZXR1cm4gc3RyZWFtW2tJc1JlYWRhYmxlXVxuICBpZiAodHlwZW9mIChzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJlYW0ucmVhZGFibGUpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGlzUmVhZGFibGVOb2RlU3RyZWFtKHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlICYmICFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtKVxufVxuZnVuY3Rpb24gaXNXcml0YWJsZShzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiAoc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RyZWFtLndyaXRhYmxlKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICBpZiAoaXNEZXN0cm95ZWQoc3RyZWFtKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pICYmIHN0cmVhbS53cml0YWJsZSAmJiAhaXNXcml0YWJsZUVuZGVkKHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGlzRmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0cy5yZWFkYWJsZSkgIT09IGZhbHNlICYmIGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLndyaXRhYmxlKSAhPT0gZmFsc2UgJiYgaXNXcml0YWJsZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cbmZ1bmN0aW9uIGlzV3JpdGFibGVFcnJvcmVkKHN0cmVhbSkge1xuICB2YXIgX3N0cmVhbSRfd3JpdGFibGVTdGF0LCBfc3RyZWFtJF93cml0YWJsZVN0YXQyXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChzdHJlYW0ud3JpdGFibGVFcnJvcmVkKSB7XG4gICAgcmV0dXJuIHN0cmVhbS53cml0YWJsZUVycm9yZWRcbiAgfVxuICByZXR1cm4gKF9zdHJlYW0kX3dyaXRhYmxlU3RhdCA9XG4gICAgKF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0Mi5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RyZWFtJF93cml0YWJsZVN0YXQgIT09IHVuZGVmaW5lZFxuICAgID8gX3N0cmVhbSRfd3JpdGFibGVTdGF0XG4gICAgOiBudWxsXG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0kX3JlYWRhYmxlU3RhdCwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MlxuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZGFibGVFcnJvcmVkXG4gIH1cbiAgcmV0dXJuIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQgPVxuICAgIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3JlYWRhYmxlU3RhdDIuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0cmVhbSRfcmVhZGFibGVTdGF0ICE9PSB1bmRlZmluZWRcbiAgICA/IF9zdHJlYW0kX3JlYWRhYmxlU3RhdFxuICAgIDogbnVsbFxufVxuZnVuY3Rpb24gaXNDbG9zZWQoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5jbG9zZWRcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChcbiAgICB0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbicgfHxcbiAgICB0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuY2xvc2VkKSB8fFxuICAgICAgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpXG4gICAgKVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLl9jbG9zZWQgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fY2xvc2VkXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbmZ1bmN0aW9uIGlzT3V0Z29pbmdNZXNzYWdlKHN0cmVhbSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2Nsb3NlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZGVmYXVsdEtlZXBBbGl2ZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fcmVtb3ZlZENvbm5lY3Rpb24gPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX3JlbW92ZWRDb250TGVuID09PSAnYm9vbGVhbidcbiAgKVxufVxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZShzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX3NlbnQxMDAgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pXG59XG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJHJlcVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2NvbnN1bWluZyA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZHVtcGVkID09PSAnYm9vbGVhbicgJiZcbiAgICAoKF9zdHJlYW0kcmVxID0gc3RyZWFtLnJlcSkgPT09IG51bGwgfHwgX3N0cmVhbSRyZXEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9zdHJlYW0kcmVxLnVwZ3JhZGVPckNvbm5lY3QpID09PVxuICAgICAgdW5kZWZpbmVkXG4gIClcbn1cbmZ1bmN0aW9uIHdpbGxFbWl0Q2xvc2Uoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgc3RhdGUgPSB3U3RhdGUgfHwgclN0YXRlXG4gIHJldHVybiAoXG4gICAgKCFzdGF0ZSAmJiBpc1NlcnZlclJlc3BvbnNlKHN0cmVhbSkpIHx8ICEhKHN0YXRlICYmIHN0YXRlLmF1dG9EZXN0cm95ICYmIHN0YXRlLmVtaXRDbG9zZSAmJiBzdGF0ZS5jbG9zZWQgPT09IGZhbHNlKVxuICApXG59XG5mdW5jdGlvbiBpc0Rpc3R1cmJlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0ka0lzRGlzdHVyYmVkXG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9zdHJlYW0ka0lzRGlzdHVyYmVkID0gc3RyZWFtW2tJc0Rpc3R1cmJlZF0pICE9PSBudWxsICYmIF9zdHJlYW0ka0lzRGlzdHVyYmVkICE9PSB1bmRlZmluZWRcbiAgICAgID8gX3N0cmVhbSRrSXNEaXN0dXJiZWRcbiAgICAgIDogc3RyZWFtLnJlYWRhYmxlRGlkUmVhZCB8fCBzdHJlYW0ucmVhZGFibGVBYm9ydGVkKVxuICApXG59XG5mdW5jdGlvbiBpc0Vycm9yZWQoc3RyZWFtKSB7XG4gIHZhciBfcmVmLFxuICAgIF9yZWYyLFxuICAgIF9yZWYzLFxuICAgIF9yZWY0LFxuICAgIF9yZWY1LFxuICAgIF9zdHJlYW0ka0lzRXJyb3JlZCxcbiAgICBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLFxuICAgIF9zdHJlYW0kX3dyaXRhYmxlU3RhdDMsXG4gICAgX3N0cmVhbSRfcmVhZGFibGVTdGF0NCxcbiAgICBfc3RyZWFtJF93cml0YWJsZVN0YXQ0XG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9yZWYgPVxuICAgICAgKF9yZWYyID1cbiAgICAgICAgKF9yZWYzID1cbiAgICAgICAgICAoX3JlZjQgPVxuICAgICAgICAgICAgKF9yZWY1ID1cbiAgICAgICAgICAgICAgKF9zdHJlYW0ka0lzRXJyb3JlZCA9IHN0cmVhbVtrSXNFcnJvcmVkXSkgIT09IG51bGwgJiYgX3N0cmVhbSRrSXNFcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IF9zdHJlYW0ka0lzRXJyb3JlZFxuICAgICAgICAgICAgICAgIDogc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IF9yZWY1XG4gICAgICAgICAgICAgIDogc3RyZWFtLndyaXRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBfcmVmNFxuICAgICAgICAgICAgOiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLmVycm9yRW1pdHRlZCkgIT09IG51bGwgJiYgX3JlZjMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gX3JlZjNcbiAgICAgICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0My5lcnJvckVtaXR0ZWQpICE9PSBudWxsICYmIF9yZWYyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmMlxuICAgICAgICA6IChfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0LmVycm9yZWQpICE9PSBudWxsICYmIF9yZWYgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfcmVmXG4gICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDQuZXJyb3JlZClcbiAgKVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtEZXN0cm95ZWQsXG4gIGlzRGlzdHVyYmVkLFxuICBrSXNEaXN0dXJiZWQsXG4gIGlzRXJyb3JlZCxcbiAga0lzRXJyb3JlZCxcbiAgaXNSZWFkYWJsZSxcbiAga0lzUmVhZGFibGUsXG4gIGlzQ2xvc2VkLFxuICBpc0Rlc3Ryb3llZCxcbiAgaXNEdXBsZXhOb2RlU3RyZWFtLFxuICBpc0ZpbmlzaGVkLFxuICBpc0l0ZXJhYmxlLFxuICBpc1JlYWRhYmxlTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUVuZGVkLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGUsXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc1dyaXRhYmxlRW5kZWQsXG4gIGlzV3JpdGFibGVGaW5pc2hlZCxcbiAgaXNXcml0YWJsZUVycm9yZWQsXG4gIGlzU2VydmVyUmVxdWVzdCxcbiAgaXNTZXJ2ZXJSZXNwb25zZSxcbiAgd2lsbEVtaXRDbG9zZVxufVxuIiwiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBBYm9ydEVycm9yLCBjb2RlcyB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgfSA9IGNvZGVzXG5jb25zdCB7IGtFbXB0eU9iamVjdCwgb25jZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgdmFsaWRhdGVBYm9ydFNpZ25hbCwgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3QgeyBQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaXNDbG9zZWQsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZUZpbmlzaGVkLFxuICBpc1dyaXRhYmxlRXJyb3JlZCxcbiAgaXNOb2RlU3RyZWFtLFxuICB3aWxsRW1pdENsb3NlOiBfd2lsbEVtaXRDbG9zZVxufSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5jb25zdCBub3AgPSAoKSA9PiB7fVxuZnVuY3Rpb24gZW9zKHN0cmVhbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIF9vcHRpb25zJHJlYWRhYmxlLCBfb3B0aW9ucyR3cml0YWJsZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBrRW1wdHlPYmplY3RcbiAgfSBlbHNlIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICBvcHRpb25zID0ga0VtcHR5T2JqZWN0XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIHZhbGlkYXRlRnVuY3Rpb24oY2FsbGJhY2ssICdjYWxsYmFjaycpXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcbiAgY29uc3QgcmVhZGFibGUgPVxuICAgIChfb3B0aW9ucyRyZWFkYWJsZSA9IG9wdGlvbnMucmVhZGFibGUpICE9PSBudWxsICYmIF9vcHRpb25zJHJlYWRhYmxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gX29wdGlvbnMkcmVhZGFibGVcbiAgICAgIDogaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKVxuICBjb25zdCB3cml0YWJsZSA9XG4gICAgKF9vcHRpb25zJHdyaXRhYmxlID0gb3B0aW9ucy53cml0YWJsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkd3JpdGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfb3B0aW9ucyR3cml0YWJsZVxuICAgICAgOiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAvLyBUT0RPOiBXZWJzdHJlYW1zLlxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ1N0cmVhbScsIHN0cmVhbSlcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IG9ubGVnYWN5ZmluaXNoID0gKCkgPT4ge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICBvbmZpbmlzaCgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyAocm9uYWcpOiBJbXByb3ZlIHNvZnQgZGV0ZWN0aW9uIHRvIGluY2x1ZGUgY29yZSBtb2R1bGVzIGFuZFxuICAvLyBjb21tb24gZWNvc3lzdGVtIG1vZHVsZXMgdGhhdCBkbyBwcm9wZXJseSBlbWl0ICdjbG9zZScgYnV0IGZhaWxcbiAgLy8gdGhpcyBnZW5lcmljIGNoZWNrLlxuICBsZXQgd2lsbEVtaXRDbG9zZSA9XG4gICAgX3dpbGxFbWl0Q2xvc2Uoc3RyZWFtKSAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSByZWFkYWJsZSAmJiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSB3cml0YWJsZVxuICBsZXQgd3JpdGFibGVGaW5pc2hlZCA9IGlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKVxuICBjb25zdCBvbmZpbmlzaCA9ICgpID0+IHtcbiAgICB3cml0YWJsZUZpbmlzaGVkID0gdHJ1ZVxuICAgIC8vIFN0cmVhbSBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBoZXJlLiBJZiBpdCBpcyB0aGF0XG4gICAgLy8gbWVhbnMgdGhhdCB1c2VyIHNwYWNlIGlzIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnRseSBhbmRcbiAgICAvLyB3ZSBjYW5ub3QgdHJ1c3Qgd2lsbEVtaXRDbG9zZS5cbiAgICBpZiAoc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgd2lsbEVtaXRDbG9zZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh3aWxsRW1pdENsb3NlICYmICghc3RyZWFtLnJlYWRhYmxlIHx8IHJlYWRhYmxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVhZGFibGUgfHwgcmVhZGFibGVGaW5pc2hlZCkge1xuICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gICAgfVxuICB9XG4gIGxldCByZWFkYWJsZUZpbmlzaGVkID0gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgZmFsc2UpXG4gIGNvbnN0IG9uZW5kID0gKCkgPT4ge1xuICAgIHJlYWRhYmxlRmluaXNoZWQgPSB0cnVlXG4gICAgLy8gU3RyZWFtIHNob3VsZCBub3QgYmUgZGVzdHJveWVkIGhlcmUuIElmIGl0IGlzIHRoYXRcbiAgICAvLyBtZWFucyB0aGF0IHVzZXIgc3BhY2UgaXMgZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudGx5IGFuZFxuICAgIC8vIHdlIGNhbm5vdCB0cnVzdCB3aWxsRW1pdENsb3NlLlxuICAgIGlmIChzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgICB3aWxsRW1pdENsb3NlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKHdpbGxFbWl0Q2xvc2UgJiYgKCFzdHJlYW0ud3JpdGFibGUgfHwgd3JpdGFibGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCF3cml0YWJsZSB8fCB3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKVxuICB9XG4gIGxldCBjbG9zZWQgPSBpc0Nsb3NlZChzdHJlYW0pXG4gIGNvbnN0IG9uY2xvc2UgPSAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICAgIGNvbnN0IGVycm9yZWQgPSBpc1dyaXRhYmxlRXJyb3JlZChzdHJlYW0pIHx8IGlzUmVhZGFibGVFcnJvcmVkKHN0cmVhbSlcbiAgICBpZiAoZXJyb3JlZCAmJiB0eXBlb2YgZXJyb3JlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycm9yZWQpXG4gICAgfVxuICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVGaW5pc2hlZCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0sIHRydWUpKSB7XG4gICAgICBpZiAoIWlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgaWYgKHdyaXRhYmxlICYmICF3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBpZiAoIWlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gIH1cbiAgY29uc3Qgb25yZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICB9XG4gIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBpZiAoIXdpbGxFbWl0Q2xvc2UpIHtcbiAgICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKVxuICAgIH1cbiAgICBpZiAoc3RyZWFtLnJlcSkge1xuICAgICAgb25yZXF1ZXN0KClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KVxuICAgIH1cbiAgfSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd1N0YXRlKSB7XG4gICAgLy8gbGVnYWN5IHN0cmVhbXNcbiAgICBzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaClcbiAgfVxuXG4gIC8vIE5vdCBhbGwgc3RyZWFtcyB3aWxsIGVtaXQgJ2Nsb3NlJyBhZnRlciAnYWJvcnRlZCcuXG4gIGlmICghd2lsbEVtaXRDbG9zZSAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgIHN0cmVhbS5vbignYWJvcnRlZCcsIG9uY2xvc2UpXG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZClcbiAgc3RyZWFtLm9uKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgaWYgKG9wdGlvbnMuZXJyb3IgIT09IGZhbHNlKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gIH1cbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gIGlmIChjbG9zZWQpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gIH0gZWxzZSBpZiAoXG4gICAgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JFbWl0dGVkKSB8fFxuICAgIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yRW1pdHRlZClcbiAgKSB7XG4gICAgaWYgKCF3aWxsRW1pdENsb3NlKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgICFyZWFkYWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1JlYWRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHdyaXRhYmxlRmluaXNoZWQgfHwgaXNXcml0YWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKFxuICAgICF3cml0YWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1dyaXRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHJlYWRhYmxlRmluaXNoZWQgfHwgaXNSZWFkYWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKHJTdGF0ZSAmJiBzdHJlYW0ucmVxICYmIHN0cmVhbS5hYm9ydGVkKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2FsbGJhY2sgPSBub3BcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbmNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWNsb3NlZCkge1xuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgLy8gS2VlcCBpdCBiZWNhdXNlIGNsZWFudXAgcmVtb3ZlcyBpdC5cbiAgICAgIGNvbnN0IGVuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNsZWFudXAoKVxuICAgICAgZW5kQ2FsbGJhY2suY2FsbChcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gb25jZSgoLi4uYXJncykgPT4ge1xuICAgICAgICBvcHRpb25zLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xlYW51cFxufVxuZnVuY3Rpb24gZmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZW9zKHN0cmVhbSwgb3B0cywgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cbm1vZHVsZS5leHBvcnRzID0gZW9zXG5tb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IGZpbmlzaGVkXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX01JU1NJTkdfQVJHUywgRVJSX09VVF9PRl9SQU5HRSB9LFxuICBBYm9ydEVycm9yXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyB2YWxpZGF0ZUFib3J0U2lnbmFsLCB2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlT2JqZWN0IH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IGtXZWFrSGFuZGxlciA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKS5TeW1ib2woJ2tXZWFrJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlUHVzaCxcbiAgTWF0aEZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzTmFOLFxuICBQcm9taXNlLFxuICBQcm9taXNlUmVqZWN0LFxuICBQcm9taXNlUHJvdG90eXBlVGhlbixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBrRW1wdHkgPSBTeW1ib2woJ2tFbXB0eScpXG5jb25zdCBrRW9mID0gU3ltYm9sKCdrRW9mJylcbmZ1bmN0aW9uIG1hcChmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGNvbmN1cnJlbmN5ID0gMVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5jb25jdXJyZW5jeSkgIT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbmN5ID0gTWF0aEZsb29yKG9wdGlvbnMuY29uY3VycmVuY3kpXG4gIH1cbiAgdmFsaWRhdGVJbnRlZ2VyKGNvbmN1cnJlbmN5LCAnY29uY3VycmVuY3knLCAxKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIG1hcCgpIHtcbiAgICB2YXIgX29wdGlvbnMkc2lnbmFsLCBfb3B0aW9ucyRzaWduYWwyXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG4gICAgY29uc3QgcXVldWUgPSBbXVxuICAgIGNvbnN0IHNpZ25hbCA9IGFjLnNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbE9wdCA9IHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgICBjb25zdCBhYm9ydCA9ICgpID0+IGFjLmFib3J0KClcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWwgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwuYWJvcnRlZFxuICAgICkge1xuICAgICAgYWJvcnQoKVxuICAgIH1cbiAgICBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogKF9vcHRpb25zJHNpZ25hbDIgPSBvcHRpb25zLnNpZ25hbCkgPT09IG51bGwgfHwgX29wdGlvbnMkc2lnbmFsMiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBfb3B0aW9ucyRzaWduYWwyLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgbGV0IG5leHRcbiAgICBsZXQgcmVzdW1lXG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuICAgIGZ1bmN0aW9uIG9uRG9uZSgpIHtcbiAgICAgIGRvbmUgPSB0cnVlXG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGxldCB2YWwgb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgdmFyIF92YWxcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsID0gZm4odmFsLCBzaWduYWxPcHQpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB2YWwgPSBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VtcHR5KSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mICgoX3ZhbCA9IHZhbCkgPT09IG51bGwgfHwgX3ZhbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3ZhbC5jYXRjaCkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbC5jYXRjaChvbkRvbmUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIG5leHQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZG9uZSAmJiBxdWV1ZS5sZW5ndGggJiYgcXVldWUubGVuZ3RoID49IGNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bWUgPSByZXNvbHZlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZS5wdXNoKGtFb2YpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgdmFsID0gUHJvbWlzZVJlamVjdChlcnIpXG4gICAgICAgIFByb21pc2VQcm90b3R5cGVUaGVuKHZhbCwgdW5kZWZpbmVkLCBvbkRvbmUpXG4gICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdmFyIF9vcHRpb25zJHNpZ25hbDNcbiAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0KClcbiAgICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IChfb3B0aW9ucyRzaWduYWwzID0gb3B0aW9ucy5zaWduYWwpID09PSBudWxsIHx8IF9vcHRpb25zJHNpZ25hbDMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb3B0aW9ucyRzaWduYWwzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgICB9XG4gICAgfVxuICAgIHB1bXAoKVxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHF1ZXVlWzBdXG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VvZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsICE9PSBrRW1wdHkpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICAgICAgcmVzdW1lKClcbiAgICAgICAgICAgIHJlc3VtZSA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBuZXh0ID0gcmVzb2x2ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICByZXN1bWUoKVxuICAgICAgICByZXN1bWUgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIGFzSW5kZXhlZFBhaXJzKG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogYXNJbmRleGVkUGFpcnMoKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw0XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChfb3B0aW9ucyRzaWduYWw0ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw0LmFib3J0ZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcih7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgeWllbGQgW2luZGV4KyssIHZhbF1cbiAgICB9XG4gIH0uY2FsbCh0aGlzKVxufVxuYXN5bmMgZnVuY3Rpb24gc29tZShmbiwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBmaWx0ZXIuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuYXN5bmMgZnVuY3Rpb24gZXZlcnkoZm4sIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVfTW9yZ2FuJTI3c19sYXdzXG4gIHJldHVybiAhKGF3YWl0IHNvbWUuY2FsbChcbiAgICB0aGlzLFxuICAgIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICByZXR1cm4gIShhd2FpdCBmbiguLi5hcmdzKSlcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKSlcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmQoZm4sIG9wdGlvbnMpIHtcbiAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgZmlsdGVyLmNhbGwodGhpcywgZm4sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbmFzeW5jIGZ1bmN0aW9uIGZvckVhY2goZm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZm9yRWFjaEZuKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgYXdhaXQgZm4odmFsdWUsIG9wdGlvbnMpXG4gICAgcmV0dXJuIGtFbXB0eVxuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBtYXAuY2FsbCh0aGlzLCBmb3JFYWNoRm4sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIGZpbHRlcihmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBmaWx0ZXJGbih2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmIChhd2FpdCBmbih2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4ga0VtcHR5XG4gIH1cbiAgcmV0dXJuIG1hcC5jYWxsKHRoaXMsIGZpbHRlckZuLCBvcHRpb25zKVxufVxuXG4vLyBTcGVjaWZpYyB0byBwcm92aWRlIGJldHRlciBlcnJvciB0byByZWR1Y2Ugc2luY2UgdGhlIGFyZ3VtZW50IGlzIG9ubHlcbi8vIG1pc3NpbmcgaWYgdGhlIHN0cmVhbSBoYXMgbm8gaXRlbXMgaW4gaXQgLSBidXQgdGhlIGNvZGUgaXMgc3RpbGwgYXBwcm9wcmlhdGVcbmNsYXNzIFJlZHVjZUF3YXJlRXJyTWlzc2luZ0FyZ3MgZXh0ZW5kcyBFUlJfTUlTU0lOR19BUkdTIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3JlZHVjZScpXG4gICAgdGhpcy5tZXNzYWdlID0gJ1JlZHVjZSBvZiBhbiBlbXB0eSBzdHJlYW0gcmVxdWlyZXMgYW4gaW5pdGlhbCB2YWx1ZSdcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVkdWNlKHJlZHVjZXIsIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkc2lnbmFsNVxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3JlZHVjZXInLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgcmVkdWNlcilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGhhc0luaXRpYWxWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gIGlmIChcbiAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgKF9vcHRpb25zJHNpZ25hbDUgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1ICE9PSB1bmRlZmluZWQgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1LmFib3J0ZWRcbiAgKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgfSlcbiAgICB0aGlzLm9uY2UoJ2Vycm9yJywgKCkgPT4ge30pIC8vIFRoZSBlcnJvciBpcyBhbHJlYWR5IHByb3BhZ2F0ZWRcbiAgICBhd2FpdCBmaW5pc2hlZCh0aGlzLmRlc3Ryb3koZXJyKSlcbiAgICB0aHJvdyBlcnJcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBba1dlYWtIYW5kbGVyXTogdGhpc1xuICAgIH1cbiAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KCksIG9wdHMpXG4gIH1cbiAgbGV0IGdvdEFueUl0ZW1Gcm9tU3RyZWFtID0gZmFsc2VcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw2XG4gICAgICBnb3RBbnlJdGVtRnJvbVN0cmVhbSA9IHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbDYgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsNiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDYuYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgIH1cbiAgICAgIGlmICghaGFzSW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IHZhbHVlXG4gICAgICAgIGhhc0luaXRpYWxWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IGF3YWl0IHJlZHVjZXIoaW5pdGlhbFZhbHVlLCB2YWx1ZSwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWdvdEFueUl0ZW1Gcm9tU3RyZWFtICYmICFoYXNJbml0aWFsVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBSZWR1Y2VBd2FyZUVyck1pc3NpbmdBcmdzKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYWMuYWJvcnQoKVxuICB9XG4gIHJldHVybiBpbml0aWFsVmFsdWVcbn1cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdGhpcykge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWw3XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX29wdGlvbnMkc2lnbmFsNyA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw3LmFib3J0ZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIH1cbiAgICBBcnJheVByb3RvdHlwZVB1c2gocmVzdWx0LCB2YWwpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuZnVuY3Rpb24gZmxhdE1hcChmbiwgb3B0aW9ucykge1xuICBjb25zdCB2YWx1ZXMgPSBtYXAuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucylcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiBmbGF0TWFwKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgICAgeWllbGQqIHZhbFxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5mdW5jdGlvbiB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcikge1xuICAvLyBXZSBjb2VyY2UgaGVyZSB0byBhbGlnbiB3aXRoIHRoZSBzcGVjXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMvaXNzdWVzLzE2OVxuICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKVxuICBpZiAoTnVtYmVySXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKG51bWJlciA8IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRSgnbnVtYmVyJywgJz49IDAnLCBudW1iZXIpXG4gIH1cbiAgcmV0dXJuIG51bWJlclxufVxuZnVuY3Rpb24gZHJvcChudW1iZXIsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIG51bWJlciA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGRyb3AoKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDhcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw4ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDguYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsOVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsOSA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsOS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tIDw9IDApIHtcbiAgICAgICAgeWllbGQgdmFsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIHRha2UobnVtYmVyLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcilcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiB0YWtlKCkge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMFxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKF9vcHRpb25zJHNpZ25hbDEwID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMC5hYm9ydGVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsMTEgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsMTEgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwxMS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tID4gMCkge1xuICAgICAgICB5aWVsZCB2YWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMgPSB7XG4gIGFzSW5kZXhlZFBhaXJzLFxuICBkcm9wLFxuICBmaWx0ZXIsXG4gIGZsYXRNYXAsXG4gIG1hcCxcbiAgdGFrZVxufVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZVJldHVybmluZ09wZXJhdG9ycyA9IHtcbiAgZXZlcnksXG4gIGZvckVhY2gsXG4gIHJlZHVjZSxcbiAgdG9BcnJheSxcbiAgc29tZSxcbiAgZmluZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG5jb25zdCB7XG4gIGFnZ3JlZ2F0ZVR3b0Vycm9ycyxcbiAgY29kZXM6IHsgRVJSX01VTFRJUExFX0NBTExCQUNLIH0sXG4gIEFib3J0RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGtEZXN0cm95ZWQsIGlzRGVzdHJveWVkLCBpc0ZpbmlzaGVkLCBpc1NlcnZlclJlcXVlc3QgfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3Qga0Rlc3Ryb3kgPSBTeW1ib2woJ2tEZXN0cm95JylcbmNvbnN0IGtDb25zdHJ1Y3QgPSBTeW1ib2woJ2tDb25zdHJ1Y3QnKVxuZnVuY3Rpb24gY2hlY2tFcnJvcihlcnIsIHcsIHIpIHtcbiAgaWYgKGVycikge1xuICAgIC8vIEF2b2lkIFY4IGxlYWssIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0MTAzI2lzc3VlY29tbWVudC02NTIwMDIzNjRcbiAgICBlcnIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICh3ICYmICF3LmVycm9yZWQpIHtcbiAgICAgIHcuZXJyb3JlZCA9IGVyclxuICAgIH1cbiAgICBpZiAociAmJiAhci5lcnJvcmVkKSB7XG4gICAgICByLmVycm9yZWQgPSBlcnJcbiAgICB9XG4gIH1cbn1cblxuLy8gQmFja3dhcmRzIGNvbXBhdC4gY2IoKSBpcyB1bmRvY3VtZW50ZWQgYW5kIHVudXNlZCBpbiBjb3JlIGJ1dFxuLy8gdW5mb3J0dW5hdGVseSBtaWdodCBiZSB1c2VkIGJ5IG1vZHVsZXMuXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgLy8gV2l0aCBkdXBsZXggc3RyZWFtcyB3ZSB1c2UgdGhlIHdyaXRhYmxlIHNpZGUgZm9yIHN0YXRlLlxuICBjb25zdCBzID0gdyB8fCByXG4gIGlmICgodyAmJiB3LmRlc3Ryb3llZCkgfHwgKHIgJiYgci5kZXN0cm95ZWQpKSB7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gV2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuICBjaGVja0Vycm9yKGVyciwgdywgcilcbiAgaWYgKHcpIHtcbiAgICB3LmRlc3Ryb3llZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZGVzdHJveWVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gSWYgc3RpbGwgY29uc3RydWN0aW5nIHRoZW4gZGVmZXIgY2FsbGluZyBfZGVzdHJveS5cbiAgaWYgKCFzLmNvbnN0cnVjdGVkKSB7XG4gICAgdGhpcy5vbmNlKGtEZXN0cm95LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIF9kZXN0cm95KHRoaXMsIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlciwgZXJyKSwgY2IpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBfZGVzdHJveSh0aGlzLCBlcnIsIGNiKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBfZGVzdHJveShzZWxmLCBlcnIsIGNiKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gICAgY2hlY2tFcnJvcihlcnIsIHcsIHIpXG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiKGVycilcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZU5ULCBzZWxmLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHNlbGYpXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fZGVzdHJveShlcnIgfHwgbnVsbCwgb25EZXN0cm95KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkRlc3Ryb3koZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpXG4gIGVtaXRDbG9zZU5UKHNlbGYpXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGNvbnN0IHIgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gIGlmICh3KSB7XG4gICAgdy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgaWYgKHIpIHtcbiAgICByLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAoKHcgJiYgdy5lbWl0Q2xvc2UpIHx8IChyICYmIHIuZW1pdENsb3NlKSkge1xuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgY29uc3QgciA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHNlbGYuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZXJyb3JFbWl0dGVkKSB8fCAociAmJiByLmVycm9yRW1pdHRlZCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodykge1xuICAgIHcuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICB9XG4gIGlmIChyKSB7XG4gICAgci5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcbn1cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHIpIHtcbiAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIHIuY2xvc2VkID0gZmFsc2VcbiAgICByLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG4gICAgci5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHIuZXJyb3JlZCA9IG51bGxcbiAgICByLmVycm9yRW1pdHRlZCA9IGZhbHNlXG4gICAgci5yZWFkaW5nID0gZmFsc2VcbiAgICByLmVuZGVkID0gci5yZWFkYWJsZSA9PT0gZmFsc2VcbiAgICByLmVuZEVtaXR0ZWQgPSByLnJlYWRhYmxlID09PSBmYWxzZVxuICB9XG4gIGlmICh3KSB7XG4gICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB3LmRlc3Ryb3llZCA9IGZhbHNlXG4gICAgdy5jbG9zZWQgPSBmYWxzZVxuICAgIHcuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgICB3LmVycm9yZWQgPSBudWxsXG4gICAgdy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuICAgIHcuZmluYWxDYWxsZWQgPSBmYWxzZVxuICAgIHcucHJlZmluaXNoZWQgPSBmYWxzZVxuICAgIHcuZW5kZWQgPSB3LndyaXRhYmxlID09PSBmYWxzZVxuICAgIHcuZW5kaW5nID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICB3LmZpbmlzaGVkID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHN5bmMpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cblxuICBjb25zdCByID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZGVzdHJveWVkKSB8fCAociAmJiByLmRlc3Ryb3llZCkpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIGlmICgociAmJiByLmF1dG9EZXN0cm95KSB8fCAodyAmJiB3LmF1dG9EZXN0cm95KSkgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBlbHNlIGlmIChlcnIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXJyLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cbiAgICBpZiAodyAmJiAhdy5lcnJvcmVkKSB7XG4gICAgICB3LmVycm9yZWQgPSBlcnJcbiAgICB9XG4gICAgaWYgKHIgJiYgIXIuZXJyb3JlZCkge1xuICAgICAgci5lcnJvcmVkID0gZXJyXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCBzdHJlYW0sIGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdEVycm9yTlQoc3RyZWFtLCBlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3Qoc3RyZWFtLCBjYikge1xuICBpZiAodHlwZW9mIHN0cmVhbS5fY29uc3RydWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgciA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmIChyKSB7XG4gICAgci5jb25zdHJ1Y3RlZCA9IGZhbHNlXG4gIH1cbiAgaWYgKHcpIHtcbiAgICB3LmNvbnN0cnVjdGVkID0gZmFsc2VcbiAgfVxuICBzdHJlYW0ub25jZShrQ29uc3RydWN0LCBjYilcbiAgaWYgKHN0cmVhbS5saXN0ZW5lckNvdW50KGtDb25zdHJ1Y3QpID4gMSkge1xuICAgIC8vIER1cGxleFxuICAgIHJldHVyblxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soY29uc3RydWN0TlQsIHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdE5UKHN0cmVhbSkge1xuICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgZnVuY3Rpb24gb25Db25zdHJ1Y3QoZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIgIT09IG51bGwgJiYgZXJyICE9PSB1bmRlZmluZWQgPyBlcnIgOiBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIGNvbnN0IHIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gICAgY29uc3QgcyA9IHcgfHwgclxuICAgIGlmIChyKSB7XG4gICAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodykge1xuICAgICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKHMuZGVzdHJveWVkKSB7XG4gICAgICBzdHJlYW0uZW1pdChrRGVzdHJveSwgZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q29uc3RydWN0TlQsIHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBzdHJlYW0uX2NvbnN0cnVjdChvbkNvbnN0cnVjdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25Db25zdHJ1Y3QoZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0Q29uc3RydWN0TlQoc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KGtDb25zdHJ1Y3QpXG59XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gJiYgc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VMZWdhY3koc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZUxlZ2FjeShzdHJlYW0sIGVycikge1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG59XG5cbi8vIE5vcm1hbGl6ZSBkZXN0cm95IGZvciBsZWdhY3kuXG5mdW5jdGlvbiBkZXN0cm95ZXIoc3RyZWFtLCBlcnIpIHtcbiAgaWYgKCFzdHJlYW0gfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICghZXJyICYmICFpc0ZpbmlzaGVkKHN0cmVhbSkpIHtcbiAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gIH1cblxuICAvLyBUT0RPOiBSZW1vdmUgaXNSZXF1ZXN0IGJyYW5jaGVzLlxuICBpZiAoaXNTZXJ2ZXJSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAoaXNSZXF1ZXN0KHN0cmVhbS5yZXEpKSB7XG4gICAgc3RyZWFtLnJlcS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUT0RPOiBEb24ndCBsb3NlIGVycj9cbiAgICBzdHJlYW0uY2xvc2UoKVxuICB9IGVsc2UgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQ2xvc2VMZWdhY3ksIHN0cmVhbSwgZXJyKVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG4gIH1cbiAgaWYgKCFzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgc3RyZWFtW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29uc3RydWN0LFxuICBkZXN0cm95ZXIsXG4gIGRlc3Ryb3ksXG4gIHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3lcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFycmF5SXNBcnJheSwgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuZnVuY3Rpb24gU3RyZWFtKG9wdHMpIHtcbiAgRUUuY2FsbCh0aGlzLCBvcHRzKVxufVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLnByb3RvdHlwZSwgRUUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLCBFRSlcblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHRoaXNcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUgJiYgZGVzdC53cml0ZShjaHVuaykgPT09IGZhbHNlICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgc291cmNlLnBhdXNlKClcbiAgICB9XG4gIH1cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKVxuICB9XG4gIGxldCBkaWRPbkVuZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuXG4gICAgZGlkT25FbmQgPSB0cnVlXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm5cbiAgICBkaWRPbkVuZCA9IHRydWVcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KClcbiAgfVxuXG4gIC8vIERvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgfVxuICB9XG4gIHByZXBlbmRMaXN0ZW5lcihzb3VyY2UsICdlcnJvcicsIG9uZXJyb3IpXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cClcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKVxuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0XG59XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKVxuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pXG4gIGVsc2UgaWYgKEFycmF5SXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKVxuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3RyZWFtLFxuICBwcmVwZW5kTGlzdGVuZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFib3J0RXJyb3IsIGNvZGVzIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSB9ID0gY29kZXNcblxuLy8gVGhpcyBtZXRob2QgaXMgaW5saW5lZCBoZXJlIGZvciByZWFkYWJsZS1zdHJlYW1cbi8vIEl0IGFsc28gZG9lcyBub3QgYWxsb3cgZm9yIHNpZ25hbCB0byBub3QgZXhpc3Qgb24gdGhlIHN0cmVhbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzYwNjEjZGlzY3Vzc2lvbl9yNTMzNzE4MDI5XG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gKHNpZ25hbCwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnQWJvcnRTaWduYWwnLCBzaWduYWwpXG4gIH1cbn1cbmZ1bmN0aW9uIGlzTm9kZVN0cmVhbShvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicpXG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IGZ1bmN0aW9uIGFkZEFib3J0U2lnbmFsKHNpZ25hbCwgc3RyZWFtKSB7XG4gIHZhbGlkYXRlQWJvcnRTaWduYWwoc2lnbmFsLCAnc2lnbmFsJylcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ3N0cmVhbS5TdHJlYW0nLCBzdHJlYW0pXG4gIH1cbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZShzaWduYWwsIHN0cmVhbSlcbn1cbm1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZSA9IGZ1bmN0aW9uIChzaWduYWwsIHN0cmVhbSkge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5kZXN0cm95KFxuICAgICAgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBzaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIClcbiAgfVxuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBvbkFib3J0KClcbiAgfSBlbHNlIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KVxuICAgIGVvcyhzdHJlYW0sICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpKVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFN0cmluZ1Byb3RvdHlwZVNsaWNlLCBTeW1ib2xJdGVyYXRvciwgVHlwZWRBcnJheVByb3RvdHlwZVNldCwgVWludDhBcnJheSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaW5zcGVjdCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQnVmZmVyTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IG51bGxcbiAgICB0aGlzLnRhaWwgPSBudWxsXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cbiAgcHVzaCh2KSB7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhOiB2LFxuICAgICAgbmV4dDogbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeVxuICAgIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgKyt0aGlzLmxlbmd0aFxuICB9XG4gIHVuc2hpZnQodikge1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZGF0YTogdixcbiAgICAgIG5leHQ6IHRoaXMuaGVhZFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgdGhpcy5oZWFkID0gZW50cnlcbiAgICArK3RoaXMubGVuZ3RoXG4gIH1cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCByZXQgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgICAtLXRoaXMubGVuZ3RoXG4gICAgcmV0dXJuIHJldFxuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IHJldCA9ICcnICsgcC5kYXRhXG4gICAgd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbCkgcmV0ICs9IHMgKyBwLmRhdGFcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgICBjb25zdCByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMClcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChwKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgcC5kYXRhLCBpKVxuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoXG4gICAgICBwID0gcC5uZXh0XG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIGNvbnN1bWUobiwgaGFzU3RyaW5ncykge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmIChuIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICBjb25zdCBzbGljZSA9IGRhdGEuc2xpY2UoMCwgbilcbiAgICAgIHRoaXMuaGVhZC5kYXRhID0gZGF0YS5zbGljZShuKVxuICAgICAgcmV0dXJuIHNsaWNlXG4gICAgfVxuICAgIGlmIChuID09PSBkYXRhLmxlbmd0aCkge1xuICAgICAgLy8gRmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQoKVxuICAgIH1cbiAgICAvLyBSZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXIuXG4gICAgcmV0dXJuIGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobilcbiAgfVxuICBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGFcbiAgfVxuICAqW1N5bWJvbEl0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5oZWFkOyBwOyBwID0gcC5uZXh0KSB7XG4gICAgICB5aWVsZCBwLmRhdGFcbiAgICB9XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICBfZ2V0U3RyaW5nKG4pIHtcbiAgICBsZXQgcmV0ID0gJydcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ciA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgbiAtPSBzdHIubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgICArK2NcbiAgICAgICAgICBpZiAocC5uZXh0KSB0aGlzLmhlYWQgPSBwLm5leHRcbiAgICAgICAgICBlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgKz0gU3RyaW5nUHJvdG90eXBlU2xpY2Uoc3RyLCAwLCBuKVxuICAgICAgICAgIHRoaXMuaGVhZCA9IHBcbiAgICAgICAgICBwLmRhdGEgPSBTdHJpbmdQcm90b3R5cGVTbGljZShzdHIsIG4pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgICsrY1xuICAgIH0gd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbClcbiAgICB0aGlzLmxlbmd0aCAtPSBjXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIF9nZXRCdWZmZXIobikge1xuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGNvbnN0IHJldExlbiA9IG5cbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBidWYubGVuZ3RoKSB7XG4gICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBidWYsIHJldExlbiAtIG4pXG4gICAgICAgIG4gLT0gYnVmLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgYnVmLCByZXRMZW4gLSBuKVxuICAgICAgICAgICsrY1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dFxuICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIHJldExlbiAtIG4pXG4gICAgICAgICAgdGhpcy5oZWFkID0gcFxuICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICArK2NcbiAgICB9IHdoaWxlICgocCA9IHAubmV4dCkgIT09IG51bGwpXG4gICAgdGhpcy5sZW5ndGggLT0gY1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGUgbGlua2VkIGxpc3Qgb25seSBzaG93cyB0aGUgbWluaW1hbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24uXG4gIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXShfLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3QodGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICBkZXB0aDogMCxcbiAgICAgIC8vIEl0IHNob3VsZCBub3QgcmVjdXJzZS5cbiAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgfSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgTWF0aEZsb29yLCBOdW1iZXJJc0ludGVnZXIgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHtcbiAgcmV0dXJuIG9wdGlvbnMuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIDogaXNEdXBsZXggPyBvcHRpb25zW2R1cGxleEtleV0gOiBudWxsXG59XG5mdW5jdGlvbiBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayhvYmplY3RNb2RlKSB7XG4gIHJldHVybiBvYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjRcbn1cbmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsIG9wdGlvbnMsIGR1cGxleEtleSwgaXNEdXBsZXgpIHtcbiAgY29uc3QgaHdtID0gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSlcbiAgaWYgKGh3bSAhPSBudWxsKSB7XG4gICAgaWYgKCFOdW1iZXJJc0ludGVnZXIoaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICBjb25zdCBuYW1lID0gaXNEdXBsZXggPyBgb3B0aW9ucy4ke2R1cGxleEtleX1gIDogJ29wdGlvbnMuaGlnaFdhdGVyTWFyaydcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgaHdtKVxuICAgIH1cbiAgICByZXR1cm4gTWF0aEZsb29yKGh3bSlcbiAgfVxuXG4gIC8vIERlZmF1bHQgdmFsdWVcbiAgcmV0dXJuIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKHN0YXRlLm9iamVjdE1vZGUpXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0SGlnaFdhdGVyTWFyayxcbiAgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cblxuY29uc3QgeyBQcm9taXNlUHJvdG90eXBlVGhlbiwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sSXRlcmF0b3IgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfU1RSRUFNX05VTExfVkFMVUVTIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5mdW5jdGlvbiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cykge1xuICBsZXQgaXRlcmF0b3JcbiAgaWYgKHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycgfHwgaXRlcmFibGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKGl0ZXJhYmxlKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGxldCBpc0FzeW5jXG4gIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSkge1xuICAgIGlzQXN5bmMgPSB0cnVlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSgpXG4gIH0gZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sSXRlcmF0b3JdKSB7XG4gICAgaXNBc3luYyA9IGZhbHNlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xJdGVyYXRvcl0oKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnaXRlcmFibGUnLCBbJ0l0ZXJhYmxlJ10sIGl0ZXJhYmxlKVxuICB9XG4gIGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIGhpZ2hXYXRlck1hcms6IDEsXG4gICAgLy8gVE9ETyhyb25hZyk6IFdoYXQgb3B0aW9ucyBzaG91bGQgYmUgYWxsb3dlZD9cbiAgICAuLi5vcHRzXG4gIH0pXG5cbiAgLy8gRmxhZyB0byBwcm90ZWN0IGFnYWluc3QgX3JlYWRcbiAgLy8gYmVpbmcgY2FsbGVkIGJlZm9yZSBsYXN0IGl0ZXJhdGlvbiBjb21wbGV0aW9uLlxuICBsZXQgcmVhZGluZyA9IGZhbHNlXG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgIG5leHQoKVxuICAgIH1cbiAgfVxuICByZWFkYWJsZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnJvciwgY2IpIHtcbiAgICBQcm9taXNlUHJvdG90eXBlVGhlbihcbiAgICAgIGNsb3NlKGVycm9yKSxcbiAgICAgICgpID0+IHByb2Nlc3MubmV4dFRpY2soY2IsIGVycm9yKSxcbiAgICAgIC8vIG5leHRUaWNrIGlzIGhlcmUgaW4gY2FzZSBjYiB0aHJvd3NcbiAgICAgIChlKSA9PiBwcm9jZXNzLm5leHRUaWNrKGNiLCBlIHx8IGVycm9yKVxuICAgIClcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjbG9zZShlcnJvcikge1xuICAgIGNvbnN0IGhhZEVycm9yID0gZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBlcnJvciAhPT0gbnVsbFxuICAgIGNvbnN0IGhhc1Rocm93ID0gdHlwZW9mIGl0ZXJhdG9yLnRocm93ID09PSAnZnVuY3Rpb24nXG4gICAgaWYgKGhhZEVycm9yICYmIGhhc1Rocm93KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnJvcilcbiAgICAgIGF3YWl0IHZhbHVlXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICBhd2FpdCB2YWx1ZVxuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlzQXN5bmMgPyBhd2FpdCBpdGVyYXRvci5uZXh0KCkgOiBpdGVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICByZWFkYWJsZS5wdXNoKG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicgPyBhd2FpdCB2YWx1ZSA6IHZhbHVlXG4gICAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gICAgICAgICAgfSBlbHNlIGlmIChyZWFkYWJsZS5wdXNoKHJlcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlYWRhYmxlLmRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlYWRhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb21cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZUluZGV4T2YsXG4gIE51bWJlcklzSW50ZWdlcixcbiAgTnVtYmVySXNOYU4sXG4gIE51bWJlclBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZixcbiAgUHJvbWlzZSxcbiAgU2FmZVNldCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgeyBTdHJlYW0sIHByZXBlbmRMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9sZWdhY3knKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGFkZEFib3J0U2lnbmFsIH0gPSByZXF1aXJlKCcuL2FkZC1hYm9ydC1zaWduYWwnKVxuY29uc3QgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbmxldCBkZWJ1ZyA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmRlYnVnbG9nKCdzdHJlYW0nLCAoZm4pID0+IHtcbiAgZGVidWcgPSBmblxufSlcbmNvbnN0IEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2J1ZmZlcl9saXN0JylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gICAgRVJSX09VVF9PRl9SQU5HRSxcbiAgICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFxuICAgIEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlRcbiAgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3Qga1BhdXNlZCA9IFN5bWJvbCgna1BhdXNlZCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IGZyb20gPSByZXF1aXJlKCcuL2Zyb20nKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUucHJvdG90eXBlLCBTdHJlYW0ucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUsIFN0cmVhbSlcbmNvbnN0IG5vcCA9ICgpID0+IHt9XG5jb25zdCB7IGVycm9yT3JEZXN0cm95IH0gPSBkZXN0cm95SW1wbFxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheS5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KCkuXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5waXBlcyA9IFtdXG4gIHRoaXMuZmxvd2luZyA9IG51bGxcbiAgdGhpcy5lbmRlZCA9IGZhbHNlXG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlXG4gIHRoaXMucmVhZGluZyA9IGZhbHNlXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBXaGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZVxuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZVxuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlXG4gIHRoaXNba1BhdXNlZF0gPSBudWxsXG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW4uXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2VcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZVxuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKS5cbiAgdGhpcy5hdXRvRGVzdHJveSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuYXV0b0Rlc3Ryb3kgIT09IGZhbHNlXG5cbiAgLy8gSGFzIGl0IGJlZW4gZGVzdHJveWVkLlxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXJyb3JlZC4gV2hlbiB0cnVlIG5vIGZ1cnRoZXJcbiAgLy8gX3JlYWQgY2FsbHMsICdkYXRhJyBvciAncmVhZGFibGUnIGV2ZW50cyBzaG91bGQgb2NjdXIuIFRoaXMgaXMgbmVlZGVkXG4gIC8vIHNpbmNlIHdoZW4gYXV0b0Rlc3Ryb3kgaXMgZGlzYWJsZWQgd2UgbmVlZCBhIHdheSB0byB0ZWxsIHdoZXRoZXIgdGhlXG4gIC8vIHN0cmVhbSBoYXMgZmFpbGVkLlxuICB0aGlzLmVycm9yZWQgPSBudWxsXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZGVzdHJveWluZy5cbiAgdGhpcy5jbG9zZWQgPSBmYWxzZVxuXG4gIC8vIFRydWUgaWYgY2xvc2UgaGFzIGJlZW4gZW1pdHRlZCBvciB3b3VsZCBoYXZlIGJlZW4gZW1pdHRlZFxuICAvLyBkZXBlbmRpbmcgb24gZW1pdENsb3NlLlxuICB0aGlzLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gUmVmIHRoZSBwaXBlZCBkZXN0IHdoaWNoIHdlIG5lZWQgYSBkcmFpbiBldmVudCBvbiBpdFxuICAvLyB0eXBlOiBudWxsIHwgV3JpdGFibGUgfCBTZXQ8V3JpdGFibGU+LlxuICB0aGlzLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICB0aGlzLm11bHRpQXdhaXREcmFpbiA9IGZhbHNlXG5cbiAgLy8gSWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZC5cbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlXG4gIHRoaXMuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuICB0aGlzLmRlY29kZXIgPSBudWxsXG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKVxuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nXG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKVxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFJlYWRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41LlxuICBjb25zdCBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzLCBpc0R1cGxleClcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWlzRHVwbGV4KSBhZGRBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgdGhpcylcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzLCBvcHRpb25zKVxuICBkZXN0cm95SW1wbC5jb25zdHJ1Y3QodGhpcywgKCkgPT4ge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSkge1xuICAgICAgbWF5YmVSZWFkTW9yZSh0aGlzLCB0aGlzLl9yZWFkYWJsZVN0YXRlKVxuICAgIH1cbiAgfSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3lcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycilcbn1cblJlYWRhYmxlLnByb3RvdHlwZVtFRS5jYXB0dXJlUmVqZWN0aW9uU3ltYm9sXSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5kZXN0cm95KGVycilcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpXG59XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpLlxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgdHJ1ZSlcbn1cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuaylcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgbGV0IGVyclxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgICAgIGlmIChzdGF0ZS5lbmNvZGluZyAhPT0gZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQgJiYgc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgICAvLyBXaGVuIHVuc2hpZnRpbmcsIGlmIHN0YXRlLmVuY29kaW5nIGlzIHNldCwgd2UgaGF2ZSB0byBzYXZlXG4gICAgICAgICAgLy8gdGhlIHN0cmluZyBpbiB0aGUgQnVmZmVyTGlzdCB3aXRoIHRoZSBzdGF0ZSBlbmNvZGluZy5cbiAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZykudG9TdHJpbmcoc3RhdGUuZW5jb2RpbmcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgIT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdjaHVuaycsIFsnc3RyaW5nJywgJ0J1ZmZlcicsICdVaW50OEFycmF5J10sIGNodW5rKVxuICAgIH1cbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkpIHtcbiAgICBpZiAoYWRkVG9Gcm9udCkge1xuICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQoKSlcbiAgICAgIGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCB8fCBzdGF0ZS5lcnJvcmVkKSByZXR1cm4gZmFsc2VcbiAgICAgIGVsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRigpKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKVxuICAgICAgICBlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpXG4gIH1cblxuICAvLyBXZSBjYW4gcHVzaCBtb3JlIGRhdGEgaWYgd2UgYXJlIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLlxuICAvLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZSBtb3JlIGJ5dGVzLlxuICAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLCBzdWNoIGFzIHRoZSByZXBsLlxuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMClcbn1cbmZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBhZGRUb0Zyb250KSB7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYyAmJiBzdHJlYW0ubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIC8vIFVzZSB0aGUgZ3VhcmQgdG8gYXZvaWQgY3JlYXRpbmcgYFNldCgpYCByZXBlYXRlZGx5XG4gICAgLy8gd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHBpcGVzLlxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspXG4gIH0gZWxzZSB7XG4gICAgLy8gVXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGhcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspXG4gICAgZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuaylcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKVxuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIHJldHVybiBzdGF0ZVtrUGF1c2VkXSA9PT0gdHJ1ZSB8fCBzdGF0ZS5mbG93aW5nID09PSBmYWxzZVxufVxuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlclxuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZ1xuICBjb25zdCBidWZmZXIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlclxuICAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuICBsZXQgY29udGVudCA9ICcnXG4gIGZvciAoY29uc3QgZGF0YSBvZiBidWZmZXIpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUoZGF0YSlcbiAgfVxuICBidWZmZXIuY2xlYXIoKVxuICBpZiAoY29udGVudCAhPT0gJycpIGJ1ZmZlci5wdXNoKGNvbnRlbnQpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gY29udGVudC5sZW5ndGhcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDFHQi5cbmNvbnN0IE1BWF9IV00gPSAweDQwMDAwMDAwXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID4gTUFYX0hXTSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKCdzaXplJywgJzw9IDFHaUInLCBuKVxuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50cy5cbiAgICBuLS1cbiAgICBuIHw9IG4gPj4+IDFcbiAgICBuIHw9IG4gPj4+IDJcbiAgICBuIHw9IG4gPj4+IDRcbiAgICBuIHw9IG4gPj4+IDhcbiAgICBuIHw9IG4gPj4+IDE2XG4gICAgbisrXG4gIH1cbiAgcmV0dXJuIG5cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkpIHJldHVybiAwXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMVxuICBpZiAoTnVtYmVySXNOYU4obikpIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWUuXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmZpcnN0KCkubGVuZ3RoXG4gICAgcmV0dXJuIHN0YXRlLmxlbmd0aFxuICB9XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG5cbiAgcmV0dXJuIHN0YXRlLmVuZGVkID8gc3RhdGUubGVuZ3RoIDogMFxufVxuXG4vLyBZb3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pXG4gIC8vIFNhbWUgYXMgcGFyc2VJbnQodW5kZWZpbmVkLCAxMCksIGhvd2V2ZXIgVjggNy4zIHBlcmZvcm1hbmNlIHJlZ3Jlc3NlZFxuICAvLyBpbiB0aGlzIHNjZW5hcmlvLCBzbyB3ZSBhcmUgZG9pbmcgaXQgbWFudWFsbHkuXG4gIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICBuID0gTmFOXG4gIH0gZWxzZSBpZiAoIU51bWJlcklzSW50ZWdlcihuKSkge1xuICAgIG4gPSBOdW1iZXJQYXJzZUludChuLCAxMClcbiAgfVxuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgbk9yaWcgPSBuXG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuXG4gIC8vIElmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKFxuICAgIG4gPT09IDAgJiZcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAoKHN0YXRlLmhpZ2hXYXRlck1hcmsgIT09IDAgPyBzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayA6IHN0YXRlLmxlbmd0aCA+IDApIHx8IHN0YXRlLmVuZGVkKVxuICApIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKVxuICAgIGVsc2UgZW1pdFJlYWRhYmxlKHRoaXMpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSlcblxuICAvLyBJZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcylcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIGxldCBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGVcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpXG5cbiAgLy8gSWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZVxuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZClcbiAgfVxuXG4gIC8vIEhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LCBpZiB3ZSdyZSBjb25zdHJ1Y3Rpbmcgd2UgaGF2ZSB0byB3YWl0LFxuICAvLyBhbmQgaWYgd2UncmUgZGVzdHJveWVkIG9yIGVycm9yZWQsIHRoZW4gaXQncyBub3QgYWxsb3dlZCxcbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgZG9SZWFkID0gZmFsc2VcbiAgICBkZWJ1ZygncmVhZGluZywgZW5kZWQgb3IgY29uc3RydWN0aW5nJywgZG9SZWFkKVxuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJylcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgLy8gSWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlXG5cbiAgICAvLyBDYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIGVycilcbiAgICB9XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpXG4gIH1cbiAgbGV0IHJldFxuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKVxuICBlbHNlIHJldCA9IG51bGxcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgbiA9IDBcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gblxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcylcbiAgfVxuICBpZiAocmV0ICE9PSBudWxsICYmICFzdGF0ZS5lcnJvckVtaXR0ZWQgJiYgIXN0YXRlLmNsb3NlRW1pdHRlZCkge1xuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ29uRW9mQ2h1bmsnKVxuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVyblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIGNvbnN0IGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKVxuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKVxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZVxuICBpZiAoc3RhdGUuc3luYykge1xuICAgIC8vIElmIHdlIGFyZSBzeW5jLCB3YWl0IHVudGlsIG5leHQgdGljayB0byBlbWl0IHRoZSBkYXRhLlxuICAgIC8vIE90aGVyd2lzZSB3ZSByaXNrIGVtaXR0aW5nIGRhdGEgaW4gdGhlIGZsb3coKVxuICAgIC8vIHRoZSByZWFkYWJsZSBjb2RlIHRyaWdnZXJzIGR1cmluZyBhIHJlYWQoKSBjYWxsLlxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2VcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlXG4gICAgLy8gV2UgaGF2ZSB0byBlbWl0IHJlYWRhYmxlIG5vdyB0aGF0IHdlIGFyZSBFT0YuIE1vZHVsZXNcbiAgICAvLyBpbiB0aGUgZWNvc3lzdGVtIChlLmcuIGRpY2VyKSByZWx5IG9uIHRoaXMgZXZlbnQgYmVpbmcgc3luYy5cbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSlcbiAgfVxufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlXG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlXycsIHN0YXRlLmRlc3Ryb3llZCwgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgIXN0YXRlLmVycm9yZWQgJiYgKHN0YXRlLmxlbmd0aCB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIH1cblxuICAvLyBUaGUgc3RyZWFtIG5lZWRzIGFub3RoZXIgcmVhZGFibGUgZXZlbnQgaWY6XG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgZmxvdyhzdHJlYW0pXG59XG5cbi8vIEF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUgJiYgc3RhdGUuY29uc3RydWN0ZWQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIC8vIEF0dGVtcHQgdG8gcmVhZCBtb3JlIGRhdGEgaWYgd2Ugc2hvdWxkLlxuICAvL1xuICAvLyBUaGUgY29uZGl0aW9ucyBmb3IgcmVhZGluZyBtb3JlIGRhdGEgYXJlIChvbmUgb2YpOlxuICAvLyAtIE5vdCBlbm91Z2ggZGF0YSBidWZmZXJlZCAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykuIFRoZSBsb29wXG4gIC8vICAgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlciB3aXRoIGVub3VnaCBkYXRhIGlmIHN1Y2ggZGF0YVxuICAvLyAgIGlzIGF2YWlsYWJsZS4gSWYgaGlnaFdhdGVyTWFyayBpcyAwIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBmbG93aW5nIG1vZGVcbiAgLy8gICB3ZSBzaG91bGQgX25vdF8gYXR0ZW1wdCB0byBidWZmZXIgYW55IGV4dHJhIGRhdGEuIFdlJ2xsIGdldCBtb3JlIGRhdGFcbiAgLy8gICB3aGVuIHRoZSBzdHJlYW0gY29uc3VtZXIgY2FsbHMgcmVhZCgpIGluc3RlYWQuXG4gIC8vIC0gTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUuIEluIHRoaXMgbW9kZVxuICAvLyAgIHRoZSBsb29wIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyByZWFkKCkgaXMgY2FsbGVkLiBGYWlsaW5nIHRvXG4gIC8vICAgY2FsbCByZWFkIGhlcmUgd291bGQgYWJvcnQgdGhlIGZsb3cgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgbWVjaGFuaXNtIGZvclxuICAvLyAgIGNvbnRpbnVpbmcgdGhlIGZsb3cgaWYgdGhlIHN0cmVhbSBjb25zdW1lciBoYXMganVzdCBzdWJzY3JpYmVkIHRvIHRoZVxuICAvLyAgICdkYXRhJyBldmVudC5cbiAgLy9cbiAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGNvbmRpdGlvbnMgdG8ga2VlcCByZWFkaW5nIGRhdGEsIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgcmVhZDpcbiAgLy8gLSBUaGUgc3RyZWFtIGhhcyBlbmRlZCAoc3RhdGUuZW5kZWQpLlxuICAvLyAtIFRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nICdyZWFkJyBvcGVyYXRpb24gKHN0YXRlLnJlYWRpbmcpLiBUaGlzIGlzIGFcbiAgLy8gICBjYXNlIHdoZXJlIHRoZSBzdHJlYW0gaGFzIGNhbGxlZCB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBfcmVhZCgpXG4gIC8vICAgbWV0aG9kLCBidXQgdGhleSBhcmUgcHJvY2Vzc2luZyB0aGUgY2FsbCBhc3luY2hyb25vdXNseSBhbmQgaGF2ZSBfbm90X1xuICAvLyAgIGNhbGxlZCBwdXNoKCkgd2l0aCBuZXcgZGF0YS4gSW4gdGhpcyBjYXNlIHdlIHNraXAgcGVyZm9ybWluZyBtb3JlXG4gIC8vICAgcmVhZCgpcy4gVGhlIGV4ZWN1dGlvbiBlbmRzIGluIHRoaXMgbWV0aG9kIGFnYWluIGFmdGVyIHRoZSBfcmVhZCgpIGVuZHNcbiAgLy8gICB1cCBjYWxsaW5nIHB1c2goKSB3aXRoIG1vcmUgZGF0YS5cbiAgd2hpbGUgKFxuICAgICFzdGF0ZS5yZWFkaW5nICYmXG4gICAgIXN0YXRlLmVuZGVkICYmXG4gICAgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSlcbiAgKSB7XG4gICAgY29uc3QgbGVuID0gc3RhdGUubGVuZ3RoXG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJylcbiAgICBzdHJlYW0ucmVhZCgwKVxuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIERpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVha1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2Vcbn1cblxuLy8gQWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ19yZWFkKCknKVxufVxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgY29uc3Qgc3JjID0gdGhpc1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICghc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBzdGF0ZS5tdWx0aUF3YWl0RHJhaW4gPSB0cnVlXG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG5ldyBTYWZlU2V0KHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID8gW3N0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzXSA6IFtdKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpXG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlcy5sZW5ndGgsIHBpcGVPcHRzKVxuICBjb25zdCBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnJcbiAgY29uc3QgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlXG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKVxuICBlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbilcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpXG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJylcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlXG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKVxuICAgIGRlc3QuZW5kKClcbiAgfVxuICBsZXQgb25kcmFpblxuICBsZXQgY2xlYW5lZFVwID0gZmFsc2VcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpXG4gICAgLy8gQ2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlbi5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKVxuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGNsZWFuZWRVcCA9IHRydWVcblxuICAgIC8vIElmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKG9uZHJhaW4gJiYgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpXG4gIH1cbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgIGlmICghY2xlYW5lZFVwKSB7XG4gICAgICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAxICYmIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0KSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCAwKVxuICAgICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IGRlc3RcbiAgICAgICAgc3RhdGUubXVsdGlBd2FpdERyYWluID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID4gMSAmJiBzdGF0ZS5waXBlcy5pbmNsdWRlcyhkZXN0KSkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuc2l6ZSlcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuYWRkKGRlc3QpXG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKVxuICAgIH1cbiAgICBpZiAoIW9uZHJhaW4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgICAgIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAgICAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgICAgIC8vIHRvbyBzbG93LlxuICAgICAgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYywgZGVzdClcbiAgICAgIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gIH1cbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJylcbiAgICBjb25zdCByZXQgPSBkZXN0LndyaXRlKGNodW5rKVxuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KVxuICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIEhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpXG4gICAgdW5waXBlKClcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgaWYgKGRlc3QubGlzdGVuZXJDb3VudCgnZXJyb3InKSA9PT0gMCkge1xuICAgICAgY29uc3QgcyA9IGRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKHMgJiYgIXMuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIC8vIFVzZXIgaW5jb3JyZWN0bHkgZW1pdHRlZCAnZXJyb3InIGRpcmVjdGx5IG9uIHRoZSBzdHJlYW0uXG4gICAgICAgIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpXG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKVxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJylcbiAgICBzcmMudW5waXBlKGRlc3QpXG4gIH1cblxuICAvLyBUZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0by5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKVxuXG4gIC8vIFN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblxuICBpZiAoZGVzdC53cml0YWJsZU5lZWREcmFpbiA9PT0gdHJ1ZSkge1xuICAgIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJylcbiAgICBzcmMucmVzdW1lKClcbiAgfVxuICByZXR1cm4gZGVzdFxufVxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjLCBkZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCkge1xuICAgIGNvbnN0IHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlXG5cbiAgICAvLyBgb25kcmFpbmAgd2lsbCBjYWxsIGRpcmVjdGx5LFxuICAgIC8vIGB0aGlzYCBtYXliZSBub3QgYSByZWZlcmVuY2UgdG8gZGVzdCxcbiAgICAvLyBzbyB3ZSB1c2UgdGhlIHJlYWwgZGVzdCBoZXJlLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9PT0gZGVzdCkge1xuICAgICAgZGVidWcoJ3BpcGVPbkRyYWluJywgMSlcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplKVxuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuZGVsZXRlKGRlc3QpXG4gICAgfVxuICAgIGlmICgoIXN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzIHx8IHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLnNpemUgPT09IDApICYmIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykpIHtcbiAgICAgIHNyYy5yZXN1bWUoKVxuICAgIH1cbiAgfVxufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH1cblxuICAvLyBJZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgY29uc3QgZGVzdHMgPSBzdGF0ZS5waXBlc1xuICAgIHN0YXRlLnBpcGVzID0gW11cbiAgICB0aGlzLnBhdXNlKClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3RzLmxlbmd0aDsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywge1xuICAgICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgY29uc3QgaW5kZXggPSBBcnJheVByb3RvdHlwZUluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpXG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSlcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5wYXVzZSgpXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gU2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmcuXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIGNvbnN0IHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFVwZGF0ZSByZWFkYWJsZUxpc3RlbmluZyBzbyB0aGF0IHJlc3VtZSgpIG1heSBiZSBhIG5vLW9wXG4gICAgLy8gYSBmZXcgbGluZXMgZG93bi4gVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScpLlxuICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuXG4gICAgLy8gVHJ5IHN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZC5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKClcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuICAgICAgZGVidWcoJ29uIHJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5yZWFkaW5nKVxuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcylcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub25cblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbilcbiAgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuUmVhZGFibGUucHJvdG90eXBlLm9mZiA9IFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lclxuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICBjb25zdCBzdGF0ZSA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzZWxmLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwXG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgc3RhdGVba1BhdXNlZF0gPT09IGZhbHNlKSB7XG4gICAgLy8gRmxvd2luZyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBub3csIG90aGVyd2lzZVxuICAgIC8vIHRoZSB1cGNvbWluZyByZXN1bWUgd2lsbCBub3QgZmxvdy5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZVxuXG4gICAgLy8gQ3J1ZGUgd2F5IHRvIGNoZWNrIGlmIHdlIHNob3VsZCByZXN1bWUuXG4gIH0gZWxzZSBpZiAoc2VsZi5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgc2VsZi5yZXN1bWUoKVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgIHN0YXRlLmZsb3dpbmcgPSBudWxsXG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJylcbiAgc2VsZi5yZWFkKDApXG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJylcbiAgICAvLyBXZSBmbG93IG9ubHkgaWYgdGhlcmUgaXMgbm8gb25lIGxpc3RlbmluZ1xuICAgIC8vIGZvciByZWFkYWJsZSwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gY2FsbFxuICAgIC8vIHJlc3VtZSgpLlxuICAgIHN0YXRlLmZsb3dpbmcgPSAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmdcbiAgICByZXN1bWUodGhpcywgc3RhdGUpXG4gIH1cbiAgc3RhdGVba1BhdXNlZF0gPSBmYWxzZVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpXG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIHN0cmVhbS5yZWFkKDApXG4gIH1cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2VcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gIGZsb3coc3RyZWFtKVxuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMClcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHtcbiAgICBkZWJ1ZygncGF1c2UnKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdwYXVzZScpXG4gIH1cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZVtrUGF1c2VkXSA9IHRydWVcbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZylcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCk7XG59XG5cbi8vIFdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBsZXQgcGF1c2VkID0gZmFsc2VcblxuICAvLyBUT0RPIChyb25hZyk6IFNob3VsZCB0aGlzLmRlc3Ryb3koZXJyKSBlbWl0XG4gIC8vICdlcnJvcicgb24gdGhlIHdyYXBwZWQgc3RyZWFtPyBXb3VsZCByZXF1aXJlXG4gIC8vIGEgc3RhdGljIGZhY3RvcnkgbWV0aG9kLCBlLmcuIFJlYWRhYmxlLndyYXAoc3RyZWFtKS5cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAoIXRoaXMucHVzaChjaHVuaykgJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgdGhpcy5wdXNoKG51bGwpXG4gIH0pXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgZXJyb3JPckRlc3Ryb3kodGhpcywgZXJyKVxuICB9KVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gIH0pXG4gIHN0cmVhbS5vbignZGVzdHJveScsICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICB9KVxuICB0aGlzLl9yZWFkID0gKCkgPT4ge1xuICAgIGlmIChwYXVzZWQgJiYgc3RyZWFtLnJlc3VtZSkge1xuICAgICAgcGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy4gSW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGNvbnN0IHN0cmVhbUtleXMgPSBPYmplY3RLZXlzKHN0cmVhbSlcbiAgZm9yIChsZXQgaiA9IDE7IGogPCBzdHJlYW1LZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgY29uc3QgaSA9IHN0cmVhbUtleXNbal1cbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBzdHJlYW1baV0uYmluZChzdHJlYW0pXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5SZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sQXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBzdHJlYW1Ub0FzeW5jSXRlcmF0b3IodGhpcylcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVRvQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zKVxufVxuZnVuY3Rpb24gc3RyZWFtVG9Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHN0cmVhbS5yZWFkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtID0gUmVhZGFibGUud3JhcChzdHJlYW0sIHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICB9KVxuICB9XG4gIGNvbnN0IGl0ZXIgPSBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucylcbiAgaXRlci5zdHJlYW0gPSBzdHJlYW1cbiAgcmV0dXJuIGl0ZXJcbn1cbmFzeW5jIGZ1bmN0aW9uKiBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBsZXQgY2FsbGJhY2sgPSBub3BcbiAgZnVuY3Rpb24gbmV4dChyZXNvbHZlKSB7XG4gICAgaWYgKHRoaXMgPT09IHN0cmVhbSkge1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgY2FsbGJhY2sgPSBub3BcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSByZXNvbHZlXG4gICAgfVxuICB9XG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBuZXh0KVxuICBsZXQgZXJyb3JcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBlcnJvciA9IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IG51bGxcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGNhbGxiYWNrID0gbm9wXG4gICAgfVxuICApXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gc3RyZWFtLmRlc3Ryb3llZCA/IG51bGwgOiBzdHJlYW0ucmVhZCgpXG4gICAgICBpZiAoY2h1bmsgIT09IG51bGwpIHtcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShuZXh0KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3IgPSBhZ2dyZWdhdGVUd29FcnJvcnMoZXJyb3IsIGVycilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIGlmIChcbiAgICAgIChlcnJvciB8fCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmRlc3Ryb3lPblJldHVybikgIT09IGZhbHNlKSAmJlxuICAgICAgKGVycm9yID09PSB1bmRlZmluZWQgfHwgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuICAgICkge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9mZigncmVhZGFibGUnLCBuZXh0KVxuICAgICAgY2xlYW51cCgpXG4gICAgfVxuICB9XG59XG5cbi8vIE1ha2luZyBpdCBleHBsaWNpdCB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgZW51bWVyYWJsZVxuLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4vLyB1c2VybGFuZCB3aWxsIGZhaWwuXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlLnByb3RvdHlwZSwge1xuICByZWFkYWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICAgICAgLy8gci5yZWFkYWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgcmVhZGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgcmVhZGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXIgJiYgci5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgIXIuZGVzdHJveWVkICYmICFyLmVycm9yRW1pdHRlZCAmJiAhci5lbmRFbWl0dGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9ICEhdmFsXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZWFkYWJsZURpZFJlYWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkXG4gICAgICApXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUhpZ2hXYXRlck1hcms6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUZsb3dpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlRW5jb2Rpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuICAgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkIDogZmFsc2VcbiAgICB9XG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RhdGUucHJvdG90eXBlLCB7XG4gIC8vIExlZ2FjeSBnZXR0ZXIgZm9yIGBwaXBlc0NvdW50YC5cbiAgcGlwZXNDb3VudDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5waXBlcy5sZW5ndGhcbiAgICB9XG4gIH0sXG4gIC8vIExlZ2FjeSBwcm9wZXJ0eSBmb3IgYHBhdXNlZGAuXG4gIHBhdXNlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1trUGF1c2VkXSAhPT0gZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgdGhpc1trUGF1c2VkXSA9ICEhdmFsdWVcbiAgICB9XG4gIH1cbn0pXG5cbi8vIEV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWQuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gIGxldCByZXRcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpXG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gUmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0LlxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJylcbiAgICBlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKVxuICAgIGVsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKClcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdC5cbiAgICByZXQgPSBzdGF0ZS5idWZmZXIuY29uc3VtZShuLCBzdGF0ZS5kZWNvZGVyKVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKVxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pXG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aClcblxuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5jbG9zZUVtaXR0ZWQgJiYgIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICBpZiAoc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRXcml0YWJsZU5ULCBzdHJlYW0pXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgICAgLy8gaWYgdGhlIHdyaXRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICAgIXdTdGF0ZSB8fFxuICAgICAgICAod1N0YXRlLmF1dG9EZXN0cm95ICYmXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSB3cml0YWJsZSB0byBldmVyICdmaW5pc2gnXG4gICAgICAgICAgLy8gaWYgd3JpdGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgKHdTdGF0ZS5maW5pc2hlZCB8fCB3U3RhdGUud3JpdGFibGUgPT09IGZhbHNlKSlcbiAgICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZU5UKHN0cmVhbSkge1xuICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS53cml0YWJsZSAmJiAhc3RyZWFtLndyaXRhYmxlRW5kZWQgJiYgIXN0cmVhbS5kZXN0cm95ZWRcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgc3RyZWFtLmVuZCgpXG4gIH1cbn1cblJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cblJlYWRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtUmVhZGFibGVGcm9tUmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5SZWFkYWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdSZWFkYWJsZVN0cmVhbUZyb21TdHJlYW1SZWFkYWJsZShzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucylcbn1cblJlYWRhYmxlLndyYXAgPSBmdW5jdGlvbiAoc3JjLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgb2JqZWN0TW9kZTpcbiAgICAgIChfcmVmID1cbiAgICAgICAgKF9zcmMkcmVhZGFibGVPYmplY3RNbyA9IHNyYy5yZWFkYWJsZU9iamVjdE1vZGUpICE9PSBudWxsICYmIF9zcmMkcmVhZGFibGVPYmplY3RNbyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgICAgICAgICA6IHNyYy5vYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmXG4gICAgICAgIDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRlc3Ryb3koZXJyLCBjYWxsYmFjaykge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHNyYywgZXJyKVxuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH1cbiAgfSkud3JhcChzcmMpXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZVNsaWNlLFxuICBFcnJvcixcbiAgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZSxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHksXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMsXG4gIE9iamVjdFNldFByb3RvdHlwZU9mLFxuICBTdHJpbmdQcm90b3R5cGVUb0xvd2VyQ2FzZSxcbiAgU3ltYm9sLFxuICBTeW1ib2xIYXNJbnN0YW5jZVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZVxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGVcbmNvbnN0IHsgRXZlbnRFbWl0dGVyOiBFRSB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUoJy4vbGVnYWN5JykuU3RyZWFtXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgYWRkQWJvcnRTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWRkLWFib3J0LXNpZ25hbCcpXG5jb25zdCB7IGdldEhpZ2hXYXRlck1hcmssIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbmNvbnN0IHtcbiAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICBFUlJfTVVMVElQTEVfQ0FMTEJBQ0ssXG4gIEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVELFxuICBFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsXG4gIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElOR1xufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmNvbnN0IHsgZXJyb3JPckRlc3Ryb3kgfSA9IGRlc3Ryb3lJbXBsXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZS5wcm90b3R5cGUsIFN0cmVhbS5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZSwgU3RyZWFtKVxuZnVuY3Rpb24gbm9wKCkge31cbmNvbnN0IGtPbkZpbmlzaGVkID0gU3ltYm9sKCdrT25GaW5pc2hlZCcpXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0sXG4gIC8vIGUuZy4gb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUgdnMuIG9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlLCBldGMuXG4gIGlmICh0eXBlb2YgaXNEdXBsZXggIT09ICdib29sZWFuJykgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG5cbiAgLy8gT2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWQuXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZVxuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2VcbiAgLy8gQXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZVxuICAvLyBXaGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkLlxuICB0aGlzLmVuZGVkID0gZmFsc2VcbiAgLy8gV2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkLlxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBIYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgY29uc3Qgbm9EZWNvZGUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2UpXG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZVxuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpIHx8ICd1dGY4J1xuXG4gIC8vIE5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMFxuXG4gIC8vIEEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlXG5cbiAgLy8gV2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbC5cbiAgdGhpcy5jb3JrZWQgPSAwXG5cbiAgLy8gQSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxuXG4gIC8vIFRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuaywgY2IpLlxuICB0aGlzLm9ud3JpdGUgPSBvbndyaXRlLmJpbmQodW5kZWZpbmVkLCBzdHJlYW0pXG5cbiAgLy8gVGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikuXG4gIHRoaXMud3JpdGVjYiA9IG51bGxcblxuICAvLyBUaGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwXG5cbiAgLy8gU3RvcmFnZSBmb3IgZGF0YSBwYXNzZWQgdG8gdGhlIGFmdGVyV3JpdGUoKSBjYWxsYmFjayBpbiBjYXNlIG9mXG4gIC8vIHN5bmNocm9ub3VzIF93cml0ZSgpIGNvbXBsZXRpb24uXG4gIHRoaXMuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXNldEJ1ZmZlcih0aGlzKVxuXG4gIC8vIE51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZC5cbiAgdGhpcy5wZW5kaW5nY2IgPSAwXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBFbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zLlxuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2Fpbi5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlXG5cbiAgLy8gU2hvdWxkIC5kZXN0cm95KCkgYmUgY2FsbGVkIGFmdGVyICdmaW5pc2gnIChhbmQgcG90ZW50aWFsbHkgJ2VuZCcpLlxuICB0aGlzLmF1dG9EZXN0cm95ID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5hdXRvRGVzdHJveSAhPT0gZmFsc2VcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBlcnJvcmVkLiBXaGVuIHRydWUgYWxsIHdyaXRlKCkgY2FsbHNcbiAgLy8gc2hvdWxkIHJldHVybiBmYWxzZS4gVGhpcyBpcyBuZWVkZWQgc2luY2Ugd2hlbiBhdXRvRGVzdHJveVxuICAvLyBpcyBkaXNhYmxlZCB3ZSBuZWVkIGEgd2F5IHRvIHRlbGwgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmYWlsZWQuXG4gIHRoaXMuZXJyb3JlZCA9IG51bGxcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBkZXN0cm95aW5nLlxuICB0aGlzLmNsb3NlZCA9IGZhbHNlXG5cbiAgLy8gVHJ1ZSBpZiBjbG9zZSBoYXMgYmVlbiBlbWl0dGVkIG9yIHdvdWxkIGhhdmUgYmVlbiBlbWl0dGVkXG4gIC8vIGRlcGVuZGluZyBvbiBlbWl0Q2xvc2UuXG4gIHRoaXMuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgdGhpc1trT25GaW5pc2hlZF0gPSBbXVxufVxuZnVuY3Rpb24gcmVzZXRCdWZmZXIoc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyZWQgPSBbXVxuICBzdGF0ZS5idWZmZXJlZEluZGV4ID0gMFxuICBzdGF0ZS5hbGxCdWZmZXJzID0gdHJ1ZVxuICBzdGF0ZS5hbGxOb29wID0gdHJ1ZVxufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICByZXR1cm4gQXJyYXlQcm90b3R5cGVTbGljZSh0aGlzLmJ1ZmZlcmVkLCB0aGlzLmJ1ZmZlcmVkSW5kZXgpXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcmVkUmVxdWVzdENvdW50Jywge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJlZC5sZW5ndGggLSB0aGlzLmJ1ZmZlcmVkSW5kZXhcbiAgfVxufSlcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjUuXG4gIGNvbnN0IGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcbiAgaWYgKCFpc0R1cGxleCAmJiAhRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZShXcml0YWJsZSwgdGhpcykpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucylcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXZcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwpIGFkZEFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCB0aGlzKVxuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGRlc3Ryb3lJbXBsLmNvbnN0cnVjdCh0aGlzLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSB7XG4gICAgICBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgICB9XG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUpXG4gIH0pXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sSGFzSW5zdGFuY2UsIHtcbiAgX19wcm90b19fOiBudWxsLFxuICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIGlmIChGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlXG4gICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGVcbiAgfVxufSlcblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFKCkpXG59XG5mdW5jdGlvbiBfd3JpdGUoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZ1xuICAgIGVsc2UgaWYgKGVuY29kaW5nICE9PSAnYnVmZmVyJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3BcbiAgfVxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gIH0gZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspXG4gICAgfVxuICB9XG4gIGxldCBlcnJcbiAgaWYgKHN0YXRlLmVuZGluZykge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpXG4gIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpXG4gIH1cbiAgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVycilcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICByZXR1cm4gZXJyXG4gIH1cbiAgc3RhdGUucGVuZGluZ2NiKytcbiAgcmV0dXJuIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYilcbn1cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHJldHVybiBfd3JpdGUodGhpcywgY2h1bmssIGVuY29kaW5nLCBjYikgPT09IHRydWVcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrXG59XG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgfVxufVxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2UoZW5jb2RpbmcpXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2RpbmdcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICBzdGF0ZS5sZW5ndGggKz0gbGVuXG5cbiAgLy8gc3RyZWFtLl93cml0ZSByZXNldHMgc3RhdGUubGVuZ3RoXG4gIGNvbnN0IHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCB8fCBzdGF0ZS5lcnJvcmVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHN0YXRlLmJ1ZmZlcmVkLnB1c2goe1xuICAgICAgY2h1bmssXG4gICAgICBlbmNvZGluZyxcbiAgICAgIGNhbGxiYWNrXG4gICAgfSlcbiAgICBpZiAoc3RhdGUuYWxsQnVmZmVycyAmJiBlbmNvZGluZyAhPT0gJ2J1ZmZlcicpIHtcbiAgICAgIHN0YXRlLmFsbEJ1ZmZlcnMgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhdGUuYWxsTm9vcCAmJiBjYWxsYmFjayAhPT0gbm9wKSB7XG4gICAgICBzdGF0ZS5hbGxOb29wID0gZmFsc2VcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUud3JpdGVsZW4gPSBsZW5cbiAgICBzdGF0ZS53cml0ZWNiID0gY2FsbGJhY2tcbiAgICBzdGF0ZS53cml0aW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gIH1cblxuICAvLyBSZXR1cm4gZmFsc2UgaWYgZXJyb3JlZCBvciBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYnJlYWtcbiAgLy8gYW55IHN5bmNocm9ub3VzIHdoaWxlKHN0cmVhbS53cml0ZShkYXRhKSkgbG9vcHMuXG4gIHJldHVybiByZXQgJiYgIXN0YXRlLmVycm9yZWQgJiYgIXN0YXRlLmRlc3Ryb3llZFxufVxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlblxuICBzdGF0ZS53cml0ZWNiID0gY2JcbiAgc3RhdGUud3JpdGluZyA9IHRydWVcbiAgc3RhdGUuc3luYyA9IHRydWVcbiAgaWYgKHN0YXRlLmRlc3Ryb3llZCkgc3RhdGUub253cml0ZShuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJykpXG4gIGVsc2UgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpXG4gIGVsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gIHN0YXRlLnN5bmMgPSBmYWxzZVxufVxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYlxuICBjYihlcilcbiAgLy8gRW5zdXJlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBldmVuIHdoZW4gYXV0b0Rlc3Ryb3kgaXNcbiAgLy8gbm90IGVuYWJsZWQuIFBhc3NpbmcgYGVyYCBoZXJlIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZVxuICAvLyBpdCdzIHJlbGF0ZWQgdG8gb25lIHNwZWNpZmljIHdyaXRlLCBub3QgdG8gdGhlIGJ1ZmZlcmVkXG4gIC8vIHdyaXRlcy5cbiAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIC8vIFRoaXMgY2FuIGVtaXQgZXJyb3IsIGJ1dCBlcnJvciBtdXN0IGFsd2F5cyBmb2xsb3cgY2IuXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpXG59XG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3Qgc3luYyA9IHN0YXRlLnN5bmNcbiAgY29uc3QgY2IgPSBzdGF0ZS53cml0ZWNiXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSlcbiAgICByZXR1cm5cbiAgfVxuICBzdGF0ZS53cml0aW5nID0gZmFsc2VcbiAgc3RhdGUud3JpdGVjYiA9IG51bGxcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuXG4gIHN0YXRlLndyaXRlbGVuID0gMFxuICBpZiAoZXIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICghc3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RhdGUuZXJyb3JlZCA9IGVyXG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcmVhZGFibGUgc2lkZSBvZiB0aGVcbiAgICAvLyBlcnJvci5cbiAgICBpZiAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmICFzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVycm9yZWQgPSBlclxuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbndyaXRlRXJyb3IsIHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9IGVsc2Uge1xuICAgICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA+IHN0YXRlLmJ1ZmZlcmVkSW5kZXgpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvLyBJdCBpcyBhIGNvbW1vbiBjYXNlIHRoYXQgdGhlIGNhbGxiYWNrIHBhc3NlZCB0byAud3JpdGUoKSBpcyBhbHdheXNcbiAgICAgIC8vIHRoZSBzYW1lLiBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCBzY2hlZHVsZSBhIG5ldyBuZXh0VGljaygpLCBidXRcbiAgICAgIC8vIHJhdGhlciBqdXN0IGluY3JlYXNlIGEgY291bnRlciwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgYXZvaWRcbiAgICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy5cbiAgICAgIGlmIChzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gIT09IG51bGwgJiYgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvLmNiID09PSBjYikge1xuICAgICAgICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8uY291bnQrK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0ge1xuICAgICAgICAgIGNvdW50OiAxLFxuICAgICAgICAgIGNiLFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZVRpY2ssIHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mbylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCAxLCBjYilcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGVUaWNrKHsgc3RyZWFtLCBzdGF0ZSwgY291bnQsIGNiIH0pIHtcbiAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXR1cm4gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBjb3VudCwgY2IpXG59XG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGNvdW50LCBjYikge1xuICBjb25zdCBuZWVkRHJhaW4gPSAhc3RhdGUuZW5kaW5nICYmICFzdHJlYW0uZGVzdHJveWVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW5cbiAgaWYgKG5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlXG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLVxuICAgIGNiKClcbiAgfVxuICBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIH1cbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSlcbn1cblxuLy8gSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIGludm9rZSBjYWxsYmFja3MuXG5mdW5jdGlvbiBlcnJvckJ1ZmZlcihzdGF0ZSkge1xuICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAobGV0IG4gPSBzdGF0ZS5idWZmZXJlZEluZGV4OyBuIDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoOyArK24pIHtcbiAgICB2YXIgX3N0YXRlJGVycm9yZWRcbiAgICBjb25zdCB7IGNodW5rLCBjYWxsYmFjayB9ID0gc3RhdGUuYnVmZmVyZWRbbl1cbiAgICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgIHN0YXRlLmxlbmd0aCAtPSBsZW5cbiAgICBjYWxsYmFjayhcbiAgICAgIChfc3RhdGUkZXJyb3JlZCA9IHN0YXRlLmVycm9yZWQpICE9PSBudWxsICYmIF9zdGF0ZSRlcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfc3RhdGUkZXJyb3JlZFxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKVxuICAgIClcbiAgfVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfc3RhdGUkZXJyb3JlZDJcbiAgICBvbmZpbmlzaENhbGxiYWNrc1tpXShcbiAgICAgIChfc3RhdGUkZXJyb3JlZDIgPSBzdGF0ZS5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RhdGUkZXJyb3JlZDIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IF9zdGF0ZSRlcnJvcmVkMlxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgICApXG4gIH1cbiAgcmVzZXRCdWZmZXIoc3RhdGUpXG59XG5cbi8vIElmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0LlxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuY29ya2VkIHx8IHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHsgYnVmZmVyZWQsIGJ1ZmZlcmVkSW5kZXgsIG9iamVjdE1vZGUgfSA9IHN0YXRlXG4gIGNvbnN0IGJ1ZmZlcmVkTGVuZ3RoID0gYnVmZmVyZWQubGVuZ3RoIC0gYnVmZmVyZWRJbmRleFxuICBpZiAoIWJ1ZmZlcmVkTGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IGkgPSBidWZmZXJlZEluZGV4XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlXG4gIGlmIChidWZmZXJlZExlbmd0aCA+IDEgJiYgc3RyZWFtLl93cml0ZXYpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IgLT0gYnVmZmVyZWRMZW5ndGggLSAxXG4gICAgY29uc3QgY2FsbGJhY2sgPSBzdGF0ZS5hbGxOb29wXG4gICAgICA/IG5vcFxuICAgICAgOiAoZXJyKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgbiA9IGk7IG4gPCBidWZmZXJlZC5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgYnVmZmVyZWRbbl0uY2FsbGJhY2soZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIC8vIE1ha2UgYSBjb3B5IG9mIGBidWZmZXJlZGAgaWYgaXQncyBnb2luZyB0byBiZSB1c2VkIGJ5IGBjYWxsYmFja2AgYWJvdmUsXG4gICAgLy8gc2luY2UgYGRvV3JpdGVgIHdpbGwgbXV0YXRlIHRoZSBhcnJheS5cbiAgICBjb25zdCBjaHVua3MgPSBzdGF0ZS5hbGxOb29wICYmIGkgPT09IDAgPyBidWZmZXJlZCA6IEFycmF5UHJvdG90eXBlU2xpY2UoYnVmZmVyZWQsIGkpXG4gICAgY2h1bmtzLmFsbEJ1ZmZlcnMgPSBzdGF0ZS5hbGxCdWZmZXJzXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGNodW5rcywgJycsIGNhbGxiYWNrKVxuICAgIHJlc2V0QnVmZmVyKHN0YXRlKVxuICB9IGVsc2Uge1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHsgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayB9ID0gYnVmZmVyZWRbaV1cbiAgICAgIGJ1ZmZlcmVkW2krK10gPSBudWxsXG4gICAgICBjb25zdCBsZW4gPSBvYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKVxuICAgIH0gd2hpbGUgKGkgPCBidWZmZXJlZC5sZW5ndGggJiYgIXN0YXRlLndyaXRpbmcpXG4gICAgaWYgKGkgPT09IGJ1ZmZlcmVkLmxlbmd0aCkge1xuICAgICAgcmVzZXRCdWZmZXIoc3RhdGUpXG4gICAgfSBlbHNlIGlmIChpID4gMjU2KSB7XG4gICAgICBidWZmZXJlZC5zcGxpY2UoMCwgaSlcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSBpXG4gICAgfVxuICB9XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICh0aGlzLl93cml0ZXYpIHtcbiAgICB0aGlzLl93cml0ZXYoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjaHVuayxcbiAgICAgICAgICBlbmNvZGluZ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgY2JcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfd3JpdGUoKScpXG4gIH1cbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbFxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVua1xuICAgIGNodW5rID0gbnVsbFxuICAgIGVuY29kaW5nID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG51bGxcbiAgfVxuICBsZXQgZXJyXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ID0gX3dyaXRlKHRoaXMsIGNodW5rLCBlbmNvZGluZylcbiAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGVyciA9IHJldFxuICAgIH1cbiAgfVxuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzLlxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMVxuICAgIHRoaXMudW5jb3JrKClcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgLy8gRG8gbm90aGluZy4uLlxuICB9IGVsc2UgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5lbmRpbmcpIHtcbiAgICAvLyBUaGlzIGlzIGZvcmdpdmluZyBpbiB0ZXJtcyBvZiB1bm5lY2Vzc2FyeSBjYWxscyB0byBlbmQoKSBhbmQgY2FuIGhpZGVcbiAgICAvLyBsb2dpYyBlcnJvcnMuIEhvd2V2ZXIsIHVzdWFsbHkgc3VjaCBlcnJvcnMgYXJlIGhhcm1sZXNzIGFuZCBjYXVzaW5nIGFcbiAgICAvLyBoYXJkIGVycm9yIGNhbiBiZSBkaXNwcm9wb3J0aW9uYXRlbHkgZGVzdHJ1Y3RpdmUuIEl0IGlzIG5vdCBhbHdheXNcbiAgICAvLyB0cml2aWFsIGZvciB0aGUgdXNlciB0byBkZXRlcm1pbmUgd2hldGhlciBlbmQoKSBuZWVkcyB0byBiZSBjYWxsZWRcbiAgICAvLyBvciBub3QuXG5cbiAgICBzdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUsIHRydWUpXG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlXG4gIH0gZWxzZSBpZiAoc3RhdGUuZmluaXNoZWQpIHtcbiAgICBlcnIgPSBuZXcgRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEKCdlbmQnKVxuICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCkge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgfVxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGVyciB8fCBzdGF0ZS5maW5pc2hlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZVtrT25GaW5pc2hlZF0ucHVzaChjYilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5lbmRpbmcgJiZcbiAgICAhc3RhdGUuZGVzdHJveWVkICYmXG4gICAgc3RhdGUuY29uc3RydWN0ZWQgJiZcbiAgICBzdGF0ZS5sZW5ndGggPT09IDAgJiZcbiAgICAhc3RhdGUuZXJyb3JlZCAmJlxuICAgIHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA9PT0gMCAmJlxuICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICFzdGF0ZS53cml0aW5nICYmXG4gICAgIXN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgICFzdGF0ZS5jbG9zZUVtaXR0ZWRcbiAgKVxufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uRmluaXNoKGVycikge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8gZXJyIDogRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc3Qgb25maW5pc2hDYWxsYmFja3MgPSBzdGF0ZVtrT25GaW5pc2hlZF0uc3BsaWNlKDApXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKGVycilcbiAgICAgIH1cbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCBzdGF0ZS5zeW5jKVxuICAgIH0gZWxzZSBpZiAobmVlZEZpbmlzaChzdGF0ZSkpIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LiBEb24ndCBjaGVjayBzdGF0ZS5zeW5jIGhlcmUuXG4gICAgICAvLyBTb21lIHN0cmVhbXMgYXNzdW1lICdmaW5pc2gnIHdpbGwgYmUgZW1pdHRlZFxuICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcmVsYXRpdmUgdG8gX2ZpbmFsIGNhbGxiYWNrLlxuICAgICAgc3RhdGUucGVuZGluZ2NiKytcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoLCBzdHJlYW0sIHN0YXRlKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5zeW5jID0gdHJ1ZVxuICBzdGF0ZS5wZW5kaW5nY2IrK1xuICB0cnkge1xuICAgIHN0cmVhbS5fZmluYWwob25GaW5pc2gpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG9uRmluaXNoKGVycilcbiAgfVxuICBzdGF0ZS5zeW5jID0gZmFsc2Vcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlLCBzeW5jKSB7XG4gIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYisrXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soXG4gICAgICAgICAgKHN0cmVhbSwgc3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nY2IrK1xuICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLnBlbmRpbmdjYi0tXG4gIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKClcbiAgfVxuICBzdHJlYW0uZW1pdCgnZmluaXNoJylcbiAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsLlxuICAgIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICFyU3RhdGUgfHxcbiAgICAgIChyU3RhdGUuYXV0b0Rlc3Ryb3kgJiZcbiAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSByZWFkYWJsZSB0byBldmVyICdlbmQnXG4gICAgICAgIC8vIGlmIHJlYWRhYmxlIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAgICAoclN0YXRlLmVuZEVtaXR0ZWQgfHwgclN0YXRlLnJlYWRhYmxlID09PSBmYWxzZSkpXG4gICAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgfVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlLnByb3RvdHlwZSwge1xuICBjbG9zZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmNsb3NlZCA6IGZhbHNlXG4gICAgfVxuICB9LFxuICBkZXN0cm95ZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA6IGZhbHNlXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgICAgIC8vIHcud3JpdGFibGUgPT09IGZhbHNlIG1lYW5zIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIGEgRHVwbGV4IHN0cmVhbVxuICAgICAgLy8gd2hlcmUgdGhlIHdyaXRhYmxlIHNpZGUgd2FzIGRpc2FibGVkIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgLy8gQ29tcGF0LiBUaGUgdXNlciBtaWdodCBtYW51YWxseSBkaXNhYmxlIHdyaXRhYmxlIHNpZGUgdGhyb3VnaFxuICAgICAgLy8gZGVwcmVjYXRlZCBzZXR0ZXIuXG4gICAgICByZXR1cm4gISF3ICYmIHcud3JpdGFibGUgIT09IGZhbHNlICYmICF3LmRlc3Ryb3llZCAmJiAhdy5lcnJvcmVkICYmICF3LmVuZGluZyAmJiAhdy5lbmRlZFxuICAgIH0sXG4gICAgc2V0KHZhbCkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGlibGUuXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlID0gISF2YWxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlT2JqZWN0TW9kZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3Qgd1N0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICAgICAgaWYgKCF3U3RhdGUpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuICF3U3RhdGUuZGVzdHJveWVkICYmICF3U3RhdGUuZW5kaW5nICYmIHdTdGF0ZS5uZWVkRHJhaW5cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlSGlnaFdhdGVyTWFyazoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQ29ya2VkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQgOiAwXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUxlbmd0aDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQWJvcnRlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCkgJiZcbiAgICAgICAgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWRcbiAgICAgIClcbiAgICB9XG4gIH1cbn0pXG5jb25zdCBkZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcblxuICAvLyBJbnZva2UgcGVuZGluZyBjYWxsYmFja3MuXG4gIGlmICghc3RhdGUuZGVzdHJveWVkICYmIChzdGF0ZS5idWZmZXJlZEluZGV4IDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoIHx8IHN0YXRlW2tPbkZpbmlzaGVkXS5sZW5ndGgpKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlcnJvckJ1ZmZlciwgc3RhdGUpXG4gIH1cbiAgZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgY2IpXG4gIHJldHVybiB0aGlzXG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKVxufVxuV3JpdGFibGUucHJvdG90eXBlW0VFLmNhcHR1cmVSZWplY3Rpb25TeW1ib2xdID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmRlc3Ryb3koZXJyKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbldyaXRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAod3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtV3JpdGFibGVGcm9tV3JpdGFibGVTdHJlYW0od3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5Xcml0YWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1Xcml0YWJsZSkge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdXcml0YWJsZVN0cmVhbUZyb21TdHJlYW1Xcml0YWJsZShzdHJlYW1Xcml0YWJsZSlcbn1cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG47KCd1c2Ugc3RyaWN0JylcbmNvbnN0IGJ1ZmZlck1vZHVsZSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7XG4gIGlzUmVhZGFibGUsXG4gIGlzV3JpdGFibGUsXG4gIGlzSXRlcmFibGUsXG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZU5vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc0R1cGxleE5vZGVTdHJlYW1cbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IHsgY3JlYXRlRGVmZXJyZWRQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZnJvbSA9IHJlcXVpcmUoJy4vZnJvbScpXG5jb25zdCBCbG9iID0gZ2xvYmFsVGhpcy5CbG9iIHx8IGJ1ZmZlck1vZHVsZS5CbG9iXG5jb25zdCBpc0Jsb2IgPVxuICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5jb25zdCB7IEZ1bmN0aW9uUHJvdG90eXBlQ2FsbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5cbi8vIFRoaXMgaXMgbmVlZGVkIGZvciBwcmUgbm9kZSAxNy5cbmNsYXNzIER1cGxleGlmeSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzQzODVcblxuICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnJlYWRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMud3JpdGFibGUpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IHRydWVcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkdXBsZXhpZnkoYm9keSwgbmFtZSkge1xuICBpZiAoaXNEdXBsZXhOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHlcbiAgfVxuICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZTogYm9keVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgd3JpdGFibGU6IGJvZHlcbiAgICB9KVxuICB9XG4gIGlmIChpc05vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICByZWFkYWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtc1xuICAvLyBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAvLyAgIHJldHVybiBfZHVwbGV4aWZ5KHsgcmVhZGFibGU6IFJlYWRhYmxlLmZyb21XZWIoYm9keSkgfSk7XG4gIC8vIH1cblxuICAvLyBUT0RPOiBXZWJzdHJlYW1zXG4gIC8vIGlmIChpc1dyaXRhYmxlU3RyZWFtKGJvZHkpKSB7XG4gIC8vICAgcmV0dXJuIF9kdXBsZXhpZnkoeyB3cml0YWJsZTogV3JpdGFibGUuZnJvbVdlYihib2R5KSB9KTtcbiAgLy8gfVxuXG4gIGlmICh0eXBlb2YgYm9keSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHsgdmFsdWUsIHdyaXRlLCBmaW5hbCwgZGVzdHJveSB9ID0gZnJvbUFzeW5jR2VuKGJvZHkpXG4gICAgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIHZhbHVlLCB7XG4gICAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIGZpbmFsLFxuICAgICAgICBkZXN0cm95XG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB0aGVuID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHZhbHVlLnRoZW5cbiAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkXG4gICAgICBjb25zdCBwcm9taXNlID0gRnVuY3Rpb25Qcm90b3R5cGVDYWxsKFxuICAgICAgICB0aGVuLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSgnbnVsbHknLCAnYm9keScsIHZhbClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICBkZXN0cm95ZXIoZCwgZXJyKVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm4gKGQgPSBuZXcgRHVwbGV4aWZ5KHtcbiAgICAgICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRlLFxuICAgICAgICBmaW5hbChjYikge1xuICAgICAgICAgIGZpbmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb21pc2VcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgbnVsbClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveVxuICAgICAgfSkpXG4gICAgfVxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0l0ZXJhYmxlLCBBc3luY0l0ZXJhYmxlIG9yIEFzeW5jRnVuY3Rpb24nLCBuYW1lLCB2YWx1ZSlcbiAgfVxuICBpZiAoaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGR1cGxleGlmeShib2R5LmFycmF5QnVmZmVyKCkpXG4gIH1cbiAgaWYgKGlzSXRlcmFibGUoYm9keSkpIHtcbiAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIGJvZHksIHtcbiAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtcy5cbiAgLy8gaWYgKFxuICAvLyAgIGlzUmVhZGFibGVTdHJlYW0oYm9keT8ucmVhZGFibGUpICYmXG4gIC8vICAgaXNXcml0YWJsZVN0cmVhbShib2R5Py53cml0YWJsZSlcbiAgLy8gKSB7XG4gIC8vICAgcmV0dXJuIER1cGxleGlmeS5mcm9tV2ViKGJvZHkpO1xuICAvLyB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LndyaXRhYmxlKSA9PT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS5yZWFkYWJsZSkgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlYWRhYmxlID1cbiAgICAgIGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkICYmIGJvZHkucmVhZGFibGVcbiAgICAgICAgPyBpc1JlYWRhYmxlTm9kZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkucmVhZGFibGUpXG4gICAgICAgICAgPyBib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogYm9keS5yZWFkYWJsZVxuICAgICAgICAgIDogZHVwbGV4aWZ5KGJvZHkucmVhZGFibGUpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3Qgd3JpdGFibGUgPVxuICAgICAgYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQgJiYgYm9keS53cml0YWJsZVxuICAgICAgICA/IGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS53cml0YWJsZSlcbiAgICAgICAgICA/IGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBib2R5LndyaXRhYmxlXG4gICAgICAgICAgOiBkdXBsZXhpZnkoYm9keS53cml0YWJsZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZSxcbiAgICAgIHdyaXRhYmxlXG4gICAgfSlcbiAgfVxuICBjb25zdCB0aGVuID0gYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnRoZW5cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbGV0IGRcbiAgICBGdW5jdGlvblByb3RvdHlwZUNhbGwoXG4gICAgICB0aGVuLFxuICAgICAgYm9keSxcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgZC5wdXNoKHZhbClcbiAgICAgICAgfVxuICAgICAgICBkLnB1c2gobnVsbClcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGRlc3Ryb3llcihkLCBlcnIpXG4gICAgICB9XG4gICAgKVxuICAgIHJldHVybiAoZCA9IG5ldyBEdXBsZXhpZnkoe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHJlYWQoKSB7fVxuICAgIH0pKVxuICB9XG4gIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICBuYW1lLFxuICAgIFtcbiAgICAgICdCbG9iJyxcbiAgICAgICdSZWFkYWJsZVN0cmVhbScsXG4gICAgICAnV3JpdGFibGVTdHJlYW0nLFxuICAgICAgJ1N0cmVhbScsXG4gICAgICAnSXRlcmFibGUnLFxuICAgICAgJ0FzeW5jSXRlcmFibGUnLFxuICAgICAgJ0Z1bmN0aW9uJyxcbiAgICAgICd7IHJlYWRhYmxlLCB3cml0YWJsZSB9IHBhaXInLFxuICAgICAgJ1Byb21pc2UnXG4gICAgXSxcbiAgICBib2R5XG4gIClcbn1cbmZ1bmN0aW9uIGZyb21Bc3luY0dlbihmbikge1xuICBsZXQgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3QgdmFsdWUgPSBmbihcbiAgICAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IF9wcm9taXNlID0gcHJvbWlzZVxuICAgICAgICBwcm9taXNlID0gbnVsbFxuICAgICAgICBjb25zdCB7IGNodW5rLCBkb25lLCBjYiB9ID0gYXdhaXQgX3Byb21pc2VcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICAgICAgaWYgKGRvbmUpIHJldHVyblxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBjYXVzZTogc2lnbmFsLnJlYXNvblxuICAgICAgICAgIH0pXG4gICAgICAgIDsoeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKSlcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgKVxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICAgIGNvbnN0IF9yZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgcmVzb2x2ZSA9IG51bGxcbiAgICAgIF9yZXNvbHZlKHtcbiAgICAgICAgY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICBjYlxuICAgICAgfSlcbiAgICB9LFxuICAgIGZpbmFsKGNiKSB7XG4gICAgICBjb25zdCBfcmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHJlc29sdmUgPSBudWxsXG4gICAgICBfcmVzb2x2ZSh7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIGNiXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveShlcnIsIGNiKSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBjYihlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBfZHVwbGV4aWZ5KHBhaXIpIHtcbiAgY29uc3QgciA9IHBhaXIucmVhZGFibGUgJiYgdHlwZW9mIHBhaXIucmVhZGFibGUucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IFJlYWRhYmxlLndyYXAocGFpci5yZWFkYWJsZSkgOiBwYWlyLnJlYWRhYmxlXG4gIGNvbnN0IHcgPSBwYWlyLndyaXRhYmxlXG4gIGxldCByZWFkYWJsZSA9ICEhaXNSZWFkYWJsZShyKVxuICBsZXQgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUodylcbiAgbGV0IG9uZHJhaW5cbiAgbGV0IG9uZmluaXNoXG4gIGxldCBvbnJlYWRhYmxlXG4gIGxldCBvbmNsb3NlXG4gIGxldCBkXG4gIGZ1bmN0aW9uIG9uZmluaXNoZWQoZXJyKSB7XG4gICAgY29uc3QgY2IgPSBvbmNsb3NlXG4gICAgb25jbG9zZSA9IG51bGxcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycilcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgZC5kZXN0cm95KGVycilcbiAgICB9IGVsc2UgaWYgKCFyZWFkYWJsZSAmJiAhd3JpdGFibGUpIHtcbiAgICAgIGQuZGVzdHJveSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyhyb25hZyk6IEF2b2lkIGRvdWJsZSBidWZmZXJpbmcuXG4gIC8vIEltcGxlbWVudCBXcml0YWJsZS9SZWFkYWJsZS9EdXBsZXggdHJhaXRzLlxuICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNTE1LlxuICBkID0gbmV3IER1cGxleGlmeSh7XG4gICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogISEociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5yZWFkYWJsZU9iamVjdE1vZGUpLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogISEodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy53cml0YWJsZU9iamVjdE1vZGUpLFxuICAgIHJlYWRhYmxlLFxuICAgIHdyaXRhYmxlXG4gIH0pXG4gIGlmICh3cml0YWJsZSkge1xuICAgIGVvcyh3LCAoZXJyKSA9PiB7XG4gICAgICB3cml0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRlc3Ryb3llcihyLCBlcnIpXG4gICAgICB9XG4gICAgICBvbmZpbmlzaGVkKGVycilcbiAgICB9KVxuICAgIGQuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgIGlmICh3LndyaXRlKGNodW5rLCBlbmNvZGluZykpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25kcmFpbiA9IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfVxuICAgIGQuX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICB3LmVuZCgpXG4gICAgICBvbmZpbmlzaCA9IGNhbGxiYWNrXG4gICAgfVxuICAgIHcub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmRyYWluXG4gICAgICAgIG9uZHJhaW4gPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHcub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbmZpbmlzaCkge1xuICAgICAgICBjb25zdCBjYiA9IG9uZmluaXNoXG4gICAgICAgIG9uZmluaXNoID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpZiAocmVhZGFibGUpIHtcbiAgICBlb3MociwgKGVycikgPT4ge1xuICAgICAgcmVhZGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBkZXN0cm95ZXIociwgZXJyKVxuICAgICAgfVxuICAgICAgb25maW5pc2hlZChlcnIpXG4gICAgfSlcbiAgICByLm9uKCdyZWFkYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbnJlYWRhYmxlKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25yZWFkYWJsZVxuICAgICAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgICByLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkLnB1c2gobnVsbClcbiAgICB9KVxuICAgIGQuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBidWYgPSByLnJlYWQoKVxuICAgICAgICBpZiAoYnVmID09PSBudWxsKSB7XG4gICAgICAgICAgb25yZWFkYWJsZSA9IGQuX3JlYWRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWQucHVzaChidWYpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZC5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFlcnIgJiYgb25jbG9zZSAhPT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgIG9uZHJhaW4gPSBudWxsXG4gICAgb25maW5pc2ggPSBudWxsXG4gICAgaWYgKG9uY2xvc2UgPT09IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgb25jbG9zZSA9IGNhbGxiYWNrXG4gICAgICBkZXN0cm95ZXIodywgZXJyKVxuICAgICAgZGVzdHJveWVyKHIsIGVycilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwZSBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZlxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXhcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LnByb3RvdHlwZSwgUmVhZGFibGUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LCBSZWFkYWJsZSlcbntcbiAgY29uc3Qga2V5cyA9IE9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKVxuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWV0aG9kID0ga2V5c1tpXVxuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXVxuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucylcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKVxuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gb3B0aW9ucy5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZVxuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKER1cGxleC5wcm90b3R5cGUsIHtcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlJylcbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnKVxuICB9LFxuICB3cml0YWJsZU9iamVjdE1vZGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlT2JqZWN0TW9kZScpXG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicpXG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcpXG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlRmluaXNoZWQnKVxuICB9LFxuICB3cml0YWJsZUNvcmtlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAuLi5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVDb3JrZWQnKVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUVuZGVkJylcbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTmVlZERyYWluJylcbiAgfSxcbiAgZGVzdHJveWVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbkR1cGxleC5mcm9tV2ViID0gZnVuY3Rpb24gKHBhaXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtRHVwbGV4RnJvbVJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIG9wdGlvbnMpXG59XG5EdXBsZXgudG9XZWIgPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleChkdXBsZXgpXG59XG5sZXQgZHVwbGV4aWZ5XG5EdXBsZXguZnJvbSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gIGlmICghZHVwbGV4aWZ5KSB7XG4gICAgZHVwbGV4aWZ5ID0gcmVxdWlyZSgnLi9kdXBsZXhpZnknKVxuICB9XG4gIHJldHVybiBkdXBsZXhpZnkoYm9keSwgJ2JvZHknKVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgT2JqZWN0U2V0UHJvdG90eXBlT2YsIFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybVxuY29uc3QgeyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBnZXRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFRyYW5zZm9ybS5wcm90b3R5cGUsIER1cGxleC5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihUcmFuc2Zvcm0sIER1cGxleClcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgna0NhbGxiYWNrJylcbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKVxuXG4gIC8vIFRPRE8gKHJvbmFnKTogVGhpcyBzaG91bGQgcHJlZmVyYWJseSBhbHdheXMgYmVcbiAgLy8gYXBwbGllZCBidXQgd291bGQgYmUgc2VtdmVyLW1ham9yLiBPciBldmVuIGJldHRlcjtcbiAgLy8gbWFrZSBUcmFuc2Zvcm0gYSBSZWFkYWJsZSB3aXRoIHRoZSBXcml0YWJsZSBpbnRlcmZhY2UuXG4gIGNvbnN0IHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IG9wdGlvbnMgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB0cnVlKSA6IG51bGxcbiAgaWYgKHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9PT0gMCkge1xuICAgIC8vIEEgRHVwbGV4IHdpbGwgYnVmZmVyIGJvdGggb24gdGhlIHdyaXRhYmxlIGFuZCByZWFkYWJsZSBzaWRlIHdoaWxlXG4gICAgLy8gYSBUcmFuc2Zvcm0ganVzdCB3YW50cyB0byBidWZmZXIgaHdtIG51bWJlciBvZiBlbGVtZW50cy4gVG8gYXZvaWRcbiAgICAvLyBidWZmZXJpbmcgdHdpY2Ugd2UgZGlzYWJsZSBidWZmZXJpbmcgb24gdGhlIHdyaXRhYmxlIHNpZGUuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoaWdoV2F0ZXJNYXJrOiBudWxsLFxuICAgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLFxuICAgICAgLy8gVE9ETyAocm9uYWcpOiAwIGlzIG5vdCBvcHRpbWFsIHNpbmNlIHdlIGhhdmVcbiAgICAgIC8vIGEgXCJidWdcIiB3aGVyZSB3ZSBjaGVjayBuZWVkRHJhaW4gYmVmb3JlIGNhbGxpbmcgX3dyaXRlIGFuZCBub3QgYWZ0ZXIuXG4gICAgICAvLyBSZWZzOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMjg4N1xuICAgICAgLy8gUmVmczogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzU5NDFcbiAgICAgIHdyaXRhYmxlSGlnaFdhdGVyTWFyazogb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcmsgfHwgMFxuICAgIH1cbiAgfVxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKVxuXG4gIC8vIFdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2VcbiAgdGhpc1trQ2FsbGJhY2tdID0gbnVsbFxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2hcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgLy8gQmFja3dhcmRzIGNvbXBhdC4gU29tZSBUcmFuc2Zvcm0gc3RyZWFtcyBpbmNvcnJlY3RseSBpbXBsZW1lbnQgX2ZpbmFsXG4gIC8vIGluc3RlYWQgb2Ygb3IgaW4gYWRkaXRpb24gdG8gX2ZsdXNoLiBCeSB1c2luZyAncHJlZmluaXNoJyBpbnN0ZWFkIG9mXG4gIC8vIGltcGxlbWVudGluZyBfZmluYWwgd2UgY29udGludWUgc3VwcG9ydGluZyB0aGlzIHVuZm9ydHVuYXRlIHVzZSBjYXNlLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpXG59XG5mdW5jdGlvbiBmaW5hbChjYikge1xuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKChlciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVyKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGVzdHJveShlcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdXNoKGRhdGEpXG4gICAgICB9XG4gICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIGlmIChjYikge1xuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgaWYgKHRoaXMuX2ZpbmFsICE9PSBmaW5hbCkge1xuICAgIGZpbmFsLmNhbGwodGhpcylcbiAgfVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZmluYWwgPSBmaW5hbFxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfdHJhbnNmb3JtKCknKVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCByU3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHdTdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgbGVuZ3RoID0gclN0YXRlLmxlbmd0aFxuICB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCAoZXJyLCB2YWwpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnB1c2godmFsKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB3U3RhdGUuZW5kZWQgfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICBsZW5ndGggPT09IHJTdGF0ZS5sZW5ndGggfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICByU3RhdGUubGVuZ3RoIDwgclN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICApIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trQ2FsbGJhY2tdID0gY2FsbGJhY2tcbiAgICB9XG4gIH0pXG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpc1trQ2FsbGJhY2tdKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzW2tDYWxsYmFja11cbiAgICB0aGlzW2tDYWxsYmFja10gPSBudWxsXG4gICAgY2FsbGJhY2soKVxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE9iamVjdFNldFByb3RvdHlwZU9mIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2hcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLnByb3RvdHlwZSwgVHJhbnNmb3JtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucylcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucylcbn1cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IEFycmF5SXNBcnJheSwgUHJvbWlzZSwgU3ltYm9sQXN5bmNJdGVyYXRvciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBvbmNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLFxuICAgIEVSUl9NSVNTSU5HX0FSR1MsXG4gICAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gICAgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzUmVhZGFibGUsIGlzUmVhZGFibGVOb2RlU3RyZWFtLCBpc05vZGVTdHJlYW0gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxubGV0IFBhc3NUaHJvdWdoXG5sZXQgUmVhZGFibGVcbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcpIHtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfSlcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgICB3cml0YWJsZTogd3JpdGluZ1xuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZmluaXNoZWQgPSAhZXJyXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgZGVzdHJveTogKGVycikgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKVxuICAgIH0sXG4gICAgY2xlYW51cFxuICB9XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIC8vIFN0cmVhbXMgc2hvdWxkIG5ldmVyIGJlIGFuIGVtcHR5IGFycmF5LiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3RcbiAgLy8gYSBzaW5nbGUgc3RyZWFtLiBUaGVyZWZvcmUgb3B0aW1pemUgZm9yIHRoZSBhdmVyYWdlIGNhc2UgaW5zdGVhZCBvZlxuICAvLyBjaGVja2luZyBmb3IgbGVuZ3RoID09PSAwIGFzIHdlbGwuXG4gIHZhbGlkYXRlRnVuY3Rpb24oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdLCAnc3RyZWFtc1tzdHJlYW0ubGVuZ3RoIC0gMV0nKVxuICByZXR1cm4gc3RyZWFtcy5wb3AoKVxufVxuZnVuY3Rpb24gbWFrZUFzeW5jSXRlcmFibGUodmFsKSB7XG4gIGlmIChpc0l0ZXJhYmxlKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsXG4gIH0gZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odmFsKSkge1xuICAgIC8vIExlZ2FjeSBzdHJlYW1zIGFyZSBub3QgSXRlcmFibGUuXG4gICAgcmV0dXJuIGZyb21SZWFkYWJsZSh2YWwpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCd2YWwnLCBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnXSwgdmFsKVxufVxuYXN5bmMgZnVuY3Rpb24qIGZyb21SZWFkYWJsZSh2YWwpIHtcbiAgaWYgKCFSZWFkYWJsZSkge1xuICAgIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG4gIH1cbiAgeWllbGQqIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0l0ZXJhdG9yXS5jYWxsKHZhbClcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXAoaXRlcmFibGUsIHdyaXRhYmxlLCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVycm9yXG4gIGxldCBvbnJlc29sdmUgPSBudWxsXG4gIGNvbnN0IHJlc3VtZSA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAob25yZXNvbHZlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9ucmVzb2x2ZVxuICAgICAgb25yZXNvbHZlID0gbnVsbFxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjb25zdCB3YWl0ID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25yZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB3cml0YWJsZS5vbignZHJhaW4nLCByZXN1bWUpXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgd3JpdGFibGUsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICByZXN1bWVcbiAgKVxuICB0cnkge1xuICAgIGlmICh3cml0YWJsZS53cml0YWJsZU5lZWREcmFpbikge1xuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICAgIGlmICghd3JpdGFibGUud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXQoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICB3cml0YWJsZS5lbmQoKVxuICAgIH1cbiAgICBhd2FpdCB3YWl0KClcbiAgICBmaW5pc2goKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBmaW5pc2goZXJyb3IgIT09IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhbnVwKClcbiAgICB3cml0YWJsZS5vZmYoJ2RyYWluJywgcmVzdW1lKVxuICB9XG59XG5mdW5jdGlvbiBwaXBlbGluZSguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBwaXBlbGluZUltcGwoc3RyZWFtcywgb25jZShwb3BDYWxsYmFjayhzdHJlYW1zKSkpXG59XG5mdW5jdGlvbiBwaXBlbGluZUltcGwoc3RyZWFtcywgY2FsbGJhY2ssIG9wdHMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAxICYmIEFycmF5SXNBcnJheShzdHJlYW1zWzBdKSkge1xuICAgIHN0cmVhbXMgPSBzdHJlYW1zWzBdXG4gIH1cbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJylcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3Qgb3V0ZXJTaWduYWwgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdHMuc2lnbmFsXG5cbiAgLy8gTmVlZCB0byBjbGVhbnVwIGV2ZW50IGxpc3RlbmVycyBpZiBsYXN0IHN0cmVhbSBpcyByZWFkYWJsZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzM1NDUyXG4gIGNvbnN0IGxhc3RTdHJlYW1DbGVhbnVwID0gW11cbiAgdmFsaWRhdGVBYm9ydFNpZ25hbChvdXRlclNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgZmluaXNoSW1wbChuZXcgQWJvcnRFcnJvcigpKVxuICB9XG4gIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICBsZXQgZXJyb3JcbiAgbGV0IHZhbHVlXG4gIGNvbnN0IGRlc3Ryb3lzID0gW11cbiAgbGV0IGZpbmlzaENvdW50ID0gMFxuICBmdW5jdGlvbiBmaW5pc2goZXJyKSB7XG4gICAgZmluaXNoSW1wbChlcnIsIC0tZmluaXNoQ291bnQgPT09IDApXG4gIH1cbiAgZnVuY3Rpb24gZmluaXNoSW1wbChlcnIsIGZpbmFsKSB7XG4gICAgaWYgKGVyciAmJiAoIWVycm9yIHx8IGVycm9yLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAoIWVycm9yICYmICFmaW5hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdoaWxlIChkZXN0cm95cy5sZW5ndGgpIHtcbiAgICAgIGRlc3Ryb3lzLnNoaWZ0KCkoZXJyb3IpXG4gICAgfVxuICAgIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIGFjLmFib3J0KClcbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbGFzdFN0cmVhbUNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvciwgdmFsdWUpXG4gICAgfVxuICB9XG4gIGxldCByZXRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXVxuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgY29uc3Qgd3JpdGluZyA9IGkgPiAwXG4gICAgY29uc3QgZW5kID0gcmVhZGluZyB8fCAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLmVuZCkgIT09IGZhbHNlXG4gICAgY29uc3QgaXNMYXN0U3RyZWFtID0gaSA9PT0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgZGVzdHJveSwgY2xlYW51cCB9ID0gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZylcbiAgICAgICAgZGVzdHJveXMucHVzaChkZXN0cm95KVxuICAgICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pICYmIGlzTGFzdFN0cmVhbSkge1xuICAgICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goY2xlYW51cClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYXRjaCBzdHJlYW0gZXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgcGlwZS9wdW1wIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicgJiYgZXJyLmNvZGUgIT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpIHtcbiAgICAgICAgICBmaW5pc2goZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkgJiYgaXNMYXN0U3RyZWFtKSB7XG4gICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtKHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBTdHJlYW0nLCAnc291cmNlJywgcmV0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUoc3RyZWFtKSB8fCBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHJldCA9IHN0cmVhbVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0ID0gbWFrZUFzeW5jSXRlcmFibGUocmV0KVxuICAgICAgcmV0ID0gc3RyZWFtKHJldCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pXG4gICAgICBpZiAocmVhZGluZykge1xuICAgICAgICBpZiAoIWlzSXRlcmFibGUocmV0LCB0cnVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUnLCBgdHJhbnNmb3JtWyR7aSAtIDF9XWAsIHJldClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9yZXRcbiAgICAgICAgaWYgKCFQYXNzVGhyb3VnaCkge1xuICAgICAgICAgIFBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9wYXNzdGhyb3VnaCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCB0byBwaXBlbGluZSBpcyBub3QgYSBzdHJlYW1cbiAgICAgICAgLy8gd2UgbXVzdCBjcmVhdGUgYSBwcm94eSBzdHJlYW0gc28gdGhhdCBwaXBlbGluZSguLi4pXG4gICAgICAgIC8vIGFsd2F5cyByZXR1cm5zIGEgc3RyZWFtIHdoaWNoIGNhbiBiZSBmdXJ0aGVyXG4gICAgICAgIC8vIGNvbXBvc2VkIHRocm91Z2ggYC5waXBlKHN0cmVhbSlgLlxuXG4gICAgICAgIGNvbnN0IHB0ID0gbmV3IFBhc3NUaHJvdWdoKHtcbiAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSGFuZGxlIFByb21pc2VzL0ErIHNwZWMsIGB0aGVuYCBjb3VsZCBiZSBhIGdldHRlciB0aGF0IHRocm93cyBvblxuICAgICAgICAvLyBzZWNvbmQgdXNlLlxuICAgICAgICBjb25zdCB0aGVuID0gKF9yZXQgPSByZXQpID09PSBudWxsIHx8IF9yZXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9yZXQudGhlblxuICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbFxuICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwdC53cml0ZSh2YWwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIHB0LmVuZCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBwdC5kZXN0cm95KGVycilcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gsIGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQsIHRydWUpKSB7XG4gICAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICAgIHB1bXAocmV0LCBwdCwgZmluaXNoLCB7XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUgb3IgUHJvbWlzZScsICdkZXN0aW5hdGlvbicsIHJldClcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBwdFxuICAgICAgICBjb25zdCB7IGRlc3Ryb3ksIGNsZWFudXAgfSA9IGRlc3Ryb3llcihyZXQsIGZhbHNlLCB0cnVlKVxuICAgICAgICBkZXN0cm95cy5wdXNoKGRlc3Ryb3kpXG4gICAgICAgIGlmIChpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCArPSAyXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBwaXBlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSAmJiBpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQpKSB7XG4gICAgICAgIGZpbmlzaENvdW50KytcbiAgICAgICAgcHVtcChyZXQsIHN0cmVhbSwgZmluaXNoLCB7XG4gICAgICAgICAgZW5kXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3ZhbCcsIFsnUmVhZGFibGUnLCAnSXRlcmFibGUnLCAnQXN5bmNJdGVyYWJsZSddLCByZXQpXG4gICAgICB9XG4gICAgICByZXQgPSBzdHJlYW1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKHNpZ25hbCAhPT0gbnVsbCAmJiBzaWduYWwgIT09IHVuZGVmaW5lZCAmJiBzaWduYWwuYWJvcnRlZCkgfHxcbiAgICAob3V0ZXJTaWduYWwgIT09IG51bGwgJiYgb3V0ZXJTaWduYWwgIT09IHVuZGVmaW5lZCAmJiBvdXRlclNpZ25hbC5hYm9ydGVkKVxuICApIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIHBpcGUoc3JjLCBkc3QsIGZpbmlzaCwgeyBlbmQgfSkge1xuICBsZXQgZW5kZWQgPSBmYWxzZVxuICBkc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghZW5kZWQpIHtcbiAgICAgIC8vIEZpbmlzaCBpZiB0aGUgZGVzdGluYXRpb24gY2xvc2VzIGJlZm9yZSB0aGUgc291cmNlIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmaW5pc2gobmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICB9KVxuICBzcmMucGlwZShkc3QsIHtcbiAgICBlbmRcbiAgfSlcbiAgaWYgKGVuZCkge1xuICAgIC8vIENvbXBhdC4gQmVmb3JlIG5vZGUgdjEwLjEyLjAgc3RkaW8gdXNlZCB0byB0aHJvdyBhbiBlcnJvciBzb1xuICAgIC8vIHBpcGUoKSBkaWQvZG9lcyBub3QgZW5kKCkgc3RkaW8gZGVzdGluYXRpb25zLlxuICAgIC8vIE5vdyB0aGV5IGFsbG93IGl0IGJ1dCBcInNlY3JldGx5XCIgZG9uJ3QgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmQuXG4gICAgc3JjLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgZHN0LmVuZCgpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBmaW5pc2goKVxuICB9XG4gIGVvcyhcbiAgICBzcmMsXG4gICAge1xuICAgICAgcmVhZGFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScgJiZcbiAgICAgICAgclN0YXRlICYmXG4gICAgICAgIHJTdGF0ZS5lbmRlZCAmJlxuICAgICAgICAhclN0YXRlLmVycm9yZWQgJiZcbiAgICAgICAgIXJTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgICAgICkge1xuICAgICAgICAvLyBTb21lIHJlYWRhYmxlIHN0cmVhbXMgd2lsbCBlbWl0ICdjbG9zZScgYmVmb3JlICdlbmQnLiBIb3dldmVyLCBzaW5jZVxuICAgICAgICAvLyB0aGlzIGlzIG9uIHRoZSByZWFkYWJsZSBzaWRlICdlbmQnIHNob3VsZCBzdGlsbCBiZSBlbWl0dGVkIGlmIHRoZVxuICAgICAgICAvLyBzdHJlYW0gaGFzIGJlZW4gZW5kZWQgYW5kIG5vIGVycm9yIGVtaXR0ZWQuIFRoaXMgc2hvdWxkIGJlIGFsbG93ZWQgaW5cbiAgICAgICAgLy8gZmF2b3Igb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNpbmNlIHRoZSBzdHJlYW0gaXMgcGlwZWQgdG8gYVxuICAgICAgICAvLyBkZXN0aW5hdGlvbiB0aGlzIHNob3VsZCBub3QgcmVzdWx0IGluIGFueSBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIHdyaXRhYmxlIHByZW1hdHVyZSBjbG9zZSBzaW5jZVxuICAgICAgICAvLyBlb3Mgd2lsbCBvbmx5IGZhaWwgd2l0aCBwcmVtYXR1cmUgY2xvc2Ugb24gdGhlIHJlYWRpbmcgc2lkZSBmb3JcbiAgICAgICAgLy8gZHVwbGV4IHN0cmVhbXMuXG4gICAgICAgIHNyYy5vbmNlKCdlbmQnLCBmaW5pc2gpLm9uY2UoJ2Vycm9yJywgZmluaXNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoKGVycilcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgcmV0dXJuIGVvcyhcbiAgICBkc3QsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIGZpbmlzaFxuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmVJbXBsLFxuICBwaXBlbGluZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcGlwZWxpbmUgfSA9IHJlcXVpcmUoJy4vcGlwZWxpbmUnKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBkZXN0cm95ZXIgfSA9IHJlcXVpcmUoJy4vZGVzdHJveScpXG5jb25zdCB7IGlzTm9kZVN0cmVhbSwgaXNSZWFkYWJsZSwgaXNXcml0YWJsZSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19WQUxVRSwgRVJSX01JU1NJTkdfQVJHUyB9XG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlKC4uLnN0cmVhbXMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBEdXBsZXguZnJvbShzdHJlYW1zWzBdKVxuICB9XG4gIGNvbnN0IG9yZ1N0cmVhbXMgPSBbLi4uc3RyZWFtc11cbiAgaWYgKHR5cGVvZiBzdHJlYW1zWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtc1swXSA9IER1cGxleC5mcm9tKHN0cmVhbXNbMF0pXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpZHggPSBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICBzdHJlYW1zW2lkeF0gPSBEdXBsZXguZnJvbShzdHJlYW1zW2lkeF0pXG4gIH1cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBzdHJlYW1zLmxlbmd0aDsgKytuKSB7XG4gICAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtc1tuXSkpIHtcbiAgICAgIC8vIFRPRE8ocm9uYWcpOiBBZGQgY2hlY2tzIGZvciBub24gc3RyZWFtcy5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChuIDwgc3RyZWFtcy5sZW5ndGggLSAxICYmICFpc1JlYWRhYmxlKHN0cmVhbXNbbl0pKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKGBzdHJlYW1zWyR7bn1dYCwgb3JnU3RyZWFtc1tuXSwgJ211c3QgYmUgcmVhZGFibGUnKVxuICAgIH1cbiAgICBpZiAobiA+IDAgJiYgIWlzV3JpdGFibGUoc3RyZWFtc1tuXSkpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoYHN0cmVhbXNbJHtufV1gLCBvcmdTdHJlYW1zW25dLCAnbXVzdCBiZSB3cml0YWJsZScpXG4gICAgfVxuICB9XG4gIGxldCBvbmRyYWluXG4gIGxldCBvbmZpbmlzaFxuICBsZXQgb25yZWFkYWJsZVxuICBsZXQgb25jbG9zZVxuICBsZXQgZFxuICBmdW5jdGlvbiBvbmZpbmlzaGVkKGVycikge1xuICAgIGNvbnN0IGNiID0gb25jbG9zZVxuICAgIG9uY2xvc2UgPSBudWxsXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpXG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGQuZGVzdHJveShlcnIpXG4gICAgfSBlbHNlIGlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7XG4gICAgICBkLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuICBjb25zdCBoZWFkID0gc3RyZWFtc1swXVxuICBjb25zdCB0YWlsID0gcGlwZWxpbmUoc3RyZWFtcywgb25maW5pc2hlZClcbiAgY29uc3Qgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUoaGVhZClcbiAgY29uc3QgcmVhZGFibGUgPSAhIWlzUmVhZGFibGUodGFpbClcblxuICAvLyBUT0RPKHJvbmFnKTogQXZvaWQgZG91YmxlIGJ1ZmZlcmluZy5cbiAgLy8gSW1wbGVtZW50IFdyaXRhYmxlL1JlYWRhYmxlL0R1cGxleCB0cmFpdHMuXG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzM1MTUuXG4gIGQgPSBuZXcgRHVwbGV4KHtcbiAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgd3JpdGFibGVPYmplY3RNb2RlOiAhIShoZWFkICE9PSBudWxsICYmIGhlYWQgIT09IHVuZGVmaW5lZCAmJiBoZWFkLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgcmVhZGFibGVPYmplY3RNb2RlOiAhISh0YWlsICE9PSBudWxsICYmIHRhaWwgIT09IHVuZGVmaW5lZCAmJiB0YWlsLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgd3JpdGFibGUsXG4gICAgcmVhZGFibGVcbiAgfSlcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgZC5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGhlYWQud3JpdGUoY2h1bmssIGVuY29kaW5nKSkge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbmRyYWluID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9XG4gICAgZC5fZmluYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGhlYWQuZW5kKClcbiAgICAgIG9uZmluaXNoID0gY2FsbGJhY2tcbiAgICB9XG4gICAgaGVhZC5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25kcmFpbikge1xuICAgICAgICBjb25zdCBjYiA9IG9uZHJhaW5cbiAgICAgICAgb25kcmFpbiA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGFpbC5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZmluaXNoKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25maW5pc2hcbiAgICAgICAgb25maW5pc2ggPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGlmIChyZWFkYWJsZSkge1xuICAgIHRhaWwub24oJ3JlYWRhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9ucmVhZGFibGUpIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbnJlYWRhYmxlXG4gICAgICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRhaWwub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGQucHVzaChudWxsKVxuICAgIH0pXG4gICAgZC5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHRhaWwucmVhZCgpXG4gICAgICAgIGlmIChidWYgPT09IG51bGwpIHtcbiAgICAgICAgICBvbnJlYWRhYmxlID0gZC5fcmVhZFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZC5wdXNoKGJ1ZikpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiBvbmNsb3NlICE9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgb25kcmFpbiA9IG51bGxcbiAgICBvbmZpbmlzaCA9IG51bGxcbiAgICBpZiAob25jbG9zZSA9PT0gbnVsbCkge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbmNsb3NlID0gY2FsbGJhY2tcbiAgICAgIGRlc3Ryb3llcih0YWlsLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiBkXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBcnJheVByb3RvdHlwZVBvcCwgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzTm9kZVN0cmVhbSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy91dGlscycpXG5jb25zdCB7IHBpcGVsaW5lSW1wbDogcGwgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUnKVxuY29uc3QgeyBmaW5pc2hlZCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtJylcbmZ1bmN0aW9uIHBpcGVsaW5lKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgc2lnbmFsXG4gICAgbGV0IGVuZFxuICAgIGNvbnN0IGxhc3RBcmcgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICBpZiAobGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gJ29iamVjdCcgJiYgIWlzTm9kZVN0cmVhbShsYXN0QXJnKSAmJiAhaXNJdGVyYWJsZShsYXN0QXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5UHJvdG90eXBlUG9wKHN0cmVhbXMpXG4gICAgICBzaWduYWwgPSBvcHRpb25zLnNpZ25hbFxuICAgICAgZW5kID0gb3B0aW9ucy5lbmRcbiAgICB9XG4gICAgcGwoXG4gICAgICBzdHJlYW1zLFxuICAgICAgKGVyciwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBlbmRcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmluaXNoZWQsXG4gIHBpcGVsaW5lXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IE9iamVjdERlZmluZVByb3BlcnR5LCBPYmplY3RLZXlzLCBSZWZsZWN0QXBwbHkgfSA9IHJlcXVpcmUoJy4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7XG4gIHByb21pc2lmeTogeyBjdXN0b206IGN1c3RvbVByb21pc2lmeSB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL3V0aWwnKVxuY29uc3QgeyBzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMsIHByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9vcGVyYXRvcnMnKVxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUiB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL2Vycm9ycycpXG5jb25zdCBjb21wb3NlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UnKVxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5jb25zdCBpbnRlcm5hbEJ1ZmZlciA9IHt9XG5jb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4vc3RyZWFtL3Byb21pc2VzJylcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzJylcbmNvbnN0IFN0cmVhbSA9IChtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3knKS5TdHJlYW0pXG5TdHJlYW0uaXNEaXN0dXJiZWQgPSB1dGlscy5pc0Rpc3R1cmJlZFxuU3RyZWFtLmlzRXJyb3JlZCA9IHV0aWxzLmlzRXJyb3JlZFxuU3RyZWFtLmlzUmVhZGFibGUgPSB1dGlscy5pc1JlYWRhYmxlXG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvcmVhZGFibGUnKVxuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0S2V5cyhzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMpKSB7XG4gIGNvbnN0IG9wID0gc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBTdHJlYW0uUmVhZGFibGUuZnJvbShSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpKVxuICB9XG4gIE9iamVjdERlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLm5hbWVcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICdsZW5ndGgnLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBvcC5sZW5ndGhcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLlJlYWRhYmxlLnByb3RvdHlwZSwga2V5LCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBmbixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcbn1cbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdEtleXMocHJvbWlzZVJldHVybmluZ09wZXJhdG9ycykpIHtcbiAgY29uc3Qgb3AgPSBwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpXG4gIH1cbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubmFtZVxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLmxlbmd0aFxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0uUmVhZGFibGUucHJvdG90eXBlLCBrZXksIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IGZuLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlJylcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4JylcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtJylcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaCcpXG5TdHJlYW0ucGlwZWxpbmUgPSBwaXBlbGluZVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2FkZC1hYm9ydC1zaWduYWwnKVxuU3RyZWFtLmFkZEFib3J0U2lnbmFsID0gYWRkQWJvcnRTaWduYWxcblN0cmVhbS5maW5pc2hlZCA9IGVvc1xuU3RyZWFtLmRlc3Ryb3kgPSBkZXN0cm95ZXJcblN0cmVhbS5jb21wb3NlID0gY29tcG9zZVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzXG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0eShwaXBlbGluZSwgY3VzdG9tUHJvbWlzaWZ5LCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9taXNlcy5waXBlbGluZVxuICB9XG59KVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoZW9zLCBjdXN0b21Qcm9taXNpZnksIHtcbiAgX19wcm90b19fOiBudWxsLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzLmZpbmlzaGVkXG4gIH1cbn0pXG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtXG5TdHJlYW0uX2lzVWludDhBcnJheSA9IGZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5TdHJlYW0uX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IGZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuaWYgKFN0cmVhbSAmJiBwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU0gPT09ICdkaXNhYmxlJykge1xuICBjb25zdCBwcm9taXNlcyA9IFN0cmVhbS5wcm9taXNlc1xuXG4gIC8vIEV4cGxpY2l0IGV4cG9ydCBuYW1pbmcgaXMgbmVlZGVkIGZvciBFU01cbiAgbW9kdWxlLmV4cG9ydHMuX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyXG4gIG1vZHVsZS5leHBvcnRzLl9pc1VpbnQ4QXJyYXkgPSBTdHJlYW0uX2lzVWludDhBcnJheVxuICBtb2R1bGUuZXhwb3J0cy5pc0Rpc3R1cmJlZCA9IFN0cmVhbS5pc0Rpc3R1cmJlZFxuICBtb2R1bGUuZXhwb3J0cy5pc0Vycm9yZWQgPSBTdHJlYW0uaXNFcnJvcmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBTdHJlYW0uaXNSZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5SZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5Xcml0YWJsZSA9IFN0cmVhbS5Xcml0YWJsZVxuICBtb2R1bGUuZXhwb3J0cy5EdXBsZXggPSBTdHJlYW0uRHVwbGV4XG4gIG1vZHVsZS5leHBvcnRzLlRyYW5zZm9ybSA9IFN0cmVhbS5UcmFuc2Zvcm1cbiAgbW9kdWxlLmV4cG9ydHMuUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbiAgbW9kdWxlLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBTdHJlYW0uYWRkQWJvcnRTaWduYWxcbiAgbW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBTdHJlYW0uZmluaXNoZWRcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IFN0cmVhbS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzLnBpcGVsaW5lID0gU3RyZWFtLnBpcGVsaW5lXG4gIG1vZHVsZS5leHBvcnRzLmNvbXBvc2UgPSBTdHJlYW0uY29tcG9zZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHByb21pc2VzXG4gICAgfVxuICB9KVxuICBtb2R1bGUuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0uU3RyZWFtXG59IGVsc2Uge1xuICBjb25zdCBDdXN0b21TdHJlYW0gPSByZXF1aXJlKCcuLi9zdHJlYW0nKVxuICBjb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4uL3N0cmVhbS9wcm9taXNlcycpXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG5cbiAgLy8gRXhwbGljaXQgZXhwb3J0IG5hbWluZyBpcyBuZWVkZWQgZm9yIEVTTVxuICBtb2R1bGUuZXhwb3J0cy5fdWludDhBcnJheVRvQnVmZmVyID0gQ3VzdG9tU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXJcbiAgbW9kdWxlLmV4cG9ydHMuX2lzVWludDhBcnJheSA9IEN1c3RvbVN0cmVhbS5faXNVaW50OEFycmF5XG4gIG1vZHVsZS5leHBvcnRzLmlzRGlzdHVyYmVkID0gQ3VzdG9tU3RyZWFtLmlzRGlzdHVyYmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzRXJyb3JlZCA9IEN1c3RvbVN0cmVhbS5pc0Vycm9yZWRcbiAgbW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IEN1c3RvbVN0cmVhbS5pc1JlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLlJlYWRhYmxlID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLldyaXRhYmxlID0gQ3VzdG9tU3RyZWFtLldyaXRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLkR1cGxleCA9IEN1c3RvbVN0cmVhbS5EdXBsZXhcbiAgbW9kdWxlLmV4cG9ydHMuVHJhbnNmb3JtID0gQ3VzdG9tU3RyZWFtLlRyYW5zZm9ybVxuICBtb2R1bGUuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IEN1c3RvbVN0cmVhbS5QYXNzVGhyb3VnaFxuICBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IEN1c3RvbVN0cmVhbS5hZGRBYm9ydFNpZ25hbFxuICBtb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IEN1c3RvbVN0cmVhbS5maW5pc2hlZFxuICBtb2R1bGUuZXhwb3J0cy5kZXN0cm95ID0gQ3VzdG9tU3RyZWFtLmRlc3Ryb3lcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IG9yaWdpbmFsRGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IEN1c3RvbVN0cmVhbS5waXBlbGluZVxuICBtb2R1bGUuZXhwb3J0cy5jb21wb3NlID0gQ3VzdG9tU3RyZWFtLmNvbXBvc2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbVN0cmVhbSwgJ3Byb21pc2VzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH1cbiAgfSlcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gQ3VzdG9tU3RyZWFtLlN0cmVhbVxufVxuXG4vLyBBbGxvdyBkZWZhdWx0IGltcG9ydGluZ1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzXG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcignQnVmZmVyTGlzdCcpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QgKGJ1Zikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyTGlzdCkpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpc3QoYnVmKVxuICB9XG5cbiAgQnVmZmVyTGlzdC5faW5pdC5jYWxsKHRoaXMsIGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5faW5pdCA9IGZ1bmN0aW9uIF9pbml0IChidWYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN5bWJvbCwgeyB2YWx1ZTogdHJ1ZSB9KVxuXG4gIHRoaXMuX2J1ZnMgPSBbXVxuICB0aGlzLmxlbmd0aCA9IDBcblxuICBpZiAoYnVmKSB7XG4gICAgdGhpcy5hcHBlbmQoYnVmKVxuICB9XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiBfbmV3IChidWYpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0KGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX29mZnNldCA9IGZ1bmN0aW9uIF9vZmZzZXQgKG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIFswLCAwXVxuICB9XG5cbiAgbGV0IHRvdCA9IDBcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBfdCA9IHRvdCArIHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgaWYgKG9mZnNldCA8IF90IHx8IGkgPT09IHRoaXMuX2J1ZnMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIFtpLCBvZmZzZXQgLSB0b3RdXG4gICAgfVxuICAgIHRvdCA9IF90XG4gIH1cbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX3JldmVyc2VPZmZzZXQgPSBmdW5jdGlvbiAoYmxPZmZzZXQpIHtcbiAgY29uc3QgYnVmZmVySWQgPSBibE9mZnNldFswXVxuICBsZXQgb2Zmc2V0ID0gYmxPZmZzZXRbMV1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcklkOyBpKyspIHtcbiAgICBvZmZzZXQgKz0gdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCkge1xuICBpZiAoaW5kZXggPiB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQoaW5kZXgpXG5cbiAgcmV0dXJuIHRoaXMuX2J1ZnNbb2Zmc2V0WzBdXVtvZmZzZXRbMV1dXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicgJiYgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5kID09PSAnbnVtYmVyJyAmJiBlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhpcy5jb3B5KG51bGwsIDAsIHN0YXJ0LCBlbmQpXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkc3QsIGRzdFN0YXJ0LCBzcmNTdGFydCwgc3JjRW5kKSB7XG4gIGlmICh0eXBlb2Ygc3JjU3RhcnQgIT09ICdudW1iZXInIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgIHNyY1N0YXJ0ID0gMFxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcmNFbmQgIT09ICdudW1iZXInIHx8IHNyY0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgc3JjRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzcmNTdGFydCA+PSB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiBkc3QgfHwgQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICBpZiAoc3JjRW5kIDw9IDApIHtcbiAgICByZXR1cm4gZHN0IHx8IEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgY29uc3QgY29weSA9ICEhZHN0XG4gIGNvbnN0IG9mZiA9IHRoaXMuX29mZnNldChzcmNTdGFydClcbiAgY29uc3QgbGVuID0gc3JjRW5kIC0gc3JjU3RhcnRcbiAgbGV0IGJ5dGVzID0gbGVuXG4gIGxldCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICBsZXQgc3RhcnQgPSBvZmZbMV1cblxuICAvLyBjb3B5L3NsaWNlIGV2ZXJ5dGhpbmdcbiAgaWYgKHNyY1N0YXJ0ID09PSAwICYmIHNyY0VuZCA9PT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIHtcbiAgICAgIC8vIHNsaWNlLCBidXQgZnVsbCBjb25jYXQgaWYgbXVsdGlwbGUgYnVmZmVyc1xuICAgICAgcmV0dXJuIHRoaXMuX2J1ZnMubGVuZ3RoID09PSAxXG4gICAgICAgID8gdGhpcy5fYnVmc1swXVxuICAgICAgICA6IEJ1ZmZlci5jb25jYXQodGhpcy5fYnVmcywgdGhpcy5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gY29weSwgbmVlZCB0byBjb3B5IGluZGl2aWR1YWwgYnVmZmVyc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmKVxuICAgICAgYnVmb2ZmICs9IHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdFxuICB9XG5cbiAgLy8gZWFzeSwgY2hlYXAgY2FzZSB3aGVyZSBpdCdzIGEgc3Vic2V0IG9mIG9uZSBvZiB0aGUgYnVmZmVyc1xuICBpZiAoYnl0ZXMgPD0gdGhpcy5fYnVmc1tvZmZbMF1dLmxlbmd0aCAtIHN0YXJ0KSB7XG4gICAgcmV0dXJuIGNvcHlcbiAgICAgID8gdGhpcy5fYnVmc1tvZmZbMF1dLmNvcHkoZHN0LCBkc3RTdGFydCwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICA6IHRoaXMuX2J1ZnNbb2ZmWzBdXS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgfVxuXG4gIGlmICghY29weSkge1xuICAgIC8vIGEgc2xpY2UsIHdlIG5lZWQgc29tZXRoaW5nIHRvIGNvcHkgaW4gdG9cbiAgICBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG9mZlswXTsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsID0gdGhpcy5fYnVmc1tpXS5sZW5ndGggLSBzdGFydFxuXG4gICAgaWYgKGJ5dGVzID4gbCkge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydClcbiAgICAgIGJ1Zm9mZiArPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbaV0uY29weShkc3QsIGJ1Zm9mZiwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICBidWZvZmYgKz0gbFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBieXRlcyAtPSBsXG5cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMFxuICAgIH1cbiAgfVxuXG4gIC8vIHNhZmVndWFyZCBzbyB0aGF0IHdlIGRvbid0IHJldHVybiB1bmluaXRpYWxpemVkIG1lbW9yeVxuICBpZiAoZHN0Lmxlbmd0aCA+IGJ1Zm9mZikgcmV0dXJuIGRzdC5zbGljZSgwLCBidWZvZmYpXG5cbiAgcmV0dXJuIGRzdFxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGFsbG93U2xpY2UgPSBmdW5jdGlvbiBzaGFsbG93U2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwXG4gIGVuZCA9IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gdGhpcy5sZW5ndGggOiBlbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiB0aGlzLl9uZXcoKVxuICB9XG5cbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSB0aGlzLl9vZmZzZXQoc3RhcnQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMuX29mZnNldChlbmQpXG4gIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9idWZzLnNsaWNlKHN0YXJ0T2Zmc2V0WzBdLCBlbmRPZmZzZXRbMF0gKyAxKVxuXG4gIGlmIChlbmRPZmZzZXRbMV0gPT09IDApIHtcbiAgICBidWZmZXJzLnBvcCgpXG4gIH0gZWxzZSB7XG4gICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZE9mZnNldFsxXSlcbiAgfVxuXG4gIGlmIChzdGFydE9mZnNldFsxXSAhPT0gMCkge1xuICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHN0YXJ0T2Zmc2V0WzFdKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuX25ldyhidWZmZXJzKVxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIC8vIGZpcnN0LCBub3JtYWxpemUgdGhlIGFyZ3VtZW50LCBpbiBhY2NvcmRhbmNlIHdpdGggaG93IEJ1ZmZlciBkb2VzIGl0XG4gIGJ5dGVzID0gTWF0aC50cnVuYyhieXRlcylcbiAgLy8gZG8gbm90aGluZyBpZiBub3QgYSBwb3NpdGl2ZSBudW1iZXJcbiAgaWYgKE51bWJlci5pc05hTihieXRlcykgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuIHRoaXNcblxuICB3aGlsZSAodGhpcy5fYnVmcy5sZW5ndGgpIHtcbiAgICBpZiAoYnl0ZXMgPj0gdGhpcy5fYnVmc1swXS5sZW5ndGgpIHtcbiAgICAgIGJ5dGVzIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLmxlbmd0aCAtPSB0aGlzLl9idWZzWzBdLmxlbmd0aFxuICAgICAgdGhpcy5fYnVmcy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbMF0gPSB0aGlzLl9idWZzWzBdLnNsaWNlKGJ5dGVzKVxuICAgICAgdGhpcy5sZW5ndGggLT0gYnl0ZXNcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZHVwbGljYXRlID0gZnVuY3Rpb24gZHVwbGljYXRlICgpIHtcbiAgY29uc3QgY29weSA9IHRoaXMuX25ldygpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29weS5hcHBlbmQodGhpcy5fYnVmc1tpXSlcbiAgfVxuXG4gIHJldHVybiBjb3B5XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoYnVmKSB7XG4gIGlmIChidWYgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoYnVmLmJ1ZmZlcikge1xuICAgIC8vIGFwcGVuZCBhIHZpZXcgb2YgdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKSlcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJ1ZikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmW2ldKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLl9pc0J1ZmZlckxpc3QoYnVmKSkge1xuICAgIC8vIHVud3JhcCBhcmd1bWVudCBpbnRvIGluZGl2aWR1YWwgQnVmZmVyTGlzdHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmLl9idWZzW2ldKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjb2VyY2UgbnVtYmVyIGFyZ3VtZW50cyB0byBzdHJpbmdzLCBzaW5jZSBCdWZmZXIobnVtYmVyKSBkb2VzXG4gICAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvblxuICAgIGlmICh0eXBlb2YgYnVmID09PSAnbnVtYmVyJykge1xuICAgICAgYnVmID0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmKSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbiBhcHBlbmRCdWZmZXIgKGJ1Zikge1xuICB0aGlzLl9idWZzLnB1c2goYnVmKVxuICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkoc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQnVmZmVyTGlzdCwgb3IgVWludDhBcnJheS4nKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWFyY2ggPT09ICdudW1iZXInKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oW3NlYXJjaF0pXG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWFyY2ggPSBCdWZmZXIuZnJvbShzZWFyY2gsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKHRoaXMuX2lzQnVmZmVyTGlzdChzZWFyY2gpKSB7XG4gICAgc2VhcmNoID0gc2VhcmNoLnNsaWNlKClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaC5idWZmZXIpKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oc2VhcmNoLmJ1ZmZlciwgc2VhcmNoLmJ5dGVPZmZzZXQsIHNlYXJjaC5ieXRlTGVuZ3RoKVxuICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgIHNlYXJjaCA9IEJ1ZmZlci5mcm9tKHNlYXJjaClcbiAgfVxuXG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQgfHwgMClcblxuICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IDBcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gdGhpcy5sZW5ndGggKyBvZmZzZXRcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gMFxuICB9XG5cbiAgaWYgKHNlYXJjaC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2Zmc2V0ID4gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aCA6IG9mZnNldFxuICB9XG5cbiAgY29uc3QgYmxPZmZzZXQgPSB0aGlzLl9vZmZzZXQob2Zmc2V0KVxuICBsZXQgYmxJbmRleCA9IGJsT2Zmc2V0WzBdIC8vIGluZGV4IG9mIHdoaWNoIGludGVybmFsIGJ1ZmZlciB3ZSdyZSB3b3JraW5nIG9uXG4gIGxldCBidWZmT2Zmc2V0ID0gYmxPZmZzZXRbMV0gLy8gb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgd2UncmUgd29ya2luZyBvblxuXG4gIC8vIHNjYW4gb3ZlciBlYWNoIGJ1ZmZlclxuICBmb3IgKDsgYmxJbmRleCA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBibEluZGV4KyspIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5fYnVmc1tibEluZGV4XVxuXG4gICAgd2hpbGUgKGJ1ZmZPZmZzZXQgPCBidWZmLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2luZG93ID0gYnVmZi5sZW5ndGggLSBidWZmT2Zmc2V0XG5cbiAgICAgIGlmIChhdmFpbGFibGVXaW5kb3cgPj0gc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuYXRpdmVTZWFyY2hSZXN1bHQgPSBidWZmLmluZGV4T2Yoc2VhcmNoLCBidWZmT2Zmc2V0KVxuXG4gICAgICAgIGlmIChuYXRpdmVTZWFyY2hSZXN1bHQgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIG5hdGl2ZVNlYXJjaFJlc3VsdF0pXG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0ID0gYnVmZi5sZW5ndGggLSBzZWFyY2gubGVuZ3RoICsgMSAvLyBlbmQgb2YgbmF0aXZlIHNlYXJjaCB3aW5kb3dcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJldk9mZnNldCA9IHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIGJ1ZmZPZmZzZXRdKVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXRjaChyZXZPZmZzZXQsIHNlYXJjaCkpIHtcbiAgICAgICAgICByZXR1cm4gcmV2T2Zmc2V0XG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWZmT2Zmc2V0ID0gMFxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9tYXRjaCA9IGZ1bmN0aW9uIChvZmZzZXQsIHNlYXJjaCkge1xuICBpZiAodGhpcy5sZW5ndGggLSBvZmZzZXQgPCBzZWFyY2gubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBzZWFyY2hPZmZzZXQgPSAwOyBzZWFyY2hPZmZzZXQgPCBzZWFyY2gubGVuZ3RoOyBzZWFyY2hPZmZzZXQrKykge1xuICAgIGlmICh0aGlzLmdldChvZmZzZXQgKyBzZWFyY2hPZmZzZXQpICE9PSBzZWFyY2hbc2VhcmNoT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbjsoZnVuY3Rpb24gKCkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHJlYWREb3VibGVCRTogOCxcbiAgICByZWFkRG91YmxlTEU6IDgsXG4gICAgcmVhZEZsb2F0QkU6IDQsXG4gICAgcmVhZEZsb2F0TEU6IDQsXG4gICAgcmVhZEJpZ0ludDY0QkU6IDgsXG4gICAgcmVhZEJpZ0ludDY0TEU6IDgsXG4gICAgcmVhZEJpZ1VJbnQ2NEJFOiA4LFxuICAgIHJlYWRCaWdVSW50NjRMRTogOCxcbiAgICByZWFkSW50MzJCRTogNCxcbiAgICByZWFkSW50MzJMRTogNCxcbiAgICByZWFkVUludDMyQkU6IDQsXG4gICAgcmVhZFVJbnQzMkxFOiA0LFxuICAgIHJlYWRJbnQxNkJFOiAyLFxuICAgIHJlYWRJbnQxNkxFOiAyLFxuICAgIHJlYWRVSW50MTZCRTogMixcbiAgICByZWFkVUludDE2TEU6IDIsXG4gICAgcmVhZEludDg6IDEsXG4gICAgcmVhZFVJbnQ4OiAxLFxuICAgIHJlYWRJbnRCRTogbnVsbCxcbiAgICByZWFkSW50TEU6IG51bGwsXG4gICAgcmVhZFVJbnRCRTogbnVsbCxcbiAgICByZWFkVUludExFOiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IG0gaW4gbWV0aG9kcykge1xuICAgIChmdW5jdGlvbiAobSkge1xuICAgICAgaWYgKG1ldGhvZHNbbV0gPT09IG51bGwpIHtcbiAgICAgICAgQnVmZmVyTGlzdC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbiAob2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKVttXSgwLCBieXRlTGVuZ3RoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBCdWZmZXJMaXN0LnByb3RvdHlwZVttXSA9IGZ1bmN0aW9uIChvZmZzZXQgPSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtZXRob2RzW21dKVttXSgwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfShtKSlcbiAgfVxufSgpKVxuXG4vLyBVc2VkIGludGVybmFsbHkgYnkgdGhlIGNsYXNzIGFuZCBhbHNvIGFzIGFuIGluZGljYXRvciBvZiB0aGlzIG9iamVjdCBiZWluZ1xuLy8gYSBgQnVmZmVyTGlzdGAuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJMaXN0YCBpbiBhIGJyb3dzZXJcbi8vIGVudmlyb25tZW50IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGVcbi8vIEJ1ZmZlckxpc3QgY2xhc3MgYW5kIHNvbWUgYEJ1ZmZlckxpc3RgcyBtaWdodCBiZSBgQnVmZmVyTGlzdGBzLlxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX2lzQnVmZmVyTGlzdCA9IGZ1bmN0aW9uIF9pc0J1ZmZlckxpc3QgKGIpIHtcbiAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCdWZmZXJMaXN0IHx8IEJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0KGIpXG59XG5cbkJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gaXNCdWZmZXJMaXN0IChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYltzeW1ib2xdXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyTGlzdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IER1cGxleFN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLkR1cGxleFxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5jb25zdCBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9CdWZmZXJMaXN0JylcblxuZnVuY3Rpb24gQnVmZmVyTGlzdFN0cmVhbSAoY2FsbGJhY2spIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0pKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcblxuICAgIGNvbnN0IHBpcGVyID0gZnVuY3Rpb24gcGlwZXIgKGVycikge1xuICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrKGVycilcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLm9uKCdwaXBlJywgZnVuY3Rpb24gb25QaXBlIChzcmMpIHtcbiAgICAgIHNyYy5vbignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuICAgIHRoaXMub24oJ3VucGlwZScsIGZ1bmN0aW9uIG9uVW5waXBlIChzcmMpIHtcbiAgICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuXG4gICAgY2FsbGJhY2sgPSBudWxsXG4gIH1cblxuICBCdWZmZXJMaXN0Ll9pbml0LmNhbGwodGhpcywgY2FsbGJhY2spXG4gIER1cGxleFN0cmVhbS5jYWxsKHRoaXMpXG59XG5cbmluaGVyaXRzKEJ1ZmZlckxpc3RTdHJlYW0sIER1cGxleFN0cmVhbSlcbk9iamVjdC5hc3NpZ24oQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUsIEJ1ZmZlckxpc3QucHJvdG90eXBlKVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fbmV3ID0gZnVuY3Rpb24gX25ldyAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiBfd3JpdGUgKGJ1ZiwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2FwcGVuZEJ1ZmZlcihidWYpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIF9yZWFkIChzaXplKSB7XG4gIGlmICghdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpXG4gIH1cblxuICBzaXplID0gTWF0aC5taW4oc2l6ZSwgdGhpcy5sZW5ndGgpXG4gIHRoaXMucHVzaCh0aGlzLnNsaWNlKDAsIHNpemUpKVxuICB0aGlzLmNvbnN1bWUoc2l6ZSlcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kIChjaHVuaykge1xuICBEdXBsZXhTdHJlYW0ucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGNodW5rKVxuXG4gIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHRoaXMuc2xpY2UoKSlcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIF9kZXN0cm95IChlcnIsIGNiKSB7XG4gIHRoaXMuX2J1ZnMubGVuZ3RoID0gMFxuICB0aGlzLmxlbmd0aCA9IDBcbiAgY2IoZXJyKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5faXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gX2lzQnVmZmVyTGlzdCAoYikge1xuICByZXR1cm4gYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0gfHwgYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3QgfHwgQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QoYilcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QgPSBCdWZmZXJMaXN0LmlzQnVmZmVyTGlzdFxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlckxpc3RTdHJlYW1cbm1vZHVsZS5leHBvcnRzLkJ1ZmZlckxpc3RTdHJlYW0gPSBCdWZmZXJMaXN0U3RyZWFtXG5tb2R1bGUuZXhwb3J0cy5CdWZmZXJMaXN0ID0gQnVmZmVyTGlzdFxuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsIm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgPyBwcm9jZXNzLm5leHRUaWNrLmJpbmQocHJvY2VzcylcbiAgOiByZXF1aXJlKCcuL3F1ZXVlLW1pY3JvdGFzaycpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEZpeGVkRklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICBpZiAoIShod20gPiAwKSB8fCAoKGh3bSAtIDEpICYgaHdtKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdNYXggc2l6ZSBmb3IgYSBGaXhlZEZJRk8gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvJylcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShod20pXG4gICAgdGhpcy5tYXNrID0gaHdtIC0gMVxuICAgIHRoaXMudG9wID0gMFxuICAgIHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5idWZmZXJbdGhpcy50b3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuYnVmZmVyW3RoaXMudG9wXSA9IGRhdGFcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnRtID0gKHRoaXMuYnRtICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gbGFzdFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9PT0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICB9XG5cbiAgcHVzaCAodmFsKSB7XG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFpbC5wZWVrKClcbiAgfVxuXG4gIGlzRW1wdHkgKCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpXG4gIH1cbn1cbiIsImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjYgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxMyBmcm9tIHJlYWQsIGFuZCA5IGZyb20gd3JpdGUpXG5jb25zdCBNQVggPSAoKDEgPDwgMjYpIC0gMSlcblxuLy8gU2hhcmVkIHN0YXRlXG5jb25zdCBPUEVOSU5HICAgICAgID0gMGIwMDAxXG5jb25zdCBQUkVERVNUUk9ZSU5HID0gMGIwMDEwXG5jb25zdCBERVNUUk9ZSU5HICAgID0gMGIwMTAwXG5jb25zdCBERVNUUk9ZRUQgICAgID0gMGIxMDAwXG5cbmNvbnN0IE5PVF9PUEVOSU5HID0gTUFYIF4gT1BFTklOR1xuY29uc3QgTk9UX1BSRURFU1RST1lJTkcgPSBNQVggXiBQUkVERVNUUk9ZSU5HXG5cbi8vIFJlYWQgc3RhdGUgKDQgYml0IG9mZnNldCBmcm9tIHNoYXJlZCBzdGF0ZSlcbmNvbnN0IFJFQURfQUNUSVZFICAgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMSA8PCA0XG5jb25zdCBSRUFEX1BSSU1BUlkgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9TWU5DICAgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMTAwIDw8IDRcbmNvbnN0IFJFQURfUVVFVUVEICAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMCA8PCA0XG5jb25zdCBSRUFEX1JFU1VNRUQgICAgICAgICAgPSAwYjAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMTAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU5ESU5HICAgICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRfREFUQSAgICAgICAgPSAwYjAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMTAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVFRFRF9SRUFEQUJMRSA9IDBiMDAwMTAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0RPTkUgICAgICAgICAgICAgPSAwYjAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMTAwMDAwMDAwMDAxIDw8IDQgLy8gYWxzbyBhY3RpdmVcbmNvbnN0IFJFQURfTkVFRFNfUFVTSCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMCA8PCA0XG5cbi8vIENvbWJpbmVkIHJlYWQgc3RhdGVcbmNvbnN0IFJFQURfRkxPV0lORyA9IFJFQURfUkVTVU1FRCB8IFJFQURfUElQRV9EUkFJTkVEXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQyA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQ19BTkRfTkVFRFNfUFVTSCA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSA9IFJFQURfUFJJTUFSWSB8IFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCA9IFJFQURfRU1JVF9SRUFEQUJMRSB8IFJFQURfUVVFVUVEXG5cbmNvbnN0IFJFQURfTk9UX0FDVElWRSAgICAgICAgICAgICA9IE1BWCBeIFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX05PTl9QUklNQVJZICAgICAgICAgICAgPSBNQVggXiBSRUFEX1BSSU1BUllcbmNvbnN0IFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRCA9IE1BWCBeIChSRUFEX1BSSU1BUlkgfCBSRUFEX05FRURTX1BVU0gpXG5jb25zdCBSRUFEX05PVF9TWU5DICAgICAgICAgICAgICAgPSBNQVggXiBSRUFEX1NZTkNcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuXG4vLyBXcml0ZSBzdGF0ZSAoMTcgYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxMyBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDEgPDwgMTdcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAxMCA8PCAxN1xuY29uc3QgV1JJVEVfU1lOQyAgICAgICA9IDBiMDAwMDAwMTAwIDw8IDE3XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDEwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX1VORFJBSU5FRCAgPSAwYjAwMDAxMDAwMCA8PCAxN1xuY29uc3QgV1JJVEVfRE9ORSAgICAgICA9IDBiMDAwMTAwMDAwIDw8IDE3XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDEwMDAwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX05FWFRfVElDSyAgPSAwYjAxMDAwMDAwMSA8PCAxNyAvLyBhbHNvIGFjdGl2ZVxuY29uc3QgV1JJVEVfRklOSVNISU5HICA9IDBiMTAwMDAwMDAwIDw8IDE3XG5cbmNvbnN0IFdSSVRFX05PVF9BQ1RJVkUgICAgPSBNQVggXiBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX05PVF9TWU5DICAgICAgPSBNQVggXiBXUklURV9TWU5DXG5jb25zdCBXUklURV9OT05fUFJJTUFSWSAgID0gTUFYIF4gV1JJVEVfUFJJTUFSWVxuY29uc3QgV1JJVEVfTk9UX0ZJTklTSElORyA9IE1BWCBeIFdSSVRFX0ZJTklTSElOR1xuY29uc3QgV1JJVEVfRFJBSU5FRCAgICAgICA9IE1BWCBeIFdSSVRFX1VORFJBSU5FRFxuY29uc3QgV1JJVEVfTk9UX1FVRVVFRCAgICA9IE1BWCBeIFdSSVRFX1FVRVVFRFxuY29uc3QgV1JJVEVfTk9UX05FWFRfVElDSyA9IE1BWCBeIFdSSVRFX05FWFRfVElDS1xuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfU1lOQyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1NZTkNcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuXG5jb25zdCBhc3luY0l0ZXJhdG9yID0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgU3ltYm9sKCdhc3luY0l0ZXJhdG9yJylcblxuY2xhc3MgV3JpdGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBXcml0YWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFdyaXRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFdyaXRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFdyaXRhYmxlIHx8IG1hcFxuICAgIHRoaXMuYWZ0ZXJXcml0ZSA9IGFmdGVyV3JpdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljayA9IHVwZGF0ZVdyaXRlTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RPTkUpICE9PSAwXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBpZiAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyaykge1xuICAgICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1FVRVVFRFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORURcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1FVRVVFRFxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zdHJlYW0ub25jZSgnZmluaXNoJywgZGF0YSlcbiAgICBlbHNlIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlID0gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFdSSVRFX0ZJTklTSElORykgJiBXUklURV9OT05fUFJJTUFSWVxuICB9XG5cbiAgYXV0b0JhdGNoIChkYXRhLCBjYikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEX0FORF9BQ1RJVkUpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIE9QRU5fU1RBVFVTKSAhPT0gMCkgcmV0dXJuIGNiKG51bGwpXG4gICAgc3RyZWFtLl93cml0ZXYoYnVmZmVyLCBjYilcbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NUQVRVUykgPT09IFdSSVRFX1FVRVVFRCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1NZTkNcbiAgICAgIHN0cmVhbS5fd3JpdGUoZGF0YSwgdGhpcy5hZnRlcldyaXRlKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfU1lOQ1xuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRklOSVNISU5HX1NUQVRVUykgPT09IFdSSVRFX0ZJTklTSElORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfQUNUSVZFKSAmIFdSSVRFX05PVF9GSU5JU0hJTkdcbiAgICAgIHN0cmVhbS5fZmluYWwoYWZ0ZXJGaW5hbC5iaW5kKHRoaXMpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX05FWFRfVElDSykgIT09IDApIHJldHVyblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ORVhUX1RJQ0tcbiAgICBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFJlYWRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwUmVhZGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhSZWFkYWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhSZWFkYWJsZSB8fCBieXRlTGVuZ3RoIHx8IGRlZmF1bHRCeXRlTGVuZ3RoXG4gICAgdGhpcy5tYXAgPSBtYXBSZWFkYWJsZSB8fCBtYXBcbiAgICB0aGlzLnBpcGVUbyA9IG51bGxcbiAgICB0aGlzLmFmdGVyUmVhZCA9IGFmdGVyUmVhZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlUmVhZE5ULmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBlbmRlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpICE9PSAwXG4gIH1cblxuICBwaXBlIChwaXBlVG8sIGNiKSB7XG4gICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBpcGUgdG8gb25lIGRlc3RpbmF0aW9uJylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG51bGxcblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICAgIHRoaXMucGlwZVRvID0gcGlwZVRvXG4gICAgdGhpcy5waXBlbGluZSA9IG5ldyBQaXBlbGluZSh0aGlzLnN0cmVhbSwgcGlwZVRvLCBjYilcblxuICAgIGlmIChjYikgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcblxuICAgIGlmIChpc1N0cmVhbXgocGlwZVRvKSkge1xuICAgICAgcGlwZVRvLl93cml0YWJsZVN0YXRlLnBpcGVsaW5lID0gdGhpcy5waXBlbGluZVxuICAgICAgaWYgKGNiKSBwaXBlVG8ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcbiAgICAgIHBpcGVUby5vbignZmluaXNoJywgdGhpcy5waXBlbGluZS5maW5pc2hlZC5iaW5kKHRoaXMucGlwZWxpbmUpKSAvLyBUT0RPOiBqdXN0IGNhbGwgZmluaXNoZWQgZnJvbSBwaXBlVG8gaXRzZWxmXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9uZXJyb3IgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8pXG4gICAgICBjb25zdCBvbmNsb3NlID0gdGhpcy5waXBlbGluZS5kb25lLmJpbmQodGhpcy5waXBlbGluZSwgcGlwZVRvLCBudWxsKSAvLyBvbmNsb3NlIGhhcyBhIHdlaXJkIGJvb2wgYXJnXG4gICAgICBwaXBlVG8ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIHBpcGVUby5vbignY2xvc2UnLCBvbmNsb3NlKVxuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpXG4gICAgfVxuXG4gICAgcGlwZVRvLm9uKCdkcmFpbicsIGFmdGVyRHJhaW4uYmluZCh0aGlzKSlcbiAgICB0aGlzLnN0cmVhbS5lbWl0KCdwaXBpbmcnLCBwaXBlVG8pXG4gICAgcGlwZVRvLmVtaXQoJ3BpcGUnLCB0aGlzLnN0cmVhbSlcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRU5ESU5HKSAmIFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIHRoaXMucXVldWUucHVzaChkYXRhKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9RVUVVRUQpICYgUkVBRF9QVVNIRURcblxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrXG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucXVldWUuc2hpZnQoKVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICBpZiAodGhpcy5idWZmZXJlZCA9PT0gMCkgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX1FVRVVFRFxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgbGV0IHRhaWxcbiAgICBjb25zdCBwZW5kaW5nID0gW11cblxuICAgIHdoaWxlICgodGFpbCA9IHRoaXMucXVldWUuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGVuZGluZy5wdXNoKHRhaWwpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKGRhdGEpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucXVldWUucHVzaChwZW5kaW5nW2ldKVxuICAgIH1cbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkcmFpbiAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0ZMT1dJTkcpICE9PSAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgdGhpcy5kcmFpbigpXG5cbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyayAmJiAoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFNIT1VMRF9OT1RfUkVBRCkgPT09IDApIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX1NZTkNfQU5EX05FRURTX1BVU0hcbiAgICAgIHN0cmVhbS5fcmVhZCh0aGlzLmFmdGVyUmVhZClcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfU1lOQ1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkUpID09PSAwKSB0aGlzLmRyYWluKClcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFQURBQkxFX1NUQVRVUykgPT09IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJylcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTkRJTkdfU1RBVFVTKSA9PT0gUkVBRF9FTkRJTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRE9ORSkgJiBSRUFEX05PVF9FTkRJTkdcbiAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZSU5HXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRoaXMucGlwZVRvLmVuZCgpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfTkVYVF9USUNLKSAhPT0gMCkgcmV0dXJuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfTkVYVF9USUNLXG4gICAgcXVldWVUaWNrKHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljaylcbiAgfVxufVxuXG5jbGFzcyBUcmFuc2Zvcm1TdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0pIHtcbiAgICB0aGlzLmRhdGEgPSBudWxsXG4gICAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGFmdGVyVHJhbnNmb3JtLmJpbmQoc3RyZWFtKVxuICAgIHRoaXMuYWZ0ZXJGaW5hbCA9IG51bGxcbiAgfVxufVxuXG5jbGFzcyBQaXBlbGluZSB7XG4gIGNvbnN0cnVjdG9yIChzcmMsIGRzdCwgY2IpIHtcbiAgICB0aGlzLmZyb20gPSBzcmNcbiAgICB0aGlzLnRvID0gZHN0XG4gICAgdGhpcy5hZnRlclBpcGUgPSBjYlxuICAgIHRoaXMuZXJyb3IgPSBudWxsXG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IGZhbHNlXG4gIH1cblxuICBmaW5pc2hlZCAoKSB7XG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IHRydWVcbiAgfVxuXG4gIGRvbmUgKHN0cmVhbSwgZXJyKSB7XG4gICAgaWYgKGVycikgdGhpcy5lcnJvciA9IGVyclxuXG4gICAgaWYgKHN0cmVhbSA9PT0gdGhpcy50bykge1xuICAgICAgdGhpcy50byA9IG51bGxcblxuICAgICAgaWYgKHRoaXMuZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHRoaXMuZnJvbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwIHx8ICF0aGlzLnBpcGVUb0ZpbmlzaGVkKSB7XG4gICAgICAgICAgdGhpcy5mcm9tLmRlc3Ryb3kodGhpcy5lcnJvciB8fCBuZXcgRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLmZyb20pIHtcbiAgICAgIHRoaXMuZnJvbSA9IG51bGxcblxuICAgICAgaWYgKHRoaXMudG8gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ET05FKSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMudG8uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignUmVhZGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgZW5kaW5nJykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWZ0ZXJQaXBlICE9PSBudWxsKSB0aGlzLmFmdGVyUGlwZSh0aGlzLmVycm9yKVxuICAgIHRoaXMudG8gPSB0aGlzLmZyb20gPSB0aGlzLmFmdGVyUGlwZSA9IG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlckRyYWluICgpIHtcbiAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkVfQU5EX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgZWxzZSB0aGlzLmRyYWluKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJGaW5hbCAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gIGlmIChlcnIpIHN0cmVhbS5kZXN0cm95KGVycilcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ET05FXG4gICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpXG4gIH1cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICB9XG5cbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQUNUSVZFXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZXN0cm95IChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoIWVyciAmJiB0aGlzLmVycm9yICE9PSBTVFJFQU1fREVTVFJPWUVEKSBlcnIgPSB0aGlzLmVycm9yXG4gIGlmIChlcnIpIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZRURcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcblxuICBjb25zdCBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuXG4gIGlmIChycyAhPT0gbnVsbCAmJiBycy5waXBlbGluZSAhPT0gbnVsbCkgcnMucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcbiAgaWYgKHdzICE9PSBudWxsICYmIHdzLnBpcGVsaW5lICE9PSBudWxsKSB3cy5waXBlbGluZS5kb25lKHN0cmVhbSwgZXJyKVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RSQUlOX1NUQVRVUykgPT09IFdSSVRFX1VORFJBSU5FRCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfRFJBSU5FRFxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0VNSVRfRFJBSU4pID09PSBXUklURV9FTUlUX0RSQUlOKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICAgIH1cbiAgfVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9TWU5DKSA9PT0gMCkgdGhpcy51cGRhdGUoKVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWFkTlQgKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JpdGVOVCAoKSB7XG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJPcGVuIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUlORykgPT09IDApIHtcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfU1RBVFVTKSA9PT0gMCkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BSSU1BUllcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUFJJTUFSWVxuICAgIHN0cmVhbS5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gTk9UX0FDVElWRVxuXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybSAoZXJyLCBkYXRhKSB7XG4gIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuYWZ0ZXJXcml0ZShlcnIpXG59XG5cbmNsYXNzIFN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSAwXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG51bGxcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbnVsbFxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLm9wZW4pIHRoaXMuX29wZW4gPSBvcHRzLm9wZW5cbiAgICAgIGlmIChvcHRzLmRlc3Ryb3kpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRzLmRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnByZWRlc3Ryb3kpIHRoaXMuX3ByZWRlc3Ryb3kgPSBvcHRzLnByZWRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnNpZ25hbCkge1xuICAgICAgICBvcHRzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcblxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUFJFREVTVFJPWUlOR1xuICAgICAgdGhpcy5fcHJlZGVzdHJveSgpXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSAmPSBOT1RfUFJFREVTVFJPWUlOR1xuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgfVxuICB9XG5cbiAgb24gKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChuYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gKFJFQURfRU1JVF9EQVRBIHwgUkVBRF9SRVNVTUVEKVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVF9SRUFEQUJMRVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkcmFpbicpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRU1JVF9EUkFJTlxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgZm4pXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnJlYWQpIHRoaXMuX3JlYWQgPSBvcHRzLnJlYWRcbiAgICAgIGlmIChvcHRzLmVhZ2VyT3BlbikgdGhpcy5yZXN1bWUoKS5wYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHBpcGUgKGRlc3QsIGNiKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5waXBlKGRlc3QsIGNiKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiBkZXN0XG4gIH1cblxuICByZWFkICgpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkKClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUudW5zaGlmdChkYXRhKVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFU1VNRURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfUEFVU0VEXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHN0YXRpYyBpc0JhY2twcmVzc3VyZWQgKHdzKSB7XG4gICAgcmV0dXJuICh3cy5fZHVwbGV4U3RhdGUgJiBXUklURV9CQUNLUFJFU1NVUkVfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgRHVwbGV4IGV4dGVuZHMgUmVhZGFibGUgeyAvLyBhbmQgV3JpdGFibGVcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSBPUEVOSU5HXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgZGVzdC5vbignZmluaXNoJywgKCkgPT4geyBmaW4gPSB0cnVlIH0pXG4gICAgZGVzdC5vbignZXJyb3InLCBlcnIgPT4geyBlcnJvciA9IGVycm9yIHx8IGVyciB9KVxuICAgIGRlc3Qub24oJ2Nsb3NlJywgKCkgPT4gZG9uZShlcnJvciB8fCAoZmluID8gbnVsbCA6IFBSRU1BVFVSRV9DTE9TRSkpKVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSAoc3RyZWFtKSB7XG4gIHJldHVybiAhIXN0cmVhbS5fcmVhZGFibGVTdGF0ZSB8fCAhIXN0cmVhbS5fd3JpdGFibGVTdGF0ZVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gdHlwZW9mIHN0cmVhbS5fZHVwbGV4U3RhdGUgPT09ICdudW1iZXInICYmIGlzU3RyZWFtKHN0cmVhbSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtRXJyb3IgKHN0cmVhbSkge1xuICByZXR1cm4gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRTdHJlYW14IChzdHJlYW0pIHtcbiAgcmV0dXJuIGlzU3RyZWFteChzdHJlYW0pICYmIHN0cmVhbS5yZWFkYWJsZVxufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkgKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhLmJ5dGVMZW5ndGggPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRCeXRlTGVuZ3RoIChkYXRhKSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkoZGF0YSkgPyBkYXRhLmJ5dGVMZW5ndGggOiAxMDI0XG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gYWJvcnQgKCkge1xuICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZC4nKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBpcGVsaW5lLFxuICBwaXBlbGluZVByb21pc2UsXG4gIGlzU3RyZWFtLFxuICBpc1N0cmVhbXgsXG4gIGdldFN0cmVhbUVycm9yLFxuICBTdHJlYW0sXG4gIFdyaXRhYmxlLFxuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBUcmFuc2Zvcm0sXG4gIC8vIEV4cG9ydCBQYXNzVGhyb3VnaCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE5vZGUuanMgY29yZSdzIHN0cmVhbSBtb2R1bGVcbiAgUGFzc1Rocm91Z2hcbn1cbiIsImZ1bmN0aW9uIGlzQnVmZmVyICh2YWx1ZSkge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblxuZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZVNsb3cgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3coc2l6ZSlcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYSwgYilcbn1cblxuZnVuY3Rpb24gY29uY2F0IChidWZmZXJzLCB0b3RhbExlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzLCB0b3RhbExlbmd0aClcbn1cblxuZnVuY3Rpb24gY29weSAoc291cmNlLCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihzb3VyY2UpLmNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gZXF1YWxzIChhLCBiKSB7XG4gIHJldHVybiB0b0J1ZmZlcihhKS5lcXVhbHMoYilcbn1cblxuZnVuY3Rpb24gZmlsbCAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmZpbGwodmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXMgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluY2x1ZGVzKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5kZXhPZih2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGxhc3RJbmRleE9mIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5sYXN0SW5kZXhPZih2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHN3YXAxNiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAxNigpXG59XG5cbmZ1bmN0aW9uIHN3YXAzMiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAzMigpXG59XG5cbmZ1bmN0aW9uIHN3YXA2NCAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXA2NCgpXG59XG5cbmZ1bmN0aW9uIHRvQnVmZmVyIChidWZmZXIpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSByZXR1cm4gYnVmZmVyXG4gIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nIChidWZmZXIsIGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnRvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdExFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVGbG9hdExFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWREb3VibGVMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdExFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRmxvYXRMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRVSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZFVJbnQzMkxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRJbnQzMkxFKG9mZnNldClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQnVmZmVyLFxuICBpc0VuY29kaW5nLFxuICBhbGxvYyxcbiAgYWxsb2NVbnNhZmUsXG4gIGFsbG9jVW5zYWZlU2xvdyxcbiAgYnl0ZUxlbmd0aCxcbiAgY29tcGFyZSxcbiAgY29uY2F0LFxuICBjb3B5LFxuICBlcXVhbHMsXG4gIGZpbGwsXG4gIGZyb20sXG4gIGluY2x1ZGVzLFxuICBpbmRleE9mLFxuICBsYXN0SW5kZXhPZixcbiAgc3dhcDE2LFxuICBzd2FwMzIsXG4gIHN3YXA2NCxcbiAgdG9CdWZmZXIsXG4gIHRvU3RyaW5nLFxuICB3cml0ZSxcbiAgd3JpdGVEb3VibGVMRSxcbiAgd3JpdGVGbG9hdExFLFxuICB3cml0ZVVJbnQzMkxFLFxuICB3cml0ZUludDMyTEUsXG4gIHJlYWREb3VibGVMRSxcbiAgcmVhZEZsb2F0TEUsXG4gIHJlYWRVSW50MzJMRSxcbiAgcmVhZEludDMyTEVcbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MDAnLCAnYmluYXJ5JylcbmNvbnN0IFVTVEFSX1ZFUiA9IGI0YS5mcm9tKCcwMCcsICdiaW5hcnknKVxuY29uc3QgR05VX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MjAnLCAnYmluYXJ5JylcbmNvbnN0IEdOVV9WRVIgPSBiNGEuZnJvbSgnXFx4MjBcXHgwMCcsICdiaW5hcnknKVxuY29uc3QgTUFTSyA9IDBvNzc3N1xuY29uc3QgTUFHSUNfT0ZGU0VUID0gMjU3XG5jb25zdCBWRVJTSU9OX09GRlNFVCA9IDI2M1xuXG5jb25zdCBjbGFtcCA9IGZ1bmN0aW9uIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4IC8vIENvZXJjZSB0byBpbnRlZ2VyLlxuICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm4gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgaW5kZXggKz0gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgdG9UeXBlID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCB0b1R5cGVmbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICByZXR1cm4gMFxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgcmV0dXJuIDFcbiAgICBjYXNlICdzeW1saW5rJzpcbiAgICAgIHJldHVybiAyXG4gICAgY2FzZSAnY2hhcmFjdGVyLWRldmljZSc6XG4gICAgICByZXR1cm4gM1xuICAgIGNhc2UgJ2Jsb2NrLWRldmljZSc6XG4gICAgICByZXR1cm4gNFxuICAgIGNhc2UgJ2RpcmVjdG9yeSc6XG4gICAgICByZXR1cm4gNVxuICAgIGNhc2UgJ2ZpZm8nOlxuICAgICAgcmV0dXJuIDZcbiAgICBjYXNlICdjb250aWd1b3VzLWZpbGUnOlxuICAgICAgcmV0dXJuIDdcbiAgICBjYXNlICdwYXgtaGVhZGVyJzpcbiAgICAgIHJldHVybiA3MlxuICB9XG5cbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgaW5kZXhPZiA9IGZ1bmN0aW9uIChibG9jaywgbnVtLCBvZmZzZXQsIGVuZCkge1xuICBmb3IgKDsgb2Zmc2V0IDwgZW5kOyBvZmZzZXQrKykge1xuICAgIGlmIChibG9ja1tvZmZzZXRdID09PSBudW0pIHJldHVybiBvZmZzZXRcbiAgfVxuICByZXR1cm4gZW5kXG59XG5cbmNvbnN0IGNrc3VtID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuY29uc3QgZW5jb2RlT2N0ID0gZnVuY3Rpb24gKHZhbCwgbikge1xuICB2YWwgPSB2YWwudG9TdHJpbmcoOClcbiAgaWYgKHZhbC5sZW5ndGggPiBuKSByZXR1cm4gU0VWRU5TLnNsaWNlKDAsIG4pICsgJyAnXG4gIGVsc2UgcmV0dXJuIFpFUk9TLnNsaWNlKDAsIG4gLSB2YWwubGVuZ3RoKSArIHZhbCArICcgJ1xufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmNvbnN0IGRlY29kZU9jdCA9IGZ1bmN0aW9uICh2YWwsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHZhbCA9IHZhbC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aClcbiAgb2Zmc2V0ID0gMFxuXG4gIC8vIElmIHByZWZpeGVkIHdpdGggMHg4MCB0aGVuIHBhcnNlIGFzIGEgYmFzZS0yNTYgaW50ZWdlclxuICBpZiAodmFsW29mZnNldF0gJiAweDgwKSB7XG4gICAgcmV0dXJuIHBhcnNlMjU2KHZhbClcbiAgfSBlbHNlIHtcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiB0YXIgY2FuIHByZWZpeCB3aXRoIHNwYWNlc1xuICAgIHdoaWxlIChvZmZzZXQgPCB2YWwubGVuZ3RoICYmIHZhbFtvZmZzZXRdID09PSAzMikgb2Zmc2V0KytcbiAgICBjb25zdCBlbmQgPSBjbGFtcChpbmRleE9mKHZhbCwgMzIsIG9mZnNldCwgdmFsLmxlbmd0aCksIHZhbC5sZW5ndGgsIHZhbC5sZW5ndGgpXG4gICAgd2hpbGUgKG9mZnNldCA8IGVuZCAmJiB2YWxbb2Zmc2V0XSA9PT0gMCkgb2Zmc2V0KytcbiAgICBpZiAoZW5kID09PSBvZmZzZXQpIHJldHVybiAwXG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbC5zbGljZShvZmZzZXQsIGVuZCkudG9TdHJpbmcoKSwgOClcbiAgfVxufVxuXG5jb25zdCBkZWNvZGVTdHIgPSBmdW5jdGlvbiAodmFsLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHZhbC5zbGljZShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLnRvU3RyaW5nKGVuY29kaW5nKVxufVxuXG5jb25zdCBhZGRMZW5ndGggPSBmdW5jdGlvbiAoc3RyKSB7XG4gIGNvbnN0IGxlbiA9IGI0YS5ieXRlTGVuZ3RoKHN0cilcbiAgbGV0IGRpZ2l0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIE1hdGgubG9nKDEwKSkgKyAxXG4gIGlmIChsZW4gKyBkaWdpdHMgPj0gTWF0aC5wb3coMTAsIGRpZ2l0cykpIGRpZ2l0cysrXG5cbiAgcmV0dXJuIChsZW4gKyBkaWdpdHMpICsgc3RyXG59XG5cbmV4cG9ydHMuZGVjb2RlTG9uZ1BhdGggPSBmdW5jdGlvbiAoYnVmLCBlbmNvZGluZykge1xuICByZXR1cm4gZGVjb2RlU3RyKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmV4cG9ydHMuZW5jb2RlUGF4ID0gZnVuY3Rpb24gKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICB3aGlsZSAoYnVmLmxlbmd0aCkge1xuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gIT09IDMyKSBpKytcbiAgICBjb25zdCBsZW4gPSBwYXJzZUludChidWYuc2xpY2UoMCwgaSkudG9TdHJpbmcoKSwgMTApXG4gICAgaWYgKCFsZW4pIHJldHVybiByZXN1bHRcblxuICAgIGNvbnN0IGIgPSBidWYuc2xpY2UoaSArIDEsIGxlbiAtIDEpLnRvU3RyaW5nKClcbiAgICBjb25zdCBrZXlJbmRleCA9IGIuaW5kZXhPZignPScpXG4gICAgaWYgKGtleUluZGV4ID09PSAtMSkgcmV0dXJuIHJlc3VsdFxuICAgIHJlc3VsdFtiLnNsaWNlKDAsIGtleUluZGV4KV0gPSBiLnNsaWNlKGtleUluZGV4ICsgMSlcblxuICAgIGJ1ZiA9IGJ1Zi5zbGljZShsZW4pXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgYnVmID0gYjRhLmFsbG9jKDUxMilcbiAgbGV0IG5hbWUgPSBvcHRzLm5hbWVcbiAgbGV0IHByZWZpeCA9ICcnXG5cbiAgaWYgKG9wdHMudHlwZWZsYWcgPT09IDUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdICE9PSAnLycpIG5hbWUgKz0gJy8nXG4gIGlmIChiNGEuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHJldHVybiBudWxsIC8vIHV0Zi04XG5cbiAgd2hpbGUgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwKSB7XG4gICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZignLycpXG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4gbnVsbFxuICAgIHByZWZpeCArPSBwcmVmaXggPyAnLycgKyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZS5zbGljZSgwLCBpKVxuICAgIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKVxuICB9XG5cbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwIHx8IGI0YS5ieXRlTGVuZ3RoKHByZWZpeCkgPiAxNTUpIHJldHVybiBudWxsXG4gIGlmIChvcHRzLmxpbmtuYW1lICYmIGI0YS5ieXRlTGVuZ3RoKG9wdHMubGlua25hbWUpID4gMTAwKSByZXR1cm4gbnVsbFxuXG4gIGI0YS53cml0ZShidWYsIG5hbWUpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLm1vZGUgJiBNQVNLLCA2KSwgMTAwKVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy51aWQsIDYpLCAxMDgpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLmdpZCwgNiksIDExNilcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuc2l6ZSwgMTEpLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoYnVmLCBmaWxlbmFtZUVuY29kaW5nLCBhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgbGV0IHR5cGVmbGFnID0gYnVmWzE1Nl0gPT09IDAgPyAwIDogYnVmWzE1Nl0gLSBaRVJPX09GRlNFVFxuXG4gIGxldCBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMCwgMTAwLCBmaWxlbmFtZUVuY29kaW5nKVxuICBjb25zdCBtb2RlID0gZGVjb2RlT2N0KGJ1ZiwgMTAwLCA4KVxuICBjb25zdCB1aWQgPSBkZWNvZGVPY3QoYnVmLCAxMDgsIDgpXG4gIGNvbnN0IGdpZCA9IGRlY29kZU9jdChidWYsIDExNiwgOClcbiAgY29uc3Qgc2l6ZSA9IGRlY29kZU9jdChidWYsIDEyNCwgMTIpXG4gIGNvbnN0IG10aW1lID0gZGVjb2RlT2N0KGJ1ZiwgMTM2LCAxMilcbiAgY29uc3QgdHlwZSA9IHRvVHlwZSh0eXBlZmxhZylcbiAgY29uc3QgbGlua25hbWUgPSBidWZbMTU3XSA9PT0gMCA/IG51bGwgOiBkZWNvZGVTdHIoYnVmLCAxNTcsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgdW5hbWUgPSBkZWNvZGVTdHIoYnVmLCAyNjUsIDMyKVxuICBjb25zdCBnbmFtZSA9IGRlY29kZVN0cihidWYsIDI5NywgMzIpXG4gIGNvbnN0IGRldm1ham9yID0gZGVjb2RlT2N0KGJ1ZiwgMzI5LCA4KVxuICBjb25zdCBkZXZtaW5vciA9IGRlY29kZU9jdChidWYsIDMzNywgOClcblxuICBjb25zdCBjID0gY2tzdW0oYnVmKVxuXG4gIC8vIGNoZWNrc3VtIGlzIHN0aWxsIGluaXRpYWwgdmFsdWUgaWYgaGVhZGVyIHdhcyBudWxsLlxuICBpZiAoYyA9PT0gOCAqIDMyKSByZXR1cm4gbnVsbFxuXG4gIC8vIHZhbGlkIGNoZWNrc3VtXG4gIGlmIChjICE9PSBkZWNvZGVPY3QoYnVmLCAxNDgsIDgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyIGhlYWRlci4gTWF5YmUgdGhlIHRhciBpcyBjb3JydXB0ZWQgb3IgaXQgbmVlZHMgdG8gYmUgZ3VuemlwcGVkPycpXG5cbiAgaWYgKFVTVEFSX01BR0lDLmNvbXBhcmUoYnVmLCBNQUdJQ19PRkZTRVQsIE1BR0lDX09GRlNFVCArIDYpID09PSAwKSB7XG4gICAgLy8gdXN0YXIgKHBvc2l4KSBmb3JtYXQuXG4gICAgLy8gcHJlcGVuZCBwcmVmaXgsIGlmIHByZXNlbnQuXG4gICAgaWYgKGJ1ZlszNDVdKSBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMzQ1LCAxNTUsIGZpbGVuYW1lRW5jb2RpbmcpICsgJy8nICsgbmFtZVxuICB9IGVsc2UgaWYgKEdOVV9NQUdJQy5jb21wYXJlKGJ1ZiwgTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSA9PT0gMCAmJlxuICAgICAgICAgICAgIEdOVV9WRVIuY29tcGFyZShidWYsIFZFUlNJT05fT0ZGU0VULCBWRVJTSU9OX09GRlNFVCArIDIpID09PSAwKSB7XG4gICAgLy8gJ2dudScvJ29sZGdudScgZm9ybWF0LiBTaW1pbGFyIHRvIHVzdGFyLCBidXQgaGFzIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGFuZFxuICAgIC8vIG11bHRpLXZvbHVtZSB0YXJiYWxscy5cbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFsbG93VW5rbm93bkZvcm1hdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXI6IHVua25vd24gZm9ybWF0LicpXG4gICAgfVxuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBvbGQgdGFyIHZlcnNpb25zIHRoYXQgdXNlIHRyYWlsaW5nIC8gdG8gaW5kaWNhdGUgZGlyc1xuICBpZiAodHlwZWZsYWcgPT09IDAgJiYgbmFtZSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcvJykgdHlwZWZsYWcgPSA1XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIG1vZGUsXG4gICAgdWlkLFxuICAgIGdpZCxcbiAgICBzaXplLFxuICAgIG10aW1lOiBuZXcgRGF0ZSgxMDAwICogbXRpbWUpLFxuICAgIHR5cGUsXG4gICAgbGlua25hbWUsXG4gICAgdW5hbWUsXG4gICAgZ25hbWUsXG4gICAgZGV2bWFqb3IsXG4gICAgZGV2bWlub3JcbiAgfVxufVxuIiwiY29uc3QgeyBjb25zdGFudHMgfSA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IERNT0RFID0gMG83NTVcbmNvbnN0IEZNT0RFID0gMG82NDRcblxuY29uc3QgRU5EX09GX1RBUiA9IGI0YS5hbGxvYygxMDI0KVxuXG5jb25zdCBub29wID0gZnVuY3Rpb24gKCkge31cblxuY29uc3Qgb3ZlcmZsb3cgPSBmdW5jdGlvbiAoc2VsZiwgc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICBpZiAoc2l6ZSkgc2VsZi5wdXNoKEVORF9PRl9UQVIuc3ViYXJyYXkoMCwgNTEyIC0gc2l6ZSkpXG59XG5cbmZ1bmN0aW9uIG1vZGVUb1R5cGUgKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlICYgY29uc3RhbnRzLlNfSUZNVCkge1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZCTEs6IHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZDSFI6IHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGRElSOiByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGSUZPOiByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkxOSzogcmV0dXJuICdzeW1saW5rJ1xuICB9XG5cbiAgcmV0dXJuICdmaWxlJ1xufVxuXG5jbGFzcyBTaW5rIGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAodG8pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy53cml0dGVuID0gMFxuICAgIHRoaXMuX3RvID0gdG9cbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLndyaXR0ZW4gKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgaWYgKHRoaXMuX3RvLnB1c2goZGF0YSkpIHJldHVybiBjYigpXG4gICAgdGhpcy5fdG8uX2RyYWluID0gY2JcbiAgfVxufVxuXG5jbGFzcyBMaW5rU2luayBleHRlbmRzIFdyaXRhYmxlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmxpbmtuYW1lID0gJydcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ3V0Zi04JylcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLmxpbmtuYW1lICs9IHRoaXMuX2RlY29kZXIud3JpdGUoZGF0YSlcbiAgICBjYigpXG4gIH1cbn1cblxuY2xhc3MgVm9pZCBleHRlbmRzIFdyaXRhYmxlIHtcbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIGNiKG5ldyBFcnJvcignTm8gYm9keSBhbGxvd2VkIGZvciB0aGlzIGVudHJ5JykpXG4gIH1cbn1cblxuY2xhc3MgUGFjayBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5fZmluYWxpemluZyA9IGZhbHNlXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICB9XG5cbiAgZW50cnkgKGhlYWRlciwgYnVmZmVyLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBwaXBpbmcgYW4gZW50cnknKVxuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVyblxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYnVmZmVyXG4gICAgICBidWZmZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wXG5cbiAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgaWYgKCFoZWFkZXIuc2l6ZSB8fCBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnKSBoZWFkZXIuc2l6ZSA9IDBcbiAgICBpZiAoIWhlYWRlci50eXBlKSBoZWFkZXIudHlwZSA9IG1vZGVUb1R5cGUoaGVhZGVyLm1vZGUpXG4gICAgaWYgKCFoZWFkZXIubW9kZSkgaGVhZGVyLm1vZGUgPSBoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScgPyBETU9ERSA6IEZNT0RFXG4gICAgaWYgKCFoZWFkZXIudWlkKSBoZWFkZXIudWlkID0gMFxuICAgIGlmICghaGVhZGVyLmdpZCkgaGVhZGVyLmdpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5tdGltZSkgaGVhZGVyLm10aW1lID0gbmV3IERhdGUoKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSBidWZmZXIgPSBiNGEuZnJvbShidWZmZXIpXG4gICAgaWYgKGI0YS5pc0J1ZmZlcihidWZmZXIpKSB7XG4gICAgICBoZWFkZXIuc2l6ZSA9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuICAgICAgY29uc3Qgb2sgPSB0aGlzLnB1c2goYnVmZmVyKVxuICAgICAgb3ZlcmZsb3coc2VsZiwgaGVhZGVyLnNpemUpXG4gICAgICBpZiAob2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG4gICAgICBlbHNlIHRoaXMuX2RyYWluID0gY2FsbGJhY2tcbiAgICAgIHJldHVybiBuZXcgVm9pZCgpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnc3ltbGluaycgJiYgIWhlYWRlci5saW5rbmFtZSkge1xuICAgICAgY29uc3QgbGlua1NpbmsgPSBuZXcgTGlua1NpbmsoKVxuICAgICAgbGlua1NpbmtcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBzZWxmLmRlc3Ryb3koKVxuICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBoZWFkZXIubGlua25hbWUgPSBsaW5rU2luay5saW5rbmFtZVxuICAgICAgICAgIHNlbGYuX2VuY29kZShoZWFkZXIpXG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4gbGlua1NpbmtcbiAgICB9XG5cbiAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuXG4gICAgaWYgKGhlYWRlci50eXBlICE9PSAnZmlsZScgJiYgaGVhZGVyLnR5cGUgIT09ICdjb250aWd1b3VzLWZpbGUnKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBWb2lkKClcbiAgICB9XG5cbiAgICBjb25zdCBzaW5rID0gbmV3IFNpbmsodGhpcylcbiAgICBzaW5rXG4gICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG4gICAgICAgIHNlbGYuZGVzdHJveSgpXG4gICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG5cbiAgICAgICAgaWYgKHNpbmsud3JpdHRlbiAhPT0gaGVhZGVyLnNpemUpIHsgLy8gY29ycnVwdGluZyB0YXJcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJmbG93KHNlbGYsIGhlYWRlci5zaXplKVxuICAgICAgICBpZiAoc2VsZi5fZmluYWxpemluZykgeyBzZWxmLmZpbmFsaXplKCkgfVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9KVxuXG4gICAgdGhpcy5fc3RyZWFtID0gc2lua1xuXG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtKSB7XG4gICAgICB0aGlzLl9maW5hbGl6aW5nID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMucHVzaChFTkRfT0ZfVEFSKVxuICAgIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgX2VuY29kZSAoaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIucGF4KSB7XG4gICAgICBjb25zdCBidWYgPSBoZWFkZXJzLmVuY29kZShoZWFkZXIpXG4gICAgICBpZiAoYnVmKSB7XG4gICAgICAgIHRoaXMucHVzaChidWYpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbmNvZGVQYXgoaGVhZGVyKVxuICB9XG5cbiAgX2VuY29kZVBheCAoaGVhZGVyKSB7XG4gICAgY29uc3QgcGF4SGVhZGVyID0gaGVhZGVycy5lbmNvZGVQYXgoe1xuICAgICAgbmFtZTogaGVhZGVyLm5hbWUsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lLFxuICAgICAgcGF4OiBoZWFkZXIucGF4XG4gICAgfSlcblxuICAgIGNvbnN0IG5ld0hlYWRlciA9IHtcbiAgICAgIG5hbWU6ICdQYXhIZWFkZXInLFxuICAgICAgbW9kZTogaGVhZGVyLm1vZGUsXG4gICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICBzaXplOiBwYXhIZWFkZXIuYnl0ZUxlbmd0aCxcbiAgICAgIG10aW1lOiBoZWFkZXIubXRpbWUsXG4gICAgICB0eXBlOiAncGF4LWhlYWRlcicsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lICYmICdQYXhIZWFkZXInLFxuICAgICAgdW5hbWU6IGhlYWRlci51bmFtZSxcbiAgICAgIGduYW1lOiBoZWFkZXIuZ25hbWUsXG4gICAgICBkZXZtYWpvcjogaGVhZGVyLmRldm1ham9yLFxuICAgICAgZGV2bWlub3I6IGhlYWRlci5kZXZtaW5vclxuICAgIH1cblxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICAgIHRoaXMucHVzaChwYXhIZWFkZXIpXG4gICAgb3ZlcmZsb3codGhpcywgcGF4SGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICBuZXdIZWFkZXIuc2l6ZSA9IGhlYWRlci5zaXplXG4gICAgbmV3SGVhZGVyLnR5cGUgPSBoZWFkZXIudHlwZVxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY29uc3QgZHJhaW4gPSB0aGlzLl9kcmFpblxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIGRyYWluKClcbiAgICBjYigpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrIChvcHRzKSB7XG4gIHJldHVybiBuZXcgUGFjayhvcHRzKVxufVxuIiwiZXhwb3J0cy5leHRyYWN0ID0gcmVxdWlyZSgnLi9leHRyYWN0JylcbmV4cG9ydHMucGFjayA9IHJlcXVpcmUoJy4vcGFjaycpXG4iLG51bGxdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJwcm9jZXNzIiwiZ2xvYmFsIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwiZW5kT2ZTdHJlYW1Nb2R1bGUiLCJlbmRPZlN0cmVhbSIsInJlcXVpcmUkJDYiLCJyZXF1aXJlJCQ3IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDE1Iiwic3RyZWFtTW9kdWxlIiwicmVxdWlyZSQkMTMiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsIkJ1ZmZlciIsIkJ1ZmZlckxpc3QiLCJibE1vZHVsZSIsImJsIiwibm9vcCIsIlJlYWRhYmxlIiwiV3JpdGFibGUiLCJpbmRleE9mIiwiYjRhIiwiaGVhZGVycyIsInBhY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsV0FBYyxHQUFHO0dBQ2YsWUFBWSxDQUFDLElBQUksRUFBRTtBQUNyQixLQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDM0I7QUFDSCxHQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDbkMsS0FBSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3pCO0FBQ0gsR0FBRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQ2xDLEtBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN4QjtBQUNILEdBQUUsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNoQyxLQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDdEI7QUFDSCxHQUFFLGlCQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDOUIsS0FBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3BCO0FBQ0gsR0FBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQzlCLEtBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNwQjtBQUNILEdBQUUsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUMvQixLQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDckI7QUFDSCxHQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0tBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0lBQzlCO0FBQ0gsR0FBRSxLQUFLO0dBQ0wscUJBQXFCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksRUFBRTtLQUMzQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ2xDO0FBQ0gsR0FBRSxrQ0FBa0MsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3JELEtBQUksT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztJQUNuRTtBQUNILEdBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLO0FBQ3ZCLEdBQUUsTUFBTTtBQUNSLEdBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0FBQ25DLEdBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0FBQzNCLEdBQUUsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtBQUNqRCxHQUFFLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7QUFDakQsR0FBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVE7QUFDakMsR0FBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0tBQ2xDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7SUFDNUM7QUFDSCxHQUFFLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQ3JDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztJQUMvQztBQUNILEdBQUUsOEJBQThCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtLQUN6QyxPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ25EO0dBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUNsQixLQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDeEI7QUFDSCxHQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7S0FDbEMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7SUFDNUM7QUFDSCxHQUFFLE9BQU87QUFDVCxHQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDbEMsS0FBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ3RCO0FBQ0gsR0FBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtLQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUNsQztHQUNELGFBQWEsQ0FBQyxHQUFHLEVBQUU7QUFDckIsS0FBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzNCO0FBQ0gsR0FBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUs7QUFDN0IsR0FBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ25DLEtBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN4QjtHQUNELE9BQU8sRUFBRSxHQUFHO0FBQ2QsR0FBRSxNQUFNO0FBQ1IsR0FBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtLQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztJQUM5QjtHQUNELDBCQUEwQixDQUFDLElBQUksRUFBRTtBQUNuQyxLQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRTtJQUMxQjtHQUNELDBCQUEwQixDQUFDLElBQUksRUFBRTtBQUNuQyxLQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRTtJQUMxQjtHQUNELG1CQUFtQixDQUFDLElBQUksRUFBRTtBQUM1QixLQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRTtJQUNuQjtBQUNILEdBQUUsTUFBTTtBQUNSLEdBQUUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLGFBQWE7QUFDM0MsR0FBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsV0FBVztBQUN2QyxHQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUTtBQUNqQyxHQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0tBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzFCO0FBQ0gsR0FBRSxVQUFVO0FBQ1osR0FBQTs7Ozs7Ozs7Ozs7O0FDbEdBO0VBQ0EsTUFBTSxZQUFZLEdBQUcsV0FBaUI7RUFDdEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsWUFBVztFQUM3RSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxLQUFJO0FBQ2pEO0FBQ0EsRUFBQSxNQUFNLE1BQU07SUFDVixPQUFPLElBQUksS0FBSyxXQUFXO0FBQzdCLFFBQU0sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQ3pCO1VBQ1EsT0FBTyxDQUFDLFlBQVksSUFBSTtTQUN6QjtBQUNQLFFBQU0sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLFVBQVEsT0FBTyxLQUFLO1VBQ2I7QUFDUDtBQUNBO0FBQ0E7RUFDQSxNQUFNLGNBQWMsU0FBUyxLQUFLLENBQUM7SUFDakMsV0FBVyxDQUFDLE1BQU0sRUFBRTtNQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsbUNBQW1DLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO09BQzNFO01BQ0QsSUFBSSxPQUFPLEdBQUcsR0FBRTtBQUNwQixNQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLFFBQU0sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFDO09BQ3RDO01BQ0QsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUNsQixNQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWdCO0FBQ2hDLE1BQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFNO0tBQ3JCO0dBQ0Y7RUFDRCxNQUFpQixDQUFBLE9BQUEsR0FBQTtBQUNqQixJQUFFLGNBQWM7QUFDaEIsSUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRTtNQUNiLElBQUksTUFBTSxHQUFHLE1BQUs7QUFDdEIsTUFBSSxPQUFPLFVBQVUsR0FBRyxJQUFJLEVBQUU7UUFDeEIsSUFBSSxNQUFNLEVBQUU7QUFDbEIsVUFBUSxNQUFNO1NBQ1A7UUFDRCxNQUFNLEdBQUcsS0FBSTtBQUNuQixRQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBQztPQUMzQjtLQUNGO0lBQ0QscUJBQXFCLEVBQUUsWUFBWTtBQUNyQyxNQUFJLElBQUksUUFBTztBQUNmLE1BQUksSUFBSSxPQUFNO0FBQ2Q7QUFDQTtNQUNJLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSztRQUN4QyxPQUFPLEdBQUcsSUFBRztRQUNiLE1BQU0sR0FBRyxJQUFHO0FBQ2xCLE9BQUssRUFBQztBQUNOLE1BQUksT0FBTztBQUNYLFFBQU0sT0FBTztBQUNiLFFBQU0sT0FBTztBQUNiLFFBQU0sTUFBTTtPQUNQO0tBQ0Y7SUFDRCxTQUFTLENBQUMsRUFBRSxFQUFFO01BQ1osT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUs7QUFDNUMsUUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUs7VUFDbkIsSUFBSSxHQUFHLEVBQUU7QUFDakIsWUFBVSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUM7V0FDbkI7QUFDVCxVQUFRLE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFNBQU8sRUFBQztBQUNSLE9BQUssQ0FBQztLQUNIO0FBQ0gsSUFBRSxRQUFRLEdBQUc7TUFDVCxPQUFPLFlBQVksRUFBRTtLQUN0QjtBQUNILElBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRTtBQUMxQjtBQUNBLE1BQUksT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDdkUsUUFBTSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFFO0FBQ3RDLFFBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ3hCLFVBQVEsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxTQUFPLE1BQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQy9CLFVBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUNuQyxNQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUU7QUFDbEUsVUFBUSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsV0FBVyxLQUFLLE1BQU0sR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFFO1VBQ25GLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUU7QUFDbEMsU0FBTyxNQUFNO0FBQ2IsVUFBUSxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUU7U0FDOUI7QUFDUCxPQUFLLENBQUM7S0FDSDtJQUNELE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDakI7TUFDSSxRQUFRLE9BQU8sS0FBSztBQUN4QixRQUFNLEtBQUssUUFBUTtBQUNuQixVQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNwQyxjQUFZLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQixhQUFXLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3BFLGNBQVksT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3RCO1dBQ0Y7QUFDVCxVQUFRLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFNLEtBQUssUUFBUTtBQUNuQixVQUFRLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzFCLFlBQVUsT0FBTyxLQUFLO1dBQ2IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekMsWUFBVSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7V0FDckI7QUFDVCxVQUFRLE9BQU8sS0FBSztBQUNwQixRQUFNLEtBQUssUUFBUTtVQUNYLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsS0FBSyxTQUFTLENBQUM7QUFDckIsUUFBTSxLQUFLLFdBQVc7QUFDdEIsVUFBUSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDNUIsUUFBTSxLQUFLLFFBQVE7QUFDbkIsVUFBUSxPQUFPLElBQUk7T0FDZDtLQUNGO0FBQ0gsSUFBRSxLQUFLLEVBQUU7TUFDTCxlQUFlLENBQUMsRUFBRSxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxZQUFZLGFBQWE7T0FDbkM7TUFDRCxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7QUFDM0IsUUFBTSxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO09BQy9CO0tBQ0Y7QUFDSCxJQUFFLE1BQU07SUFDUDtFQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFBOzs7Ozs7O0FDL0gzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUU7QUFDbkIsSUFBSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLElBQUksT0FBTyxDQUFDLE1BQU07QUFDbEIsUUFBUSxJQUFJLElBQUksSUFBSTtBQUNwQixRQUFRLDZDQUE2QztBQUNyRCxRQUFRLEtBQUs7QUFDYixLQUFLLENBQUM7QUFDTixJQUFJLE9BQU8sSUFBSTtBQUNmLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxhQUFhLENBQUMsSUFBSSxFQUFFO0FBQzdCLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRTtBQUN0QyxRQUFRO0FBQ1IsWUFBWSxPQUFPLE9BQU8sS0FBSyxXQUFXO0FBQzFDLFlBQVksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVU7QUFDL0MsVUFBVTtBQUNWLFlBQVksT0FBTyxDQUFDLEtBQUs7QUFDekIsZ0JBQWdCLG9FQUFvRTtBQUNwRixnQkFBZ0IsSUFBSSxDQUFDLGVBQWU7QUFDcEMsYUFBYSxDQUFDO0FBQ2QsU0FBUztBQUNULFFBQVEsTUFBTTtBQUNkLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtBQUNoQyxRQUFRLE1BQU07QUFDZCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsRUFBRTtBQUN6RCxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDcEMsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRTtBQUNuQyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO0FBQzFCLFFBQVEsV0FBVztBQUNuQixRQUFRLEtBQUs7QUFDYixRQUFRLFVBQVUsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsYUFBYSxFQUFFLFdBQVc7QUFDbEMsUUFBUSxRQUFRLEVBQUUsS0FBSztBQUN2QixRQUFRLE9BQU8sRUFBRSxLQUFLO0FBQ3RCLFFBQVEsZ0JBQWdCLEVBQUUsS0FBSztBQUMvQixRQUFRLGVBQWUsRUFBRSxJQUFJO0FBQzdCLFFBQVEsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNoRCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0E7QUFDQSxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakY7QUFDQTtBQUNBLElBQUksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRTtBQUM1QixZQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVFLFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQSxLQUFLLENBQUMsU0FBUyxHQUFHO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRztBQUNmLFFBQVEsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUk7QUFDbEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksTUFBTSxHQUFHO0FBQ2pCLFFBQVEsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVztBQUNuQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxhQUFhLEdBQUc7QUFDeEIsUUFBUSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhO0FBQ3JDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxHQUFHO0FBQ25CLFFBQVEsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQztBQUNyRCxRQUFRLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtBQUNuQyxZQUFZLE9BQU8sRUFBRTtBQUNyQixTQUFTO0FBQ1QsUUFBUSxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQzlCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRztBQUNmLFFBQVEsT0FBTyxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLGVBQWUsR0FBRztBQUMxQixRQUFRLE9BQU8sQ0FBQztBQUNoQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxTQUFTLEdBQUc7QUFDcEIsUUFBUSxPQUFPLENBQUM7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksY0FBYyxHQUFHO0FBQ3pCLFFBQVEsT0FBTyxDQUFDO0FBQ2hCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFVBQVUsR0FBRztBQUNyQixRQUFRLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVU7QUFDbEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGVBQWUsR0FBRztBQUN0QixRQUFRLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QjtBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDNUIsUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEtBQUssVUFBVSxFQUFFO0FBQzlELFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUN6QyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHdCQUF3QixHQUFHO0FBQy9CLFFBQVEsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUM1QixRQUFRLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDckMsUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsS0FBSyxVQUFVLEVBQUU7QUFDdkUsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUM7QUFDbEQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE9BQU8sR0FBRztBQUNsQixRQUFRLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQzlDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFVBQVUsR0FBRztBQUNyQixRQUFRLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQ2pELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLEdBQUc7QUFDckIsUUFBUSxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksZ0JBQWdCLEdBQUc7QUFDM0IsUUFBUSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRO0FBQ2hDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFFBQVEsR0FBRztBQUNuQixRQUFRLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFNBQVMsR0FBRztBQUNwQixRQUFRLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxVQUFVLEdBQUc7QUFDckIsUUFBUSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXO0FBQ25DLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksWUFBWSxHQUFHO0FBQ3ZCLFFBQVEsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTztBQUMvQixLQUFLO0FBQ0wsSUFBSSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUU7QUFDNUIsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3BCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1QsUUFBUSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUI7QUFDQSxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtBQUMxRCxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztBQUMzQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUc7QUFDdEIsUUFBUSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVE7QUFDakMsS0FBSztBQUNMLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzNCLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNwQixZQUFZLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsR0FBRztBQUNoQjtBQUNBLEtBQUs7QUFDTCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRTtBQUN0RCxJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLElBQUksWUFBWSxFQUFFLElBQUk7QUFDdEIsSUFBSSxRQUFRLEVBQUUsSUFBSTtBQUNsQixDQUFDLENBQUMsQ0FBQztBQUNIO0FBQ0E7QUFDQSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO0FBQzFFLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkU7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHdCQUF3QixDQUFDLEdBQUcsRUFBRTtBQUN2QyxJQUFJLE9BQU87QUFDWCxRQUFRLEdBQUcsR0FBRztBQUNkLFlBQVksT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUN0QyxTQUFTO0FBQ1QsUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFO0FBQ25CLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDeEMsU0FBUztBQUNULFFBQVEsWUFBWSxFQUFFLElBQUk7QUFDMUIsUUFBUSxVQUFVLEVBQUUsSUFBSTtBQUN4QixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUU7QUFDbkMsSUFBSSxPQUFPO0FBQ1gsUUFBUSxLQUFLLEdBQUc7QUFDaEIsWUFBWSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3pDLFlBQVksT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7QUFDckQsU0FBUztBQUNULFFBQVEsWUFBWSxFQUFFLElBQUk7QUFDMUIsUUFBUSxVQUFVLEVBQUUsSUFBSTtBQUN4QixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFO0FBQ3pDLElBQUksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDM0IsUUFBUSxPQUFPLFNBQVM7QUFDeEIsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLFNBQVMsV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUU7QUFDN0MsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtBQUMvRCxRQUFRLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO0FBQy9FLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQTtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDMUMsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUMzQyxZQUFZLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0UsWUFBWSxNQUFNLE1BQU0sR0FBRyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO0FBQ2xFLFlBQVksTUFBTSxDQUFDLGNBQWM7QUFDakMsZ0JBQWdCLFdBQVcsQ0FBQyxTQUFTO0FBQ3JDLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixNQUFNO0FBQ3RCLHNCQUFzQixvQkFBb0IsQ0FBQyxHQUFHLENBQUM7QUFDL0Msc0JBQXNCLHdCQUF3QixDQUFDLEdBQUcsQ0FBQztBQUNuRCxhQUFhLENBQUM7QUFDZCxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFdBQVc7QUFDdEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0FBQzNCLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFO0FBQ3JELFFBQVEsT0FBTyxLQUFLO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUN6QixRQUFRLE9BQU8sR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNqRixRQUFRLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLEtBQUs7QUFDTCxJQUFJLE9BQU8sT0FBTztBQUNsQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUU7QUFDdkMsSUFBSSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQzFDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRTtBQUMxQixJQUFJLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtBQUNyQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7QUFDMUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUN0QyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtBQUNoRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQzVDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFO0FBQ3BELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDaEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDbkM7QUFDQTtBQUNBLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQzlDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsWUFBWSxDQUFDLFdBQVcsRUFBRTtBQUNuQyxJQUFJLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7QUFDM0IsUUFBUSxNQUFNLElBQUksU0FBUztBQUMzQixZQUFZLGtFQUFrRTtBQUM5RSxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksT0FBTyxTQUFTO0FBQ3BCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsOEJBQThCLENBQUMsU0FBUyxFQUFFO0FBQ25ELElBQUksT0FBTztBQUNYLFFBQVEsR0FBRyxHQUFHO0FBQ2QsWUFBWSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsWUFBWSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELFlBQVksT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ2pDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO0FBQ3JELG9CQUFvQixPQUFPLElBQUksQ0FBQyxRQUFRO0FBQ3hDLGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDakMsYUFBYTtBQUNiLFlBQVksT0FBTyxJQUFJO0FBQ3ZCLFNBQVM7QUFDVDtBQUNBLFFBQVEsR0FBRyxDQUFDLFFBQVEsRUFBRTtBQUN0QixZQUFZLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3ZFLGdCQUFnQixRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLGFBQWE7QUFDYixZQUFZLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRDtBQUNBO0FBQ0EsWUFBWSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUIsWUFBWSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELFlBQVksT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ2pDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO0FBQ3JEO0FBQ0Esb0JBQW9CLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtBQUN2Qyx3QkFBd0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzlDLHFCQUFxQixNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7QUFDbkQsd0JBQXdCLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1RCxxQkFBcUIsTUFBTTtBQUMzQix3QkFBd0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNwRCxxQkFBcUI7QUFDckIsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEMsaUJBQWlCO0FBQ2pCO0FBQ0EsZ0JBQWdCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ2pDLGFBQWE7QUFDYjtBQUNBO0FBQ0EsWUFBWSxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFDbkMsZ0JBQWdCLE1BQU0sT0FBTyxHQUFHO0FBQ2hDLG9CQUFvQixRQUFRO0FBQzVCLG9CQUFvQixZQUFZLEVBQUUsU0FBUztBQUMzQyxvQkFBb0IsT0FBTyxFQUFFLEtBQUs7QUFDbEMsb0JBQW9CLElBQUksRUFBRSxLQUFLO0FBQy9CLG9CQUFvQixJQUFJLEVBQUUsSUFBSTtBQUM5QixpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQ25DLG9CQUFvQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RCxpQkFBaUIsTUFBTTtBQUN2QixvQkFBb0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7QUFDeEMsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1QsUUFBUSxZQUFZLEVBQUUsSUFBSTtBQUMxQixRQUFRLFVBQVUsRUFBRSxJQUFJO0FBQ3hCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRTtBQUMvRCxJQUFJLE1BQU0sQ0FBQyxjQUFjO0FBQ3pCLFFBQVEsb0JBQW9CO0FBQzVCLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEIsUUFBUSw4QkFBOEIsQ0FBQyxTQUFTLENBQUM7QUFDakQsS0FBSyxDQUFDO0FBQ04sQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUU7QUFDN0M7QUFDQSxJQUFJLFNBQVMsaUJBQWlCLEdBQUc7QUFDakMsUUFBUSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLEtBQUs7QUFDTDtBQUNBLElBQUksaUJBQWlCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtBQUN2RSxRQUFRLFdBQVcsRUFBRTtBQUNyQixZQUFZLEtBQUssRUFBRSxpQkFBaUI7QUFDcEMsWUFBWSxZQUFZLEVBQUUsSUFBSTtBQUM5QixZQUFZLFFBQVEsRUFBRSxJQUFJO0FBQzFCLFNBQVM7QUFDVCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUNoRCxRQUFRLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8saUJBQWlCO0FBQzVCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLEdBQUc7QUFDdkI7QUFDQSxJQUFJLElBQUksSUFBSSxZQUFZLFdBQVcsRUFBRTtBQUNyQyxRQUFRLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMxQyxRQUFRLE1BQU07QUFDZCxLQUFLO0FBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDL0QsUUFBUSxPQUFPLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxLQUFLO0FBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzlCLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDbkQsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFNBQVM7QUFDVCxRQUFRLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDO0FBQzdDLEtBQUs7QUFDTCxJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUM7QUFDNUQ7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFdBQVcsQ0FBQyxTQUFTLEdBQUc7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQ25ELFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0FBQzlCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1QsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNuRSxZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUM7QUFDaEYsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBUSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0MsUUFBUSxNQUFNLE9BQU8sR0FBRyxZQUFZO0FBQ3BDLGNBQWMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDdEMsY0FBYyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsUUFBUSxNQUFNLFlBQVksR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUN4RCxRQUFRLE1BQU0sT0FBTyxHQUFHO0FBQ3hCLFlBQVksUUFBUTtBQUNwQixZQUFZLFlBQVk7QUFDeEIsWUFBWSxPQUFPLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzdELFlBQVksSUFBSSxFQUFFLFlBQVksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN2RCxZQUFZLElBQUksRUFBRSxJQUFJO0FBQ3RCLFNBQVMsQ0FBQztBQUNWO0FBQ0E7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUMsUUFBUSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDaEMsWUFBWSxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5QyxZQUFZLE1BQU07QUFDbEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixRQUFRLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRTtBQUM3QixZQUFZO0FBQ1osZ0JBQWdCLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTtBQUMxQyxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZO0FBQ2xELGNBQWM7QUFDZDtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCLGFBQWE7QUFDYixZQUFZLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEIsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUM3QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7QUFDNUIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQ3RELFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0FBQzlCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxRQUFRLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDekMsY0FBYyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxjQUFjLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvQixRQUFRLE1BQU0sWUFBWSxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQ3hEO0FBQ0EsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEIsUUFBUSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFO0FBQzdCLFlBQVk7QUFDWixnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRO0FBQzFDLGdCQUFnQixJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVk7QUFDbEQsY0FBYztBQUNkLGdCQUFnQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7QUFDbkMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMxQyxpQkFBaUIsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQy9DLG9CQUFvQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEQsaUJBQWlCO0FBQ2pCLGdCQUFnQixNQUFNO0FBQ3RCLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzdCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFO0FBQ3pCLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDN0QsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLGtDQUFrQyxDQUFDO0FBQ25FLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBUSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUMxQixZQUFZLE9BQU8sSUFBSTtBQUN2QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRDtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixRQUFRLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRTtBQUM3QjtBQUNBLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQzNCLGdCQUFnQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7QUFDbkMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMxQyxpQkFBaUIsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQy9DLG9CQUFvQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEQsaUJBQWlCO0FBQ2pCLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1QixhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksa0JBQWtCO0FBQzlCLGdCQUFnQixZQUFZO0FBQzVCLGdCQUFnQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSTtBQUNuRCxhQUFhLENBQUM7QUFDZCxZQUFZLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtBQUNyRCxnQkFBZ0IsSUFBSTtBQUNwQixvQkFBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELGlCQUFpQixDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQzlCLG9CQUFvQjtBQUNwQix3QkFBd0IsT0FBTyxPQUFPLEtBQUssV0FBVztBQUN0RCx3QkFBd0IsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVU7QUFDM0Qsc0JBQXNCO0FBQ3RCLHdCQUF3QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakIsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVM7QUFDL0MsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssVUFBVTtBQUMvRCxjQUFjO0FBQ2QsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hELGFBQWE7QUFDYjtBQUNBO0FBQ0EsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtBQUN6QyxnQkFBZ0IsS0FBSztBQUNyQixhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzdCLFNBQVM7QUFDVCxRQUFRLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxRQUFRLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsUUFBUSxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0M7QUFDQSxRQUFRLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCO0FBQzdDLEtBQUs7QUFDTCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRTtBQUM1RCxJQUFJLEtBQUssRUFBRSxXQUFXO0FBQ3RCLElBQUksWUFBWSxFQUFFLElBQUk7QUFDdEIsSUFBSSxRQUFRLEVBQUUsSUFBSTtBQUNsQixDQUFDLENBQUMsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztBQUNqQyxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxXQUFXO0FBQzdDLEVBQUU7QUFDRixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9FOztBQ3oxQkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxXQUFXLFNBQVMsV0FBVyxDQUFDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxHQUFHO0FBQ2xCLFFBQVEsS0FBSyxFQUFFLENBQUM7QUFDaEIsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7QUFDMUUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUc7QUFDbEIsUUFBUSxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDMUMsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsdURBQXVELEVBQUUsSUFBSSxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEksU0FBUztBQUNULFFBQVEsT0FBTyxPQUFPLENBQUM7QUFDdkIsS0FBSztBQUNMLENBQUM7QUFDRCxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLEdBQUc7QUFDN0IsSUFBSSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4RCxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7QUFDN0IsSUFBSSxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQzVDLFFBQVEsT0FBTztBQUNmLEtBQUs7QUFDTCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ25DO0FBQ0EsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7QUFDL0MsSUFBSSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0FBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0g7QUFDQSxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFO0FBQzVFLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDckUsUUFBUSxZQUFZLEVBQUUsSUFBSTtBQUMxQixRQUFRLEtBQUssRUFBRSxhQUFhO0FBQzVCLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGVBQWUsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUMvQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE1BQU0sR0FBRztBQUNqQixRQUFRLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssR0FBRztBQUNaLFFBQVEsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUM5QjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVMsQ0FBQyxVQUFVLEVBQUU7QUFDL0IsSUFBSSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNDLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3hCLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLDJEQUEyRCxFQUFFLFVBQVUsS0FBSyxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlJLEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRDtBQUNBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO0FBQ25ELElBQUksTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtBQUNoQyxJQUFJLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7QUFDL0IsQ0FBQyxDQUFDLENBQUM7QUFDSCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFO0FBQzVFLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDekUsUUFBUSxZQUFZLEVBQUUsSUFBSTtBQUMxQixRQUFRLEtBQUssRUFBRSxpQkFBaUI7QUFDaEMsS0FBSyxDQUFDLENBQUM7QUFDUDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoSEE7Q0FDQSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsR0FBR0EsV0FBaUIsR0FBQTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsSUFBSSxxQkFBb0I7QUFDeEUsQ0FBQSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFDO0FBQzNDLENBQUEsTUFBTSxNQUFNLEdBQUc7QUFDZixHQUFFLFFBQVE7QUFDVixHQUFFLFVBQVU7QUFDWixHQUFFLFFBQVE7QUFDVixHQUFFLFFBQVE7QUFDVjtBQUNBLEdBQUUsVUFBVTtBQUNaLEdBQUUsUUFBUTtBQUNWLEdBQUUsU0FBUztBQUNYLEdBQUUsUUFBUTtBQUNWLEdBQUUsUUFBUTtHQUNUO0NBQ0QsTUFBTSxXQUFXLEdBQUcsc0JBQXFCO0NBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQWtCO0NBQzdDLE1BQU0sS0FBSyxHQUFHLEdBQUU7QUFDaEIsQ0FBQSxTQUFTLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFO0dBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDZCxLQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO0lBQ2hEO0VBQ0Y7QUFDRDtBQUNBO0NBQ0EsU0FBUyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7R0FDbEMsSUFBSSxHQUFHLEdBQUcsR0FBRTtBQUNkLEdBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU07QUFDcEIsR0FBRSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFDO0dBQ3BDLE9BQU8sQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNqQyxLQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBQztJQUN0QztBQUNILEdBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQztBQUNELENBQUEsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDcEMsR0FBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsRUFBRTtBQUNqQyxLQUFJLE1BQU07QUFDVixPQUFNLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07QUFDL0I7QUFDQSxPQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO09BQ2pIO0FBQ0wsS0FBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwQjtBQUNILEdBQUUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFNO0FBQ2hFLEdBQUUsTUFBTTtBQUNSLEtBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxNQUFNO0FBQ2xDLEtBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQztLQUNySDtBQUNILEdBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN6QixLQUFJLE9BQU8sR0FBRztJQUNYO0FBQ0gsR0FBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7RUFDNUI7QUFDRCxDQUFBLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0dBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUU7S0FDVCxJQUFJLEdBQUcsTUFBSztJQUNiO0FBQ0gsR0FBRSxNQUFNLFNBQVMsU0FBUyxJQUFJLENBQUM7QUFDL0IsS0FBSSxXQUFXLENBQUMsR0FBRyxJQUFJLEVBQUU7T0FDbkIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFDO01BQ3ZDO0FBQ0wsS0FBSSxRQUFRLEdBQUc7QUFDZixPQUFNLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO01BQ2pEO0lBQ0Y7QUFDSCxHQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO0FBQy9DLEtBQUksSUFBSSxFQUFFO0FBQ1YsT0FBTSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7T0FDaEIsUUFBUSxFQUFFLElBQUk7T0FDZCxVQUFVLEVBQUUsS0FBSztPQUNqQixZQUFZLEVBQUUsSUFBSTtNQUNuQjtBQUNMLEtBQUksUUFBUSxFQUFFO0FBQ2QsT0FBTSxLQUFLLEdBQUc7QUFDZCxTQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pEO09BQ0QsUUFBUSxFQUFFLElBQUk7T0FDZCxVQUFVLEVBQUUsS0FBSztPQUNqQixZQUFZLEVBQUUsSUFBSTtNQUNuQjtBQUNMLElBQUcsRUFBQztBQUNKLEdBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsS0FBSTtBQUNqQyxHQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSTtBQUMxQyxHQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFTO0VBQ3hCO0NBQ0QsU0FBUyxlQUFlLENBQUMsRUFBRSxFQUFFO0FBQzdCO0FBQ0E7QUFDQSxHQUFFLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxLQUFJO0FBQzdDLEdBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0tBQ2hDLEtBQUssRUFBRSxNQUFNO0FBQ2pCLElBQUcsRUFBQztBQUNKLEdBQUUsT0FBTyxFQUFFO0VBQ1Y7QUFDRCxDQUFBLFNBQVMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRTtHQUNsRCxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRTtLQUN6RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzFDO0FBQ0EsT0FBTSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUM7QUFDeEMsT0FBTSxPQUFPLFVBQVU7TUFDbEI7QUFDTCxLQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUM7QUFDaEYsS0FBSSxHQUFHLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFJO0FBQzlCLEtBQUksT0FBTyxHQUFHO0lBQ1g7R0FDRCxPQUFPLFVBQVUsSUFBSSxVQUFVO0VBQ2hDO0NBQ0QsTUFBTSxVQUFVLFNBQVMsS0FBSyxDQUFDO0dBQzdCLFdBQVcsQ0FBQyxPQUFPLEdBQUcsMkJBQTJCLEVBQUUsT0FBTyxHQUFHLFNBQVMsRUFBRTtLQUN0RSxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO09BQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUM7TUFDbkU7QUFDTCxLQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzNCLEtBQUksSUFBSSxDQUFDLElBQUksR0FBRyxZQUFXO0FBQzNCLEtBQUksSUFBSSxDQUFDLElBQUksR0FBRyxhQUFZO0lBQ3pCO0VBQ0Y7QUFDRCxDQUFBLENBQUMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQztDQUMvQixDQUFDO0FBQ0QsR0FBRSxzQkFBc0I7QUFDeEIsR0FBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxLQUFLO0tBQzFCLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUseUJBQXlCLEVBQUM7S0FDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDbEMsT0FBTSxRQUFRLEdBQUcsQ0FBQyxRQUFRLEVBQUM7TUFDdEI7S0FDRCxJQUFJLEdBQUcsR0FBRyxPQUFNO0FBQ3BCLEtBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ3BDO0FBQ0EsT0FBTSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUM7QUFDdkIsTUFBSyxNQUFNO09BQ0wsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBQztNQUNwRTtLQUNELEdBQUcsSUFBSSxXQUFVO0tBQ2pCLE1BQU0sS0FBSyxHQUFHLEdBQUU7S0FDaEIsTUFBTSxTQUFTLEdBQUcsR0FBRTtLQUNwQixNQUFNLEtBQUssR0FBRyxHQUFFO0FBQ3BCLEtBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUU7T0FDNUIsTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxnREFBZ0QsRUFBQztBQUN6RixPQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtTQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBQztRQUNoQyxNQUFNLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMxQyxTQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDO0FBQzdCLFFBQU8sTUFBTTtBQUNiLFNBQVEsTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsa0RBQWtELEVBQUM7QUFDdEYsU0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQztRQUNsQjtNQUNGO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO09BQ3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFDO0FBQ3pDLE9BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUU7U0FDZCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ25DLFNBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUM7UUFDekI7TUFDRjtBQUNMLEtBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtPQUNwQixRQUFRLEtBQUssQ0FBQyxNQUFNO0FBQzFCLFNBQVEsS0FBSyxDQUFDO1dBQ0osR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3RDLFdBQVUsS0FBSztBQUNmLFNBQVEsS0FBSyxDQUFDO0FBQ2QsV0FBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztBQUN6RCxXQUFVLEtBQUs7QUFDZixTQUFRLFNBQVM7QUFDakIsV0FBVSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFFO0FBQ2xDLFdBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFDO1VBQ3JEO1FBQ0Y7QUFDUCxPQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7U0FDNUMsR0FBRyxJQUFJLE9BQU07UUFDZDtNQUNGO0FBQ0wsS0FBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO09BQ3hCLFFBQVEsU0FBUyxDQUFDLE1BQU07QUFDOUIsU0FBUSxLQUFLLENBQUM7V0FDSixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7QUFDakQsV0FBVSxLQUFLO0FBQ2YsU0FBUSxLQUFLLENBQUM7QUFDZCxXQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3BFLFdBQVUsS0FBSztBQUNmLFNBQVEsU0FBUztBQUNqQixXQUFVLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUU7QUFDdEMsV0FBVSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUM7VUFDNUQ7UUFDRjtBQUNQLE9BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtTQUNwQixHQUFHLElBQUksT0FBTTtRQUNkO01BQ0Y7S0FDRCxRQUFRLEtBQUssQ0FBQyxNQUFNO0FBQ3hCLE9BQU0sS0FBSyxDQUFDO0FBQ1osU0FBUSxLQUFLO0FBQ2IsT0FBTSxLQUFLLENBQUM7QUFDWixTQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtXQUN2QyxHQUFHLElBQUksTUFBSztVQUNiO1NBQ0QsR0FBRyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztBQUM1QixTQUFRLEtBQUs7QUFDYixPQUFNLEtBQUssQ0FBQztBQUNaLFNBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7QUFDbEQsU0FBUSxLQUFLO0FBQ2IsT0FBTSxTQUFTO0FBQ2YsU0FBUSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFFO0FBQ2hDLFNBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFDO1FBQ2hEO01BQ0Y7QUFDTCxLQUFJLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtBQUN4QixPQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBQztNQUM5QixNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7T0FDdEQsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDO0FBQ2pELE1BQUssTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtBQUMzQyxPQUFNLElBQUksb0JBQW1CO09BQ3ZCO0FBQ04sU0FBUSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxXQUFXLE1BQU0sSUFBSTtTQUNuRCxtQkFBbUIsS0FBSyxTQUFTO1NBQ2pDLG1CQUFtQixDQUFDLElBQUk7U0FDeEI7U0FDQSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFDO0FBQ3JFLFFBQU8sTUFBTTtBQUNiLFNBQVEsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRTtXQUNoQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLFVBQVMsRUFBQztBQUNWLFNBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFDO1FBQ2pDO0FBQ1AsTUFBSyxNQUFNO0FBQ1gsT0FBTSxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1NBQzlCLE1BQU0sRUFBRSxLQUFLO0FBQ3JCLFFBQU8sRUFBQztBQUNSLE9BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtBQUNqQyxTQUFRLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFDO1FBQzNDO0FBQ1AsT0FBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBQztNQUN6RDtBQUNMLEtBQUksT0FBTyxHQUFHO0lBQ1g7QUFDSCxHQUFFLFNBQVM7R0FDVjtDQUNELENBQUM7QUFDRCxHQUFFLHVCQUF1QjtHQUN2QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLFlBQVksS0FBSztBQUMxQyxLQUFJLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUM7QUFDbEMsS0FBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO09BQzFCLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFLO01BQzVDO0FBQ0wsS0FBSSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxXQUFVO0FBQzdELEtBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRTtBQUNILEdBQUUsU0FBUztHQUNWO0NBQ0QsQ0FBQztBQUNELEdBQUUsMEJBQTBCO0FBQzVCLEdBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssS0FBSztBQUMxQixLQUFJLElBQUksbUJBQWtCO0FBQzFCLEtBQUksTUFBTSxJQUFJO09BQ1IsS0FBSyxLQUFLLElBQUk7T0FDZCxLQUFLLEtBQUssU0FBUztBQUN6QixPQUFNLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFdBQVcsTUFBTSxJQUFJO09BQ2pELGtCQUFrQixLQUFLLFNBQVM7T0FDaEMsa0JBQWtCLENBQUMsSUFBSTtXQUNuQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELFdBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBQztBQUNoQyxLQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUY7QUFDSCxHQUFFLFNBQVM7R0FDVjtDQUNELENBQUM7QUFDRCxHQUFFLGtCQUFrQjtHQUNsQixDQUFDLEdBQUcsSUFBSSxLQUFLO0tBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLHdDQUF3QyxFQUFDO0FBQ3JFLEtBQUksSUFBSSxJQUFHO0FBQ1gsS0FBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTTtBQUMzQixLQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7QUFDbEYsS0FBSSxRQUFRLEdBQUc7QUFDZixPQUFNLEtBQUssQ0FBQztTQUNKLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFDO0FBQ3hDLFNBQVEsS0FBSztBQUNiLE9BQU0sS0FBSyxDQUFDO0FBQ1osU0FBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFDO0FBQ3hELFNBQVEsS0FBSztPQUNQO1NBQ0U7QUFDUixXQUFVLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUU7QUFDakMsV0FBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQztVQUN2RDtBQUNULFNBQVEsS0FBSztNQUNSO0FBQ0wsS0FBSSxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUM7SUFDbEM7QUFDSCxHQUFFLFNBQVM7R0FDVjtDQUNELENBQUM7QUFDRCxHQUFFLGtCQUFrQjtBQUNwQixHQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUs7QUFDekIsS0FBSSxNQUFNLENBQUMsS0FBSyxFQUFFLDBCQUEwQixFQUFDO0FBQzdDLEtBQUksSUFBSSxTQUFRO0FBQ2hCLEtBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtPQUN4RCxRQUFRLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFDO0FBQ3JELE1BQUssTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUMxQyxPQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFDO0FBQzlCLE9BQU0sSUFBSSxLQUFLLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDckQsU0FBUSxRQUFRLEdBQUcscUJBQXFCLENBQUMsUUFBUSxFQUFDO1FBQzNDO09BQ0QsUUFBUSxJQUFJLElBQUc7QUFDckIsTUFBSyxNQUFNO0FBQ1gsT0FBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBQztNQUMxQjtBQUNMLEtBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRjtBQUNILEdBQUUsVUFBVTtHQUNYO0FBQ0QsQ0FBQSxDQUFDLENBQUMsdUJBQXVCLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFDO0FBQ25FLENBQUEsQ0FBQyxDQUFDLDRCQUE0QixFQUFFLGtDQUFrQyxFQUFFLEtBQUssRUFBQztBQUMxRSxDQUFBLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSw0Q0FBNEMsRUFBRSxLQUFLLEVBQUM7QUFDckYsQ0FBQSxDQUFDLENBQUMsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFDO0FBQy9ELENBQUEsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLDZDQUE2QyxFQUFFLEtBQUssRUFBQztBQUMvRSxDQUFBLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxxQ0FBcUMsRUFBRSxTQUFTLEVBQUM7QUFDN0UsQ0FBQSxDQUFDLENBQUMsNEJBQTRCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFDO0FBQ3pELENBQUEsQ0FBQyxDQUFDLDJCQUEyQixFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBQztBQUNoRSxDQUFBLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLEVBQUM7QUFDbEYsQ0FBQSxDQUFDLENBQUMsNEJBQTRCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFDO0FBQ3pELENBQUEsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQztBQUM1RCxDQUFBLE1BQWMsR0FBRztBQUNqQixHQUFFLFVBQVU7QUFDWixHQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztBQUN6RCxHQUFFLGVBQWU7QUFDakIsR0FBRSxLQUFLO0FBQ1AsR0FBQTs7Ozs7Ozs7OztBQ25WQTtDQUNBLE1BQU07QUFDTixHQUFFLFlBQVk7QUFDZCxHQUFFLHNCQUFzQjtBQUN4QixHQUFFLGtCQUFrQjtBQUNwQixHQUFFLGlCQUFpQjtBQUNuQixHQUFFLGVBQWU7QUFDakIsR0FBRSxXQUFXO0FBQ2IsR0FBRSxzQkFBc0I7QUFDeEIsR0FBRSxzQkFBc0I7QUFDeEIsR0FBRSxjQUFjO0FBQ2hCLEdBQUUsNkJBQTZCO0FBQy9CLEdBQUUsbUJBQW1CO0FBQ3JCLEdBQUUsTUFBTTtBQUNSLEdBQUUsMEJBQTBCO0FBQzVCLEdBQUUsbUJBQW1CO0FBQ3JCLEVBQUMsR0FBR0Esa0JBQThCLEdBQUE7Q0FDbEMsTUFBTTtBQUNOLEdBQUUsZUFBZTtBQUNqQixHQUFFLEtBQUssRUFBRSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFO0FBQ25ILEVBQUMsR0FBR0MsYUFBeUIsR0FBQTtBQUM3QixDQUFBLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHQyxXQUF1QixHQUFBO0NBQ3JELE1BQU0sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsR0FBR0EsV0FBQSxFQUF1QixDQUFDLE1BQUs7Q0FDNUUsTUFBTSxPQUFPLEdBQUcsR0FBRTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3hCLEdBQUUsT0FBTyxLQUFLLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztFQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFDekIsR0FBRSxPQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssQ0FBQztFQUM3QjtDQUNELE1BQU0sUUFBUSxHQUFHLFdBQVU7Q0FDM0IsTUFBTSxRQUFRLEdBQUcsdURBQXNEO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUN6QyxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO0tBQ2hDLEtBQUssR0FBRyxJQUFHO0lBQ1o7QUFDSCxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0tBQzdCLElBQUksbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtPQUNqRCxNQUFNLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUM7TUFDdkQ7QUFDTCxLQUFJLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBQztJQUNqQztBQUNILEdBQUUsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUM7QUFDN0IsR0FBRSxPQUFPLEtBQUs7RUFDYjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLHNCQUFzQixFQUFFLEdBQUcsR0FBRyxzQkFBc0IsS0FBSztBQUNySCxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztBQUN0RixHQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO0dBQ2xGLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUNuRyxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsVUFBVSxLQUFLO0FBQzVGO0FBQ0EsR0FBRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtLQUM3QixNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDdEQ7QUFDSCxHQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7S0FDM0IsTUFBTSxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO0lBQ3REO0dBQ0QsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7QUFDbEMsS0FBSSxNQUFNLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDbEU7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEdBQUcsS0FBSyxLQUFLO0FBQzFFLEdBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7S0FDN0IsTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ3REO0FBQ0gsR0FBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO0tBQzNCLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQztJQUN0RDtBQUNILEdBQUUsTUFBTSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFDO0FBQzlCO0dBQ0UsTUFBTSxHQUFHLEdBQUcsV0FBVTtHQUN0QixJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtBQUNsQyxLQUFJLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUNsRTtBQUNILEVBQUMsRUFBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtBQUNyQyxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztFQUNyRjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFO0FBQzNELEdBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0dBQ3BGO0FBQ0YsS0FBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxHQUFHLEdBQUc7QUFDL0IsTUFBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEQ7S0FDQSxNQUFNLElBQUksZ0JBQWdCO0FBQzlCLE9BQU0sSUFBSTtBQUNWLE9BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNySCxPQUFNLEtBQUs7TUFDTjtJQUNGO0VBQ0Y7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxLQUFLO0dBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7S0FDekMsTUFBTSxPQUFPLEdBQUcsa0JBQWtCO09BQ2hDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLE9BQU0sSUFBSTtPQUNMO0FBQ0wsS0FBSSxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsR0FBRyxRQUFPO0tBQzNDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztJQUNyRDtBQUNILEVBQUMsRUFBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN0QyxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQztFQUN2RjtBQUNELENBQUEsU0FBUyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRTtBQUNsRSxHQUFFLE9BQU8sT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUNyRztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxJQUFJLEtBQUs7R0FDdEUsTUFBTSxVQUFVLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUM7R0FDN0UsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUM7R0FDbkYsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUM7R0FDekU7QUFDRixLQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7QUFDaEMsTUFBSyxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEMsTUFBSyxPQUFPLEtBQUssS0FBSyxRQUFRLEtBQUssQ0FBQyxhQUFhLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7S0FDOUU7S0FDQSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDdEQ7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEdBQUcsQ0FBQyxLQUFLO0FBQ3RFLEdBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtLQUN4QixNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7SUFDckQ7QUFDSCxHQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7S0FDNUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsRUFBQztLQUNqRCxNQUFNLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDckQ7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLFFBQVEsRUFBRTtBQUNyRCxHQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO0FBQzlCLEdBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxFQUFFO0tBQ2pDLElBQUksT0FBTyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ25FLE9BQU0sTUFBTSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyx5Q0FBeUMsQ0FBQztNQUNqRjtBQUNMLEtBQUksTUFBTSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUNyQztFQUNGO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxRQUFRLEtBQUs7QUFDcEUsR0FBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDbEMsS0FBSSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbkY7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxTQUFTLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDMUMsR0FBRSxNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDLFFBQVEsRUFBQztBQUN4RCxHQUFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFNO0dBQzFCLElBQUksa0JBQWtCLEtBQUssS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3hELEtBQUksTUFBTSxJQUFJLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2pHO0VBQ0Y7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxTQUFTLEdBQUcsSUFBSSxFQUFFO0dBQzNEO0tBQ0UsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtBQUN6RCxNQUFLLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLEtBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztLQUNyQixJQUFJLEdBQUcsTUFBTTtBQUNqQixNQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7S0FDMUI7S0FDQSxNQUFNLElBQUksbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUM7SUFDckQ7R0FDRCxPQUFPLElBQUksR0FBRyxDQUFDO0VBQ2hCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSztHQUM1RCxJQUFJLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRTtLQUNyRyxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDNUQ7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUs7QUFDMUQsR0FBRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUM7QUFDMUYsRUFBQyxFQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLO0dBQzdELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUM7QUFDcEgsRUFBQyxFQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLO0FBQzNELEdBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQztBQUNuRixFQUFDLEVBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7R0FDekMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtLQUN6QyxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDckY7RUFDRjtBQUNELENBQUEsVUFBYyxHQUFHO0FBQ2pCLEdBQUUsT0FBTztBQUNULEdBQUUsUUFBUTtBQUNWLEdBQUUsYUFBYTtBQUNmLEdBQUUsYUFBYTtBQUNmLEdBQUUsZUFBZTtBQUNqQixHQUFFLGNBQWM7QUFDaEIsR0FBRSxnQkFBZ0I7QUFDbEIsR0FBRSxnQkFBZ0I7QUFDbEIsR0FBRSxhQUFhO0FBQ2YsR0FBRSxlQUFlO0FBQ2pCLEdBQUUsY0FBYztBQUNoQixHQUFFLGNBQWM7QUFDaEIsR0FBRSxhQUFhO0FBQ2YsR0FBRSxxQkFBcUI7QUFDdkIsR0FBRSxZQUFZO0FBQ2QsR0FBRSxrQkFBa0I7QUFDcEIsR0FBRSxjQUFjO0FBQ2hCLEdBQUUsY0FBYztBQUNoQixHQUFFLGlCQUFpQjtBQUNuQixHQUFFLGFBQWE7QUFDZixHQUFFLG1CQUFtQjtBQUNyQixHQUFBOzs7Ozs7Ozs7Ozs7QUMxWUE7QUFDQSxDQUFjQyxTQUFBLEdBQUdDLGNBQU0sQ0FBQyxPQUFPLENBQUE7Ozs7Ozs7Ozs7QUNBL0I7Q0FDQSxNQUFNLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxHQUFHSixrQkFBaUMsR0FBQTtBQUN6RixDQUFBLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUM7QUFDdkMsQ0FBQSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFDO0FBQ3ZDLENBQUEsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBQztBQUN6QyxDQUFBLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUM7QUFDM0MsQ0FBQSxTQUFTLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFO0FBQ25ELEdBQUUsSUFBSSxvQkFBbUI7QUFDekIsR0FBRSxPQUFPLENBQUM7QUFDVjtBQUNBLE9BQU0sR0FBRztBQUNULE9BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVU7QUFDcEMsT0FBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEtBQUssVUFBVTtBQUNsQyxRQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsR0FBRyxDQUFDLGNBQWM7QUFDMUIsU0FBUSxDQUFDLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLGNBQWMsTUFBTSxJQUFJLElBQUksbUJBQW1CLEtBQUssU0FBUztBQUNqRyxhQUFZLFNBQVM7QUFDckIsYUFBWSxtQkFBbUIsQ0FBQyxRQUFRLE1BQU0sS0FBSyxDQUFDO0FBQ3BEO1FBQ08sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUM7QUFDakQ7SUFDRztFQUNGO0FBQ0Q7Q0FDQSxTQUFTLG9CQUFvQixDQUFDLEdBQUcsRUFBRTtBQUNuQyxHQUFFLElBQUksb0JBQW1CO0FBQ3pCLEdBQUUsT0FBTyxDQUFDO0FBQ1Y7QUFDQSxPQUFNLEdBQUc7QUFDVCxPQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxVQUFVO0FBQ3JDLE9BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLFVBQVU7UUFDM0IsQ0FBQyxHQUFHLENBQUMsY0FBYztBQUMxQixTQUFRLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsY0FBYyxNQUFNLElBQUksSUFBSSxtQkFBbUIsS0FBSyxTQUFTO0FBQ2pHLGFBQVksU0FBUztBQUNyQixhQUFZLG1CQUFtQixDQUFDLFFBQVEsTUFBTSxLQUFLLENBQUM7QUFDcEQ7SUFDRztFQUNGO0FBQ0Q7Q0FDQSxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRTtBQUNqQyxHQUFFLE9BQU8sQ0FBQztBQUNWLEtBQUksR0FBRztBQUNQLEtBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVU7S0FDOUIsR0FBRyxDQUFDLGNBQWM7QUFDdEIsS0FBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEtBQUssVUFBVTtBQUNoQyxLQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxVQUFVO0lBQ2hDO0VBQ0Y7Q0FDRCxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUU7R0FDekI7QUFDRixLQUFJLEdBQUc7TUFDRixHQUFHLENBQUMsY0FBYztPQUNqQixHQUFHLENBQUMsY0FBYztBQUN4QixRQUFPLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztBQUN2RSxRQUFPLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQ3BFO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDbEMsR0FBRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsT0FBTyxLQUFLO0FBQy9CLEdBQUUsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsbUJBQW1CLENBQUMsS0FBSyxVQUFVO0FBQzdFLEdBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssVUFBVTtBQUN6RSxHQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsbUJBQW1CLENBQUMsS0FBSyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssVUFBVTtFQUNuRztDQUNELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtHQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sSUFBSTtBQUN4QyxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3RDLEdBQUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDdEMsR0FBRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksT0FBTTtHQUM5QixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0VBQ2hIO0FBQ0Q7QUFDQTtDQUNBLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRTtHQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxJQUFJO0dBQzlDLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsT0FBTyxJQUFJO0FBQ2hELEdBQUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDdEMsR0FBRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSztHQUMzRSxJQUFJLFFBQVEsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLE9BQU8sSUFBSTtHQUMxRyxPQUFPLE1BQU0sQ0FBQyxLQUFLO0VBQ3BCO0FBQ0Q7QUFDQTtBQUNBLENBQUEsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0dBQzFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7R0FDOUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLE9BQU8sSUFBSTtBQUNuRCxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3RDLEdBQUUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7R0FDM0UsSUFBSSxRQUFRLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRSxPQUFPLElBQUk7R0FDN0csT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDakc7QUFDRDtBQUNBO0NBQ0EsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0dBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7R0FDOUMsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUk7QUFDaEQsR0FBRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBYztHQUNwQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxLQUFLO0dBQzNDLElBQUksUUFBUSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUUsT0FBTyxJQUFJO0dBQzFHLE9BQU8sTUFBTSxDQUFDLEtBQUs7RUFDcEI7QUFDRDtBQUNBO0FBQ0EsQ0FBQSxTQUFTLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7R0FDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sSUFBSTtBQUNoRCxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3RDLEdBQUUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7R0FDM0UsSUFBSSxRQUFRLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRSxPQUFPLElBQUk7R0FDL0csT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbkc7Q0FDRCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDNUIsR0FBRSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQztHQUNyRSxJQUFJLFFBQVEsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFLE9BQU8sSUFBSTtBQUMvRyxHQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sS0FBSztBQUN2QyxHQUFFLE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztFQUN0RjtDQUNELFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRTtHQUMxQixJQUFJLFFBQVEsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFLE9BQU8sSUFBSTtBQUMvRyxHQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sS0FBSztBQUN2QyxHQUFFLE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7RUFDbkY7QUFDRCxDQUFBLFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbEMsR0FBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzdCLEtBQUksT0FBTyxJQUFJO0lBQ1o7QUFDSCxHQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzNCLEtBQUksT0FBTyxJQUFJO0lBQ1o7R0FDRCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDekcsS0FBSSxPQUFPLEtBQUs7SUFDYjtHQUNELElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUN6RyxLQUFJLE9BQU8sS0FBSztJQUNiO0FBQ0gsR0FBRSxPQUFPLElBQUk7RUFDWjtDQUNELFNBQVMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO0dBQ2pDLElBQUkscUJBQXFCLEVBQUUsdUJBQXNCO0FBQ25ELEdBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM3QixLQUFJLE9BQU8sSUFBSTtJQUNaO0FBQ0gsR0FBRSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7S0FDMUIsT0FBTyxNQUFNLENBQUMsZUFBZTtJQUM5QjtHQUNELE9BQU8sQ0FBQyxxQkFBcUI7S0FDM0IsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsY0FBYyxNQUFNLElBQUksSUFBSSxzQkFBc0IsS0FBSyxTQUFTO0FBQ3JHLFNBQVEsU0FBUztTQUNULHNCQUFzQixDQUFDLE9BQU8sTUFBTSxJQUFJLElBQUkscUJBQXFCLEtBQUssU0FBUztBQUN2RixPQUFNLHFCQUFxQjtBQUMzQixPQUFNLElBQUk7RUFDVDtDQUNELFNBQVMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO0dBQ2pDLElBQUkscUJBQXFCLEVBQUUsdUJBQXNCO0FBQ25ELEdBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM3QixLQUFJLE9BQU8sSUFBSTtJQUNaO0FBQ0gsR0FBRSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7S0FDMUIsT0FBTyxNQUFNLENBQUMsZUFBZTtJQUM5QjtHQUNELE9BQU8sQ0FBQyxxQkFBcUI7S0FDM0IsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsY0FBYyxNQUFNLElBQUksSUFBSSxzQkFBc0IsS0FBSyxTQUFTO0FBQ3JHLFNBQVEsU0FBUztTQUNULHNCQUFzQixDQUFDLE9BQU8sTUFBTSxJQUFJLElBQUkscUJBQXFCLEtBQUssU0FBUztBQUN2RixPQUFNLHFCQUFxQjtBQUMzQixPQUFNLElBQUk7RUFDVDtDQUNELFNBQVMsUUFBUSxDQUFDLE1BQU0sRUFBRTtBQUMxQixHQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDN0IsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNILEdBQUUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO0tBQ3RDLE9BQU8sTUFBTSxDQUFDLE1BQU07SUFDckI7QUFDSCxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3RDLEdBQUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWM7R0FDcEM7QUFDRixLQUFJLFFBQVEsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztBQUM5RixLQUFJLFFBQVEsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztLQUMxRjtLQUNBO0FBQ0osT0FBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU07QUFDMUUsUUFBTyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7TUFDdEU7SUFDRjtBQUNILEdBQUUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO0tBQ3BFLE9BQU8sTUFBTSxDQUFDLE9BQU87SUFDdEI7QUFDSCxHQUFFLE9BQU8sSUFBSTtFQUNaO0NBQ0QsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7R0FDakM7QUFDRixLQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQ3ZDLEtBQUksT0FBTyxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUztBQUNqRCxLQUFJLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixLQUFLLFNBQVM7QUFDbEQsS0FBSSxPQUFPLE1BQU0sQ0FBQyxlQUFlLEtBQUssU0FBUztJQUM1QztFQUNGO0NBQ0QsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7R0FDaEMsT0FBTyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztFQUN6RTtDQUNELFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRTtBQUNqQyxHQUFFLElBQUksWUFBVztHQUNmO0FBQ0YsS0FBSSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztBQUMxQyxLQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQ3ZDLEtBQUksQ0FBQyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUMsZ0JBQWdCO0FBQ2hILE9BQU0sU0FBUztJQUNaO0VBQ0Y7Q0FDRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUU7R0FDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7QUFDeEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBYztBQUN0QyxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3RDLEdBQUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLE9BQU07R0FDOUI7S0FDRSxDQUFDLENBQUMsS0FBSyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDO0lBQ3BIO0VBQ0Y7Q0FDRCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7QUFDN0IsR0FBRSxJQUFJLHFCQUFvQjtBQUMxQixHQUFFLE9BQU8sQ0FBQztBQUNWLEtBQUksTUFBTTtBQUNWLE1BQUssQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLG9CQUFvQixLQUFLLFNBQVM7QUFDakcsU0FBUSxvQkFBb0I7QUFDNUIsU0FBUSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDdEQ7RUFDRjtDQUNELFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUMzQixHQUFFLElBQUksSUFBSTtBQUNWLEtBQUksS0FBSztBQUNULEtBQUksS0FBSztBQUNULEtBQUksS0FBSztBQUNULEtBQUksS0FBSztBQUNULEtBQUksa0JBQWtCO0FBQ3RCLEtBQUksc0JBQXNCO0FBQzFCLEtBQUksc0JBQXNCO0FBQzFCLEtBQUksc0JBQXNCO0FBQzFCLEtBQUksdUJBQXNCO0FBQzFCLEdBQUUsT0FBTyxDQUFDO0FBQ1YsS0FBSSxNQUFNO0FBQ1YsTUFBSyxDQUFDLElBQUk7QUFDVixPQUFNLENBQUMsS0FBSztBQUNaLFNBQVEsQ0FBQyxLQUFLO0FBQ2QsV0FBVSxDQUFDLEtBQUs7QUFDaEIsYUFBWSxDQUFDLEtBQUs7QUFDbEIsZUFBYyxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLElBQUksa0JBQWtCLEtBQUssU0FBUztBQUNwRyxtQkFBa0Isa0JBQWtCO21CQUNsQixNQUFNLENBQUMsZUFBZSxNQUFNLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztBQUN6RSxpQkFBZ0IsS0FBSztpQkFDTCxNQUFNLENBQUMsZUFBZSxNQUFNLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztBQUN2RSxlQUFjLEtBQUs7ZUFDTCxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxjQUFjLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixLQUFLLFNBQVM7QUFDL0csZUFBYyxTQUFTO2VBQ1Qsc0JBQXNCLENBQUMsWUFBWSxNQUFNLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztBQUNsRixhQUFZLEtBQUs7YUFDTCxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxjQUFjLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixLQUFLLFNBQVM7QUFDN0csYUFBWSxTQUFTO2FBQ1Qsc0JBQXNCLENBQUMsWUFBWSxNQUFNLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztBQUNoRixXQUFVLEtBQUs7V0FDTCxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxjQUFjLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixLQUFLLFNBQVM7QUFDM0csV0FBVSxTQUFTO1dBQ1Qsc0JBQXNCLENBQUMsT0FBTyxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUztBQUN4RSxTQUFRLElBQUk7U0FDSixDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxjQUFjLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixLQUFLLFNBQVM7QUFDekcsU0FBUSxTQUFTO1NBQ1Qsc0JBQXNCLENBQUMsT0FBTyxDQUFDO0lBQ3BDO0VBQ0Y7QUFDRCxDQUFBLEtBQWMsR0FBRztBQUNqQixHQUFFLFVBQVU7QUFDWixHQUFFLFdBQVc7QUFDYixHQUFFLFlBQVk7QUFDZCxHQUFFLFNBQVM7QUFDWCxHQUFFLFVBQVU7QUFDWixHQUFFLFVBQVU7QUFDWixHQUFFLFdBQVc7QUFDYixHQUFFLFFBQVE7QUFDVixHQUFFLFdBQVc7QUFDYixHQUFFLGtCQUFrQjtBQUNwQixHQUFFLFVBQVU7QUFDWixHQUFFLFVBQVU7QUFDWixHQUFFLG9CQUFvQjtBQUN0QixHQUFFLGVBQWU7QUFDakIsR0FBRSxrQkFBa0I7QUFDcEIsR0FBRSxpQkFBaUI7QUFDbkIsR0FBRSxZQUFZO0FBQ2QsR0FBRSxVQUFVO0FBQ1osR0FBRSxvQkFBb0I7QUFDdEIsR0FBRSxlQUFlO0FBQ2pCLEdBQUUsa0JBQWtCO0FBQ3BCLEdBQUUsaUJBQWlCO0FBQ25CLEdBQUUsZUFBZTtBQUNqQixHQUFFLGdCQUFnQjtBQUNsQixHQUFFLGFBQWE7QUFDZixHQUFBOzs7Ozs7Ozs7OztDQ3BTQSxNQUFNLE9BQU8sR0FBR0EsY0FBbUIsRUFBQTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBRUEsQ0FBQSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHQyxhQUE0QixHQUFBO0FBQzFELENBQUEsTUFBTSxFQUFFLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLEdBQUcsTUFBSztBQUNsRSxDQUFBLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUdDLFdBQTBCLEdBQUE7Q0FDekQsTUFBTSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxHQUFHRyxpQkFBd0IsR0FBQTtBQUMxRixDQUFBLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBR0Msa0JBQWlDLEdBQUE7Q0FDckQsTUFBTTtBQUNOLEdBQUUsUUFBUTtBQUNWLEdBQUUsVUFBVTtBQUNaLEdBQUUsb0JBQW9CO0FBQ3RCLEdBQUUsa0JBQWtCO0FBQ3BCLEdBQUUsaUJBQWlCO0FBQ25CLEdBQUUsVUFBVTtBQUNaLEdBQUUsb0JBQW9CO0FBQ3RCLEdBQUUsa0JBQWtCO0FBQ3BCLEdBQUUsaUJBQWlCO0FBQ25CLEdBQUUsWUFBWTtHQUNaLGFBQWEsRUFBRSxjQUFjO0FBQy9CLEVBQUMsR0FBR0MsWUFBa0IsR0FBQTtDQUN0QixTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUU7R0FDekIsT0FBTyxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxVQUFVO0VBQzlEO0NBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFFO0FBQ3BCLENBQUEsU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7R0FDdEMsSUFBSSxpQkFBaUIsRUFBRSxrQkFBaUI7QUFDMUMsR0FBRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0tBQzFCLFFBQVEsR0FBRyxRQUFPO0tBQ2xCLE9BQU8sR0FBRyxhQUFZO0FBQzFCLElBQUcsTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7S0FDMUIsT0FBTyxHQUFHLGFBQVk7QUFDMUIsSUFBRyxNQUFNO0FBQ1QsS0FBSSxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQztJQUNuQztBQUNILEdBQUUsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQztBQUN4QyxHQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUM7QUFDdkQsR0FBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBQztBQUMzQixHQUFFLE1BQU0sUUFBUTtLQUNaLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLFFBQVEsTUFBTSxJQUFJLElBQUksaUJBQWlCLEtBQUssU0FBUztBQUN0RixTQUFRLGlCQUFpQjtTQUNqQixvQkFBb0IsQ0FBQyxNQUFNLEVBQUM7QUFDcEMsR0FBRSxNQUFNLFFBQVE7S0FDWixDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxRQUFRLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixLQUFLLFNBQVM7QUFDdEYsU0FBUSxpQkFBaUI7U0FDakIsb0JBQW9CLENBQUMsTUFBTSxFQUFDO0FBQ3BDLEdBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM3QjtLQUNJLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUMzRDtBQUNILEdBQUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDdEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBYztHQUNwQyxNQUFNLGNBQWMsR0FBRyxNQUFNO0FBQy9CLEtBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDMUIsT0FBTSxRQUFRLEdBQUU7TUFDWDtLQUNGO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksYUFBYTtBQUNuQixLQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUTtHQUNsSCxJQUFJLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7R0FDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTTtLQUNyQixnQkFBZ0IsR0FBRyxLQUFJO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEtBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO09BQ3BCLGFBQWEsR0FBRyxNQUFLO01BQ3RCO0tBQ0QsSUFBSSxhQUFhLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxFQUFFO0FBQ3pELE9BQU0sTUFBTTtNQUNQO0FBQ0wsS0FBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGdCQUFnQixFQUFFO0FBQ3ZDLE9BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7TUFDdEI7S0FDRjtHQUNELElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztHQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNO0tBQ2xCLGdCQUFnQixHQUFHLEtBQUk7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsS0FBSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7T0FDcEIsYUFBYSxHQUFHLE1BQUs7TUFDdEI7S0FDRCxJQUFJLGFBQWEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEVBQUU7QUFDekQsT0FBTSxNQUFNO01BQ1A7QUFDTCxLQUFJLElBQUksQ0FBQyxRQUFRLElBQUksZ0JBQWdCLEVBQUU7QUFDdkMsT0FBTSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBQztNQUN0QjtLQUNGO0FBQ0gsR0FBRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSztBQUMzQixLQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQztLQUMzQjtBQUNILEdBQUUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBQztHQUM3QixNQUFNLE9BQU8sR0FBRyxNQUFNO0tBQ3BCLE1BQU0sR0FBRyxLQUFJO0tBQ2IsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFDO0FBQzFFLEtBQUksSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFO09BQzNDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO01BQ3RDO0FBQ0wsS0FBSSxJQUFJLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUM3RSxPQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLDBCQUEwQixFQUFFLENBQUM7TUFDdkc7QUFDTCxLQUFJLElBQUksUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7QUFDdkMsT0FBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO01BQ3ZHO0FBQ0wsS0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBQztLQUN0QjtHQUNELE1BQU0sU0FBUyxHQUFHLE1BQU07S0FDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztLQUNsQztBQUNILEdBQUUsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDekIsS0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUM7S0FDL0IsSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUN4QixPQUFNLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztNQUM1QjtBQUNMLEtBQUksSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQ3BCLE9BQU0sU0FBUyxHQUFFO0FBQ2pCLE1BQUssTUFBTTtBQUNYLE9BQU0sTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFDO01BQ2hDO0FBQ0wsSUFBRyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xDO0FBQ0EsS0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUM7QUFDcEMsS0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUM7SUFDbkM7QUFDSDtBQUNBO0dBQ0UsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQzdELEtBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFDO0lBQzlCO0FBQ0gsR0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUM7QUFDekIsR0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7QUFDL0IsR0FBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO0FBQy9CLEtBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0lBQzVCO0FBQ0gsR0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7R0FDM0IsSUFBSSxNQUFNLEVBQUU7QUFDZCxLQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFDO0FBQzdCLElBQUcsTUFBTTtLQUNMLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxZQUFZO01BQzlELE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO0tBQ2hFO0tBQ0EsSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUN4QixPQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFDO01BQzFCO0FBQ0wsSUFBRyxNQUFNO0FBQ1QsS0FBSSxDQUFDLFFBQVE7QUFDYixNQUFLLENBQUMsYUFBYSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztNQUNyQyxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDO0tBQ2xEO0FBQ0osS0FBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBQztBQUM3QixJQUFHLE1BQU07QUFDVCxLQUFJLENBQUMsUUFBUTtBQUNiLE1BQUssQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO01BQ3JDLGdCQUFnQixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUM7S0FDbEQ7QUFDSixLQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFDO0lBQzFCLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO0FBQ3JELEtBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUM7SUFDMUI7R0FDRCxNQUFNLE9BQU8sR0FBRyxNQUFNO0tBQ3BCLFFBQVEsR0FBRyxJQUFHO0FBQ2xCLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFDO0FBQzdDLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFDO0FBQy9DLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzNDLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFDO0FBQy9DLEtBQUksSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7QUFDakUsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUM7QUFDaEQsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUM7QUFDbEQsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7QUFDN0MsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUM7QUFDdkMsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7QUFDM0MsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7S0FDeEM7QUFDSCxHQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtLQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNO0FBQ3hCO09BQ00sTUFBTSxXQUFXLEdBQUcsU0FBUTtBQUNsQyxPQUFNLE9BQU8sR0FBRTtPQUNULFdBQVcsQ0FBQyxJQUFJO0FBQ3RCLFNBQVEsTUFBTTtBQUNkLFNBQVEsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO0FBQ2xDLFdBQVUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUN0QyxVQUFTLENBQUM7U0FDSDtPQUNGO0FBQ0wsS0FBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO0FBQ2hDLE9BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUM7QUFDN0IsTUFBSyxNQUFNO09BQ0wsTUFBTSxnQkFBZ0IsR0FBRyxTQUFRO0FBQ3ZDLE9BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLO1NBQzNCLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztBQUMxRCxTQUFRLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO0FBQzVDLFFBQU8sRUFBQztPQUNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztNQUNoRDtJQUNGO0FBQ0gsR0FBRSxPQUFPLE9BQU87RUFDZjtBQUNELENBQUEsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtHQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sS0FBSztLQUN0QyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSztPQUN6QixJQUFJLEdBQUcsRUFBRTtTQUNQLE1BQU0sQ0FBQyxHQUFHLEVBQUM7QUFDbkIsUUFBTyxNQUFNO0FBQ2IsU0FBUSxPQUFPLEdBQUU7UUFDVjtBQUNQLE1BQUssRUFBQztBQUNOLElBQUcsQ0FBQztFQUNIO0FBQ0QsQ0FBQUMsV0FBQSxDQUFBLE9BQWMsR0FBRyxJQUFHO0FBQ3BCLENBQUFDLG1CQUFBLENBQUEsUUFBdUIsR0FBRyxTQUFBOzs7Ozs7Ozs7QUM5TjFCO0NBQ0EsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGVBQWUsSUFBSVQsVUFBMkIsQ0FBQyxnQkFBZTtDQUNqRyxNQUFNO0dBQ0osS0FBSyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUU7QUFDckUsR0FBRSxVQUFVO0FBQ1osRUFBQyxHQUFHQyxhQUE0QixHQUFBO0NBQ2hDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLEdBQUdDLGlCQUF3QixHQUFBO0FBQ3pGLENBQUEsTUFBTSxZQUFZLEdBQUdHLGtCQUFBLEVBQWlDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBQztBQUN0RSxDQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBR0Msa0JBQTBCLEdBQUE7Q0FDL0MsTUFBTTtBQUNOLEdBQUUsa0JBQWtCO0FBQ3BCLEdBQUUsU0FBUztBQUNYLEdBQUUsTUFBTTtBQUNSLEdBQUUsV0FBVztBQUNiLEdBQUUsT0FBTztBQUNULEdBQUUsYUFBYTtBQUNmLEdBQUUsb0JBQW9CO0FBQ3RCLEdBQUUsTUFBTTtBQUNSLEVBQUMsR0FBR0Qsa0JBQWlDLEdBQUE7QUFDckMsQ0FBQSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFDO0FBQy9CLENBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBQztBQUMzQixDQUFBLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDMUIsR0FBRSxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtBQUNoQyxLQUFJLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hFO0FBQ0gsR0FBRSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDdkIsS0FBSSxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQztJQUNuQztBQUNILEdBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFDeEYsS0FBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFDO0lBQ3REO0dBQ0QsSUFBSSxXQUFXLEdBQUcsRUFBQztBQUNyQixHQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO0FBQzdGLEtBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFDO0lBQzdDO0FBQ0gsR0FBRSxlQUFlLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUM7R0FDOUMsT0FBTyxnQkFBZ0IsR0FBRyxHQUFHO0tBQzNCLElBQUksZUFBZSxFQUFFLGlCQUFnQjtBQUN6QyxLQUFJLE1BQU0sRUFBRSxHQUFHLElBQUksZUFBZSxHQUFFO0tBQ2hDLE1BQU0sTUFBTSxHQUFHLEtBQUk7S0FDbkIsTUFBTSxLQUFLLEdBQUcsR0FBRTtBQUNwQixLQUFJLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFNO0tBQ3hCLE1BQU0sU0FBUyxHQUFHO0FBQ3RCLE9BQU0sTUFBTTtPQUNQO0FBQ0wsS0FBSSxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEdBQUU7S0FDOUI7T0FDRSxPQUFPLEtBQUssSUFBSTtPQUNoQixPQUFPLEtBQUssU0FBUztBQUMzQixPQUFNLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxNQUFNLE1BQU0sSUFBSTtPQUMzQyxlQUFlLEtBQUssU0FBUztPQUM3QixlQUFlLENBQUMsT0FBTztPQUN2QjtBQUNOLE9BQU0sS0FBSyxHQUFFO01BQ1I7QUFDTCxLQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVM7QUFDN0MsU0FBUSxTQUFTO1NBQ1QsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxNQUFNLElBQUksSUFBSSxnQkFBZ0IsS0FBSyxTQUFTO0FBQ3RGLFNBQVEsU0FBUztBQUNqQixTQUFRLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUM7QUFDekQsS0FBSSxJQUFJLEtBQUk7QUFDWixLQUFJLElBQUksT0FBTTtLQUNWLElBQUksSUFBSSxHQUFHLE1BQUs7S0FDaEIsU0FBUyxNQUFNLEdBQUc7T0FDaEIsSUFBSSxHQUFHLEtBQUk7TUFDWjtLQUNELGVBQWUsSUFBSSxHQUFHO0FBQzFCLE9BQU0sSUFBSTtBQUNWLFNBQVEsV0FBVyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUU7QUFDdEMsV0FBVSxJQUFJLEtBQUk7V0FDUixJQUFJLElBQUksRUFBRTtBQUNwQixhQUFZLE1BQU07WUFDUDtBQUNYLFdBQVUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2FBQ2xCLE1BQU0sSUFBSSxVQUFVLEVBQUU7WUFDdkI7QUFDWCxXQUFVLElBQUk7QUFDZCxhQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBQztZQUN6QixDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQ3hCLGFBQVksR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUM7WUFDekI7QUFDWCxXQUFVLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRTtBQUM5QixhQUFZLFFBQVE7WUFDVDtXQUNELElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDNUcsYUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBQztZQUNsQjtBQUNYLFdBQVUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUM7V0FDZixJQUFJLElBQUksRUFBRTtBQUNwQixhQUFZLElBQUksR0FBRTthQUNOLElBQUksR0FBRyxLQUFJO1lBQ1o7QUFDWCxXQUFVLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRTtBQUNwRSxhQUFZLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUs7ZUFDN0IsTUFBTSxHQUFHLFFBQU87QUFDOUIsY0FBYSxFQUFDO1lBQ0g7VUFDRjtBQUNULFNBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7UUFDakIsQ0FBQyxPQUFPLEdBQUcsRUFBRTtBQUNwQixTQUFRLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUM7QUFDdEMsU0FBUSxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQztBQUNwRCxTQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDO0FBQ3ZCLFFBQU8sU0FBUztBQUNoQixTQUFRLElBQUksaUJBQWdCO1NBQ3BCLElBQUksR0FBRyxLQUFJO1NBQ1gsSUFBSSxJQUFJLEVBQUU7QUFDbEIsV0FBVSxJQUFJLEdBQUU7V0FDTixJQUFJLEdBQUcsS0FBSTtVQUNaO0FBQ1QsU0FBUSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTO0FBQ2pELGFBQVksU0FBUzthQUNULENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sTUFBTSxJQUFJLElBQUksZ0JBQWdCLEtBQUssU0FBUztBQUMxRixhQUFZLFNBQVM7QUFDckIsYUFBWSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFDO1FBQ3pEO01BQ0Y7QUFDTCxLQUFJLElBQUksR0FBRTtBQUNWLEtBQUksSUFBSTtPQUNGLE9BQU8sSUFBSSxFQUFFO0FBQ25CLFNBQVEsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxXQUFVLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBQztBQUNwQyxXQUFVLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtBQUM1QixhQUFZLE1BQU07WUFDUDtBQUNYLFdBQVUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2FBQ2xCLE1BQU0sSUFBSSxVQUFVLEVBQUU7WUFDdkI7QUFDWCxXQUFVLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRTtBQUM5QixhQUFZLE1BQU0sSUFBRztZQUNWO1dBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRTtXQUNiLElBQUksTUFBTSxFQUFFO0FBQ3RCLGFBQVksTUFBTSxHQUFFO2FBQ1IsTUFBTSxHQUFHLEtBQUk7WUFDZDtVQUNGO0FBQ1QsU0FBUSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLO1dBQzdCLElBQUksR0FBRyxRQUFPO0FBQ3hCLFVBQVMsRUFBQztRQUNIO0FBQ1AsTUFBSyxTQUFTO09BQ1IsRUFBRSxDQUFDLEtBQUssR0FBRTtPQUNWLElBQUksR0FBRyxLQUFJO09BQ1gsSUFBSSxNQUFNLEVBQUU7QUFDbEIsU0FBUSxNQUFNLEdBQUU7U0FDUixNQUFNLEdBQUcsS0FBSTtRQUNkO01BQ0Y7QUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNiO0FBQ0QsQ0FBQSxTQUFTLGNBQWMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxFQUFFO0FBQzdDLEdBQUUsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQ3ZCLEtBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUM7SUFDbkM7QUFDSCxHQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQ3hGLEtBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBQztJQUN0RDtHQUNELE9BQU8sZ0JBQWdCLGNBQWMsR0FBRztLQUN0QyxJQUFJLEtBQUssR0FBRyxFQUFDO0FBQ2pCLEtBQUksV0FBVyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEMsT0FBTSxJQUFJLGlCQUFnQjtPQUNwQjtTQUNFLE9BQU8sS0FBSyxJQUFJO1NBQ2hCLE9BQU8sS0FBSyxTQUFTO0FBQzdCLFNBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxNQUFNLElBQUk7U0FDNUMsZ0JBQWdCLEtBQUssU0FBUztTQUM5QixnQkFBZ0IsQ0FBQyxPQUFPO1NBQ3hCO1NBQ0EsTUFBTSxJQUFJLFVBQVUsQ0FBQztBQUM3QixXQUFVLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDdEMsVUFBUyxDQUFDO1FBQ0g7QUFDUCxPQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUM7TUFDckI7QUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNiO0FBQ0QsQ0FBQSxlQUFlLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLFNBQVMsRUFBRTtBQUM3QyxHQUFFLFdBQVcsTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQzdELEtBQUksT0FBTyxJQUFJO0lBQ1o7QUFDSCxHQUFFLE9BQU8sS0FBSztFQUNiO0FBQ0QsQ0FBQSxlQUFlLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLFNBQVMsRUFBRTtBQUM5QyxHQUFFLElBQUksT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFO0FBQ2hDLEtBQUksTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDeEU7QUFDSDtBQUNBLEdBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUk7QUFDMUIsS0FBSSxJQUFJO0tBQ0osT0FBTyxHQUFHLElBQUksS0FBSztPQUNqQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztNQUM1QjtBQUNMLEtBQUksT0FBTztBQUNYLElBQUcsQ0FBQztFQUNIO0FBQ0QsQ0FBQSxlQUFlLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQ2pDLEdBQUUsV0FBVyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDN0QsS0FBSSxPQUFPLE1BQU07SUFDZDtBQUNILEdBQUUsT0FBTyxTQUFTO0VBQ2pCO0FBQ0QsQ0FBQSxlQUFlLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQ3BDLEdBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUU7QUFDaEMsS0FBSSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN4RTtBQUNILEdBQUUsZUFBZSxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUMzQyxLQUFJLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUM7QUFDNUIsS0FBSSxPQUFPLE1BQU07SUFDZDtBQUNIO0FBQ0EsR0FBRSxXQUFXLE1BQU0sTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0VBQ2hFO0FBQ0QsQ0FBQSxTQUFTLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzdCLEdBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUU7QUFDaEMsS0FBSSxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN4RTtBQUNILEdBQUUsZUFBZSxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtLQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRTtBQUNsQyxPQUFNLE9BQU8sS0FBSztNQUNiO0FBQ0wsS0FBSSxPQUFPLE1BQU07SUFDZDtHQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztFQUN6QztBQUNEO0FBQ0E7QUFDQTtDQUNBLE1BQU0seUJBQXlCLFNBQVMsZ0JBQWdCLENBQUM7QUFDekQsR0FBRSxXQUFXLEdBQUc7S0FDWixLQUFLLENBQUMsUUFBUSxFQUFDO0FBQ25CLEtBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxzREFBcUQ7SUFDckU7RUFDRjtBQUNELENBQUEsZUFBZSxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7QUFDdEQsR0FBRSxJQUFJLGlCQUFnQjtBQUN0QixHQUFFLElBQUksT0FBTyxPQUFPLEtBQUssVUFBVSxFQUFFO0FBQ3JDLEtBQUksTUFBTSxJQUFJLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDbEY7QUFDSCxHQUFFLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUN2QixLQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFDO0lBQ25DO0FBQ0gsR0FBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtBQUN4RixLQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUM7SUFDdEQ7QUFDSCxHQUFFLElBQUksZUFBZSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBQztHQUMxQztLQUNFLE9BQU8sS0FBSyxJQUFJO0tBQ2hCLE9BQU8sS0FBSyxTQUFTO0FBQ3pCLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxNQUFNLElBQUk7S0FDNUMsZ0JBQWdCLEtBQUssU0FBUztLQUM5QixnQkFBZ0IsQ0FBQyxPQUFPO0tBQ3hCO0FBQ0osS0FBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7QUFDMUMsT0FBTSxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQ2xDLE1BQUssRUFBQztLQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFDO0tBQzVCLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUM7QUFDckMsS0FBSSxNQUFNLEdBQUc7SUFDVjtBQUNILEdBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLEdBQUU7QUFDbEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTTtBQUMxQixHQUFFLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7S0FDL0QsTUFBTSxJQUFJLEdBQUc7T0FDWCxJQUFJLEVBQUUsSUFBSTtPQUNWLENBQUMsWUFBWSxHQUFHLElBQUk7T0FDckI7QUFDTCxLQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBQztJQUNqRTtHQUNELElBQUksb0JBQW9CLEdBQUcsTUFBSztBQUNsQyxHQUFFLElBQUk7QUFDTixLQUFJLFdBQVcsTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3BDLE9BQU0sSUFBSSxpQkFBZ0I7T0FDcEIsb0JBQW9CLEdBQUcsS0FBSTtPQUMzQjtTQUNFLE9BQU8sS0FBSyxJQUFJO1NBQ2hCLE9BQU8sS0FBSyxTQUFTO0FBQzdCLFNBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxNQUFNLElBQUk7U0FDNUMsZ0JBQWdCLEtBQUssU0FBUztTQUM5QixnQkFBZ0IsQ0FBQyxPQUFPO1NBQ3hCO1NBQ0EsTUFBTSxJQUFJLFVBQVUsRUFBRTtRQUN2QjtPQUNELElBQUksQ0FBQyxlQUFlLEVBQUU7U0FDcEIsWUFBWSxHQUFHLE1BQUs7U0FDcEIsZUFBZSxHQUFHLEtBQUk7QUFDOUIsUUFBTyxNQUFNO1NBQ0wsWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUU7QUFDMUQsV0FBVSxNQUFNO0FBQ2hCLFVBQVMsRUFBQztRQUNIO01BQ0Y7QUFDTCxLQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLGVBQWUsRUFBRTtPQUM3QyxNQUFNLElBQUkseUJBQXlCLEVBQUU7TUFDdEM7QUFDTCxJQUFHLFNBQVM7S0FDUixFQUFFLENBQUMsS0FBSyxHQUFFO0lBQ1g7QUFDSCxHQUFFLE9BQU8sWUFBWTtFQUNwQjtDQUNELGVBQWUsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUNoQyxHQUFFLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUN2QixLQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFDO0lBQ25DO0FBQ0gsR0FBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtBQUN4RixLQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUM7SUFDdEQ7R0FDRCxNQUFNLE1BQU0sR0FBRyxHQUFFO0FBQ25CLEdBQUUsV0FBVyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDaEMsS0FBSSxJQUFJLGlCQUFnQjtLQUNwQjtPQUNFLE9BQU8sS0FBSyxJQUFJO09BQ2hCLE9BQU8sS0FBSyxTQUFTO0FBQzNCLE9BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxNQUFNLElBQUk7T0FDNUMsZ0JBQWdCLEtBQUssU0FBUztPQUM5QixnQkFBZ0IsQ0FBQyxPQUFPO09BQ3hCO0FBQ04sT0FBTSxNQUFNLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtBQUN0QyxTQUFRLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDcEMsUUFBTyxDQUFDO01BQ0g7QUFDTCxLQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUM7SUFDaEM7QUFDSCxHQUFFLE9BQU8sTUFBTTtFQUNkO0FBQ0QsQ0FBQSxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzlCLEdBQUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQztHQUMxQyxPQUFPLGdCQUFnQixPQUFPLEdBQUc7QUFDbkMsS0FBSSxXQUFXLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtBQUNwQyxPQUFNLE9BQU8sSUFBRztNQUNYO0FBQ0wsSUFBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDYjtDQUNELFNBQVMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO0FBQ3JDO0FBQ0E7QUFDQSxHQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFDO0FBQ3pCLEdBQUUsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDM0IsS0FBSSxPQUFPLENBQUM7SUFDVDtBQUNILEdBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0tBQ2QsTUFBTSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ3JEO0FBQ0gsR0FBRSxPQUFPLE1BQU07RUFDZDtBQUNELENBQUEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxTQUFTLEVBQUU7QUFDM0MsR0FBRSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDdkIsS0FBSSxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQztJQUNuQztBQUNILEdBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFDeEYsS0FBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFDO0lBQ3REO0FBQ0gsR0FBRSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFDO0dBQ3BDLE9BQU8sZ0JBQWdCLElBQUksR0FBRztBQUNoQyxLQUFJLElBQUksaUJBQWdCO0tBQ3BCO09BQ0UsT0FBTyxLQUFLLElBQUk7T0FDaEIsT0FBTyxLQUFLLFNBQVM7QUFDM0IsT0FBTSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLE1BQU0sSUFBSTtPQUM1QyxnQkFBZ0IsS0FBSyxTQUFTO09BQzlCLGdCQUFnQixDQUFDLE9BQU87T0FDeEI7T0FDQSxNQUFNLElBQUksVUFBVSxFQUFFO01BQ3ZCO0FBQ0wsS0FBSSxXQUFXLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQyxPQUFNLElBQUksaUJBQWdCO09BQ3BCO1NBQ0UsT0FBTyxLQUFLLElBQUk7U0FDaEIsT0FBTyxLQUFLLFNBQVM7QUFDN0IsU0FBUSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLE1BQU0sSUFBSTtTQUM1QyxnQkFBZ0IsS0FBSyxTQUFTO1NBQzlCLGdCQUFnQixDQUFDLE9BQU87U0FDeEI7U0FDQSxNQUFNLElBQUksVUFBVSxFQUFFO1FBQ3ZCO0FBQ1AsT0FBTSxJQUFJLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUN6QixTQUFRLE1BQU0sSUFBRztRQUNWO01BQ0Y7QUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNiO0FBQ0QsQ0FBQSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLFNBQVMsRUFBRTtBQUMzQyxHQUFFLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUN2QixLQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFDO0lBQ25DO0FBQ0gsR0FBRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtBQUN4RixLQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUM7SUFDdEQ7QUFDSCxHQUFFLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUM7R0FDcEMsT0FBTyxnQkFBZ0IsSUFBSSxHQUFHO0FBQ2hDLEtBQUksSUFBSSxrQkFBaUI7S0FDckI7T0FDRSxPQUFPLEtBQUssSUFBSTtPQUNoQixPQUFPLEtBQUssU0FBUztBQUMzQixPQUFNLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sTUFBTSxJQUFJO09BQzdDLGlCQUFpQixLQUFLLFNBQVM7T0FDL0IsaUJBQWlCLENBQUMsT0FBTztPQUN6QjtPQUNBLE1BQU0sSUFBSSxVQUFVLEVBQUU7TUFDdkI7QUFDTCxLQUFJLFdBQVcsTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xDLE9BQU0sSUFBSSxrQkFBaUI7T0FDckI7U0FDRSxPQUFPLEtBQUssSUFBSTtTQUNoQixPQUFPLEtBQUssU0FBUztBQUM3QixTQUFRLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sTUFBTSxJQUFJO1NBQzdDLGlCQUFpQixLQUFLLFNBQVM7U0FDL0IsaUJBQWlCLENBQUMsT0FBTztTQUN6QjtTQUNBLE1BQU0sSUFBSSxVQUFVLEVBQUU7UUFDdkI7QUFDUCxPQUFNLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFO0FBQ3hCLFNBQVEsTUFBTSxJQUFHO0FBQ2pCLFFBQU8sTUFBTTtBQUNiLFNBQVEsTUFBTTtRQUNQO01BQ0Y7QUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNiO0FBQ0QsQ0FBQSxTQUFBLENBQUEsd0JBQXVDLEdBQUc7QUFDMUMsR0FBRSxjQUFjO0FBQ2hCLEdBQUUsSUFBSTtBQUNOLEdBQUUsTUFBTTtBQUNSLEdBQUUsT0FBTztBQUNULEdBQUUsR0FBRztBQUNMLEdBQUUsSUFBSTtHQUNMO0FBQ0QsQ0FBQSxTQUFBLENBQUEseUJBQXdDLEdBQUc7QUFDM0MsR0FBRSxLQUFLO0FBQ1AsR0FBRSxPQUFPO0FBQ1QsR0FBRSxNQUFNO0FBQ1IsR0FBRSxPQUFPO0FBQ1QsR0FBRSxJQUFJO0FBQ04sR0FBRSxJQUFJO0FBQ04sR0FBQTs7Ozs7Ozs7OztBQ2xiQTtBQUNBO0FBQ0E7Q0FDQSxNQUFNLE9BQU8sR0FBR0wsY0FBbUIsR0FBQTtBQUNuQztBQUNBO0FBQ0E7Q0FDQSxNQUFNO0FBQ04sR0FBRSxrQkFBa0I7QUFDcEIsR0FBRSxLQUFLLEVBQUUsRUFBRSxxQkFBcUIsRUFBRTtBQUNsQyxHQUFFLFVBQVU7QUFDWixFQUFDLEdBQUdDLGFBQTRCLEdBQUE7QUFDaEMsQ0FBQSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUdDLGtCQUFpQyxHQUFBO0NBQ3BELE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsR0FBR0csWUFBa0IsR0FBQTtBQUNuRixDQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUM7QUFDbkMsQ0FBQSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFDO0FBQ3ZDLENBQUEsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7R0FDN0IsSUFBSSxHQUFHLEVBQUU7QUFDWDtLQUNJLEdBQUcsQ0FBQyxNQUFLO0FBQ2I7QUFDQSxLQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtBQUN6QixPQUFNLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBRztNQUNoQjtBQUNMLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQ3pCLE9BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFHO01BQ2hCO0lBQ0Y7RUFDRjtBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRTtBQUMxQixHQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQy9CLEdBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWM7QUFDL0I7QUFDQSxHQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDO0FBQ2xCLEdBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDaEQsS0FBSSxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtBQUNsQyxPQUFNLEVBQUUsR0FBRTtNQUNMO0FBQ0wsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0dBQ3JCLElBQUksQ0FBQyxFQUFFO0FBQ1QsS0FBSSxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUk7SUFDbkI7R0FDRCxJQUFJLENBQUMsRUFBRTtBQUNULEtBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFJO0lBQ25CO0FBQ0g7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7S0FDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUU7QUFDdEMsT0FBTSxRQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUM7QUFDckQsTUFBSyxFQUFDO0FBQ04sSUFBRyxNQUFNO0FBQ1QsS0FBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7SUFDeEI7QUFDSCxHQUFFLE9BQU8sSUFBSTtFQUNaO0FBQ0QsQ0FBQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtHQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFLO0FBQ3BCLEdBQUUsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFO0tBQ3RCLElBQUksTUFBTSxFQUFFO0FBQ2hCLE9BQU0sTUFBTTtNQUNQO0tBQ0QsTUFBTSxHQUFHLEtBQUk7QUFDakIsS0FBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBYztBQUNqQyxLQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ2pDLEtBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0tBQ3JCLElBQUksQ0FBQyxFQUFFO0FBQ1gsT0FBTSxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUk7TUFDaEI7S0FDRCxJQUFJLENBQUMsRUFBRTtBQUNYLE9BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFJO01BQ2hCO0FBQ0wsS0FBSSxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtPQUM1QixFQUFFLENBQUMsR0FBRyxFQUFDO01BQ1I7S0FDRCxJQUFJLEdBQUcsRUFBRTtPQUNQLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQztBQUNuRCxNQUFLLE1BQU07QUFDWCxPQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksRUFBQztNQUNwQztJQUNGO0FBQ0gsR0FBRSxJQUFJO0tBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLFNBQVMsRUFBQztJQUN0QyxDQUFDLE9BQU8sR0FBRyxFQUFFO0tBQ1osU0FBUyxDQUFDLEdBQUcsRUFBQztJQUNmO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNyQyxHQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFDO0dBQ3RCLFdBQVcsQ0FBQyxJQUFJLEVBQUM7RUFDbEI7Q0FDRCxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUU7QUFDM0IsR0FBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBYztBQUMvQixHQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0dBQzdCLElBQUksQ0FBQyxFQUFFO0FBQ1QsS0FBSSxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUk7SUFDdEI7R0FDRCxJQUFJLENBQUMsRUFBRTtBQUNULEtBQUksQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFJO0lBQ3RCO0FBQ0gsR0FBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUNoRCxLQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO0lBQ25CO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDaEMsR0FBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBYztBQUMvQixHQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQy9CLEdBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUU7QUFDdEQsS0FBSSxNQUFNO0lBQ1A7R0FDRCxJQUFJLENBQUMsRUFBRTtBQUNULEtBQUksQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFJO0lBQ3RCO0dBQ0QsSUFBSSxDQUFDLEVBQUU7QUFDVCxLQUFJLENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSTtJQUN0QjtBQUNILEdBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFDO0VBQ3hCO0FBQ0QsQ0FBQSxTQUFTLFNBQVMsR0FBRztBQUNyQixHQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQy9CLEdBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWM7R0FDN0IsSUFBSSxDQUFDLEVBQUU7QUFDVCxLQUFJLENBQUMsQ0FBQyxXQUFXLEdBQUcsS0FBSTtBQUN4QixLQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBSztBQUNwQixLQUFJLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBSztBQUMxQixLQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBSztBQUN2QixLQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSTtBQUNwQixLQUFJLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBSztBQUMxQixLQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsTUFBSztLQUNqQixDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBSztLQUM5QixDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBSztJQUNwQztHQUNELElBQUksQ0FBQyxFQUFFO0FBQ1QsS0FBSSxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUk7QUFDeEIsS0FBSSxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQUs7QUFDdkIsS0FBSSxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQUs7QUFDcEIsS0FBSSxDQUFDLENBQUMsWUFBWSxHQUFHLE1BQUs7QUFDMUIsS0FBSSxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUk7QUFDcEIsS0FBSSxDQUFDLENBQUMsWUFBWSxHQUFHLE1BQUs7QUFDMUIsS0FBSSxDQUFDLENBQUMsV0FBVyxHQUFHLE1BQUs7QUFDekIsS0FBSSxDQUFDLENBQUMsV0FBVyxHQUFHLE1BQUs7S0FDckIsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQUs7S0FDOUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQUs7S0FDL0IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQUs7SUFDbEM7RUFDRjtBQUNELENBQUEsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsZUFBYztBQUNqQyxHQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ2pDLEdBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDaEQsS0FBSSxPQUFPLElBQUk7SUFDWjtHQUNELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO1FBQ2hFLElBQUksR0FBRyxFQUFFO0FBQ2hCO0tBQ0ksR0FBRyxDQUFDLE1BQUs7QUFDYjtBQUNBLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQ3pCLE9BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFHO01BQ2hCO0FBQ0wsS0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7QUFDekIsT0FBTSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUc7TUFDaEI7S0FDRCxJQUFJLElBQUksRUFBRTtPQUNSLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUM7QUFDaEQsTUFBSyxNQUFNO0FBQ1gsT0FBTSxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQztNQUN6QjtJQUNGO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7QUFDL0IsR0FBRSxJQUFJLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDL0MsS0FBSSxNQUFNO0lBQ1A7QUFDSCxHQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ2pDLEdBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLGVBQWM7R0FDL0IsSUFBSSxDQUFDLEVBQUU7QUFDVCxLQUFJLENBQUMsQ0FBQyxXQUFXLEdBQUcsTUFBSztJQUN0QjtHQUNELElBQUksQ0FBQyxFQUFFO0FBQ1QsS0FBSSxDQUFDLENBQUMsV0FBVyxHQUFHLE1BQUs7SUFDdEI7QUFDSCxHQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBQztHQUMzQixJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQzVDO0FBQ0EsS0FBSSxNQUFNO0lBQ1A7QUFDSCxHQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBQztFQUN0QztDQUNELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtHQUMzQixJQUFJLE1BQU0sR0FBRyxNQUFLO0FBQ3BCLEdBQUUsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFO0tBQ3hCLElBQUksTUFBTSxFQUFFO0FBQ2hCLE9BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUkscUJBQXFCLEVBQUUsRUFBQztBQUNuRyxPQUFNLE1BQU07TUFDUDtLQUNELE1BQU0sR0FBRyxLQUFJO0FBQ2pCLEtBQUksTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDbkMsS0FBSSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsZUFBYztBQUNuQyxLQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDO0tBQ2hCLElBQUksQ0FBQyxFQUFFO0FBQ1gsT0FBTSxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUk7TUFDckI7S0FDRCxJQUFJLENBQUMsRUFBRTtBQUNYLE9BQU0sQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFJO01BQ3JCO0FBQ0wsS0FBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDckIsT0FBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUM7TUFDM0IsTUFBTSxJQUFJLEdBQUcsRUFBRTtBQUNwQixPQUFNLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQztBQUN2QyxNQUFLLE1BQU07QUFDWCxPQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBQztNQUMxQztJQUNGO0FBQ0gsR0FBRSxJQUFJO0FBQ04sS0FBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBQztJQUMvQixDQUFDLE9BQU8sR0FBRyxFQUFFO0tBQ1osV0FBVyxDQUFDLEdBQUcsRUFBQztJQUNqQjtFQUNGO0NBQ0QsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ2pDLEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUM7RUFDeEI7Q0FDRCxTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFDM0IsR0FBRSxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxVQUFVO0VBQ3hFO0NBQ0QsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ2pDLEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUM7RUFDckI7QUFDRCxDQUFBLFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUMzQyxHQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBQztBQUMzQixHQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBQztFQUMxQztBQUNEO0FBQ0E7QUFDQSxDQUFBLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7R0FDOUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdEMsS0FBSSxNQUFNO0lBQ1A7R0FDRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ25DLEtBQUksR0FBRyxHQUFHLElBQUksVUFBVSxHQUFFO0lBQ3ZCO0FBQ0g7QUFDQTtBQUNBLEdBQUUsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDL0IsS0FBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUk7QUFDeEIsS0FBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztBQUN2QixJQUFHLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7S0FDNUIsTUFBTSxDQUFDLEtBQUssR0FBRTtJQUNmLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3BDLEtBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUU7SUFDbkIsTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7QUFDbkQsS0FBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztJQUNwQixNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtBQUNqRDtLQUNJLE1BQU0sQ0FBQyxLQUFLLEdBQUU7SUFDZixNQUFNLElBQUksR0FBRyxFQUFFO0tBQ2QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDO0FBQ3ZELElBQUcsTUFBTTtBQUNULEtBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFDO0lBQzFDO0FBQ0gsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUN6QixLQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFJO0lBQzFCO0VBQ0Y7QUFDRCxDQUFBLFNBQWMsR0FBRztBQUNqQixHQUFFLFNBQVM7QUFDWCxHQUFFLFNBQVM7QUFDWCxHQUFFLE9BQU87QUFDVCxHQUFFLFNBQVM7QUFDWCxHQUFFLGNBQWM7QUFDaEIsR0FBQTs7Ozs7Ozs7OztBQzdSQTtBQUNBLENBQUEsTUFBTSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHTCxrQkFBaUMsR0FBQTtBQUNoRixDQUFBLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUdDLFdBQWlCO0NBQzlDLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRTtBQUN0QixHQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBQztFQUNwQjtDQUNELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBQztBQUNwRCxDQUFBLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUM7Q0FDaEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFJLEVBQUUsT0FBTyxFQUFFO0dBQy9DLE1BQU0sTUFBTSxHQUFHLEtBQUk7QUFDckIsR0FBRSxTQUFTLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFDekIsS0FBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtPQUNoRSxNQUFNLENBQUMsS0FBSyxHQUFFO01BQ2Y7SUFDRjtBQUNILEdBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFDO0dBQ3pCLFNBQVMsT0FBTyxHQUFHO0tBQ2pCLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO09BQ3BDLE1BQU0sQ0FBQyxNQUFNLEdBQUU7TUFDaEI7SUFDRjtBQUNILEdBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUM3RCxLQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBQztBQUMzQixLQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztJQUM1QjtHQUNELElBQUksUUFBUSxHQUFHLE1BQUs7R0FDcEIsU0FBUyxLQUFLLEdBQUc7S0FDZixJQUFJLFFBQVEsRUFBRSxNQUFNO0tBQ3BCLFFBQVEsR0FBRyxLQUFJO0tBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRTtJQUNYO0dBQ0QsU0FBUyxPQUFPLEdBQUc7S0FDakIsSUFBSSxRQUFRLEVBQUUsTUFBTTtLQUNwQixRQUFRLEdBQUcsS0FBSTtLQUNmLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFFO0lBQ3ZEO0FBQ0g7QUFDQTtBQUNBLEdBQUUsU0FBUyxPQUFPLENBQUMsRUFBRSxFQUFFO0FBQ3ZCLEtBQUksT0FBTyxHQUFFO0tBQ1QsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDL0MsT0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUM7TUFDdkI7SUFDRjtBQUNILEdBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzNDLEdBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQ3pDO0FBQ0E7R0FDRSxTQUFTLE9BQU8sR0FBRztBQUNyQixLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQztBQUN6QyxLQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUN6QyxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBQztBQUN2QyxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUMzQyxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUMzQyxLQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUN6QyxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQztBQUN6QyxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUMzQyxLQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztJQUN0QztBQUNILEdBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFDO0FBQzNCLEdBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzdCLEdBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQzNCLEdBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFDO0FBQzNCO0FBQ0E7QUFDQSxHQUFFLE9BQU8sSUFBSTtHQUNaO0FBQ0QsQ0FBQSxTQUFTLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtBQUM3QztBQUNBO0FBQ0EsR0FBRSxJQUFJLE9BQU8sT0FBTyxDQUFDLGVBQWUsS0FBSyxVQUFVLEVBQUUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7UUFDakUsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQztBQUNuRixRQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBQztFQUMzRDtBQUNELENBQUEsTUFBYyxHQUFHO0FBQ2pCLEdBQUUsTUFBTTtBQUNSLEdBQUUsZUFBZTtBQUNqQixHQUFBOzs7Ozs7Ozs7Ozs7QUN2RkE7QUFDQSxFQUFBLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUdELGFBQTRCLEdBQUE7RUFDMUQsTUFBTSxHQUFHLEdBQUdDLGtCQUEwQixHQUFBO0FBQ3RDLEVBQUEsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsTUFBSztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUEsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUs7SUFDNUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDLEVBQUU7TUFDeEQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDO0tBQzVEO0lBQ0Y7RUFDRCxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUU7SUFDekIsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7R0FDakQ7QUFDRCxFQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsY0FBQSxHQUFnQyxTQUFTLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3hFLElBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQztBQUN2QyxJQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDekIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDO0tBQ2xFO0lBQ0QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0Q7QUFDRCxFQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsd0JBQUEsR0FBMEMsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ2xFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLEVBQUUsU0FBUyxJQUFJLE1BQU0sQ0FBQyxFQUFFO0FBQzVELE1BQUksT0FBTyxNQUFNO0tBQ2Q7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNO01BQ3BCLE1BQU0sQ0FBQyxPQUFPO0FBQ2xCLFFBQU0sSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO0FBQ2hDLFVBQVEsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQzVCLFNBQU8sQ0FBQztRQUNIO01BQ0Y7QUFDSCxJQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtBQUN0QixNQUFJLE9BQU8sR0FBRTtBQUNiLEtBQUcsTUFBTTtBQUNULE1BQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7QUFDN0MsTUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBQztLQUNoRTtBQUNILElBQUUsT0FBTyxNQUFNO0FBQ2YsSUFBQTs7Ozs7Ozs7Ozs7QUN6Q0E7Q0FDQSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxHQUFHRCxrQkFBaUMsR0FBQTtBQUN0SCxDQUFBLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBR0MsV0FBaUI7QUFDcEMsQ0FBQSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUdDLFdBQTBCLEdBQUE7QUFDOUMsQ0FBYyxXQUFBLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDbEMsR0FBRSxXQUFXLEdBQUc7QUFDaEIsS0FBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUk7QUFDcEIsS0FBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUk7QUFDcEIsS0FBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUM7SUFDaEI7R0FDRCxJQUFJLENBQUMsQ0FBQyxFQUFFO0tBQ04sTUFBTSxLQUFLLEdBQUc7T0FDWixJQUFJLEVBQUUsQ0FBQztPQUNQLElBQUksRUFBRSxJQUFJO09BQ1g7QUFDTCxLQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBSztBQUMvQyxVQUFTLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBSztBQUMxQixLQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBSztLQUNqQixFQUFFLElBQUksQ0FBQyxPQUFNO0lBQ2Q7R0FDRCxPQUFPLENBQUMsQ0FBQyxFQUFFO0tBQ1QsTUFBTSxLQUFLLEdBQUc7T0FDWixJQUFJLEVBQUUsQ0FBQztBQUNiLE9BQU0sSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO09BQ2hCO0tBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQUs7QUFDNUMsS0FBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQUs7S0FDakIsRUFBRSxJQUFJLENBQUMsT0FBTTtJQUNkO0FBQ0gsR0FBRSxLQUFLLEdBQUc7QUFDVixLQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsTUFBTTtBQUNqQyxLQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSTtBQUM5QixLQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUk7VUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUk7S0FDL0IsRUFBRSxJQUFJLENBQUMsT0FBTTtBQUNqQixLQUFJLE9BQU8sR0FBRztJQUNYO0FBQ0gsR0FBRSxLQUFLLEdBQUc7S0FDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSTtBQUNoQyxLQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBQztJQUNoQjtHQUNELElBQUksQ0FBQyxDQUFDLEVBQUU7S0FDTixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUNwQyxLQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFJO0FBQ3JCLEtBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFJO0FBQ3pCLEtBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFJO0FBQ25ELEtBQUksT0FBTyxHQUFHO0lBQ1g7R0FDRCxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQ1osS0FBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDO0FBQzNDLEtBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUk7S0FDakIsSUFBSSxDQUFDLEdBQUcsRUFBQztLQUNULE9BQU8sQ0FBQyxFQUFFO09BQ1Isc0JBQXNCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDO0FBQzVDLE9BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTTtBQUN4QixPQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSTtNQUNYO0FBQ0wsS0FBSSxPQUFPLEdBQUc7SUFDWDtBQUNIO0FBQ0E7QUFDQSxHQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFO0FBQ3pCLEtBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFJO0FBQy9CLEtBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN6QjtPQUNNLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQztPQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQztBQUNwQyxPQUFNLE9BQU8sS0FBSztNQUNiO0FBQ0wsS0FBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzNCO0FBQ0EsT0FBTSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUU7TUFDcEI7QUFDTDtBQUNBLEtBQUksT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM1RDtBQUNILEdBQUUsS0FBSyxHQUFHO0FBQ1YsS0FBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtJQUN0QjtHQUNELEVBQUUsY0FBYyxDQUFDLEdBQUc7QUFDdEIsS0FBSSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO09BQ3JDLE1BQU0sQ0FBQyxDQUFDLEtBQUk7TUFDYjtJQUNGO0FBQ0g7QUFDQTtHQUNFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7S0FDWixJQUFJLEdBQUcsR0FBRyxHQUFFO0FBQ2hCLEtBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUk7S0FDakIsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUNiLEtBQUksR0FBRztBQUNQLE9BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUk7QUFDeEIsT0FBTSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFO1NBQ2xCLEdBQUcsSUFBSSxJQUFHO0FBQ2xCLFNBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFNO0FBQ3ZCLFFBQU8sTUFBTTtBQUNiLFNBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRTtXQUNwQixHQUFHLElBQUksSUFBRztBQUNwQixXQUFVLEVBQUUsRUFBQztXQUNILElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFJO2dCQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSTtBQUMzQyxVQUFTLE1BQU07V0FDTCxHQUFHLElBQUksb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUM7QUFDaEQsV0FBVSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUM7V0FDYixDQUFDLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUM7VUFDdEM7QUFDVCxTQUFRLEtBQUs7UUFDTjtBQUNQLE9BQU0sRUFBRSxFQUFDO01BQ0osUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQztBQUNuQyxLQUFJLElBQUksQ0FBQyxNQUFNLElBQUksRUFBQztBQUNwQixLQUFJLE9BQU8sR0FBRztJQUNYO0FBQ0g7QUFDQTtHQUNFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7S0FDWixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBQztLQUNqQyxNQUFNLE1BQU0sR0FBRyxFQUFDO0FBQ3BCLEtBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUk7S0FDakIsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUNiLEtBQUksR0FBRztBQUNQLE9BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUk7QUFDeEIsT0FBTSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFO1NBQ2xCLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBQztBQUNwRCxTQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTTtBQUN2QixRQUFPLE1BQU07QUFDYixTQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUU7V0FDcEIsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFDO0FBQ3RELFdBQVUsRUFBRSxFQUFDO1dBQ0gsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUk7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFJO0FBQzNDLFVBQVMsTUFBTTtXQUNMLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBQztBQUNoRyxXQUFVLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBQztXQUNiLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUM7VUFDdEI7QUFDVCxTQUFRLEtBQUs7UUFDTjtBQUNQLE9BQU0sRUFBRSxFQUFDO01BQ0osUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQztBQUNuQyxLQUFJLElBQUksQ0FBQyxNQUFNLElBQUksRUFBQztBQUNwQixLQUFJLE9BQU8sR0FBRztJQUNYO0FBQ0g7QUFDQTtBQUNBLEdBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFO0FBQ3pELEtBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQ3pCLE9BQU0sR0FBRyxPQUFPO0FBQ2hCO09BQ00sS0FBSyxFQUFFLENBQUM7QUFDZDtPQUNNLGFBQWEsRUFBRSxLQUFLO0FBQzFCLE1BQUssQ0FBQztJQUNIO0FBQ0gsR0FBQTs7Ozs7Ozs7OztBQzNKQTtBQUNBLENBQUEsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsR0FBR0Ysa0JBQWlDLEdBQUE7QUFDeEUsQ0FBQSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsR0FBR0MsYUFBQSxFQUE0QixDQUFDLE1BQUs7QUFDcEUsQ0FBQSxTQUFTLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO0FBQ3pELEdBQUUsT0FBTyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSTtFQUNwRztDQUNELFNBQVMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO0FBQzdDLEdBQUUsT0FBTyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0VBQ25DO0NBQ0QsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUU7R0FDN0QsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUM7QUFDN0QsR0FBRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7S0FDZixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDMUMsT0FBTSxNQUFNLElBQUksR0FBRyxRQUFRLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyx3QkFBdUI7QUFDOUUsT0FBTSxNQUFNLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztNQUMzQztBQUNMLEtBQUksT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDO0lBQ3RCO0FBQ0g7QUFDQTtBQUNBLEdBQUUsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0VBQ2pEO0FBQ0QsQ0FBQSxLQUFjLEdBQUc7QUFDakIsR0FBRSxnQkFBZ0I7QUFDbEIsR0FBRSx1QkFBdUI7QUFDekIsR0FBQTs7Ozs7Ozs7OztBQ3pCQTtBQUNBO0FBQ0E7Q0FDQSxNQUFNLE9BQU8sR0FBR0QsY0FBbUIsR0FBQTtBQUNuQztBQUNBO0FBQ0E7Q0FDQSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLEdBQUdDLGtCQUFpQyxHQUFBO0FBQ3ZHLENBQUEsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHQyxXQUFpQjtDQUNwQyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsR0FBR0csYUFBQSxFQUE0QixDQUFDLE1BQUs7QUFDM0YsQ0FBQSxTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtBQUN4QyxHQUFFLElBQUksU0FBUTtHQUNaLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsWUFBWSxNQUFNLEVBQUU7S0FDOUQsT0FBTyxJQUFJLFFBQVEsQ0FBQztPQUNsQixVQUFVLEVBQUUsSUFBSTtBQUN0QixPQUFNLEdBQUcsSUFBSTtBQUNiLE9BQU0sSUFBSSxHQUFHO0FBQ2IsU0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBQztBQUMzQixTQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO1FBQ2hCO0FBQ1AsTUFBSyxDQUFDO0lBQ0g7QUFDSCxHQUFFLElBQUksUUFBTztBQUNiLEdBQUUsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7S0FDN0MsT0FBTyxHQUFHLEtBQUk7QUFDbEIsS0FBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUU7SUFDM0MsTUFBTSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUU7S0FDL0MsT0FBTyxHQUFHLE1BQUs7QUFDbkIsS0FBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFFO0FBQ3pDLElBQUcsTUFBTTtLQUNMLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDbkU7QUFDSCxHQUFFLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDO0tBQzVCLFVBQVUsRUFBRSxJQUFJO0tBQ2hCLGFBQWEsRUFBRSxDQUFDO0FBQ3BCO0FBQ0EsS0FBSSxHQUFHLElBQUk7QUFDWCxJQUFHLEVBQUM7QUFDSjtBQUNBO0FBQ0E7R0FDRSxJQUFJLE9BQU8sR0FBRyxNQUFLO0FBQ3JCLEdBQUUsUUFBUSxDQUFDLEtBQUssR0FBRyxZQUFZO0tBQzNCLElBQUksQ0FBQyxPQUFPLEVBQUU7T0FDWixPQUFPLEdBQUcsS0FBSTtBQUNwQixPQUFNLElBQUksR0FBRTtNQUNQO0tBQ0Y7R0FDRCxRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsS0FBSyxFQUFFLEVBQUUsRUFBRTtBQUMzQyxLQUFJLG9CQUFvQjtPQUNsQixLQUFLLENBQUMsS0FBSyxDQUFDO09BQ1osTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUM7QUFDdkM7QUFDQSxPQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUM7T0FDeEM7S0FDRjtBQUNILEdBQUUsZUFBZSxLQUFLLENBQUMsS0FBSyxFQUFFO0tBQzFCLE1BQU0sUUFBUSxHQUFHLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEtBQUk7S0FDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxRQUFRLENBQUMsS0FBSyxLQUFLLFdBQVU7QUFDekQsS0FBSSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7QUFDOUIsT0FBTSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUM7QUFDekQsT0FBTSxNQUFNLE1BQUs7T0FDWCxJQUFJLElBQUksRUFBRTtBQUNoQixTQUFRLE1BQU07UUFDUDtNQUNGO0FBQ0wsS0FBSSxJQUFJLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7T0FDekMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sR0FBRTtBQUMvQyxPQUFNLE1BQU0sTUFBSztNQUNaO0lBQ0Y7R0FDRCxlQUFlLElBQUksR0FBRztBQUN4QixLQUFJLFNBQVM7QUFDYixPQUFNLElBQUk7QUFDVixTQUFRLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUU7U0FDekUsSUFBSSxJQUFJLEVBQUU7QUFDbEIsV0FBVSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQztBQUM3QixVQUFTLE1BQU07QUFDZixXQUFVLE1BQU0sR0FBRyxHQUFHLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxHQUFHLE1BQU0sS0FBSyxHQUFHLE1BQUs7QUFDckYsV0FBVSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7YUFDaEIsT0FBTyxHQUFHLE1BQUs7YUFDZixNQUFNLElBQUksc0JBQXNCLEVBQUU7WUFDbkMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDekMsYUFBWSxRQUFRO0FBQ3BCLFlBQVcsTUFBTTthQUNMLE9BQU8sR0FBRyxNQUFLO1lBQ2hCO1VBQ0Y7UUFDRixDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQ3BCLFNBQVEsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7UUFDdEI7QUFDUCxPQUFNLEtBQUs7TUFDTjtJQUNGO0FBQ0gsR0FBRSxPQUFPLFFBQVE7RUFDaEI7QUFDRCxDQUFBLE1BQWMsR0FBRyxLQUFBOzs7Ozs7Ozs7Ozs7Q0MvRmpCLE1BQU0sT0FBTyxHQUFHTCxjQUFtQixFQUFBO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7R0FFQSxNQUFNO0FBQ04sR0FBRSxxQkFBcUI7QUFDdkIsR0FBRSxlQUFlO0FBQ2pCLEdBQUUsV0FBVztBQUNiLEdBQUUsY0FBYztBQUNoQixHQUFFLHNCQUFzQjtBQUN4QixHQUFFLFVBQVU7QUFDWixHQUFFLG9CQUFvQjtBQUN0QixHQUFFLE9BQU87QUFDVCxHQUFFLE9BQU87QUFDVCxHQUFFLG1CQUFtQjtBQUNyQixHQUFFLE1BQU07QUFDUixFQUFDLEdBQUdDLGtCQUFpQyxHQUFBO0FBQ3JDLENBQUEsUUFBYyxHQUFHLFNBQVE7Q0FDekIsUUFBUSxDQUFDLGFBQWEsR0FBRyxjQUFhO0FBQ3RDLENBQUEsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsR0FBRyxXQUFpQjtBQUM5QyxDQUFBLE1BQU0sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUdJLGFBQW1CLEdBQUE7QUFDdkQsQ0FBQSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUdDLFdBQWlCO0FBQ3BDLENBQUEsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHQyxxQkFBNkIsR0FBQTtDQUN4RCxNQUFNLEdBQUcsR0FBR0csa0JBQTBCLEdBQUE7Q0FDdEMsSUFBSSxLQUFLLEdBQUdDLFdBQUEsRUFBMEIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLO0dBQ2hFLEtBQUssR0FBRyxHQUFFO0FBQ1osRUFBQyxFQUFDO0NBQ0YsTUFBTSxVQUFVLEdBQUdDLGtCQUF3QixHQUFBO0NBQzNDLE1BQU0sV0FBVyxHQUFHQyxjQUFvQixHQUFBO0FBQ3hDLENBQUEsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLEdBQUdDLFlBQWtCLEdBQUE7Q0FDeEUsTUFBTTtBQUNOLEdBQUUsa0JBQWtCO0FBQ3BCLEdBQUUsS0FBSyxFQUFFO0FBQ1QsS0FBSSxvQkFBb0I7QUFDeEIsS0FBSSwwQkFBMEI7QUFDOUIsS0FBSSxnQkFBZ0I7QUFDcEIsS0FBSSx5QkFBeUI7QUFDN0IsS0FBSSxrQ0FBa0M7SUFDbkM7QUFDSCxFQUFDLEdBQUdDLGFBQTRCLEdBQUE7QUFDaEMsQ0FBQSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUdDLGlCQUF3QixHQUFBO0FBQ25ELENBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBQztBQUNqQyxDQUFBLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUF5QjtDQUNuRCxNQUFNLElBQUksR0FBR0MsV0FBaUIsR0FBQTtDQUM5QixvQkFBb0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUM7QUFDMUQsQ0FBQSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFDO0NBQ3RDLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRTtBQUNwQixDQUFBLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxZQUFXO0FBQ3RDLENBQUEsU0FBUyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLElBQUksT0FBTyxRQUFRLEtBQUssU0FBUyxFQUFFLFFBQVEsR0FBRyxNQUFNLFlBQVlDLGFBQW1CLEdBQUE7QUFDckY7QUFDQTtBQUNBO0dBQ0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUM7QUFDckQsR0FBRSxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUM7QUFDOUY7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU87T0FDeEIsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxRQUFRLENBQUM7T0FDbEUsdUJBQXVCLENBQUMsS0FBSyxFQUFDO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxHQUFFO0FBQ2hDLEdBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDO0FBQ2pCLEdBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFFO0FBQ2pCLEdBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFJO0FBQ3JCLEdBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFLO0FBQ3BCLEdBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFLO0FBQ3pCLEdBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFLO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUk7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQUs7QUFDM0IsR0FBRSxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQUs7QUFDOUIsR0FBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBSztBQUNoQyxHQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBSztBQUM5QixHQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFJO0FBQ3RCO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBSztBQUMzQjtBQUNBO0dBQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLE1BQUs7QUFDMUQ7QUFDQTtHQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxNQUFLO0FBQzlEO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUk7QUFDckI7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0dBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLE9BQU07QUFDdkU7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSTtBQUMvQixHQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBSztBQUM5QjtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUs7QUFDMUIsR0FBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUs7QUFDMUIsR0FBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUk7QUFDckIsR0FBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUk7QUFDdEIsR0FBRSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO0tBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBQztBQUN0RCxLQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFNBQVE7SUFDakM7RUFDRjtDQUNELFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRTtBQUMzQixHQUFFLElBQUksRUFBRSxJQUFJLFlBQVksUUFBUSxDQUFDLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRSxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVlBLGFBQW1CLEdBQUE7QUFDdEQsR0FBRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO0dBQ2hFLElBQUksT0FBTyxFQUFFO0FBQ2YsS0FBSSxJQUFJLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSTtBQUNyRSxLQUFJLElBQUksT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFPO0FBQzlFLEtBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVM7QUFDcEYsS0FBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO0lBQ3RFO0FBQ0gsR0FBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUM7QUFDNUIsR0FBRSxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNO0FBQ3BDLEtBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRTtBQUMxQyxPQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBQztNQUN6QztBQUNMLElBQUcsRUFBQztFQUNIO0FBQ0QsQ0FBQSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBTztBQUNoRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFTO0NBQ3JELFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsRUFBRTtHQUMvQyxFQUFFLENBQUMsR0FBRyxFQUFDO0dBQ1I7Q0FDRCxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLFVBQVUsR0FBRyxFQUFFO0FBQy9ELEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7R0FDbEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO0dBQ25ELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0dBQ3REO0FBQ0Q7QUFDQTtDQUNBLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtHQUN0RCxPQUFPLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztHQUNyRDtDQUNELFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQy9ELEdBQUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBQztBQUNsQyxHQUFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3JDLEdBQUUsSUFBSSxJQUFHO0FBQ1QsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtBQUN6QixLQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQ25DLE9BQU0sUUFBUSxHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUMsZ0JBQWU7QUFDbEQsT0FBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLFNBQVEsSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtBQUMxQztBQUNBO0FBQ0EsV0FBVSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUM7QUFDdkUsVUFBUyxNQUFNO1dBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztXQUNwQyxRQUFRLEdBQUcsR0FBRTtVQUNkO1FBQ0Y7QUFDUCxNQUFLLE1BQU0sSUFBSSxLQUFLLFlBQVksTUFBTSxFQUFFO09BQ2xDLFFBQVEsR0FBRyxHQUFFO01BQ2QsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDNUMsT0FBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBQztPQUN6QyxRQUFRLEdBQUcsR0FBRTtBQUNuQixNQUFLLE1BQU0sSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO0FBQzlCLE9BQU0sR0FBRyxHQUFHLElBQUksb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUM7TUFDbkY7SUFDRjtHQUNELElBQUksR0FBRyxFQUFFO0FBQ1gsS0FBSSxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQztBQUMvQixJQUFHLE1BQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQzdCLEtBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFLO0FBQ3pCLEtBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7QUFDN0IsSUFBRyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtLQUMxRCxJQUFJLFVBQVUsRUFBRTtBQUNwQixPQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksa0NBQWtDLEVBQUUsRUFBQztZQUNqRixJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7WUFDbEQsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztBQUMvQyxNQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0FBQzVCLE9BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLHlCQUF5QixFQUFFLEVBQUM7TUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUNqRCxPQUFNLE9BQU8sS0FBSztBQUNsQixNQUFLLE1BQU07QUFDWCxPQUFNLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBSztBQUMzQixPQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRTtTQUM5QixLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDO1NBQ2xDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO0FBQ3pGLGNBQWEsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7QUFDekMsUUFBTyxNQUFNO1NBQ0wsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQztRQUN0QztNQUNGO0FBQ0wsSUFBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDMUIsS0FBSSxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQUs7QUFDekIsS0FBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztJQUM3QjtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7RUFDbEY7Q0FDRCxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7R0FDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUM5RjtBQUNBO0FBQ0EsS0FBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUU7QUFDL0IsT0FBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFFO0FBQ3JDLE1BQUssTUFBTTtBQUNYLE9BQU0sS0FBSyxDQUFDLGlCQUFpQixHQUFHLEtBQUk7TUFDL0I7QUFDTCxLQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSTtBQUM1QixLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztBQUM5QixJQUFHLE1BQU07QUFDVDtBQUNBLEtBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTTtLQUNuRCxJQUFJLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUM7QUFDL0MsVUFBUyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUM7S0FDN0IsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUM7SUFDN0M7QUFDSCxHQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO0VBQzdCO0FBQ0QsQ0FBQSxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzFDLEdBQUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWM7QUFDbkMsR0FBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLO0dBQzFEO0FBQ0Q7QUFDQTtBQUNBLENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDaEQsR0FBRSxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUM7QUFDeEMsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxRQUFPO0FBQ3ZDO0FBQ0EsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFRO0FBQ3JFLEdBQUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFNO0FBQzNDO0dBQ0UsSUFBSSxPQUFPLEdBQUcsR0FBRTtBQUNsQixHQUFFLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO0FBQzdCLEtBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFDO0lBQy9CO0dBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRTtHQUNkLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBQztHQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTTtBQUM3QyxHQUFFLE9BQU8sSUFBSTtHQUNaO0FBQ0Q7QUFDQTtDQUNBLE1BQU0sT0FBTyxHQUFHLFdBQVU7Q0FDMUIsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUU7QUFDcEMsR0FBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUU7S0FDZixNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDcEQsSUFBRyxNQUFNO0FBQ1Q7QUFDQTtBQUNBLEtBQUksQ0FBQyxHQUFFO0FBQ1AsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUM7QUFDaEIsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUM7QUFDaEIsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUM7QUFDaEIsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUM7QUFDaEIsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUU7QUFDakIsS0FBSSxDQUFDLEdBQUU7SUFDSjtBQUNILEdBQUUsT0FBTyxDQUFDO0VBQ1Q7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFBLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDakMsR0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUM3RCxHQUFFLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7QUFDaEMsR0FBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0QjtBQUNBLEtBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU07S0FDckUsT0FBTyxLQUFLLENBQUMsTUFBTTtJQUNwQjtHQUNELElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0dBQy9CLE9BQU8sS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7RUFDdEM7QUFDRDtBQUNBO0FBQ0EsQ0FBQSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRTtBQUN2QyxHQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDO0FBQ2xCO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtLQUNuQixDQUFDLEdBQUcsSUFBRztBQUNYLElBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2xDLEtBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDO0lBQzFCO0FBQ0gsR0FBRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBYztHQUNqQyxNQUFNLEtBQUssR0FBRyxFQUFDO0FBQ2pCO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUM7R0FDN0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBSztBQUM1QztBQUNBO0FBQ0E7QUFDQTtHQUNFO0tBQ0UsQ0FBQyxLQUFLLENBQUM7S0FDUCxLQUFLLENBQUMsWUFBWTtNQUNqQixDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO0tBQ3JHO0tBQ0EsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQztBQUMxRCxLQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFDO1VBQ25ELFlBQVksQ0FBQyxJQUFJLEVBQUM7QUFDM0IsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNILEdBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO0FBQzdCO0FBQ0E7R0FDRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtLQUMxQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUM7QUFDN0MsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQVk7QUFDakMsR0FBRSxLQUFLLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBQztBQUNoQztBQUNBO0FBQ0EsR0FBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUU7S0FDaEUsTUFBTSxHQUFHLEtBQUk7QUFDakIsS0FBSSxLQUFLLENBQUMsNEJBQTRCLEVBQUUsTUFBTSxFQUFDO0lBQzVDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7R0FDRSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO0tBQzFGLE1BQU0sR0FBRyxNQUFLO0FBQ2xCLEtBQUksS0FBSyxDQUFDLGdDQUFnQyxFQUFFLE1BQU0sRUFBQztJQUNoRCxNQUFNLElBQUksTUFBTSxFQUFFO0tBQ2pCLEtBQUssQ0FBQyxTQUFTLEVBQUM7QUFDcEIsS0FBSSxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUk7QUFDeEIsS0FBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUk7QUFDckI7S0FDSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSTtBQUNyRDtBQUNBO0FBQ0EsS0FBSSxJQUFJO0FBQ1IsT0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUM7TUFDaEMsQ0FBQyxPQUFPLEdBQUcsRUFBRTtBQUNsQixPQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFDO01BQzFCO0FBQ0wsS0FBSSxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQUs7QUFDdEI7QUFDQTtBQUNBLEtBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFDO0lBQ3BEO0FBQ0gsR0FBRSxJQUFJLElBQUc7QUFDVCxHQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7UUFDOUIsR0FBRyxHQUFHLEtBQUk7QUFDakIsR0FBRSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7S0FDaEIsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFhO0tBQ3hELENBQUMsR0FBRyxFQUFDO0FBQ1QsSUFBRyxNQUFNO0FBQ1QsS0FBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUM7QUFDckIsS0FBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUU7QUFDL0IsT0FBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFFO0FBQ3JDLE1BQUssTUFBTTtBQUNYLE9BQU0sS0FBSyxDQUFDLGlCQUFpQixHQUFHLEtBQUk7TUFDL0I7SUFDRjtBQUNILEdBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMxQjtBQUNBO0tBQ0ksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFJO0FBQy9DO0FBQ0E7QUFDQSxLQUFJLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUM7SUFDbEQ7QUFDSCxHQUFFLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFO0FBQ2xFLEtBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFJO0FBQzVCLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFDO0lBQ3ZCO0FBQ0gsR0FBRSxPQUFPLEdBQUc7R0FDWDtBQUNELENBQUEsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtHQUNqQyxLQUFLLENBQUMsWUFBWSxFQUFDO0FBQ3JCLEdBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU07QUFDekIsR0FBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7S0FDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUU7QUFDckMsS0FBSSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQy9CLE9BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDO0FBQzlCLE9BQU0sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTTtNQUNwRDtJQUNGO0FBQ0gsR0FBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUk7QUFDcEIsR0FBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7QUFDbEI7QUFDQTtBQUNBO0tBQ0ksWUFBWSxDQUFDLE1BQU0sRUFBQztBQUN4QixJQUFHLE1BQU07QUFDVDtBQUNBLEtBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFLO0FBQzlCLEtBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxLQUFJO0FBQ2hDO0FBQ0E7S0FDSSxhQUFhLENBQUMsTUFBTSxFQUFDO0lBQ3RCO0VBQ0Y7QUFDRDtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUM5QixHQUFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxlQUFjO0dBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFDO0FBQ2xFLEdBQUUsS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFLO0FBQzVCLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7QUFDOUIsS0FBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUM7QUFDeEMsS0FBSSxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUk7QUFDaEMsS0FBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUM7SUFDeEM7RUFDRjtDQUNELFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRTtBQUMvQixHQUFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQ3JDLEdBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQztBQUNwRSxHQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMzRSxLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDO0FBQzNCLEtBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxNQUFLO0lBQzlCO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7R0FDRSxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYTtHQUMxRixJQUFJLENBQUMsTUFBTSxFQUFDO0VBQ2I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtHQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO0FBQy9DLEtBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFJO0tBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUM7SUFDaEQ7RUFDRjtBQUNELENBQUEsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0dBQ0U7S0FDRSxDQUFDLEtBQUssQ0FBQyxPQUFPO0tBQ2QsQ0FBQyxLQUFLLENBQUMsS0FBSztBQUNoQixNQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDN0U7QUFDSixLQUFJLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFNO0tBQ3hCLEtBQUssQ0FBQyxzQkFBc0IsRUFBQztBQUNqQyxLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDO0FBQ2xCLEtBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLE1BQU07QUFDNUI7QUFDQSxPQUFNLEtBQUs7SUFDUjtBQUNILEdBQUUsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFLO0VBQzFCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEVBQUU7QUFDeEMsR0FBRSxNQUFNLElBQUksMEJBQTBCLENBQUMsU0FBUyxDQUFDO0dBQ2hEO0NBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFO0dBQ2xELE1BQU0sR0FBRyxHQUFHLEtBQUk7QUFDbEIsR0FBRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBYztHQUNqQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNoQyxLQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO0FBQ2hDLE9BQU0sS0FBSyxDQUFDLGVBQWUsR0FBRyxLQUFJO0FBQ2xDLE9BQU0sS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsRUFBQztNQUNoRztJQUNGO0FBQ0gsR0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7R0FDdEIsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQztHQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsT0FBTTtBQUMzRyxHQUFFLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsT0FBTTtHQUNwQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUM7QUFDL0MsUUFBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUM7QUFDN0IsR0FBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7QUFDN0IsR0FBRSxTQUFTLFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFO0tBQ3RDLEtBQUssQ0FBQyxVQUFVLEVBQUM7QUFDckIsS0FBSSxJQUFJLFFBQVEsS0FBSyxHQUFHLEVBQUU7T0FDcEIsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7QUFDekQsU0FBUSxVQUFVLENBQUMsVUFBVSxHQUFHLEtBQUk7QUFDcEMsU0FBUSxPQUFPLEdBQUU7UUFDVjtNQUNGO0lBQ0Y7R0FDRCxTQUFTLEtBQUssR0FBRztLQUNmLEtBQUssQ0FBQyxPQUFPLEVBQUM7S0FDZCxJQUFJLENBQUMsR0FBRyxHQUFFO0lBQ1g7QUFDSCxHQUFFLElBQUksUUFBTztHQUNYLElBQUksU0FBUyxHQUFHLE1BQUs7R0FDckIsU0FBUyxPQUFPLEdBQUc7S0FDakIsS0FBSyxDQUFDLFNBQVMsRUFBQztBQUNwQjtBQUNBLEtBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQ3pDLEtBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO0tBQ3ZDLElBQUksT0FBTyxFQUFFO0FBQ2pCLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO01BQ3RDO0FBQ0wsS0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7QUFDekMsS0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7QUFDM0MsS0FBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUM7QUFDcEMsS0FBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUM7QUFDckMsS0FBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUM7S0FDbEMsU0FBUyxHQUFHLEtBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0tBQ0ksSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sR0FBRTtJQUM3RztHQUNELFNBQVMsS0FBSyxHQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0tBQ0ksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNwQixPQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQy9ELFNBQVEsS0FBSyxDQUFDLDZCQUE2QixFQUFFLENBQUMsRUFBQztBQUMvQyxTQUFRLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxLQUFJO0FBQ3RDLFNBQVEsS0FBSyxDQUFDLGVBQWUsR0FBRyxNQUFLO0FBQ3JDLFFBQU8sTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtTQUMvRCxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBQztBQUMxRSxTQUFRLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDO1FBQ2xDO09BQ0QsR0FBRyxDQUFDLEtBQUssR0FBRTtNQUNaO0tBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFDO0FBQ3RDLE9BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO01BQzFCO0lBQ0Y7QUFDSCxHQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQztBQUN4QixHQUFFLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtLQUNyQixLQUFLLENBQUMsUUFBUSxFQUFDO0tBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUM7QUFDakMsS0FBSSxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBQztBQUM1QixLQUFJLElBQUksR0FBRyxLQUFLLEtBQUssRUFBRTtBQUN2QixPQUFNLEtBQUssR0FBRTtNQUNSO0lBQ0Y7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFFLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUN2QixLQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFDO0FBQ3hCLEtBQUksTUFBTSxHQUFFO0FBQ1osS0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7S0FDckMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtPQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxlQUFjO0FBQzFELE9BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFO0FBQ2hDO0FBQ0EsU0FBUSxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQztBQUNoQyxRQUFPLE1BQU07QUFDYixTQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQztRQUN2QjtNQUNGO0lBQ0Y7QUFDSDtBQUNBO0FBQ0EsR0FBRSxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUM7QUFDekM7QUFDQTtHQUNFLFNBQVMsT0FBTyxHQUFHO0FBQ3JCLEtBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO0FBQzNDLEtBQUksTUFBTSxHQUFFO0lBQ1Q7QUFDSCxHQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztHQUMzQixTQUFTLFFBQVEsR0FBRztLQUNsQixLQUFLLENBQUMsVUFBVSxFQUFDO0FBQ3JCLEtBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQ3pDLEtBQUksTUFBTSxHQUFFO0lBQ1Q7QUFDSCxHQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQztHQUM3QixTQUFTLE1BQU0sR0FBRztLQUNoQixLQUFLLENBQUMsUUFBUSxFQUFDO0FBQ25CLEtBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUM7SUFDakI7QUFDSDtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7QUFDdkMsS0FBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDdkIsT0FBTSxLQUFLLEdBQUU7TUFDUjtBQUNMLElBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtLQUN6QixLQUFLLENBQUMsYUFBYSxFQUFDO0tBQ3BCLEdBQUcsQ0FBQyxNQUFNLEdBQUU7SUFDYjtBQUNILEdBQUUsT0FBTyxJQUFJO0dBQ1o7QUFDRCxDQUFBLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7R0FDOUIsT0FBTyxTQUFTLHlCQUF5QixHQUFHO0FBQzlDLEtBQUksTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLGVBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFJLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLElBQUksRUFBRTtBQUMxQyxPQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFDO0FBQzdCLE9BQU0sS0FBSyxDQUFDLGlCQUFpQixHQUFHLEtBQUk7QUFDcEMsTUFBSyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtPQUNoQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUM7QUFDeEQsT0FBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBQztNQUNyQztLQUNELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO09BQ2pHLEdBQUcsQ0FBQyxNQUFNLEdBQUU7TUFDYjtJQUNGO0VBQ0Y7QUFDRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQzVDLEdBQUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWM7R0FDakMsTUFBTSxVQUFVLEdBQUc7S0FDakIsVUFBVSxFQUFFLEtBQUs7S0FDbEI7QUFDSDtBQUNBO0dBQ0UsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJO0dBQ3pDLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDYjtBQUNBLEtBQUksTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQUs7QUFDN0IsS0FBSSxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUU7S0FDaEIsSUFBSSxDQUFDLEtBQUssR0FBRTtBQUNoQixLQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtPQUNuQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUU7U0FDNUIsVUFBVSxFQUFFLEtBQUs7QUFDekIsUUFBTyxFQUFDO0FBQ1IsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNIO0FBQ0E7R0FDRSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBQztBQUN4RCxHQUFFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSTtHQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDO0FBQzlCLEdBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRTtHQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDO0FBQ3ZDLEdBQUUsT0FBTyxJQUFJO0dBQ1o7QUFDRDtBQUNBO0FBQ0E7Q0FDQSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDMUMsR0FBRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUM7QUFDcEQsR0FBRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBYztBQUNuQyxHQUFFLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRTtBQUNyQjtBQUNBO0tBQ0ksS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBQztBQUNoRTtBQUNBO0tBQ0ksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFFO0FBQzlDLElBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxVQUFVLEVBQUU7S0FDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7T0FDakQsS0FBSyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSTtBQUN6RCxPQUFNLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBSztBQUMzQixPQUFNLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBSztPQUM3QixLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUN2RCxPQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtTQUNoQixZQUFZLENBQUMsSUFBSSxFQUFDO0FBQzFCLFFBQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUNqQyxTQUFRLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDO1FBQ3pDO01BQ0Y7SUFDRjtBQUNILEdBQUUsT0FBTyxHQUFHO0dBQ1g7Q0FDRCxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUU7Q0FDdEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3RELEdBQUUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFDO0FBQ2hFLEdBQUUsSUFBSSxFQUFFLEtBQUssVUFBVSxFQUFFO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLEVBQUM7SUFDaEQ7QUFDSCxHQUFFLE9BQU8sR0FBRztHQUNYO0NBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFjO0FBQzFELENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLEVBQUUsRUFBRTtBQUN0RCxHQUFFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUM7R0FDdEUsSUFBSSxFQUFFLEtBQUssVUFBVSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSSxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLElBQUksRUFBQztJQUNoRDtBQUNILEdBQUUsT0FBTyxHQUFHO0dBQ1g7Q0FDRCxTQUFTLHVCQUF1QixDQUFDLElBQUksRUFBRTtBQUN2QyxHQUFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFjO0dBQ2pDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUM7R0FDNUQsSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDekQ7QUFDQTtBQUNBLEtBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFJO0FBQ3hCO0FBQ0E7SUFDRyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7S0FDekMsSUFBSSxDQUFDLE1BQU0sR0FBRTtBQUNqQixJQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtBQUN2QyxLQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSTtJQUNyQjtFQUNGO0NBQ0QsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7R0FDOUIsS0FBSyxDQUFDLDBCQUEwQixFQUFDO0FBQ25DLEdBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUM7RUFDYjtBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTtBQUN4QyxHQUFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ25DLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7S0FDbEIsS0FBSyxDQUFDLFFBQVEsRUFBQztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxLQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWlCO0FBQzVDLEtBQUksTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUM7SUFDcEI7QUFDSCxHQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFLO0FBQ3hCLEdBQUUsT0FBTyxJQUFJO0dBQ1o7QUFDRCxDQUFBLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDL0IsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtBQUM5QixLQUFJLEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSTtLQUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDO0lBQ3pDO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDaEMsR0FBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUM7QUFDaEMsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUN0QixLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDO0lBQ2Y7QUFDSCxHQUFFLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBSztBQUMvQixHQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDO0dBQ3JCLElBQUksQ0FBQyxNQUFNLEVBQUM7QUFDZCxHQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUM7RUFDcEQ7QUFDRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7R0FDckMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFDO0dBQzNELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO0tBQ3pDLEtBQUssQ0FBQyxPQUFPLEVBQUM7QUFDbEIsS0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxNQUFLO0FBQ3ZDLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUM7SUFDbkI7QUFDSCxHQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSTtBQUNyQyxHQUFFLE9BQU8sSUFBSTtHQUNaO0NBQ0QsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ3RCLEdBQUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDckMsR0FBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUM7QUFDOUIsR0FBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0VBQ2pEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQVUsTUFBTSxFQUFFO0dBQzFDLElBQUksTUFBTSxHQUFHLE1BQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLO0FBQy9CLEtBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtPQUNyQyxNQUFNLEdBQUcsS0FBSTtPQUNiLE1BQU0sQ0FBQyxLQUFLLEdBQUU7TUFDZjtBQUNMLElBQUcsRUFBQztBQUNKLEdBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTTtBQUN6QixLQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO0FBQ25CLElBQUcsRUFBQztHQUNGLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLO0FBQzlCLEtBQUksY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUM7QUFDN0IsSUFBRyxFQUFDO0FBQ0osR0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNO0tBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUU7QUFDbEIsSUFBRyxFQUFDO0FBQ0osR0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNO0tBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUU7QUFDbEIsSUFBRyxFQUFDO0FBQ0osR0FBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU07QUFDckIsS0FBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO09BQzNCLE1BQU0sR0FBRyxNQUFLO09BQ2QsTUFBTSxDQUFDLE1BQU0sR0FBRTtNQUNoQjtLQUNGO0FBQ0g7QUFDQTtBQUNBLEdBQUUsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBQztBQUN2QyxHQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLEtBQUksTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBQztBQUMzQixLQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDbEUsT0FBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7TUFDakM7SUFDRjtBQUNILEdBQUUsT0FBTyxJQUFJO0dBQ1o7QUFDRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxZQUFZO0FBQ3RELEdBQUUsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7R0FDbkM7QUFDRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsT0FBTyxFQUFFO0FBQ2pELEdBQUUsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQzdCLEtBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUM7SUFDbkM7QUFDSCxHQUFFLE9BQU8scUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztHQUM1QztBQUNELENBQUEsU0FBUyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQ2hELEdBQUUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ3pDLEtBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO09BQzdCLFVBQVUsRUFBRSxJQUFJO0FBQ3RCLE1BQUssRUFBQztJQUNIO0dBQ0QsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQztBQUNuRCxHQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTTtBQUN0QixHQUFFLE9BQU8sSUFBSTtFQUNaO0FBQ0QsQ0FBQSxnQkFBZ0IsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRTtHQUNuRCxJQUFJLFFBQVEsR0FBRyxJQUFHO0FBQ3BCLEdBQUUsU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3pCLEtBQUksSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO0FBQ3pCLE9BQU0sUUFBUSxHQUFFO09BQ1YsUUFBUSxHQUFHLElBQUc7QUFDcEIsTUFBSyxNQUFNO09BQ0wsUUFBUSxHQUFHLFFBQU87TUFDbkI7SUFDRjtBQUNILEdBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFDO0FBQzdCLEdBQUUsSUFBSSxNQUFLO0dBQ1QsTUFBTSxPQUFPLEdBQUcsR0FBRztBQUNyQixLQUFJLE1BQU07S0FDTjtPQUNFLFFBQVEsRUFBRSxLQUFLO01BQ2hCO0tBQ0QsQ0FBQyxHQUFHLEtBQUs7T0FDUCxLQUFLLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFJO0FBQ3pELE9BQU0sUUFBUSxHQUFFO09BQ1YsUUFBUSxHQUFHLElBQUc7TUFDZjtLQUNGO0FBQ0gsR0FBRSxJQUFJO0tBQ0YsT0FBTyxJQUFJLEVBQUU7QUFDakIsT0FBTSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFFO0FBQzNELE9BQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQzFCLFNBQVEsTUFBTSxNQUFLO1FBQ1osTUFBTSxJQUFJLEtBQUssRUFBRTtBQUN4QixTQUFRLE1BQU0sS0FBSztBQUNuQixRQUFPLE1BQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQ2pDLFNBQVEsTUFBTTtBQUNkLFFBQU8sTUFBTTtBQUNiLFNBQVEsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUM7UUFDeEI7TUFDRjtJQUNGLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFDaEIsS0FBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQztBQUMxQyxLQUFJLE1BQU0sS0FBSztBQUNmLElBQUcsU0FBUztLQUNSO0FBQ0osT0FBTSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLGVBQWUsTUFBTSxLQUFLO1FBQ3BHLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7T0FDMUQ7QUFDTixPQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBQztBQUN6QyxNQUFLLE1BQU07QUFDWCxPQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBQztBQUNsQyxPQUFNLE9BQU8sR0FBRTtNQUNWO0lBQ0Y7RUFDRjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO0FBQzNDLEdBQUUsUUFBUSxFQUFFO0tBQ1IsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7QUFDVixPQUFNLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO09BQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtNQUN2RjtLQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7QUFDYjtBQUNBLE9BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1NBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFHO1FBQ3JDO01BQ0Y7SUFDRjtBQUNILEdBQUUsZUFBZSxFQUFFO0tBQ2YsU0FBUyxFQUFFLElBQUk7S0FDZixVQUFVLEVBQUUsS0FBSztLQUNqQixHQUFHLEVBQUUsWUFBWTtBQUNyQixPQUFNLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXO01BQ3ZDO0lBQ0Y7QUFDSCxHQUFFLGVBQWUsRUFBRTtLQUNmLFNBQVMsRUFBRSxJQUFJO0tBQ2YsVUFBVSxFQUFFLEtBQUs7S0FDakIsR0FBRyxFQUFFLFlBQVk7QUFDckIsT0FBTSxPQUFPLENBQUM7QUFDZCxTQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLEtBQUs7VUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDdEUsU0FBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVTtRQUNoQztNQUNGO0lBQ0Y7QUFDSCxHQUFFLHFCQUFxQixFQUFFO0tBQ3JCLFNBQVMsRUFBRSxJQUFJO0tBQ2YsVUFBVSxFQUFFLEtBQUs7S0FDakIsR0FBRyxFQUFFLFlBQVk7QUFDckIsT0FBTSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtNQUN6QztJQUNGO0FBQ0gsR0FBRSxjQUFjLEVBQUU7S0FDZCxTQUFTLEVBQUUsSUFBSTtLQUNmLFVBQVUsRUFBRSxLQUFLO0tBQ2pCLEdBQUcsRUFBRSxZQUFZO09BQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtNQUN6RDtJQUNGO0FBQ0gsR0FBRSxlQUFlLEVBQUU7S0FDZixTQUFTLEVBQUUsSUFBSTtLQUNmLFVBQVUsRUFBRSxLQUFLO0tBQ2pCLEdBQUcsRUFBRSxZQUFZO0FBQ3JCLE9BQU0sT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87TUFDbkM7QUFDTCxLQUFJLEdBQUcsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUMxQixPQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUMvQixTQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLE1BQUs7UUFDcEM7TUFDRjtJQUNGO0FBQ0gsR0FBRSxjQUFjLEVBQUU7S0FDZCxTQUFTLEVBQUUsSUFBSTtLQUNmLFVBQVUsRUFBRSxLQUFLO0FBQ3JCLEtBQUksR0FBRyxHQUFHO0FBQ1YsT0FBTSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtNQUNsQztJQUNGO0FBQ0gsR0FBRSxrQkFBa0IsRUFBRTtLQUNsQixTQUFTLEVBQUUsSUFBSTtLQUNmLFVBQVUsRUFBRSxLQUFLO0FBQ3JCLEtBQUksR0FBRyxHQUFHO09BQ0osT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxHQUFHLEtBQUs7TUFDcEU7SUFDRjtBQUNILEdBQUUsZ0JBQWdCLEVBQUU7S0FDaEIsU0FBUyxFQUFFLElBQUk7S0FDZixVQUFVLEVBQUUsS0FBSztBQUNyQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJO01BQ2pFO0lBQ0Y7QUFDSCxHQUFFLE9BQU8sRUFBRTtLQUNQLFNBQVMsRUFBRSxJQUFJO0tBQ2YsVUFBVSxFQUFFLEtBQUs7QUFDckIsS0FBSSxHQUFHLEdBQUc7T0FDSixPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSTtNQUNoRTtJQUNGO0FBQ0gsR0FBRSxNQUFNLEVBQUU7S0FDTixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxLQUFLO01BQ2hFO0lBQ0Y7QUFDSCxHQUFFLFNBQVMsRUFBRTtLQUNULFNBQVMsRUFBRSxJQUFJO0tBQ2YsVUFBVSxFQUFFLEtBQUs7QUFDckIsS0FBSSxHQUFHLEdBQUc7T0FDSixPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsS0FBSztNQUNuRTtLQUNELEdBQUcsQ0FBQyxLQUFLLEVBQUU7QUFDZjtBQUNBO0FBQ0EsT0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUNoQyxTQUFRLE1BQU07UUFDUDtBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsTUFBSztNQUN0QztJQUNGO0FBQ0gsR0FBRSxhQUFhLEVBQUU7S0FDYixTQUFTLEVBQUUsSUFBSTtLQUNmLFVBQVUsRUFBRSxLQUFLO0FBQ3JCLEtBQUksR0FBRyxHQUFHO09BQ0osT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxHQUFHLEtBQUs7TUFDcEU7SUFDRjtBQUNILEVBQUMsRUFBQztBQUNGLENBQUEsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRTtBQUNoRDtBQUNBLEdBQUUsVUFBVSxFQUFFO0tBQ1YsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7QUFDVixPQUFNLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO01BQ3pCO0lBQ0Y7QUFDSDtBQUNBLEdBQUUsTUFBTSxFQUFFO0tBQ04sU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7QUFDVixPQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUs7TUFDL0I7S0FDRCxHQUFHLENBQUMsS0FBSyxFQUFFO0FBQ2YsT0FBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQUs7TUFDeEI7SUFDRjtBQUNILEVBQUMsRUFBQztBQUNGO0FBQ0E7Q0FDQSxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM1QjtHQUNFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQ3JDLEdBQUUsSUFBSSxJQUFHO0FBQ1QsR0FBRSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFFO1FBQzNDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDcEM7QUFDQSxLQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFDO0FBQ2xELFVBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFFO1VBQ3pELEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDO0FBQ2hELEtBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUU7QUFDeEIsSUFBRyxNQUFNO0FBQ1Q7QUFDQSxLQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQztJQUM3QztBQUNILEdBQUUsT0FBTyxHQUFHO0VBQ1g7Q0FDRCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7QUFDN0IsR0FBRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsZUFBYztBQUNyQyxHQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBQztBQUN4QyxHQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFO0FBQ3pCLEtBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFJO0tBQ2xCLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUM7SUFDL0M7RUFDRjtBQUNELENBQUEsU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtHQUNwQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBQztBQUN4RDtBQUNBO0dBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN4RixLQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSTtBQUMzQixLQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDO0tBQ2xCLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUMzRCxPQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBQztBQUM3QyxNQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO0FBQ2xDO0FBQ0E7QUFDQSxPQUFNLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFjO0FBQzFDLE9BQU0sTUFBTSxXQUFXO0FBQ3ZCLFNBQVEsQ0FBQyxNQUFNO1VBQ04sTUFBTSxDQUFDLFdBQVc7QUFDM0I7QUFDQTtZQUNXLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBQztPQUNuRCxJQUFJLFdBQVcsRUFBRTtTQUNmLE1BQU0sQ0FBQyxPQUFPLEdBQUU7UUFDakI7TUFDRjtJQUNGO0VBQ0Y7Q0FDRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUU7QUFDL0IsR0FBRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFTO0dBQzlFLElBQUksUUFBUSxFQUFFO0tBQ1osTUFBTSxDQUFDLEdBQUcsR0FBRTtJQUNiO0VBQ0Y7QUFDRCxDQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsVUFBVSxRQUFRLEVBQUUsSUFBSSxFQUFFO0dBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0dBQ3RDO0FBQ0QsQ0FBQSxJQUFJLG1CQUFrQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQSxTQUFTLGNBQWMsR0FBRztBQUMxQixHQUFFLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFLGtCQUFrQixHQUFHLEdBQUU7QUFDL0QsR0FBRSxPQUFPLGtCQUFrQjtFQUMxQjtBQUNELENBQUEsUUFBUSxDQUFDLE9BQU8sR0FBRyxVQUFVLGNBQWMsRUFBRSxPQUFPLEVBQUU7R0FDcEQsT0FBTyxjQUFjLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDO0dBQ3JGO0FBQ0QsQ0FBQSxRQUFRLENBQUMsS0FBSyxHQUFHLFVBQVUsY0FBYyxFQUFFLE9BQU8sRUFBRTtHQUNsRCxPQUFPLGNBQWMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUM7R0FDckY7QUFDRCxDQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLEVBQUUsT0FBTyxFQUFFO0dBQ3RDLElBQUksSUFBSSxFQUFFLHNCQUFxQjtHQUMvQixPQUFPLElBQUksUUFBUSxDQUFDO0FBQ3RCLEtBQUksVUFBVTtBQUNkLE9BQU0sQ0FBQyxJQUFJO1NBQ0gsQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsa0JBQWtCLE1BQU0sSUFBSSxJQUFJLHFCQUFxQixLQUFLLFNBQVM7QUFDeEcsYUFBWSxxQkFBcUI7YUFDckIsR0FBRyxDQUFDLFVBQVUsTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVM7QUFDMUQsV0FBVSxJQUFJO0FBQ2QsV0FBVSxJQUFJO0FBQ2QsS0FBSSxHQUFHLE9BQU87QUFDZCxLQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFO0FBQzNCLE9BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFDO09BQy9CLFFBQVEsQ0FBQyxHQUFHLEVBQUM7TUFDZDtBQUNMLElBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDZCxHQUFBOzs7Ozs7Ozs7Ozs7Q0M1dENBLE1BQU0sT0FBTyxHQUFHbEIsY0FBbUIsRUFBQTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7R0FFQSxNQUFNO0FBQ04sR0FBRSxtQkFBbUI7QUFDckIsR0FBRSxLQUFLO0FBQ1AsR0FBRSxrQ0FBa0M7QUFDcEMsR0FBRSxvQkFBb0I7QUFDdEIsR0FBRSxzQkFBc0I7QUFDeEIsR0FBRSxvQkFBb0I7QUFDdEIsR0FBRSwwQkFBMEI7QUFDNUIsR0FBRSxNQUFNO0FBQ1IsR0FBRSxpQkFBaUI7QUFDbkIsRUFBQyxHQUFHQyxrQkFBaUMsR0FBQTtBQUNyQyxDQUFBLFFBQWMsR0FBRyxTQUFRO0NBQ3pCLFFBQVEsQ0FBQyxhQUFhLEdBQUcsY0FBYTtBQUN0QyxDQUFBLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBaUI7QUFDOUMsQ0FBQSxNQUFNLE1BQU0sR0FBR0ksYUFBbUIsRUFBQSxDQUFDLE9BQU07QUFDekMsQ0FBQSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUdDLFdBQWlCO0NBQ3BDLE1BQU0sV0FBVyxHQUFHQyxjQUFvQixHQUFBO0FBQ3hDLENBQUEsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHRyxxQkFBNkIsR0FBQTtBQUN4RCxDQUFBLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxHQUFHQyxZQUFrQixHQUFBO0NBQ3hFLE1BQU07QUFDTixHQUFFLG9CQUFvQjtBQUN0QixHQUFFLDBCQUEwQjtBQUM1QixHQUFFLHFCQUFxQjtBQUN2QixHQUFFLHNCQUFzQjtBQUN4QixHQUFFLG9CQUFvQjtBQUN0QixHQUFFLDJCQUEyQjtBQUM3QixHQUFFLHNCQUFzQjtBQUN4QixHQUFFLDBCQUEwQjtBQUM1QixHQUFFLG9CQUFvQjtFQUNyQixHQUFHQyxhQUE0QixFQUFBLENBQUMsTUFBSztBQUN0QyxDQUFBLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxZQUFXO0NBQ3RDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBQztBQUMxRCxDQUFBLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUM7Q0FDdEMsU0FBUyxHQUFHLEdBQUcsRUFBRTtBQUNqQixDQUFBLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUM7QUFDekMsQ0FBQSxTQUFTLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0dBQ0UsSUFBSSxPQUFPLFFBQVEsS0FBSyxTQUFTLEVBQUUsUUFBUSxHQUFHLE1BQU0sWUFBWUMsYUFBbUIsR0FBQTtBQUNyRjtBQUNBO0FBQ0E7R0FDRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBQztBQUNyRCxHQUFFLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBQztBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPO09BQ3hCLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxDQUFDO09BQ2xFLHVCQUF1QixDQUFDLEtBQUssRUFBQztBQUNwQztBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUs7QUFDMUI7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFLO0FBQ3hCO0FBQ0EsR0FBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQUs7QUFDckI7QUFDQSxHQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBSztBQUNwQjtBQUNBLEdBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFLO0FBQ3ZCO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBQztBQUNqRSxHQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxTQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0dBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLE9BQU07QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBQztBQUNqQjtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUs7QUFDdEI7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQUs7QUFDL0I7QUFDQTtHQUNFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFDO0FBQ2hEO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSTtBQUNyQjtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUM7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSTtHQUM5QixXQUFXLENBQUMsSUFBSSxFQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFDO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBSztBQUMxQjtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQUs7QUFDM0I7QUFDQTtHQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxNQUFLO0FBQzFEO0FBQ0E7R0FDRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssTUFBSztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFJO0FBQ3JCO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBSztBQUMzQixHQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFFO0VBQ3ZCO0NBQ0QsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzVCLEdBQUUsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFFO0FBQ3JCLEdBQUUsS0FBSyxDQUFDLGFBQWEsR0FBRyxFQUFDO0FBQ3pCLEdBQUUsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFJO0FBQ3pCLEdBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFJO0VBQ3JCO0FBQ0QsQ0FBQSxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVMsR0FBRztHQUN2RCxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztHQUM5RDtBQUNELENBQUEsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRTtHQUNwRSxTQUFTLEVBQUUsSUFBSTtBQUNqQixHQUFFLEdBQUcsR0FBRztLQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWE7SUFDakQ7QUFDSCxFQUFDLEVBQUM7Q0FDRixTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWUEsYUFBbUIsR0FBQTtBQUN0RCxHQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDcEcsR0FBRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO0dBQ2hFLElBQUksT0FBTyxFQUFFO0FBQ2YsS0FBSSxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBSztBQUN4RSxLQUFJLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFNO0FBQzNFLEtBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQU87QUFDOUUsS0FBSSxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBSztBQUN4RSxLQUFJLElBQUksT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFTO0FBQ3BGLEtBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBQztJQUN6RDtBQUNILEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDO0FBQzVCLEdBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUNwQyxLQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ3JDLEtBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDeEIsT0FBTSxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBQztNQUN6QjtBQUNMLEtBQUksV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUM7QUFDNUIsSUFBRyxFQUFDO0VBQ0g7QUFDRCxDQUFBLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRTtHQUNoRCxTQUFTLEVBQUUsSUFBSTtBQUNqQixHQUFFLEtBQUssRUFBRSxVQUFVLE1BQU0sRUFBRTtLQUN2QixJQUFJLGtDQUFrQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7QUFDckUsS0FBSSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsT0FBTyxLQUFLO0FBQ3ZDLEtBQUksT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLGNBQWMsWUFBWSxhQUFhO0lBQ2hFO0FBQ0gsRUFBQyxFQUFDO0FBQ0Y7QUFDQTtBQUNBLENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsWUFBWTtBQUN0QyxHQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxFQUFDO0dBQ25EO0NBQ0QsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0FBQzdDLEdBQUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDckMsR0FBRSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtLQUNsQyxFQUFFLEdBQUcsU0FBUTtBQUNqQixLQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsZ0JBQWU7QUFDcEMsSUFBRyxNQUFNO0tBQ0wsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEdBQUcsS0FBSyxDQUFDLGdCQUFlO0FBQ25ELFVBQVMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDO0tBQ3hHLElBQUksT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFHO0lBQ3ZDO0FBQ0gsR0FBRSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7S0FDbEIsTUFBTSxJQUFJLHNCQUFzQixFQUFFO0FBQ3RDLElBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtBQUNoQyxLQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQ25DLE9BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRTtTQUNqQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFDO1NBQ3BDLFFBQVEsR0FBRyxTQUFRO1FBQ3BCO0FBQ1AsTUFBSyxNQUFNLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRTtPQUNsQyxRQUFRLEdBQUcsU0FBUTtNQUNwQixNQUFNLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM1QyxPQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFDO09BQ3pDLFFBQVEsR0FBRyxTQUFRO0FBQ3pCLE1BQUssTUFBTTtBQUNYLE9BQU0sTUFBTSxJQUFJLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDO01BQ25GO0lBQ0Y7QUFDSCxHQUFFLElBQUksSUFBRztBQUNULEdBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQ3BCLEtBQUksR0FBRyxHQUFHLElBQUksMEJBQTBCLEdBQUU7QUFDMUMsSUFBRyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtBQUM5QixLQUFJLEdBQUcsR0FBRyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sRUFBQztJQUN4QztHQUNELElBQUksR0FBRyxFQUFFO0FBQ1gsS0FBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUM7QUFDN0IsS0FBSSxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDckMsS0FBSSxPQUFPLEdBQUc7SUFDWDtHQUNELEtBQUssQ0FBQyxTQUFTLEdBQUU7QUFDbkIsR0FBRSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO0VBQ3pEO0NBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtBQUMxRCxHQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUk7R0FDbEQ7QUFDRCxDQUFBLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFlBQVk7QUFDdEMsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRTtHQUM3QjtBQUNELENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTtBQUN4QyxHQUFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ25DLEdBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO0tBQ2hCLEtBQUssQ0FBQyxNQUFNLEdBQUU7S0FDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBQztJQUM3QztHQUNGO0NBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtBQUM5RTtHQUNFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxRQUFRLEVBQUM7QUFDbkYsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDO0FBQzVFLEdBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEdBQUcsU0FBUTtBQUNoRCxHQUFFLE9BQU8sSUFBSTtHQUNaO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0dBQy9ELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFNO0FBQ2pELEdBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFHO0FBQ3JCO0FBQ0E7R0FDRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFhO0FBQ2hEO0dBQ0UsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUk7QUFDbEMsR0FBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtBQUM1RSxLQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE9BQU0sS0FBSztBQUNYLE9BQU0sUUFBUTtBQUNkLE9BQU0sUUFBUTtBQUNkLE1BQUssRUFBQztLQUNGLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO0FBQ25ELE9BQU0sS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFLO01BQ3pCO0tBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLFFBQVEsS0FBSyxHQUFHLEVBQUU7QUFDM0MsT0FBTSxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQUs7TUFDdEI7QUFDTCxJQUFHLE1BQU07QUFDVCxLQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBRztBQUN4QixLQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsU0FBUTtBQUM1QixLQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSTtBQUN4QixLQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSTtLQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUNqRCxLQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBSztJQUNuQjtBQUNIO0FBQ0E7QUFDQTtHQUNFLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO0VBQ2pEO0FBQ0QsQ0FBQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7QUFDbEUsR0FBRSxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUc7QUFDdEIsR0FBRSxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUU7QUFDcEIsR0FBRSxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUk7QUFDdEIsR0FBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUk7QUFDbkIsR0FBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFDO0FBQ3ZFLFFBQU8sSUFBSSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQztRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUNwRCxHQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBSztFQUNuQjtDQUNELFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtHQUMzQyxFQUFFLEtBQUssQ0FBQyxVQUFTO0dBQ2pCLEVBQUUsQ0FBQyxFQUFFLEVBQUM7QUFDUjtBQUNBO0FBQ0E7QUFDQTtHQUNFLFdBQVcsQ0FBQyxLQUFLLEVBQUM7QUFDcEI7QUFDQSxHQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFDO0VBQzNCO0FBQ0QsQ0FBQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQzdCLEdBQUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDckMsR0FBRSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSTtBQUN6QixHQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFPO0FBQzFCLEdBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUU7QUFDaEMsS0FBSSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUkscUJBQXFCLEVBQUUsRUFBQztBQUN2RCxLQUFJLE1BQU07SUFDUDtBQUNILEdBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFLO0FBQ3ZCLEdBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFJO0FBQ3RCLEdBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUTtBQUNoQyxHQUFFLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBQztHQUNsQixJQUFJLEVBQUUsRUFBRTtBQUNWO0tBQ0ksRUFBRSxDQUFDLE1BQUs7QUFDWjtBQUNBLEtBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDeEIsT0FBTSxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUU7TUFDbkI7QUFDTDtBQUNBO0FBQ0E7S0FDSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtBQUNqRSxPQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLEdBQUU7TUFDbkM7S0FDRCxJQUFJLElBQUksRUFBRTtBQUNkLE9BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFDO0FBQzNELE1BQUssTUFBTTtPQUNMLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUM7TUFDcEM7QUFDTCxJQUFHLE1BQU07S0FDTCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUU7QUFDckQsT0FBTSxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztNQUMzQjtLQUNELElBQUksSUFBSSxFQUFFO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUNuRixTQUFRLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUU7QUFDeEMsUUFBTyxNQUFNO1NBQ0wsS0FBSyxDQUFDLGtCQUFrQixHQUFHO1dBQ3pCLEtBQUssRUFBRSxDQUFDO0FBQ2xCLFdBQVUsRUFBRTtBQUNaLFdBQVUsTUFBTTtBQUNoQixXQUFVLEtBQUs7V0FDTjtTQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBQztRQUMzRDtBQUNQLE1BQUssTUFBTTtPQUNMLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUM7TUFDakM7SUFDRjtFQUNGO0NBQ0QsU0FBUyxjQUFjLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN0RCxHQUFFLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxLQUFJO0dBQy9CLE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztFQUM1QztDQUNELFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtHQUM1QyxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFTO0dBQzdGLElBQUksU0FBUyxFQUFFO0FBQ2pCLEtBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFLO0FBQzNCLEtBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUM7SUFDckI7QUFDSCxHQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO0tBQ2xCLEtBQUssQ0FBQyxTQUFTLEdBQUU7QUFDckIsS0FBSSxFQUFFLEdBQUU7SUFDTDtBQUNILEdBQUUsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO0tBQ25CLFdBQVcsQ0FBQyxLQUFLLEVBQUM7SUFDbkI7QUFDSCxHQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO0VBQzNCO0FBQ0Q7QUFDQTtDQUNBLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUM1QixHQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUNyQixLQUFJLE1BQU07SUFDUDtBQUNILEdBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUNwRSxLQUFJLElBQUksZUFBYztBQUN0QixLQUFJLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUM7S0FDN0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU07QUFDbkQsS0FBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUc7QUFDdkIsS0FBSSxRQUFRO09BQ04sQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sTUFBTSxJQUFJLElBQUksY0FBYyxLQUFLLFNBQVM7QUFDL0UsV0FBVSxjQUFjO0FBQ3hCLFdBQVUsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7T0FDdEM7SUFDRjtHQUNELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUM7QUFDeEQsR0FBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JELEtBQUksSUFBSSxnQkFBZTtLQUNuQixpQkFBaUIsQ0FBQyxDQUFDLENBQUM7T0FDbEIsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sTUFBTSxJQUFJLElBQUksZUFBZSxLQUFLLFNBQVM7QUFDakYsV0FBVSxlQUFlO0FBQ3pCLFdBQVUsSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7T0FDcEM7SUFDRjtHQUNELFdBQVcsQ0FBQyxLQUFLLEVBQUM7RUFDbkI7QUFDRDtBQUNBO0FBQ0EsQ0FBQSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ3BDLEdBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtBQUN2RixLQUFJLE1BQU07SUFDUDtHQUNELE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQUs7QUFDdkQsR0FBRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLGNBQWE7R0FDdEQsSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUN2QixLQUFJLE1BQU07SUFDUDtHQUNELElBQUksQ0FBQyxHQUFHLGNBQWE7QUFDdkIsR0FBRSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsS0FBSTtHQUM3QixJQUFJLGNBQWMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtBQUM1QyxLQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksY0FBYyxHQUFHLEVBQUM7QUFDekMsS0FBSSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTztBQUNsQyxTQUFRLEdBQUc7U0FDSCxDQUFDLEdBQUcsS0FBSztBQUNqQixXQUFVLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2FBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFDO1lBQzFCO1dBQ0Y7QUFDVDtBQUNBO0FBQ0EsS0FBSSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUM7QUFDekYsS0FBSSxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFVO0FBQ3hDLEtBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUM7S0FDaEUsV0FBVyxDQUFDLEtBQUssRUFBQztBQUN0QixJQUFHLE1BQU07QUFDVCxLQUFJLEdBQUc7QUFDUCxPQUFNLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUM7QUFDdkQsT0FBTSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFJO09BQ3BCLE1BQU0sR0FBRyxHQUFHLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU07QUFDL0MsT0FBTSxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDO01BQzlELFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ25ELEtBQUksSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRTtPQUN6QixXQUFXLENBQUMsS0FBSyxFQUFDO0FBQ3hCLE1BQUssTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFDeEIsT0FBTSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUM7QUFDM0IsT0FBTSxLQUFLLENBQUMsYUFBYSxHQUFHLEVBQUM7QUFDN0IsTUFBSyxNQUFNO0FBQ1gsT0FBTSxLQUFLLENBQUMsYUFBYSxHQUFHLEVBQUM7TUFDeEI7SUFDRjtBQUNILEdBQUUsS0FBSyxDQUFDLGdCQUFnQixHQUFHLE1BQUs7RUFDL0I7Q0FDRCxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0FBQzNELEdBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0tBQ2hCLElBQUksQ0FBQyxPQUFPO09BQ1Y7U0FDRTtBQUNSLFdBQVUsS0FBSztBQUNmLFdBQVUsUUFBUTtVQUNUO1FBQ0Y7QUFDUCxPQUFNLEVBQUU7T0FDSDtBQUNMLElBQUcsTUFBTTtBQUNULEtBQUksTUFBTSxJQUFJLDBCQUEwQixDQUFDLFVBQVUsQ0FBQztJQUNqRDtHQUNGO0FBQ0QsQ0FBQSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFJO0NBQ2pDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7QUFDeEQsR0FBRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBYztBQUNuQyxHQUFFLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO0tBQy9CLEVBQUUsR0FBRyxNQUFLO0tBQ1YsS0FBSyxHQUFHLEtBQUk7S0FDWixRQUFRLEdBQUcsS0FBSTtBQUNuQixJQUFHLE1BQU0sSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7S0FDekMsRUFBRSxHQUFHLFNBQVE7S0FDYixRQUFRLEdBQUcsS0FBSTtJQUNoQjtBQUNILEdBQUUsSUFBSSxJQUFHO0dBQ1AsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7S0FDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDO0FBQzdDLEtBQUksSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFO09BQ3hCLEdBQUcsR0FBRyxJQUFHO01BQ1Y7SUFDRjtBQUNIO0FBQ0E7QUFDQSxHQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUNwQixLQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBQztLQUNoQixJQUFJLENBQUMsTUFBTSxHQUFFO0lBQ2Q7R0FDRCxJQUFJLEdBQUcsRUFBRSxDQUVSLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFJO0FBQ3ZCLEtBQUksV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO0FBQ2xDLEtBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFJO0FBQ3RCLElBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7QUFDN0IsS0FBSSxHQUFHLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUM7QUFDaEQsSUFBRyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtBQUM5QixLQUFJLEdBQUcsR0FBRyxJQUFJLG9CQUFvQixDQUFDLEtBQUssRUFBQztJQUN0QztBQUNILEdBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUU7QUFDaEMsS0FBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQy9CLE9BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFDO0FBQy9CLE1BQUssTUFBTTtPQUNMLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFDO01BQzVCO0lBQ0Y7QUFDSCxHQUFFLE9BQU8sSUFBSTtHQUNaO0NBQ0QsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0dBQ3pCO0tBQ0UsS0FBSyxDQUFDLE1BQU07S0FDWixDQUFDLEtBQUssQ0FBQyxTQUFTO0tBQ2hCLEtBQUssQ0FBQyxXQUFXO0FBQ3JCLEtBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO0tBQ2xCLENBQUMsS0FBSyxDQUFDLE9BQU87QUFDbEIsS0FBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO0tBQzNCLENBQUMsS0FBSyxDQUFDLFFBQVE7S0FDZixDQUFDLEtBQUssQ0FBQyxPQUFPO0tBQ2QsQ0FBQyxLQUFLLENBQUMsWUFBWTtLQUNuQixDQUFDLEtBQUssQ0FBQyxZQUFZO0lBQ3BCO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7R0FDaEMsSUFBSSxNQUFNLEdBQUcsTUFBSztBQUNwQixHQUFFLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtLQUNyQixJQUFJLE1BQU0sRUFBRTtBQUNoQixPQUFNLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxHQUFHLEdBQUcsR0FBRyxxQkFBcUIsRUFBRSxFQUFDO0FBQy9GLE9BQU0sTUFBTTtNQUNQO0tBQ0QsTUFBTSxHQUFHLEtBQUk7S0FDYixLQUFLLENBQUMsU0FBUyxHQUFFO0tBQ2pCLElBQUksR0FBRyxFQUFFO09BQ1AsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQztBQUM1RCxPQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekQsU0FBUSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7UUFDMUI7T0FDRCxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFDO0FBQzdDLE1BQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNsQyxPQUFNLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSTtBQUM5QixPQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFDO0FBQzlCO0FBQ0E7QUFDQTtPQUNNLEtBQUssQ0FBQyxTQUFTLEdBQUU7T0FDakIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQztNQUN4QztJQUNGO0FBQ0gsR0FBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUk7R0FDakIsS0FBSyxDQUFDLFNBQVMsR0FBRTtBQUNuQixHQUFFLElBQUk7QUFDTixLQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFDO0lBQ3hCLENBQUMsT0FBTyxHQUFHLEVBQUU7S0FDWixRQUFRLENBQUMsR0FBRyxFQUFDO0lBQ2Q7QUFDSCxHQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBSztFQUNuQjtBQUNELENBQUEsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtHQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7QUFDaEQsS0FBSSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO0FBQ2pFLE9BQU0sS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFJO0FBQzlCLE9BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7QUFDOUIsTUFBSyxNQUFNO0FBQ1gsT0FBTSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUk7QUFDOUIsT0FBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBQztNQUN6QjtJQUNGO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQzFDLEdBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDekIsS0FBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztBQUM1QixLQUFJLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLEVBQUU7T0FDekIsSUFBSSxJQUFJLEVBQUU7U0FDUixLQUFLLENBQUMsU0FBUyxHQUFFO1NBQ2pCLE9BQU8sQ0FBQyxRQUFRO0FBQ3hCLFdBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxLQUFLO0FBQzdCLGFBQVksSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbkMsZUFBYyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztBQUNuQyxjQUFhLE1BQU07ZUFDTCxLQUFLLENBQUMsU0FBUyxHQUFFO2NBQ2xCO1lBQ0Y7QUFDWCxXQUFVLE1BQU07QUFDaEIsV0FBVSxLQUFLO1dBQ047QUFDVCxRQUFPLE1BQU0sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7U0FDNUIsS0FBSyxDQUFDLFNBQVMsR0FBRTtBQUN6QixTQUFRLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO1FBQ3RCO01BQ0Y7SUFDRjtFQUNGO0FBQ0QsQ0FBQSxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0dBQzdCLEtBQUssQ0FBQyxTQUFTLEdBQUU7QUFDbkIsR0FBRSxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUk7R0FDckIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQztBQUN4RCxHQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsS0FBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRTtJQUN2QjtBQUNILEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUM7QUFDdkIsR0FBRSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7QUFDekI7QUFDQTtBQUNBLEtBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWM7QUFDeEMsS0FBSSxNQUFNLFdBQVc7QUFDckIsT0FBTSxDQUFDLE1BQU07UUFDTixNQUFNLENBQUMsV0FBVztBQUN6QjtBQUNBO1VBQ1MsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFDO0tBQ3JELElBQUksV0FBVyxFQUFFO09BQ2YsTUFBTSxDQUFDLE9BQU8sR0FBRTtNQUNqQjtJQUNGO0VBQ0Y7QUFDRCxDQUFBLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7QUFDM0MsR0FBRSxNQUFNLEVBQUU7S0FDTixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxLQUFLO01BQ2hFO0lBQ0Y7QUFDSCxHQUFFLFNBQVMsRUFBRTtLQUNULFNBQVMsRUFBRSxJQUFJO0FBQ25CLEtBQUksR0FBRyxHQUFHO09BQ0osT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLEtBQUs7TUFDbkU7S0FDRCxHQUFHLENBQUMsS0FBSyxFQUFFO0FBQ2Y7QUFDQSxPQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUMvQixTQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLE1BQUs7UUFDdEM7TUFDRjtJQUNGO0FBQ0gsR0FBRSxRQUFRLEVBQUU7S0FDUixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztBQUNWLE9BQU0sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO01BQzFGO0tBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUNiO0FBQ0EsT0FBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7U0FDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUc7UUFDckM7TUFDRjtJQUNGO0FBQ0gsR0FBRSxnQkFBZ0IsRUFBRTtLQUNoQixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxLQUFLO01BQ2xFO0lBQ0Y7QUFDSCxHQUFFLGtCQUFrQixFQUFFO0tBQ2xCLFNBQVMsRUFBRSxJQUFJO0FBQ25CLEtBQUksR0FBRyxHQUFHO09BQ0osT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxHQUFHLEtBQUs7TUFDcEU7SUFDRjtBQUNILEdBQUUsY0FBYyxFQUFFO0tBQ2QsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7T0FDSixPQUFPLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUU7TUFDOUQ7SUFDRjtBQUNILEdBQUUsYUFBYSxFQUFFO0tBQ2IsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7T0FDSixPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsS0FBSztNQUNoRTtJQUNGO0FBQ0gsR0FBRSxpQkFBaUIsRUFBRTtLQUNqQixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztBQUNWLE9BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWM7QUFDeEMsT0FBTSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSztBQUMvQixPQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUztNQUMvRDtJQUNGO0FBQ0gsR0FBRSxxQkFBcUIsRUFBRTtLQUNyQixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWE7TUFDaEU7SUFDRjtBQUNILEdBQUUsY0FBYyxFQUFFO0tBQ2QsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxHQUFHLEdBQUc7T0FDSixPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztNQUM1RDtJQUNGO0FBQ0gsR0FBRSxjQUFjLEVBQUU7S0FDZCxTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07TUFDekQ7SUFDRjtBQUNILEdBQUUsT0FBTyxFQUFFO0tBQ1AsU0FBUyxFQUFFLElBQUk7S0FDZixVQUFVLEVBQUUsS0FBSztBQUNyQixLQUFJLEdBQUcsR0FBRztPQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJO01BQ2hFO0lBQ0Y7QUFDSCxHQUFFLGVBQWUsRUFBRTtLQUNmLFNBQVMsRUFBRSxJQUFJO0tBQ2YsVUFBVSxFQUFFLEtBQUs7S0FDakIsR0FBRyxFQUFFLFlBQVk7QUFDckIsT0FBTSxPQUFPLENBQUM7QUFDZCxTQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLEtBQUs7VUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDdEUsU0FBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUTtRQUM5QjtNQUNGO0lBQ0Y7QUFDSCxFQUFDLEVBQUM7QUFDRixDQUFBLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFPO0NBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsRUFBRTtBQUNoRCxHQUFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFjO0FBQ25DO0FBQ0E7R0FDRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUN0RyxLQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBQztJQUNyQztHQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDN0IsR0FBRSxPQUFPLElBQUk7R0FDWjtBQUNELENBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVM7Q0FDckQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsRUFBRSxFQUFFO0dBQy9DLEVBQUUsQ0FBQyxHQUFHLEVBQUM7R0FDUjtDQUNELFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDL0QsR0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztHQUNsQjtBQUNELENBQUEsSUFBSSxtQkFBa0I7QUFDdEI7QUFDQTtBQUNBLENBQUEsU0FBUyxjQUFjLEdBQUc7QUFDMUIsR0FBRSxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxrQkFBa0IsR0FBRyxHQUFFO0FBQy9ELEdBQUUsT0FBTyxrQkFBa0I7RUFDMUI7QUFDRCxDQUFBLFFBQVEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxjQUFjLEVBQUUsT0FBTyxFQUFFO0dBQ3BELE9BQU8sY0FBYyxFQUFFLENBQUMsbUNBQW1DLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQztHQUNyRjtBQUNELENBQUEsUUFBUSxDQUFDLEtBQUssR0FBRyxVQUFVLGNBQWMsRUFBRTtBQUMzQyxHQUFFLE9BQU8sY0FBYyxFQUFFLENBQUMsbUNBQW1DLENBQUMsY0FBYyxDQUFDO0FBQzdFLEdBQUE7Ozs7Ozs7Ozs7OztDQzl5QkEsTUFBTSxPQUFPLEdBQUdiLGNBQW1CLEVBQUE7QUFDbkM7QUFDQTtBQUNBO0dBRUEsTUFBTSxZQUFZLEdBQUdDLFdBQWlCO0NBQ3RDLE1BQU07QUFDTixHQUFFLFVBQVU7QUFDWixHQUFFLFVBQVU7QUFDWixHQUFFLFVBQVU7QUFDWixHQUFFLFlBQVk7QUFDZCxHQUFFLG9CQUFvQjtBQUN0QixHQUFFLG9CQUFvQjtBQUN0QixHQUFFLGtCQUFrQjtBQUNwQixFQUFDLEdBQUdDLFlBQWtCLEdBQUE7Q0FDdEIsTUFBTSxHQUFHLEdBQUdHLGtCQUEwQixHQUFBO0NBQ3RDLE1BQU07QUFDTixHQUFFLFVBQVU7QUFDWixHQUFFLEtBQUssRUFBRSxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFO0FBQzNELEVBQUMsR0FBR0MsYUFBNEIsR0FBQTtBQUNoQyxDQUFBLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBR0MsY0FBb0IsR0FBQTtDQUMxQyxNQUFNLE1BQU0sR0FBR0csYUFBbUIsR0FBQTtDQUNsQyxNQUFNLFFBQVEsR0FBR0MsZUFBcUIsR0FBQTtBQUN0QyxDQUFBLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxHQUFHQyxXQUEwQixHQUFBO0NBQzVELE1BQU0sSUFBSSxHQUFHQyxXQUFpQixHQUFBO0NBQzlCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLEtBQUk7QUFDakQsQ0FBQSxNQUFNLE1BQU07R0FDVixPQUFPLElBQUksS0FBSyxXQUFXO0FBQzdCLE9BQU0sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO1NBQ2pCLE9BQU8sQ0FBQyxZQUFZLElBQUk7UUFDekI7QUFDUCxPQUFNLFNBQVMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN6QixTQUFRLE9BQU8sS0FBSztTQUNiO0NBQ1AsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGVBQWUsSUFBSUMsVUFBMkIsQ0FBQyxnQkFBZTtBQUNqRyxDQUFBLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxHQUFHQyxrQkFBaUMsR0FBQTtBQUNuRTtBQUNBO0NBQ0EsTUFBTSxTQUFTLFNBQVMsTUFBTSxDQUFDO0dBQzdCLFdBQVcsQ0FBQyxPQUFPLEVBQUU7S0FDbkIsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUNsQjtBQUNBO0FBQ0E7QUFDQSxLQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLE1BQU0sS0FBSyxFQUFFO0FBQzlGLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsTUFBSztBQUMxQyxPQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEtBQUk7QUFDdEMsT0FBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxLQUFJO01BQ3RDO0FBQ0wsS0FBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxNQUFNLEtBQUssRUFBRTtBQUM5RixPQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLE1BQUs7QUFDMUMsT0FBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxLQUFJO0FBQ3ZDLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSTtBQUN0QyxPQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLEtBQUk7TUFDcEM7SUFDRjtFQUNGO0FBQ0QsQ0FBQSxTQUFjLEdBQUcsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtBQUNoRCxHQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDaEMsS0FBSSxPQUFPLElBQUk7SUFDWjtBQUNILEdBQUUsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtLQUM5QixPQUFPLFVBQVUsQ0FBQztPQUNoQixRQUFRLEVBQUUsSUFBSTtBQUNwQixNQUFLLENBQUM7SUFDSDtBQUNILEdBQUUsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtLQUM5QixPQUFPLFVBQVUsQ0FBQztPQUNoQixRQUFRLEVBQUUsSUFBSTtBQUNwQixNQUFLLENBQUM7SUFDSDtBQUNILEdBQUUsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7S0FDdEIsT0FBTyxVQUFVLENBQUM7T0FDaEIsUUFBUSxFQUFFLEtBQUs7T0FDZixRQUFRLEVBQUUsS0FBSztBQUNyQixNQUFLLENBQUM7SUFDSDtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ2xDLEtBQUksTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUM7QUFDL0QsS0FBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMzQixPQUFNLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7QUFDcEM7U0FDUSxVQUFVLEVBQUUsSUFBSTtBQUN4QixTQUFRLEtBQUs7QUFDYixTQUFRLEtBQUs7QUFDYixTQUFRLE9BQU87QUFDZixRQUFPLENBQUM7TUFDSDtBQUNMLEtBQUksTUFBTSxJQUFJLEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSTtBQUMvRSxLQUFJLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ3BDLE9BQU0sSUFBSSxFQUFDO09BQ0wsTUFBTSxPQUFPLEdBQUcscUJBQXFCO0FBQzNDLFNBQVEsSUFBSTtBQUNaLFNBQVEsS0FBSztTQUNMLENBQUMsR0FBRyxLQUFLO0FBQ2pCLFdBQVUsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2FBQ2YsTUFBTSxJQUFJLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO1lBQ3pEO1VBQ0Y7U0FDRCxDQUFDLEdBQUcsS0FBSztBQUNqQixXQUFVLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO1VBQ2xCO1NBQ0Y7QUFDUCxPQUFNLFFBQVEsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDO0FBQ2hDO1NBQ1EsVUFBVSxFQUFFLElBQUk7U0FDaEIsUUFBUSxFQUFFLEtBQUs7QUFDdkIsU0FBUSxLQUFLO1NBQ0wsS0FBSyxDQUFDLEVBQUUsRUFBRTtXQUNSLEtBQUssQ0FBQyxZQUFZO0FBQzVCLGFBQVksSUFBSTtBQUNoQixlQUFjLE1BQU0sUUFBTztBQUMzQixlQUFjLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBQztjQUMzQixDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQzFCLGVBQWMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFDO2NBQzFCO0FBQ2IsWUFBVyxFQUFDO1VBQ0g7QUFDVCxTQUFRLE9BQU87QUFDZixRQUFPLENBQUMsQ0FBQztNQUNKO0tBQ0QsTUFBTSxJQUFJLHdCQUF3QixDQUFDLDBDQUEwQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7SUFDNUY7QUFDSCxHQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3BCLEtBQUksT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JDO0FBQ0gsR0FBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN4QixLQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUU7QUFDakM7T0FDTSxVQUFVLEVBQUUsSUFBSTtPQUNoQixRQUFRLEVBQUUsS0FBSztBQUNyQixNQUFLLENBQUM7SUFDSDtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFO0FBQ0YsS0FBSSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7QUFDekYsS0FBSSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7S0FDckY7QUFDSixLQUFJLE1BQU0sUUFBUTtPQUNaLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUTtBQUMxRCxXQUFVLG9CQUFvQixDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUMvRixhQUFZLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVM7QUFDL0MsZUFBYyxTQUFTO2VBQ1QsSUFBSSxDQUFDLFFBQVE7QUFDM0IsYUFBWSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUNwQyxXQUFVLFVBQVM7QUFDbkIsS0FBSSxNQUFNLFFBQVE7T0FDWixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVE7QUFDMUQsV0FBVSxvQkFBb0IsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDL0YsYUFBWSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTO0FBQy9DLGVBQWMsU0FBUztlQUNULElBQUksQ0FBQyxRQUFRO0FBQzNCLGFBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDcEMsV0FBVSxVQUFTO0tBQ2YsT0FBTyxVQUFVLENBQUM7QUFDdEIsT0FBTSxRQUFRO0FBQ2QsT0FBTSxRQUFRO0FBQ2QsTUFBSyxDQUFDO0lBQ0g7QUFDSCxHQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUk7QUFDMUUsR0FBRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTtBQUNsQyxLQUFJLElBQUksRUFBQztBQUNULEtBQUkscUJBQXFCO0FBQ3pCLE9BQU0sSUFBSTtBQUNWLE9BQU0sSUFBSTtPQUNKLENBQUMsR0FBRyxLQUFLO0FBQ2YsU0FBUSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDekIsV0FBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBQztVQUNaO0FBQ1QsU0FBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQztRQUNiO09BQ0QsQ0FBQyxHQUFHLEtBQUs7QUFDZixTQUFRLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO1FBQ2xCO09BQ0Y7QUFDTCxLQUFJLFFBQVEsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDO09BQ3hCLFVBQVUsRUFBRSxJQUFJO09BQ2hCLFFBQVEsRUFBRSxLQUFLO09BQ2YsSUFBSSxHQUFHLEVBQUU7QUFDZixNQUFLLENBQUMsQ0FBQztJQUNKO0dBQ0QsTUFBTSxJQUFJLG9CQUFvQjtBQUNoQyxLQUFJLElBQUk7S0FDSjtBQUNKLE9BQU0sTUFBTTtBQUNaLE9BQU0sZ0JBQWdCO0FBQ3RCLE9BQU0sZ0JBQWdCO0FBQ3RCLE9BQU0sUUFBUTtBQUNkLE9BQU0sVUFBVTtBQUNoQixPQUFNLGVBQWU7QUFDckIsT0FBTSxVQUFVO0FBQ2hCLE9BQU0sNkJBQTZCO0FBQ25DLE9BQU0sU0FBUztNQUNWO0FBQ0wsS0FBSSxJQUFJO0lBQ0w7R0FDRjtDQUNELFNBQVMsWUFBWSxDQUFDLEVBQUUsRUFBRTtHQUN4QixJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLHFCQUFxQixHQUFFO0FBQ3BELEdBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLEdBQUU7QUFDbEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTTtHQUN4QixNQUFNLEtBQUssR0FBRyxFQUFFO0FBQ2xCLEtBQUksQ0FBQyxtQkFBbUI7T0FDbEIsT0FBTyxJQUFJLEVBQUU7U0FDWCxNQUFNLFFBQVEsR0FBRyxRQUFPO1NBQ3hCLE9BQU8sR0FBRyxLQUFJO1NBQ2QsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxTQUFRO0FBQ2xELFNBQVEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUM7U0FDcEIsSUFBSSxJQUFJLEVBQUUsTUFBTTtTQUNoQixJQUFJLE1BQU0sQ0FBQyxPQUFPO0FBQzFCLFdBQVUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7QUFDMUMsYUFBWSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU07QUFDaEMsWUFBVyxDQUFDO1VBQ0gsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxFQUFDO0FBQ3pELFNBQVEsTUFBTSxNQUFLO1FBQ1o7QUFDUCxNQUFLLEdBQUc7S0FDSjtBQUNKLE9BQU0sTUFBTTtNQUNQO0tBQ0Y7QUFDSCxHQUFFLE9BQU87QUFDVCxLQUFJLEtBQUs7QUFDVCxLQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtPQUN6QixNQUFNLFFBQVEsR0FBRyxRQUFPO09BQ3hCLE9BQU8sR0FBRyxLQUFJO0FBQ3BCLE9BQU0sUUFBUSxDQUFDO0FBQ2YsU0FBUSxLQUFLO1NBQ0wsSUFBSSxFQUFFLEtBQUs7QUFDbkIsU0FBUSxFQUFFO0FBQ1YsUUFBTyxFQUFDO01BQ0g7S0FDRCxLQUFLLENBQUMsRUFBRSxFQUFFO09BQ1IsTUFBTSxRQUFRLEdBQUcsUUFBTztPQUN4QixPQUFPLEdBQUcsS0FBSTtBQUNwQixPQUFNLFFBQVEsQ0FBQztTQUNQLElBQUksRUFBRSxJQUFJO0FBQ2xCLFNBQVEsRUFBRTtBQUNWLFFBQU8sRUFBQztNQUNIO0FBQ0wsS0FBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRTtPQUNmLEVBQUUsQ0FBQyxLQUFLLEdBQUU7T0FDVixFQUFFLENBQUMsR0FBRyxFQUFDO01BQ1I7SUFDRjtFQUNGO0NBQ0QsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0dBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVE7QUFDcEgsR0FBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUTtHQUN2QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBQztHQUM5QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBQztBQUNoQyxHQUFFLElBQUksUUFBTztBQUNiLEdBQUUsSUFBSSxTQUFRO0FBQ2QsR0FBRSxJQUFJLFdBQVU7QUFDaEIsR0FBRSxJQUFJLFFBQU87QUFDYixHQUFFLElBQUksRUFBQztBQUNQLEdBQUUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFO0tBQ3ZCLE1BQU0sRUFBRSxHQUFHLFFBQU87S0FDbEIsT0FBTyxHQUFHLEtBQUk7S0FDZCxJQUFJLEVBQUUsRUFBRTtPQUNOLEVBQUUsQ0FBQyxHQUFHLEVBQUM7TUFDUixNQUFNLElBQUksR0FBRyxFQUFFO0FBQ3BCLE9BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7QUFDcEIsTUFBSyxNQUFNLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7T0FDakMsQ0FBQyxDQUFDLE9BQU8sR0FBRTtNQUNaO0lBQ0Y7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDO0FBQ3BCO0FBQ0EsS0FBSSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztBQUNqRixLQUFJLGtCQUFrQixFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0FBQ2pGLEtBQUksUUFBUTtBQUNaLEtBQUksUUFBUTtBQUNaLElBQUcsRUFBQztHQUNGLElBQUksUUFBUSxFQUFFO0FBQ2hCLEtBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSztPQUNkLFFBQVEsR0FBRyxNQUFLO09BQ2hCLElBQUksR0FBRyxFQUFFO0FBQ2YsU0FBUSxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztRQUNsQjtPQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUM7QUFDckIsTUFBSyxFQUFDO0tBQ0YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO09BQzlDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7QUFDcEMsU0FBUSxRQUFRLEdBQUU7QUFDbEIsUUFBTyxNQUFNO1NBQ0wsT0FBTyxHQUFHLFNBQVE7UUFDbkI7T0FDRjtBQUNMLEtBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxVQUFVLFFBQVEsRUFBRTtPQUM3QixDQUFDLENBQUMsR0FBRyxHQUFFO09BQ1AsUUFBUSxHQUFHLFNBQVE7T0FDcEI7QUFDTCxLQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVk7T0FDeEIsSUFBSSxPQUFPLEVBQUU7U0FDWCxNQUFNLEVBQUUsR0FBRyxRQUFPO1NBQ2xCLE9BQU8sR0FBRyxLQUFJO0FBQ3RCLFNBQVEsRUFBRSxHQUFFO1FBQ0w7QUFDUCxNQUFLLEVBQUM7QUFDTixLQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVk7T0FDekIsSUFBSSxRQUFRLEVBQUU7U0FDWixNQUFNLEVBQUUsR0FBRyxTQUFRO1NBQ25CLFFBQVEsR0FBRyxLQUFJO0FBQ3ZCLFNBQVEsRUFBRSxHQUFFO1FBQ0w7QUFDUCxNQUFLLEVBQUM7SUFDSDtHQUNELElBQUksUUFBUSxFQUFFO0FBQ2hCLEtBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSztPQUNkLFFBQVEsR0FBRyxNQUFLO09BQ2hCLElBQUksR0FBRyxFQUFFO0FBQ2YsU0FBUSxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztRQUNsQjtPQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUM7QUFDckIsTUFBSyxFQUFDO0FBQ04sS0FBSSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZO09BQzNCLElBQUksVUFBVSxFQUFFO1NBQ2QsTUFBTSxFQUFFLEdBQUcsV0FBVTtTQUNyQixVQUFVLEdBQUcsS0FBSTtBQUN6QixTQUFRLEVBQUUsR0FBRTtRQUNMO0FBQ1AsTUFBSyxFQUFDO0FBQ04sS0FBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxZQUFZO0FBQzVCLE9BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7QUFDbEIsTUFBSyxFQUFDO0FBQ04sS0FBSSxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVk7T0FDcEIsT0FBTyxJQUFJLEVBQUU7QUFDbkIsU0FBUSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFFO0FBQzVCLFNBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO0FBQzFCLFdBQVUsVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFLO0FBQzlCLFdBQVUsTUFBTTtVQUNQO1NBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUIsV0FBVSxNQUFNO1VBQ1A7UUFDRjtPQUNGO0lBQ0Y7R0FDRCxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLFFBQVEsRUFBRTtBQUN4QyxLQUFJLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtBQUNsQyxPQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsR0FBRTtNQUN2QjtLQUNELFVBQVUsR0FBRyxLQUFJO0tBQ2pCLE9BQU8sR0FBRyxLQUFJO0tBQ2QsUUFBUSxHQUFHLEtBQUk7QUFDbkIsS0FBSSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7T0FDcEIsUUFBUSxDQUFDLEdBQUcsRUFBQztBQUNuQixNQUFLLE1BQU07T0FDTCxPQUFPLEdBQUcsU0FBUTtBQUN4QixPQUFNLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZCLE9BQU0sU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUM7TUFDbEI7S0FDRjtBQUNILEdBQUUsT0FBTyxDQUFDO0FBQ1YsRUFBQTs7Ozs7Ozs7OztBQ2pXQTtDQUNBLE1BQU07QUFDTixHQUFFLHNCQUFzQjtBQUN4QixHQUFFLDhCQUE4QjtBQUNoQyxHQUFFLFVBQVU7QUFDWixHQUFFLG9CQUFvQjtBQUN0QixFQUFDLEdBQUdmLGtCQUFpQyxHQUFBO0FBQ3JDLENBQUEsTUFBYyxHQUFHLE9BQU07Q0FDdkIsTUFBTSxRQUFRLEdBQUdDLGVBQXFCLEdBQUE7Q0FDdEMsTUFBTSxRQUFRLEdBQUdDLGVBQXFCLEdBQUE7Q0FDdEMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFDO0FBQzFELENBQUEsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQztBQUN0QyxDQUFBO0dBQ0UsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUM7QUFDN0M7QUFDQSxHQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hDLEtBQUksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBQztLQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFDO0lBQ3JGO0VBQ0Y7Q0FDRCxTQUFTLE1BQU0sQ0FBQyxPQUFPLEVBQUU7QUFDekIsR0FBRSxJQUFJLEVBQUUsSUFBSSxZQUFZLE1BQU0sQ0FBQyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNELEdBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDO0FBQzlCLEdBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDO0dBQzVCLElBQUksT0FBTyxFQUFFO0tBQ1gsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxLQUFLLE1BQUs7QUFDeEQsS0FBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO0FBQ3BDLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsTUFBSztBQUMxQyxPQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEtBQUk7QUFDdEMsT0FBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxLQUFJO01BQ3RDO0FBQ0wsS0FBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO0FBQ3BDLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsTUFBSztBQUMxQyxPQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEtBQUk7QUFDdkMsT0FBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFJO0FBQ3RDLE9BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsS0FBSTtNQUNwQztBQUNMLElBQUcsTUFBTTtBQUNULEtBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFJO0lBQzFCO0VBQ0Y7QUFDRCxDQUFBLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7QUFDekMsR0FBRSxRQUFRLEVBQUU7S0FDUixTQUFTLEVBQUUsSUFBSTtLQUNmLEdBQUcsOEJBQThCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDbEU7QUFDSCxHQUFFLHFCQUFxQixFQUFFO0tBQ3JCLFNBQVMsRUFBRSxJQUFJO0tBQ2YsR0FBRyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLHVCQUF1QixDQUFDO0lBQy9FO0FBQ0gsR0FBRSxrQkFBa0IsRUFBRTtLQUNsQixTQUFTLEVBQUUsSUFBSTtLQUNmLEdBQUcsOEJBQThCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQztJQUM1RTtBQUNILEdBQUUsY0FBYyxFQUFFO0tBQ2QsU0FBUyxFQUFFLElBQUk7S0FDZixHQUFHLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEU7QUFDSCxHQUFFLGNBQWMsRUFBRTtLQUNkLFNBQVMsRUFBRSxJQUFJO0tBQ2YsR0FBRyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDO0lBQ3hFO0FBQ0gsR0FBRSxnQkFBZ0IsRUFBRTtLQUNoQixTQUFTLEVBQUUsSUFBSTtLQUNmLEdBQUcsOEJBQThCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztJQUMxRTtBQUNILEdBQUUsY0FBYyxFQUFFO0tBQ2QsU0FBUyxFQUFFLElBQUk7S0FDZixHQUFHLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEU7QUFDSCxHQUFFLGFBQWEsRUFBRTtLQUNiLFNBQVMsRUFBRSxJQUFJO0tBQ2YsR0FBRyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQztJQUN2RTtBQUNILEdBQUUsaUJBQWlCLEVBQUU7S0FDakIsU0FBUyxFQUFFLElBQUk7S0FDZixHQUFHLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUM7SUFDM0U7QUFDSCxHQUFFLFNBQVMsRUFBRTtLQUNULFNBQVMsRUFBRSxJQUFJO0FBQ25CLEtBQUksR0FBRyxHQUFHO0FBQ1YsT0FBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO0FBQ2xGLFNBQVEsT0FBTyxLQUFLO1FBQ2I7T0FDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUztNQUN0RTtLQUNELEdBQUcsQ0FBQyxLQUFLLEVBQUU7QUFDZjtBQUNBO09BQ00sSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDdEQsU0FBUSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxNQUFLO0FBQzdDLFNBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsTUFBSztRQUN0QztNQUNGO0lBQ0Y7QUFDSCxFQUFDLEVBQUM7QUFDRixDQUFBLElBQUksbUJBQWtCO0FBQ3RCO0FBQ0E7QUFDQSxDQUFBLFNBQVMsY0FBYyxHQUFHO0FBQzFCLEdBQUUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsa0JBQWtCLEdBQUcsR0FBRTtBQUMvRCxHQUFFLE9BQU8sa0JBQWtCO0VBQzFCO0FBQ0QsQ0FBQSxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsSUFBSSxFQUFFLE9BQU8sRUFBRTtHQUN4QyxPQUFPLGNBQWMsRUFBRSxDQUFDLHVDQUF1QyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7R0FDL0U7QUFDRCxDQUFBLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxNQUFNLEVBQUU7QUFDakMsR0FBRSxPQUFPLGNBQWMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztHQUNsRTtBQUNELENBQUEsSUFBSSxVQUFTO0FBQ2IsQ0FBQSxNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsSUFBSSxFQUFFO0dBQzVCLElBQUksQ0FBQyxTQUFTLEVBQUU7S0FDZCxTQUFTLEdBQUdHLGdCQUFzQixHQUFBO0lBQ25DO0FBQ0gsR0FBRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQ2hDLEdBQUE7Ozs7Ozs7Ozs7QUM5RUE7QUFDQSxDQUFBLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBR0wsa0JBQWlDLEdBQUE7QUFDMUUsQ0FBQSxTQUFjLEdBQUcsVUFBUztBQUMxQixDQUFBLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxHQUFHQyxhQUFBLEVBQTRCLENBQUMsTUFBSztDQUN6RSxNQUFNLE1BQU0sR0FBR0MsYUFBbUIsR0FBQTtBQUNsQyxDQUFBLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHRyxZQUFrQixHQUFBO0NBQy9DLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBQztBQUMzRCxDQUFBLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUM7QUFDdkMsQ0FBQSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFDO0NBQ3JDLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRTtBQUM1QixHQUFFLElBQUksRUFBRSxJQUFJLFlBQVksU0FBUyxDQUFDLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSTtBQUMvRyxHQUFFLElBQUkscUJBQXFCLEtBQUssQ0FBQyxFQUFFO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLEtBQUksT0FBTyxHQUFHO0FBQ2QsT0FBTSxHQUFHLE9BQU87T0FDVixhQUFhLEVBQUUsSUFBSTtBQUN6QixPQUFNLHFCQUFxQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU0scUJBQXFCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUM7T0FDMUQ7SUFDRjtBQUNILEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxNQUFLO0FBQ2xDLEdBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUk7R0FDdEIsSUFBSSxPQUFPLEVBQUU7QUFDZixLQUFJLElBQUksT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFTO0FBQ3BGLEtBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQUs7SUFDckU7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUM7RUFDaEM7Q0FDRCxTQUFTLEtBQUssQ0FBQyxFQUFFLEVBQUU7QUFDbkIsR0FBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO0tBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxLQUFLO09BQ3hCLElBQUksRUFBRSxFQUFFO1NBQ04sSUFBSSxFQUFFLEVBQUU7V0FDTixFQUFFLENBQUMsRUFBRSxFQUFDO0FBQ2hCLFVBQVMsTUFBTTtBQUNmLFdBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUM7VUFDakI7QUFDVCxTQUFRLE1BQU07UUFDUDtBQUNQLE9BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ3hCLFNBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7UUFDaEI7QUFDUCxPQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO09BQ2YsSUFBSSxFQUFFLEVBQUU7QUFDZCxTQUFRLEVBQUUsR0FBRTtRQUNMO0FBQ1AsTUFBSyxFQUFDO0FBQ04sSUFBRyxNQUFNO0FBQ1QsS0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQztLQUNmLElBQUksRUFBRSxFQUFFO0FBQ1osT0FBTSxFQUFFLEdBQUU7TUFDTDtJQUNGO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsU0FBUyxHQUFHO0FBQ3JCLEdBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtBQUM3QixLQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO0lBQ2pCO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQUs7Q0FDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN0RSxHQUFFLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxjQUFjLENBQUM7R0FDckQ7Q0FDRCxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ2xFLEdBQUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWM7QUFDcEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBYztBQUNwQyxHQUFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFNO0FBQzlCLEdBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSztLQUM3QyxJQUFJLEdBQUcsRUFBRTtPQUNQLFFBQVEsQ0FBQyxHQUFHLEVBQUM7QUFDbkIsT0FBTSxNQUFNO01BQ1A7QUFDTCxLQUFJLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUNyQixPQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDO01BQ2Y7S0FDRDtPQUNFLE1BQU0sQ0FBQyxLQUFLO0FBQ2xCO0FBQ0EsT0FBTSxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU07QUFDOUI7QUFDQSxPQUFNLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWE7T0FDcEM7QUFDTixPQUFNLFFBQVEsR0FBRTtBQUNoQixNQUFLLE1BQU07QUFDWCxPQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFRO01BQzNCO0FBQ0wsSUFBRyxFQUFDO0dBQ0g7QUFDRCxDQUFBLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7QUFDeEMsR0FBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUN2QixLQUFJLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUM7QUFDcEMsS0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSTtBQUMxQixLQUFJLFFBQVEsR0FBRTtJQUNYO0FBQ0gsR0FBQTs7Ozs7Ozs7OztBQ3pKQTtBQUNBLENBQUEsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUdMLGtCQUFpQyxHQUFBO0FBQ2xFLENBQUEsV0FBYyxHQUFHLFlBQVc7Q0FDNUIsTUFBTSxTQUFTLEdBQUdDLGdCQUFzQixHQUFBO0NBQ3hDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBQztBQUNoRSxDQUFBLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUM7Q0FDNUMsU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFO0FBQzlCLEdBQUUsSUFBSSxFQUFFLElBQUksWUFBWSxXQUFXLENBQUMsRUFBRSxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQztBQUNyRSxHQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQztFQUM5QjtDQUNELFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7QUFDbEUsR0FBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBQztBQUNqQixHQUFBOzs7Ozs7Ozs7Ozs7Q0NwQ0EsTUFBTSxPQUFPLEdBQUdELGNBQW1CLEVBQUE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUVBLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLEdBQUdDLGtCQUFpQyxHQUFBO0NBQ3hGLE1BQU0sR0FBRyxHQUFHQyxrQkFBMEIsR0FBQTtBQUN0QyxDQUFBLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBR0csV0FBMEIsR0FBQTtDQUMzQyxNQUFNLFdBQVcsR0FBR0MsY0FBb0IsR0FBQTtDQUN4QyxNQUFNLE1BQU0sR0FBR0MsYUFBbUIsR0FBQTtDQUNsQyxNQUFNO0FBQ04sR0FBRSxrQkFBa0I7QUFDcEIsR0FBRSxLQUFLLEVBQUU7QUFDVCxLQUFJLG9CQUFvQjtBQUN4QixLQUFJLHdCQUF3QjtBQUM1QixLQUFJLGdCQUFnQjtBQUNwQixLQUFJLG9CQUFvQjtBQUN4QixLQUFJLDBCQUEwQjtJQUMzQjtBQUNILEdBQUUsVUFBVTtBQUNaLEVBQUMsR0FBR0csYUFBNEIsR0FBQTtBQUNoQyxDQUFBLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxHQUFHQyxpQkFBd0IsR0FBQTtDQUMxRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsR0FBR0MsWUFBa0IsR0FBQTtDQUN6RixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxJQUFJLFVBQTJCLENBQUMsZ0JBQWU7QUFDakcsQ0FBQSxJQUFJLFlBQVc7QUFDZixDQUFBLElBQUksU0FBUTtBQUNaLENBQUEsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7R0FDM0MsSUFBSSxRQUFRLEdBQUcsTUFBSztBQUN0QixHQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07S0FDdkIsUUFBUSxHQUFHLEtBQUk7QUFDbkIsSUFBRyxFQUFDO0dBQ0YsTUFBTSxPQUFPLEdBQUcsR0FBRztBQUNyQixLQUFJLE1BQU07S0FDTjtPQUNFLFFBQVEsRUFBRSxPQUFPO09BQ2pCLFFBQVEsRUFBRSxPQUFPO01BQ2xCO0tBQ0QsQ0FBQyxHQUFHLEtBQUs7T0FDUCxRQUFRLEdBQUcsQ0FBQyxJQUFHO01BQ2hCO0tBQ0Y7QUFDSCxHQUFFLE9BQU87QUFDVCxLQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSztPQUNoQixJQUFJLFFBQVEsRUFBRSxNQUFNO09BQ3BCLFFBQVEsR0FBRyxLQUFJO0FBQ3JCLE9BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUM7TUFDdkU7QUFDTCxLQUFJLE9BQU87SUFDUjtFQUNGO0NBQ0QsU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEdBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsNEJBQTRCLEVBQUM7QUFDN0UsR0FBRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUU7RUFDckI7Q0FDRCxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtBQUNoQyxHQUFFLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZCLEtBQUksT0FBTyxHQUFHO0FBQ2QsSUFBRyxNQUFNLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDeEM7QUFDQSxLQUFJLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUN6QjtBQUNILEdBQUUsTUFBTSxJQUFJLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDO0VBQ3RGO0NBQ0QsZ0JBQWdCLFlBQVksQ0FBQyxHQUFHLEVBQUU7R0FDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUNiLFFBQVEsR0FBR0UsZUFBcUIsR0FBQTtJQUNqQztHQUNELE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUM7RUFDekQ7Q0FDRCxlQUFlLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ3pELEdBQUUsSUFBSSxNQUFLO0dBQ1QsSUFBSSxTQUFTLEdBQUcsS0FBSTtBQUN0QixHQUFFLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLO0tBQ3RCLElBQUksR0FBRyxFQUFFO09BQ1AsS0FBSyxHQUFHLElBQUc7TUFDWjtLQUNELElBQUksU0FBUyxFQUFFO09BQ2IsTUFBTSxRQUFRLEdBQUcsVUFBUztPQUMxQixTQUFTLEdBQUcsS0FBSTtBQUN0QixPQUFNLFFBQVEsR0FBRTtNQUNYO0tBQ0Y7R0FDRCxNQUFNLElBQUksR0FBRztBQUNmLEtBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLO09BQy9CLElBQUksS0FBSyxFQUFFO1NBQ1QsTUFBTSxDQUFDLEtBQUssRUFBQztBQUNyQixRQUFPLE1BQU07U0FDTCxTQUFTLEdBQUcsTUFBTTtXQUNoQixJQUFJLEtBQUssRUFBRTthQUNULE1BQU0sQ0FBQyxLQUFLLEVBQUM7QUFDekIsWUFBVyxNQUFNO0FBQ2pCLGFBQVksT0FBTyxHQUFFO1lBQ1Y7V0FDRjtRQUNGO0FBQ1AsTUFBSyxFQUFDO0FBQ04sR0FBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUM7R0FDNUIsTUFBTSxPQUFPLEdBQUcsR0FBRztBQUNyQixLQUFJLFFBQVE7S0FDUjtPQUNFLFFBQVEsRUFBRSxLQUFLO01BQ2hCO0FBQ0wsS0FBSSxNQUFNO0tBQ1A7QUFDSCxHQUFFLElBQUk7QUFDTixLQUFJLElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFO09BQzlCLE1BQU0sSUFBSSxHQUFFO01BQ2I7QUFDTCxLQUFJLFdBQVcsTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFO09BQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1NBQzFCLE1BQU0sSUFBSSxHQUFFO1FBQ2I7TUFDRjtLQUNELElBQUksR0FBRyxFQUFFO09BQ1AsUUFBUSxDQUFDLEdBQUcsR0FBRTtNQUNmO0tBQ0QsTUFBTSxJQUFJLEdBQUU7QUFDaEIsS0FBSSxNQUFNLEdBQUU7SUFDVCxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQ2hCLEtBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBQztBQUNoRSxJQUFHLFNBQVM7QUFDWixLQUFJLE9BQU8sR0FBRTtBQUNiLEtBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFDO0lBQzlCO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsUUFBUSxDQUFDLEdBQUcsT0FBTyxFQUFFO0FBQzlCLEdBQUUsT0FBTyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztFQUN6RDtBQUNELENBQUEsU0FBUyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7QUFDL0MsR0FBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN4RCxLQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFDO0lBQ3JCO0FBQ0gsR0FBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzFCLEtBQUksTUFBTSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztJQUN0QztBQUNILEdBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLEdBQUU7QUFDbEMsR0FBRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTTtBQUMxQixHQUFFLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU07QUFDbkY7QUFDQTtBQUNBO0dBQ0UsTUFBTSxpQkFBaUIsR0FBRyxHQUFFO0FBQzlCLEdBQUUsbUJBQW1CLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFDO0dBQ2xELFNBQVMsS0FBSyxHQUFHO0FBQ25CLEtBQUksVUFBVSxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUM7SUFDN0I7QUFDSCxHQUFFLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUM7QUFDOUcsR0FBRSxJQUFJLE1BQUs7QUFDWCxHQUFFLElBQUksTUFBSztHQUNULE1BQU0sUUFBUSxHQUFHLEdBQUU7R0FDbkIsSUFBSSxXQUFXLEdBQUcsRUFBQztBQUNyQixHQUFFLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtLQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxLQUFLLENBQUMsRUFBQztJQUNyQztBQUNILEdBQUUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNsQyxLQUFJLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssNEJBQTRCLENBQUMsRUFBRTtPQUNsRSxLQUFLLEdBQUcsSUFBRztNQUNaO0FBQ0wsS0FBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzFCLE9BQU0sTUFBTTtNQUNQO0FBQ0wsS0FBSSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDNUIsT0FBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFDO01BQ3hCO0FBQ0wsS0FBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFDO0tBQy9HLEVBQUUsQ0FBQyxLQUFLLEdBQUU7S0FDVixJQUFJLEtBQUssRUFBRTtPQUNULElBQUksQ0FBQyxLQUFLLEVBQUU7U0FDVixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUM7UUFDeEM7T0FDRCxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO01BQ3pDO0lBQ0Y7QUFDSCxHQUFFLElBQUksSUFBRztBQUNULEdBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsS0FBSSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFDO0tBQ3pCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDMUMsS0FBSSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBQztLQUNyQixNQUFNLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sTUFBSztLQUM3RixNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFDO0FBQ2pELEtBQUksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7T0FDeEIsSUFBSSxHQUFHLEVBQUU7QUFDZixTQUFRLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDO0FBQ3hFLFNBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUM7QUFDOUIsU0FBUSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEVBQUU7QUFDaEQsV0FBVSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO1VBQ2hDO1FBQ0Y7QUFDUDtBQUNBO0FBQ0EsT0FBTSxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDNUIsU0FBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLDRCQUE0QixFQUFFO1dBQ2pGLE1BQU0sQ0FBQyxHQUFHLEVBQUM7VUFDWjtRQUNGO0FBQ1AsT0FBTSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7QUFDakMsT0FBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEVBQUU7QUFDOUMsU0FBUSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUNyQyxXQUFVLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQztBQUNqRCxVQUFTLEVBQUM7UUFDSDtNQUNGO0FBQ0wsS0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDakIsT0FBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTtTQUNoQyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLFdBQVUsTUFBTTtBQUNoQixVQUFTLEVBQUM7QUFDVixTQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7V0FDcEIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLG1DQUFtQyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUM7VUFDdkY7UUFDRixNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1NBQzdELEdBQUcsR0FBRyxPQUFNO0FBQ3BCLFFBQU8sTUFBTTtBQUNiLFNBQVEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDO1FBQzFCO0FBQ1AsTUFBSyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO0FBQzdDLE9BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsRUFBQztBQUNsQyxPQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQ3hCLFNBQVEsTUFBTTtBQUNkLFFBQU8sRUFBQztPQUNGLElBQUksT0FBTyxFQUFFO1NBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDcEMsV0FBVSxNQUFNLElBQUksd0JBQXdCLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1VBQ2hGO0FBQ1QsUUFBTyxNQUFNO0FBQ2IsU0FBUSxJQUFJLEtBQUk7U0FDUixJQUFJLENBQUMsV0FBVyxFQUFFO1dBQ2hCLFdBQVcsR0FBR0Msa0JBQXdCLEdBQUE7VUFDdkM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDO1dBQ3pCLFVBQVUsRUFBRSxJQUFJO0FBQzFCLFVBQVMsRUFBQztBQUNWO0FBQ0E7QUFDQTtBQUNBLFNBQVEsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSTtBQUN4RixTQUFRLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ3hDLFdBQVUsV0FBVyxHQUFFO1dBQ2IsSUFBSSxDQUFDLElBQUk7QUFDbkIsYUFBWSxHQUFHO2FBQ0gsQ0FBQyxHQUFHLEtBQUs7ZUFDUCxLQUFLLEdBQUcsSUFBRztBQUN6QixlQUFjLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUMvQixpQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUM7Z0JBQ2Q7ZUFDRCxJQUFJLEdBQUcsRUFBRTtpQkFDUCxFQUFFLENBQUMsR0FBRyxHQUFFO2dCQUNUO0FBQ2YsZUFBYyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQztjQUN6QjthQUNELENBQUMsR0FBRyxLQUFLO0FBQ3JCLGVBQWMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7QUFDN0IsZUFBYyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUM7Y0FDOUI7YUFDRjtVQUNGLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQzFDLFdBQVUsV0FBVyxHQUFFO0FBQ3ZCLFdBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQ2hDLGFBQVksR0FBRztBQUNmLFlBQVcsRUFBQztBQUNaLFVBQVMsTUFBTTtXQUNMLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQywwQkFBMEIsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDO1VBQ25GO1NBQ0QsR0FBRyxHQUFHLEdBQUU7QUFDaEIsU0FBUSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztBQUNoRSxTQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO1NBQ3RCLElBQUksWUFBWSxFQUFFO0FBQzFCLFdBQVUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBQztVQUNoQztRQUNGO0FBQ1AsTUFBSyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3JDLE9BQU0sSUFBSSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtTQUM3QixXQUFXLElBQUksRUFBQztTQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDbEQsV0FBVSxHQUFHO0FBQ2IsVUFBUyxFQUFDO0FBQ1YsU0FBUSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEVBQUU7QUFDaEQsV0FBVSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO1VBQ2hDO0FBQ1QsUUFBTyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2xDLFNBQVEsV0FBVyxHQUFFO0FBQ3JCLFNBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ2xDLFdBQVUsR0FBRztBQUNiLFVBQVMsRUFBQztBQUNWLFFBQU8sTUFBTTtBQUNiLFNBQVEsTUFBTSxJQUFJLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQ3RGO09BQ0QsR0FBRyxHQUFHLE9BQU07QUFDbEIsTUFBSyxNQUFNO0FBQ1gsT0FBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7TUFDMUI7SUFDRjtHQUNEO0tBQ0UsQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU87TUFDekQsV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUM7S0FDMUU7QUFDSixLQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFDO0lBQ3hCO0FBQ0gsR0FBRSxPQUFPLEdBQUc7RUFDWDtDQUNELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7R0FDdkMsSUFBSSxLQUFLLEdBQUcsTUFBSztBQUNuQixHQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07S0FDcEIsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNoQjtBQUNBLE9BQU0sTUFBTSxDQUFDLElBQUksMEJBQTBCLEVBQUUsRUFBQztNQUN6QztBQUNMLElBQUcsRUFBQztBQUNKLEdBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDaEIsS0FBSSxHQUFHO0FBQ1AsSUFBRyxFQUFDO0dBQ0YsSUFBSSxHQUFHLEVBQUU7QUFDWDtBQUNBO0FBQ0E7QUFDQSxLQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU07T0FDcEIsS0FBSyxHQUFHLEtBQUk7T0FDWixHQUFHLENBQUMsR0FBRyxHQUFFO0FBQ2YsTUFBSyxFQUFDO0FBQ04sSUFBRyxNQUFNO0FBQ1QsS0FBSSxNQUFNLEdBQUU7SUFDVDtBQUNILEdBQUUsR0FBRztBQUNMLEtBQUksR0FBRztLQUNIO09BQ0UsUUFBUSxFQUFFLElBQUk7T0FDZCxRQUFRLEVBQUUsS0FBSztNQUNoQjtLQUNELENBQUMsR0FBRyxLQUFLO0FBQ2IsT0FBTSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsZUFBYztPQUNqQztBQUNOLFNBQVEsR0FBRztBQUNYLFNBQVEsR0FBRyxDQUFDLElBQUksS0FBSyw0QkFBNEI7QUFDakQsU0FBUSxNQUFNO1NBQ04sTUFBTSxDQUFDLEtBQUs7U0FDWixDQUFDLE1BQU0sQ0FBQyxPQUFPO1NBQ2YsQ0FBQyxNQUFNLENBQUMsWUFBWTtTQUNwQjtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFDO0FBQ3JELFFBQU8sTUFBTTtTQUNMLE1BQU0sQ0FBQyxHQUFHLEVBQUM7UUFDWjtNQUNGO0tBQ0Y7QUFDSCxHQUFFLE9BQU8sR0FBRztBQUNaLEtBQUksR0FBRztLQUNIO09BQ0UsUUFBUSxFQUFFLEtBQUs7T0FDZixRQUFRLEVBQUUsSUFBSTtNQUNmO0FBQ0wsS0FBSSxNQUFNO0lBQ1A7RUFDRjtBQUNELENBQUEsVUFBYyxHQUFHO0FBQ2pCLEdBQUUsWUFBWTtBQUNkLEdBQUUsUUFBUTtBQUNWLEdBQUE7Ozs7Ozs7Ozs7QUN4WEE7QUFDQSxDQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBR2YsZUFBcUIsR0FBQTtDQUMxQyxNQUFNLE1BQU0sR0FBR0MsYUFBbUIsR0FBQTtBQUNsQyxDQUFBLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBR0MsY0FBb0IsR0FBQTtDQUMxQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBR0csWUFBa0IsR0FBQTtDQUNuRSxNQUFNO0FBQ04sR0FBRSxVQUFVO0FBQ1osR0FBRSxLQUFLLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRTtBQUNwRCxFQUFDLEdBQUdDLGFBQTRCLEdBQUE7QUFDaEMsQ0FBQSxPQUFjLEdBQUcsU0FBUyxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUU7QUFDOUMsR0FBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQzVCLEtBQUksTUFBTSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztJQUN0QztBQUNILEdBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtLQUN4QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CO0FBQ0gsR0FBRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFDO0dBQy9CLElBQUksT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3hDLEtBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDO0lBQ3JDO0FBQ0gsR0FBRSxJQUFJLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3pELEtBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFDO0FBQ2xDLEtBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFDO0lBQ3pDO0FBQ0gsR0FBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtLQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ25DO0FBQ0EsT0FBTSxRQUFRO01BQ1Q7QUFDTCxLQUFJLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNELE9BQU0sTUFBTSxJQUFJLHFCQUFxQixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7TUFDcEY7QUFDTCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxQyxPQUFNLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDO01BQ3BGO0lBQ0Y7QUFDSCxHQUFFLElBQUksUUFBTztBQUNiLEdBQUUsSUFBSSxTQUFRO0FBQ2QsR0FBRSxJQUFJLFdBQVU7QUFDaEIsR0FBRSxJQUFJLFFBQU87QUFDYixHQUFFLElBQUksRUFBQztBQUNQLEdBQUUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFO0tBQ3ZCLE1BQU0sRUFBRSxHQUFHLFFBQU87S0FDbEIsT0FBTyxHQUFHLEtBQUk7S0FDZCxJQUFJLEVBQUUsRUFBRTtPQUNOLEVBQUUsQ0FBQyxHQUFHLEVBQUM7TUFDUixNQUFNLElBQUksR0FBRyxFQUFFO0FBQ3BCLE9BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7QUFDcEIsTUFBSyxNQUFNLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7T0FDakMsQ0FBQyxDQUFDLE9BQU8sR0FBRTtNQUNaO0lBQ0Y7QUFDSCxHQUFFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUM7R0FDdkIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUM7R0FDMUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUM7R0FDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQztBQUNqQjtBQUNBLEtBQUksa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFDMUYsS0FBSSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztBQUMxRixLQUFJLFFBQVE7QUFDWixLQUFJLFFBQVE7QUFDWixJQUFHLEVBQUM7R0FDRixJQUFJLFFBQVEsRUFBRTtLQUNaLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtPQUM5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0FBQ3ZDLFNBQVEsUUFBUSxHQUFFO0FBQ2xCLFFBQU8sTUFBTTtTQUNMLE9BQU8sR0FBRyxTQUFRO1FBQ25CO09BQ0Y7QUFDTCxLQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxRQUFRLEVBQUU7T0FDN0IsSUFBSSxDQUFDLEdBQUcsR0FBRTtPQUNWLFFBQVEsR0FBRyxTQUFRO09BQ3BCO0FBQ0wsS0FBSSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZO09BQzNCLElBQUksT0FBTyxFQUFFO1NBQ1gsTUFBTSxFQUFFLEdBQUcsUUFBTztTQUNsQixPQUFPLEdBQUcsS0FBSTtBQUN0QixTQUFRLEVBQUUsR0FBRTtRQUNMO0FBQ1AsTUFBSyxFQUFDO0FBQ04sS0FBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxZQUFZO09BQzVCLElBQUksUUFBUSxFQUFFO1NBQ1osTUFBTSxFQUFFLEdBQUcsU0FBUTtTQUNuQixRQUFRLEdBQUcsS0FBSTtBQUN2QixTQUFRLEVBQUUsR0FBRTtRQUNMO0FBQ1AsTUFBSyxFQUFDO0lBQ0g7R0FDRCxJQUFJLFFBQVEsRUFBRTtBQUNoQixLQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVk7T0FDOUIsSUFBSSxVQUFVLEVBQUU7U0FDZCxNQUFNLEVBQUUsR0FBRyxXQUFVO1NBQ3JCLFVBQVUsR0FBRyxLQUFJO0FBQ3pCLFNBQVEsRUFBRSxHQUFFO1FBQ0w7QUFDUCxNQUFLLEVBQUM7QUFDTixLQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVk7QUFDL0IsT0FBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQztBQUNsQixNQUFLLEVBQUM7QUFDTixLQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWTtPQUNwQixPQUFPLElBQUksRUFBRTtBQUNuQixTQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUU7QUFDL0IsU0FBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7QUFDMUIsV0FBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQUs7QUFDOUIsV0FBVSxNQUFNO1VBQ1A7U0FDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMxQixXQUFVLE1BQU07VUFDUDtRQUNGO09BQ0Y7SUFDRjtHQUNELENBQUMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsUUFBUSxFQUFFO0FBQ3hDLEtBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO0FBQ2xDLE9BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxHQUFFO01BQ3ZCO0tBQ0QsVUFBVSxHQUFHLEtBQUk7S0FDakIsT0FBTyxHQUFHLEtBQUk7S0FDZCxRQUFRLEdBQUcsS0FBSTtBQUNuQixLQUFJLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtPQUNwQixRQUFRLENBQUMsR0FBRyxFQUFDO0FBQ25CLE1BQUssTUFBTTtPQUNMLE9BQU8sR0FBRyxTQUFRO0FBQ3hCLE9BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUM7TUFDckI7S0FDRjtBQUNILEdBQUUsT0FBTyxDQUFDO0FBQ1YsR0FBQTs7Ozs7Ozs7OztBQ3JJQTtBQUNBLENBQUEsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxHQUFHTixrQkFBOEIsR0FBQTtBQUNyRSxDQUFBLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUdDLFlBQW9DLEdBQUE7QUFDekUsQ0FBQSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxHQUFHQyxlQUF1QyxHQUFBO0FBQ3BFLENBQUEsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHRyxrQkFBNEMsR0FBQTtBQUNqRSxDQUFBLFNBQVMsUUFBUSxDQUFDLEdBQUcsT0FBTyxFQUFFO0dBQzVCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLO0FBQzFDLEtBQUksSUFBSSxPQUFNO0FBQ2QsS0FBSSxJQUFJLElBQUc7S0FDUCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7QUFDL0MsS0FBSSxJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDbEcsT0FBTSxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUM7QUFDaEQsT0FBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU07QUFDN0IsT0FBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUc7TUFDbEI7QUFDTCxLQUFJLEVBQUU7QUFDTixPQUFNLE9BQU87QUFDYixPQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssS0FBSztTQUNkLElBQUksR0FBRyxFQUFFO1dBQ1AsTUFBTSxDQUFDLEdBQUcsRUFBQztBQUNyQixVQUFTLE1BQU07V0FDTCxPQUFPLENBQUMsS0FBSyxFQUFDO1VBQ2Y7UUFDRjtPQUNEO0FBQ04sU0FBUSxNQUFNO0FBQ2QsU0FBUSxHQUFHO1FBQ0o7T0FDRjtBQUNMLElBQUcsQ0FBQztFQUNIO0FBQ0QsQ0FBQSxRQUFjLEdBQUc7QUFDakIsR0FBRSxRQUFRO0FBQ1YsR0FBRSxRQUFRO0FBQ1YsR0FBQTs7Ozs7Ozs7Ozs7QUNqQ0EsQ0FBQSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUVBLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUdKLGtCQUE2QixHQUFBO0NBQ3hGLE1BQU07QUFDTixHQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUU7QUFDeEMsRUFBQyxHQUFHQyxXQUFzQixHQUFBO0FBQzFCLENBQUEsTUFBTSxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLEdBQUdHLGdCQUF1QyxHQUFBO0NBQ3ZHLE1BQU07QUFDTixHQUFFLEtBQUssRUFBRSxFQUFFLHVCQUF1QixFQUFFO0FBQ3BDLEVBQUMsR0FBR0MsYUFBd0IsR0FBQTtDQUM1QixNQUFNLE9BQU8sR0FBR0MsY0FBcUMsR0FBQTtBQUNyRCxDQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBR0csZUFBc0MsR0FBQTtBQUMzRCxDQUFBLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBR0MsY0FBcUMsR0FBQTtDQUMzRCxNQUFNLEdBQUcsR0FBR0Msa0JBQTJDLEdBQUE7Q0FFdkQsTUFBTSxRQUFRLEdBQUdDLGVBQTRCLEdBQUE7Q0FDN0MsTUFBTSxLQUFLLEdBQUdDLFlBQW1DLEdBQUE7QUFDakQsQ0FBQSxNQUFNLE1BQU0sSUFBSUssTUFBQSxDQUFBLE9BQWMsR0FBR0osYUFBb0MsRUFBQSxDQUFDLE1BQU0sRUFBQztBQUM3RSxDQUFBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVc7QUFDdEMsQ0FBQSxNQUFNLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFTO0FBQ2xDLENBQUEsTUFBTSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsV0FBVTtDQUNwQyxNQUFNLENBQUMsUUFBUSxHQUFHQyxlQUFzQyxHQUFBO0FBQ3hELENBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsd0JBQXdCLENBQUMsRUFBRTtBQUN4RCxHQUFFLE1BQU0sRUFBRSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsRUFBQztBQUMxQyxHQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFO0FBQ3ZCLEtBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO09BQ2QsTUFBTSx1QkFBdUIsRUFBRTtNQUNoQztBQUNMLEtBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRDtBQUNILEdBQUUsb0JBQW9CLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRTtLQUMvQixTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSTtBQUNsQixJQUFHLEVBQUM7QUFDSixHQUFFLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUU7S0FDakMsU0FBUyxFQUFFLElBQUk7QUFDbkIsS0FBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU07QUFDcEIsSUFBRyxFQUFDO0dBQ0Ysb0JBQW9CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0tBQ25ELFNBQVMsRUFBRSxJQUFJO0tBQ2YsS0FBSyxFQUFFLEVBQUU7S0FDVCxVQUFVLEVBQUUsS0FBSztLQUNqQixZQUFZLEVBQUUsSUFBSTtLQUNsQixRQUFRLEVBQUUsSUFBSTtBQUNsQixJQUFHLEVBQUM7RUFDSDtBQUNELENBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsRUFBRTtBQUN6RCxHQUFFLE1BQU0sRUFBRSxHQUFHLHlCQUF5QixDQUFDLEdBQUcsRUFBQztBQUMzQyxHQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFO0FBQ3ZCLEtBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO09BQ2QsTUFBTSx1QkFBdUIsRUFBRTtNQUNoQztLQUNELE9BQU8sWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ3BDO0FBQ0gsR0FBRSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0tBQy9CLFNBQVMsRUFBRSxJQUFJO0FBQ25CLEtBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJO0FBQ2xCLElBQUcsRUFBQztBQUNKLEdBQUUsb0JBQW9CLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRTtLQUNqQyxTQUFTLEVBQUUsSUFBSTtBQUNuQixLQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTTtBQUNwQixJQUFHLEVBQUM7R0FDRixvQkFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7S0FDbkQsU0FBUyxFQUFFLElBQUk7S0FDZixLQUFLLEVBQUUsRUFBRTtLQUNULFVBQVUsRUFBRSxLQUFLO0tBQ2pCLFlBQVksRUFBRSxJQUFJO0tBQ2xCLFFBQVEsRUFBRSxJQUFJO0FBQ2xCLElBQUcsRUFBQztFQUNIO0NBQ0QsTUFBTSxDQUFDLFFBQVEsR0FBR0ksZUFBc0MsR0FBQTtDQUN4RCxNQUFNLENBQUMsTUFBTSxHQUFHSCxhQUFvQyxHQUFBO0NBQ3BELE1BQU0sQ0FBQyxTQUFTLEdBQUdDLGdCQUF1QyxHQUFBO0NBQzFELE1BQU0sQ0FBQyxXQUFXLEdBQUdHLGtCQUF5QyxHQUFBO0NBQzlELE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUTtBQUMxQixDQUFBLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBR0MscUJBQThDLEdBQUE7Q0FDekUsTUFBTSxDQUFDLGNBQWMsR0FBRyxlQUFjO0NBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBRztDQUNyQixNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVM7Q0FDMUIsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFPO0FBQ3hCLENBQUEsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRTtHQUN2QyxTQUFTLEVBQUUsSUFBSTtHQUNmLFlBQVksRUFBRSxJQUFJO0dBQ2xCLFVBQVUsRUFBRSxJQUFJO0FBQ2xCLEdBQUUsR0FBRyxHQUFHO0FBQ1IsS0FBSSxPQUFPLFFBQVE7SUFDaEI7QUFDSCxFQUFDLEVBQUM7QUFDRixDQUFBLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUU7R0FDOUMsU0FBUyxFQUFFLElBQUk7R0FDZixVQUFVLEVBQUUsSUFBSTtBQUNsQixHQUFFLEdBQUcsR0FBRztLQUNKLE9BQU8sUUFBUSxDQUFDLFFBQVE7SUFDekI7QUFDSCxFQUFDLEVBQUM7QUFDRixDQUFBLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUU7R0FDekMsU0FBUyxFQUFFLElBQUk7R0FDZixVQUFVLEVBQUUsSUFBSTtBQUNsQixHQUFFLEdBQUcsR0FBRztLQUNKLE9BQU8sUUFBUSxDQUFDLFFBQVE7SUFDekI7QUFDSCxFQUFDLEVBQUM7QUFDRjtBQUNBO0NBQ0EsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFNO0FBQ3RCLENBQUEsTUFBTSxDQUFDLGFBQWEsR0FBRyxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUU7R0FDbEQsT0FBTyxLQUFLLFlBQVksVUFBVTtHQUNuQztBQUNELENBQUEsTUFBTSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsbUJBQW1CLENBQUMsS0FBSyxFQUFFO0FBQ2pFLEdBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQ3RFLEdBQUE7Ozs7O0FDdElBO0NBQ0EsTUFBTSxNQUFNLEdBQUd0QixhQUFpQjtDQUNoQyxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7QUFDekQsR0FBRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUTtBQUNsQztBQUNBO0dBQ0UsTUFBQSxDQUFBLE9BQUEsQ0FBQSxtQkFBQSxHQUFxQyxNQUFNLENBQUMsb0JBQW1CO0dBQy9ELE1BQUEsQ0FBQSxPQUFBLENBQUEsYUFBQSxHQUErQixNQUFNLENBQUMsY0FBYTtHQUNuRCxNQUFBLENBQUEsT0FBQSxDQUFBLFdBQUEsR0FBNkIsTUFBTSxDQUFDLFlBQVc7R0FDL0MsTUFBQSxDQUFBLE9BQUEsQ0FBQSxTQUFBLEdBQTJCLE1BQU0sQ0FBQyxVQUFTO0dBQzNDLE1BQUEsQ0FBQSxPQUFBLENBQUEsVUFBQSxHQUE0QixNQUFNLENBQUMsV0FBVTtHQUM3QyxNQUFBLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBMEIsTUFBTSxDQUFDLFNBQVE7R0FDekMsTUFBQSxDQUFBLE9BQUEsQ0FBQSxRQUFBLEdBQTBCLE1BQU0sQ0FBQyxTQUFRO0dBQ3pDLE1BQUEsQ0FBQSxPQUFBLENBQUEsTUFBQSxHQUF3QixNQUFNLENBQUMsT0FBTTtHQUNyQyxNQUFBLENBQUEsT0FBQSxDQUFBLFNBQUEsR0FBMkIsTUFBTSxDQUFDLFVBQVM7R0FDM0MsTUFBQSxDQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQTZCLE1BQU0sQ0FBQyxZQUFXO0dBQy9DLE1BQUEsQ0FBQSxPQUFBLENBQUEsY0FBQSxHQUFnQyxNQUFNLENBQUMsZUFBYztHQUNyRCxNQUFBLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBMEIsTUFBTSxDQUFDLFNBQVE7R0FDekMsTUFBQSxDQUFBLE9BQUEsQ0FBQSxPQUFBLEdBQXlCLE1BQU0sQ0FBQyxRQUFPO0dBQ3ZDLE1BQUEsQ0FBQSxPQUFBLENBQUEsUUFBQSxHQUEwQixNQUFNLENBQUMsU0FBUTtHQUN6QyxNQUFBLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBeUIsTUFBTSxDQUFDLFFBQU87QUFDekMsR0FBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7S0FDeEMsWUFBWSxFQUFFLElBQUk7S0FDbEIsVUFBVSxFQUFFLElBQUk7QUFDcEIsS0FBSSxHQUFHLEdBQUc7QUFDVixPQUFNLE9BQU8sUUFBUTtNQUNoQjtBQUNMLElBQUcsRUFBQztHQUNGLE1BQUEsQ0FBQSxPQUFBLENBQUEsTUFBQSxHQUF3QixNQUFNLENBQUMsT0FBTTtBQUN2QyxFQUFDLE1BQU07R0FDTCxNQUFNLFlBQVksR0FBR0MsYUFBb0IsR0FBQTtHQUN6QyxNQUFNLFFBQVEsR0FBR0MsZUFBNkIsR0FBQTtBQUNoRCxHQUFFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBTztHQUNyRCxNQUFBLENBQUEsT0FBQSxHQUFpQixZQUFZLENBQUMsU0FBUTtBQUN4QztBQUNBO0dBQ0UsTUFBQSxDQUFBLE9BQUEsQ0FBQSxtQkFBQSxHQUFxQyxZQUFZLENBQUMsb0JBQW1CO0dBQ3JFLE1BQUEsQ0FBQSxPQUFBLENBQUEsYUFBQSxHQUErQixZQUFZLENBQUMsY0FBYTtHQUN6RCxNQUFBLENBQUEsT0FBQSxDQUFBLFdBQUEsR0FBNkIsWUFBWSxDQUFDLFlBQVc7R0FDckQsTUFBQSxDQUFBLE9BQUEsQ0FBQSxTQUFBLEdBQTJCLFlBQVksQ0FBQyxVQUFTO0dBQ2pELE1BQUEsQ0FBQSxPQUFBLENBQUEsVUFBQSxHQUE0QixZQUFZLENBQUMsV0FBVTtHQUNuRCxNQUFBLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBMEIsWUFBWSxDQUFDLFNBQVE7R0FDL0MsTUFBQSxDQUFBLE9BQUEsQ0FBQSxRQUFBLEdBQTBCLFlBQVksQ0FBQyxTQUFRO0dBQy9DLE1BQUEsQ0FBQSxPQUFBLENBQUEsTUFBQSxHQUF3QixZQUFZLENBQUMsT0FBTTtHQUMzQyxNQUFBLENBQUEsT0FBQSxDQUFBLFNBQUEsR0FBMkIsWUFBWSxDQUFDLFVBQVM7R0FDakQsTUFBQSxDQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQTZCLFlBQVksQ0FBQyxZQUFXO0dBQ3JELE1BQUEsQ0FBQSxPQUFBLENBQUEsY0FBQSxHQUFnQyxZQUFZLENBQUMsZUFBYztHQUMzRCxNQUFBLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBMEIsWUFBWSxDQUFDLFNBQVE7R0FDL0MsTUFBQSxDQUFBLE9BQUEsQ0FBQSxPQUFBLEdBQXlCLFlBQVksQ0FBQyxRQUFPO0FBQy9DLEdBQUUseUJBQXlCLGdCQUFlO0dBQ3hDLE1BQUEsQ0FBQSxPQUFBLENBQUEsUUFBQSxHQUEwQixZQUFZLENBQUMsU0FBUTtHQUMvQyxNQUFBLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBeUIsWUFBWSxDQUFDLFFBQU87QUFDL0MsR0FBRSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUU7S0FDOUMsWUFBWSxFQUFFLElBQUk7S0FDbEIsVUFBVSxFQUFFLElBQUk7QUFDcEIsS0FBSSxHQUFHLEdBQUc7QUFDVixPQUFNLE9BQU8sUUFBUTtNQUNoQjtBQUNMLElBQUcsRUFBQztHQUNGLE1BQUEsQ0FBQSxPQUFBLENBQUEsTUFBQSxHQUF3QixZQUFZLENBQUMsT0FBTTtFQUM1QztBQUNEO0FBQ0E7QUFDQSxDQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsT0FBQSxHQUF5QixNQUFNLENBQUMsUUFBQTs7Ozs7Ozs7Ozs7O0FDaEVoQyxDQUFBLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtBQUN6QztHQUNFcUIsZ0JBQUEsQ0FBQSxPQUFjLEdBQUcsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtLQUNsRCxJQUFJLFNBQVMsRUFBRTtBQUNuQixPQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBUztPQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtBQUMxRCxTQUFRLFdBQVcsRUFBRTtXQUNYLEtBQUssRUFBRSxJQUFJO1dBQ1gsVUFBVSxFQUFFLEtBQUs7V0FDakIsUUFBUSxFQUFFLElBQUk7V0FDZCxZQUFZLEVBQUUsSUFBSTtVQUNuQjtBQUNULFFBQU8sRUFBQztNQUNIO0FBQ0wsSUFBRyxDQUFDO0FBQ0osRUFBQyxNQUFNO0FBQ1A7R0FDRUEsZ0JBQUEsQ0FBQSxPQUFjLEdBQUcsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtLQUNsRCxJQUFJLFNBQVMsRUFBRTtBQUNuQixPQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUM3QixPQUFNLElBQUksUUFBUSxHQUFHLFlBQVksR0FBRTtBQUNuQyxPQUFNLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVM7QUFDOUMsT0FBTSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksUUFBUSxHQUFFO0FBQ3JDLE9BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsS0FBSTtNQUNsQztLQUNGO0FBQ0gsRUFBQTs7Ozs7Q0MxQkEsSUFBSTtBQUNKLEdBQUUsSUFBSSxJQUFJLEdBQUcsT0FBUSxDQUFBLE1BQU0sQ0FBQyxDQUFDO0FBQzdCO0dBQ0UsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3BELEdBQUUsTUFBaUIsQ0FBQSxPQUFBLEdBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUNoQyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ1o7R0FDRSxNQUFBLENBQUEsT0FBQSxHQUFpQnRCLHlCQUFnQyxDQUFDO0FBQ3BELEVBQUE7OztBQ05BLE1BQU0sVUFBRXVCLFFBQU0sRUFBRSxHQUFHLFdBQWlCO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFDO0FBQ3ZDO0FBQ0EsU0FBU0MsWUFBVSxFQUFFLEdBQUcsRUFBRTtBQUMxQixFQUFFLElBQUksRUFBRSxJQUFJLFlBQVlBLFlBQVUsQ0FBQyxFQUFFO0FBQ3JDLElBQUksT0FBTyxJQUFJQSxZQUFVLENBQUMsR0FBRyxDQUFDO0FBQzlCLEdBQUc7QUFDSDtBQUNBLEVBQUVBLFlBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUM7QUFDbEMsQ0FBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFDO0FBQ3REO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUU7QUFDakIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDakI7QUFDQSxFQUFFLElBQUksR0FBRyxFQUFFO0FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBQztBQUNwQixHQUFHO0FBQ0gsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNoRCxFQUFFLE9BQU8sSUFBSUEsWUFBVSxDQUFDLEdBQUcsQ0FBQztBQUM1QixFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQ3pELEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3BCLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFDO0FBQ2I7QUFDQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxJQUFJLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU07QUFDekMsSUFBSSxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNwRCxNQUFNLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxHQUFHLEdBQUcsR0FBRTtBQUNaLEdBQUc7QUFDSCxFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxRQUFRLEVBQUU7QUFDMUQsRUFBRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFDO0FBQzlCLEVBQUUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBQztBQUMxQjtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU07QUFDbEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLE1BQU07QUFDZixFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ2hELEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQ3hDLElBQUksT0FBTyxTQUFTO0FBQ3BCLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUM7QUFDcEM7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDekQsRUFBRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQzlDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFNO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUMxQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTTtBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdkMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtBQUM1RSxFQUFFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7QUFDcEQsSUFBSSxRQUFRLEdBQUcsRUFBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzFELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFNO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJRCxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtBQUNuQixJQUFJLE9BQU8sR0FBRyxJQUFJQSxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFHO0FBQ3BCLEVBQUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUM7QUFDcEMsRUFBRSxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsU0FBUTtBQUMvQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUc7QUFDakIsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssRUFBQztBQUN0QyxFQUFFLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUM7QUFDcEI7QUFDQTtBQUNBLEVBQUUsSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2hELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNmO0FBQ0EsTUFBTSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7QUFDcEMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixVQUFVQSxRQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNoRCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBQztBQUNyQyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU07QUFDcEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFO0FBQ2xELElBQUksT0FBTyxJQUFJO0FBQ2YsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3BFLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEQsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2I7QUFDQSxJQUFJLEdBQUcsR0FBR0EsUUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUM7QUFDakMsR0FBRztBQUNIO0FBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFLO0FBQzFDO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDbkIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQztBQUM1QyxNQUFNLE1BQU0sSUFBSSxFQUFDO0FBQ2pCLEtBQUssTUFBTTtBQUNYLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBQztBQUMzRCxNQUFNLE1BQU0sSUFBSSxFQUFDO0FBQ2pCLE1BQU0sS0FBSztBQUNYLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxJQUFJLEVBQUM7QUFDZDtBQUNBLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDZixNQUFNLEtBQUssR0FBRyxFQUFDO0FBQ2YsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQ3REO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixFQUFDO0FBQ0Q7QUFDQUMsWUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUN2RSxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksRUFBQztBQUNwQixFQUFFLEdBQUcsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFHO0FBQ25EO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDakIsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU07QUFDeEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTTtBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRTtBQUNyQixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRTtBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFDO0FBQ3pDLEVBQUUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7QUFDckMsRUFBRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBQztBQUNwRTtBQUNBLEVBQUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzFCLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRTtBQUNqQixHQUFHLE1BQU07QUFDVCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3BGLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzVCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ2pELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMzQixFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDekUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFDbEQsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxFQUFFLEtBQUssRUFBRTtBQUN4RDtBQUNBLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDO0FBQzNCO0FBQ0EsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUk7QUFDcEQ7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDNUIsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN2QyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU07QUFDbkMsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTTtBQUN6QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFFO0FBQ3hCLEtBQUssTUFBTTtBQUNYLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUM7QUFDaEQsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQUs7QUFDMUIsTUFBTSxLQUFLO0FBQ1gsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxJQUFJO0FBQ2IsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsU0FBUyxJQUFJO0FBQ3ZELEVBQUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRTtBQUMxQjtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQzlCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxJQUFJO0FBQ2IsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUNwRCxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUNuQixJQUFJLE9BQU8sSUFBSTtBQUNmLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO0FBQ2xCO0FBQ0EsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDRCxRQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUM7QUFDL0UsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNqQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUM7QUFDekIsS0FBSztBQUNMLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEM7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMvQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQztBQUMvQixLQUFLO0FBQ0wsR0FBRyxNQUFNO0FBQ1Q7QUFDQTtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRTtBQUMxQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUNBLFFBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUM7QUFDeEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLElBQUk7QUFDYixFQUFDO0FBQ0Q7QUFDQUMsWUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxZQUFZLEVBQUUsR0FBRyxFQUFFO0FBQ2pFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTTtBQUMzQixFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUNuRSxFQUFFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7QUFDNUQsSUFBSSxRQUFRLEdBQUcsT0FBTTtBQUNyQixJQUFJLE1BQU0sR0FBRyxVQUFTO0FBQ3RCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM3RCxJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMscUZBQXFGLENBQUM7QUFDOUcsR0FBRyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQ3pDLElBQUksTUFBTSxHQUFHRCxRQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUM7QUFDbEMsR0FBRyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQ3pDLElBQUksTUFBTSxHQUFHQSxRQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUM7QUFDMUMsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUN6QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFFO0FBQzNCLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzNDLElBQUksTUFBTSxHQUFHQSxRQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFDO0FBQzdFLEdBQUcsTUFBTSxJQUFJLENBQUNBLFFBQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkMsSUFBSSxNQUFNLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFDO0FBQzlCO0FBQ0EsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNyQixJQUFJLE1BQU0sR0FBRyxFQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFNO0FBQ2pDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ2xCLElBQUksTUFBTSxHQUFHLEVBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDM0IsSUFBSSxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTTtBQUN0RCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFDO0FBQ3ZDLEVBQUUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBQztBQUMzQixFQUFFLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUM7QUFDOUI7QUFDQTtBQUNBLEVBQUUsT0FBTyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUU7QUFDakQsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBQztBQUNwQztBQUNBLElBQUksT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNyQyxNQUFNLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVTtBQUN0RDtBQUNBLE1BQU0sSUFBSSxlQUFlLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUM1QyxRQUFRLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFDO0FBQ25FO0FBQ0EsUUFBUSxJQUFJLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3ZDLFVBQVUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDbkUsU0FBUztBQUNUO0FBQ0EsUUFBUSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDcEQsT0FBTyxNQUFNO0FBQ2IsUUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFDO0FBQ3BFO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFO0FBQzVDLFVBQVUsT0FBTyxTQUFTO0FBQzFCLFNBQVM7QUFDVDtBQUNBLFFBQVEsVUFBVSxHQUFFO0FBQ3BCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFVBQVUsR0FBRyxFQUFDO0FBQ2xCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxFQUFDO0FBQ0Q7QUFDQUMsWUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3hELEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzVDLElBQUksT0FBTyxLQUFLO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsS0FBSyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUU7QUFDM0UsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtBQUNsRSxNQUFNLE9BQU8sS0FBSztBQUNsQixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsT0FBTyxJQUFJO0FBQ2IsQ0FBQztBQUNEO0FBQ0EsQ0FBQyxDQUFDLFlBQVk7QUFDZCxFQUFFLE1BQU0sT0FBTyxHQUFHO0FBQ2xCLElBQUksWUFBWSxFQUFFLENBQUM7QUFDbkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztBQUNuQixJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ2xCLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEIsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUNyQixJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQ3JCLElBQUksZUFBZSxFQUFFLENBQUM7QUFDdEIsSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUN0QixJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ2xCLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztBQUNuQixJQUFJLFlBQVksRUFBRSxDQUFDO0FBQ25CLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEIsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNsQixJQUFJLFlBQVksRUFBRSxDQUFDO0FBQ25CLElBQUksWUFBWSxFQUFFLENBQUM7QUFDbkIsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLElBQUksU0FBUyxFQUFFLENBQUM7QUFDaEIsSUFBSSxTQUFTLEVBQUUsSUFBSTtBQUNuQixJQUFJLFNBQVMsRUFBRSxJQUFJO0FBQ25CLElBQUksVUFBVSxFQUFFLElBQUk7QUFDcEIsSUFBSSxVQUFVLEVBQUUsSUFBSTtBQUNwQixJQUFHO0FBQ0g7QUFDQSxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFO0FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUNsQixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUMvQixRQUFRQSxZQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsTUFBTSxFQUFFLFVBQVUsRUFBRTtBQUNoRSxVQUFVLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUM7QUFDMUUsVUFBUztBQUNULE9BQU8sTUFBTTtBQUNiLFFBQVFBLFlBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3hELFVBQVUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELFVBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ1QsR0FBRztBQUNILENBQUMsRUFBRSxFQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBQSxZQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUU7QUFDaEUsRUFBRSxPQUFPLENBQUMsWUFBWUEsWUFBVSxJQUFJQSxZQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUM5RCxFQUFDO0FBQ0Q7QUFDQUEsWUFBVSxDQUFDLFlBQVksR0FBRyxTQUFTLFlBQVksRUFBRSxDQUFDLEVBQUU7QUFDcEQsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMvQixFQUFDO0FBQ0Q7QUFDQSxJQUFBLFlBQWMsR0FBR0E7O0FDN1lqQixNQUFNLFlBQVksR0FBR3pCLFlBQTBCLENBQUMsT0FBTTtBQUN0RCxNQUFNLFFBQVEsR0FBR0MsbUJBQW1CO0FBQ3BDLE1BQU0sVUFBVSxHQUFHQyxhQUF1QjtBQUMxQztBQUNBLFNBQVMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLElBQUksWUFBWSxnQkFBZ0IsQ0FBQyxFQUFFO0FBQzNDLElBQUksT0FBTyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztBQUN6QyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFO0FBQ3RDLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFRO0FBQzdCO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxTQUFTLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDdkMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDMUIsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBQztBQUMzQixRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSTtBQUM3QixPQUFPO0FBQ1AsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7QUFDaEI7QUFDQSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUMxQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztBQUM1QixLQUFLLEVBQUM7QUFDTixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsUUFBUSxFQUFFLEdBQUcsRUFBRTtBQUM5QyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztBQUN4QyxLQUFLLEVBQUM7QUFDTjtBQUNBLElBQUksUUFBUSxHQUFHLEtBQUk7QUFDbkIsR0FBRztBQUNIO0FBQ0EsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFDO0FBQ3ZDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUM7QUFDekIsQ0FBQztBQUNEO0FBQ0EsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBQztBQUN4QyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFDO0FBQy9EO0FBQ0EsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDM0QsRUFBRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLEVBQUM7QUFDRDtBQUNBLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDOUUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBQztBQUN6QjtBQUNBLEVBQUUsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7QUFDdEMsSUFBSSxRQUFRLEdBQUU7QUFDZCxHQUFHO0FBQ0gsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDekQsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNwQixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDMUIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztBQUNwQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQztBQUNwQixFQUFDO0FBQ0Q7QUFDQSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUN0RCxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFDO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUk7QUFDekIsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtBQUNsRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDakIsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFDO0FBQ1QsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUU7QUFDdEUsRUFBRSxPQUFPLENBQUMsWUFBWSxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksVUFBVSxJQUFJLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDckcsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsWUFB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LENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUN6QixFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDekIsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDbEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLEVBQUUsTUFBTSxFQUFFO0FBQzNCLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTTtBQUM1QyxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDakQsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDeEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUMxRCxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7QUFDakUsQ0FBQztBQUNEO0FBQ0EsU0FBUyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUN0RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUM5QyxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQ3JELENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9DLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDOUMsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxJQUFBQyxLQUFjLEdBQUc7QUFDakIsRUFBRSxRQUFRO0FBQ1Ys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QUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBQztBQUNuRixJQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sR0FBRTtBQUN0RCxJQUFJLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDaEMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQzNELEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUN2RixFQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUNqQyxFQUFFLE1BQU0sR0FBRyxHQUFHQSxLQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBQztBQUNqQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBQztBQUMzRCxFQUFFLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUU7QUFDcEQ7QUFDQSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUc7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SUFBSSxJQUFJLElBQUc7QUFDdkUsRUFBRSxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ3ZEO0FBQ0EsRUFBRSxPQUFPQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtBQUNyQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQzdCLElBQUksTUFBTSxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBQztBQUM1QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDN0UsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDdkU7QUFDQSxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDdEIsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUNyRCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUM7QUFDN0MsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQzdDLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUMvQyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZFO0FBQ0EsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO0FBQ2hEO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRUEsS0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBQztBQUMxQyxFQUFFQSxLQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFDO0FBQzFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQztBQUNqRCxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUM7QUFDakQsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUN2RCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRSxJQUFJLE1BQU0sRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQztBQUN6QztBQUNBLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQy9DO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixFQUFDO0FBQ0Q7QUFDQUMsU0FBQSxDQUFBLE1BQWMsR0FBRyxVQUFVLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRTtBQUN0RSxFQUFFLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFXO0FBQzVEO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUM7QUFDckQsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDckMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdEMsRUFBRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdkMsRUFBRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFDO0FBQy9CLEVBQUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFDO0FBQ3JGLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDO0FBQ0EsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFDO0FBQ3RCO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJO0FBQy9CO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUM7QUFDbEk7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDdEU7QUFDQTtBQUNBLElBQUksSUFBSSxH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 |