From 4aab15f092e4825e4069b390efd94e0e8172af4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Morcillo=20Mu=C3=B1oz?= Date: Thu, 1 Aug 2024 12:08:42 +0200 Subject: [PATCH] Add error-on-s3-exception option This adds a new boolean option named `error-on-s3-exception` to be able to mark the job as failed if the cache could not be restored. This can be combined with a retry-action so we can use it in some situations where we want to retry the job when the cache could not be restored. --- action.yml | 4 + dist/restore/index.js | 7215 ++++++++++++++++++++++++++++++----------- dist/save/index.js | 7197 +++++++++++++++++++++++++++++----------- src/restore.ts | 25 +- 4 files changed, 10539 insertions(+), 3902 deletions(-) diff --git a/action.yml b/action.yml index c3d6990..57b2ce7 100644 --- a/action.yml +++ b/action.yml @@ -43,6 +43,10 @@ inputs: description: "Use github actions/cache as fallback" required: false default: "true" + error-on-s3-exception: + description: "Whether to mark the job as failed or not depending on S3 exceptions." + required: false + default: "false" # zip-option: # description: zip options # required: false diff --git a/dist/restore/index.js b/dist/restore/index.js index 918e947..21c3c05 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -50646,75 +50646,3328 @@ function range(a, b, str) { /***/ 7124: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { Transform } = __nccwpck_require__(1642) +const { Transform } = __nccwpck_require__(2672) + +class Block extends Transform { + constructor (size, opts = {}) { + super(opts) + + if (typeof size === 'object') { + opts = size + size = opts.size + } + + this.size = size || 512 + + const { nopad, zeroPadding = true } = opts + + if (nopad) this._zeroPadding = false + else this._zeroPadding = !!zeroPadding + + this._buffered = [] + this._bufferedBytes = 0 + } + + _transform (buf, enc, next) { + this._bufferedBytes += buf.length + this._buffered.push(buf) + + while (this._bufferedBytes >= this.size) { + this._bufferedBytes -= this.size + + // Assemble the buffers that will compose the final block + const blockBufs = [] + let blockBufsBytes = 0 + while (blockBufsBytes < this.size) { + const b = this._buffered.shift() + + if (blockBufsBytes + b.length <= this.size) { + blockBufs.push(b) + blockBufsBytes += b.length + } else { + // If the last buffer is larger than needed for the block, just + // use the needed part + const neededSize = this.size - blockBufsBytes + blockBufs.push(b.slice(0, neededSize)) + blockBufsBytes += neededSize + this._buffered.unshift(b.slice(neededSize)) + } + } + + // Then concat just those buffers, leaving the rest untouched in _buffered + this.push(Buffer.concat(blockBufs, this.size)) + } + next() + } + + _flush () { + if (this._bufferedBytes && this._zeroPadding) { + const zeroes = Buffer.alloc(this.size - this._bufferedBytes) + this._buffered.push(zeroes) + this.push(Buffer.concat(this._buffered)) + this._buffered = null + } else if (this._bufferedBytes) { + this.push(Buffer.concat(this._buffered)) + this._buffered = null + } + this.push(null) + } +} + +module.exports = Block + + +/***/ }), + +/***/ 8891: +/***/ ((module) => { + +"use strict"; + + +const codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error + } + + function getMessage (arg1, arg2, arg3) { + if (typeof message === 'string') { + return message + } else { + return message(arg1, arg2, arg3) + } + } + + class NodeError extends Base { + constructor (arg1, arg2, arg3) { + super(getMessage(arg1, arg2, arg3)); + } + } + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + + codes[code] = NodeError; +} + +// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + const len = expected.length; + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"' +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + let determiner; + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + let msg; + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; + } else { + const type = includes(name, '.') ? 'property' : 'argument'; + msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; + } + + msg += `. Received type ${typeof actual}`; + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented' +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); + +module.exports.q = codes; + + +/***/ }), + +/***/ 1153: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = __nccwpck_require__(184); + +var Writable = __nccwpck_require__(4423); + +__nccwpck_require__(4124)(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + 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); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +/***/ }), + +/***/ 4896: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + + +module.exports = PassThrough; + +var Transform = __nccwpck_require__(8971); + +__nccwpck_require__(4124)(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); +}; + +/***/ }), + +/***/ 184: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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. + + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = (__nccwpck_require__(2361).EventEmitter); + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = __nccwpck_require__(8933); +/**/ + + +var Buffer = (__nccwpck_require__(4300).Buffer); + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = __nccwpck_require__(3837); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = __nccwpck_require__(6305); + +var destroyImpl = __nccwpck_require__(6138); + +var _require = __nccwpck_require__(1802), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +__nccwpck_require__(4124)(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +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 (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || __nccwpck_require__(1153); + options = options || {}; // 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 Duplex; // 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.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // 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 = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // 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.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = 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.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || __nccwpck_require__(1153); + 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 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function 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; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(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) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + 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) { + state.awaitDrain = 0; + 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); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } 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 (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = 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. + + + var 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, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', 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 + + this._read(state.highWaterMark); + + 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); + } + + var 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; + state.awaitDrain = 0; + } + + 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) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var 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; + + if (!state.emittedReadable) { + state.emittedReadable = true; + 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) { + var 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) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (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.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 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)) { + var 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) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var 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(); + } // 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. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // 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 ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.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 (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, 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 (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + 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) { + var res = Stream.prototype.on.call(this, ev, fn); + var 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) { + var 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.removeAllListeners = function (ev) { + var 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) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // 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(); + } +} + +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 () { + var 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.paused = 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.paused = true; + return this; +}; + +function flow(stream) { + var 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) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = __nccwpck_require__(3276); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // 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; + var 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) { + var 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.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = __nccwpck_require__(2173); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} + +/***/ }), + +/***/ 8971: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + + +module.exports = Transform; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = __nccwpck_require__(1153); + +__nccwpck_require__(4124)(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // 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; + + 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. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} + +/***/ }), + +/***/ 4423: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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. + + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: __nccwpck_require__(7127) +}; +/**/ + +/**/ + +var Stream = __nccwpck_require__(8933); +/**/ + + +var Buffer = (__nccwpck_require__(4300).Buffer); + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = __nccwpck_require__(6138); + +var _require = __nccwpck_require__(1802), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +__nccwpck_require__(4124)(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || __nccwpck_require__(1153); + options = options || {}; // 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 Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // 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. + + var noDecode = 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.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 = function (er) { + onwrite(stream, er); + }; // 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; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // 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.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || __nccwpck_require__(1153); // 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 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + 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; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // 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, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var 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) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +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, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + 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 + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; + +/***/ }), + +/***/ 3276: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = __nccwpck_require__(5927); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; + +/***/ }), + +/***/ 6305: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = __nccwpck_require__(4300), + Buffer = _require.Buffer; + +var _require2 = __nccwpck_require__(3837), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); + +/***/ }), + +/***/ 6138: +/***/ ((module) => { + +"use strict"; + // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + 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 + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // 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. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; -class Block extends Transform { - constructor (size, opts = {}) { - super(opts) +/***/ }), - if (typeof size === 'object') { - opts = size - size = opts.size +/***/ 5927: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). + + +var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(8891)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - this.size = size || 512 + callback.apply(this, args); + }; +} - const { nopad, zeroPadding = true } = opts +function noop() {} - if (nopad) this._zeroPadding = false - else this._zeroPadding = !!zeroPadding +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} - this._buffered = [] - this._bufferedBytes = 0 +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); } - _transform (buf, enc, next) { - this._bufferedBytes += buf.length - this._buffered.push(buf) + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + 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); + }; +} - while (this._bufferedBytes >= this.size) { - this._bufferedBytes -= this.size +module.exports = eos; - // Assemble the buffers that will compose the final block - const blockBufs = [] - let blockBufsBytes = 0 - while (blockBufsBytes < this.size) { - const b = this._buffered.shift() +/***/ }), - if (blockBufsBytes + b.length <= this.size) { - blockBufs.push(b) - blockBufsBytes += b.length +/***/ 2173: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ERR_INVALID_ARG_TYPE = (__nccwpck_require__(8891)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE); + +function from(Readable, iterable, opts) { + var iterator; + + if (iterable && typeof iterable.next === 'function') { + iterator = iterable; + } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); + + var readable = new Readable(_objectSpread({ + objectMode: true + }, opts)); // Reading boolean to protect against _read + // being called before last iteration completion. + + var reading = false; + + readable._read = function () { + if (!reading) { + reading = true; + next(); + } + }; + + function next() { + return _next2.apply(this, arguments); + } + + function _next2() { + _next2 = _asyncToGenerator(function* () { + try { + var _ref = yield iterator.next(), + value = _ref.value, + done = _ref.done; + + if (done) { + readable.push(null); + } else if (readable.push((yield value))) { + next(); } else { - // If the last buffer is larger than needed for the block, just - // use the needed part - const neededSize = this.size - blockBufsBytes - blockBufs.push(b.slice(0, neededSize)) - blockBufsBytes += neededSize - this._buffered.unshift(b.slice(neededSize)) + reading = false; } + } catch (err) { + readable.destroy(err); } + }); + return _next2.apply(this, arguments); + } - // Then concat just those buffers, leaving the rest untouched in _buffered - this.push(Buffer.concat(blockBufs, this.size)) - } - next() + return readable; +} + +module.exports = from; + +/***/ }), + +/***/ 2468: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). + + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = __nccwpck_require__(5927); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; } - _flush () { - if (this._bufferedBytes && this._zeroPadding) { - const zeroes = Buffer.alloc(this.size - this._bufferedBytes) - this._buffered.push(zeroes) - this.push(Buffer.concat(this._buffered)) - this._buffered = null - } else if (this._bufferedBytes) { - this.push(Buffer.concat(this._buffered)) - this._buffered = null - } - this.push(null) + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); } -module.exports = Block +module.exports = pipeline; + +/***/ }), + +/***/ 1802: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var ERR_INVALID_OPT_VALUE = (__nccwpck_require__(8891)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE); + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; + +/***/ }), + +/***/ 8933: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(2781); + + +/***/ }), + +/***/ 2672: +/***/ ((module, exports, __nccwpck_require__) => { + +var Stream = __nccwpck_require__(2781); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream.Readable; + Object.assign(module.exports, Stream); + module.exports.Stream = Stream; +} else { + exports = module.exports = __nccwpck_require__(184); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = __nccwpck_require__(4423); + exports.Duplex = __nccwpck_require__(1153); + exports.Transform = __nccwpck_require__(8971); + exports.PassThrough = __nccwpck_require__(4896); + exports.finished = __nccwpck_require__(5927); + exports.pipeline = __nccwpck_require__(2468); +} /***/ }), @@ -50925,40 +54178,6 @@ function expand(str, isTop) { -/***/ }), - -/***/ 9107: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - -var isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; - -var isWebWorker = (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self.constructor && self.constructor.name === "DedicatedWorkerGlobalScope"; - -/** - * @see https://github.com/jsdom/jsdom/releases/tag/12.0.0 - * @see https://github.com/jsdom/jsdom/issues/1537 - */ -var isJsDom = typeof window !== "undefined" && window.name === "nodejs" || typeof navigator !== "undefined" && (navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom")); - -var isDeno = typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - -exports.isBrowser = isBrowser; -exports.isWebWorker = isWebWorker; -exports.isNode = isNode; -exports.isJsDom = isJsDom; -exports.isDeno = isDeno; - /***/ }), /***/ 4024: @@ -52144,21 +55363,11 @@ Builder.prototype.j2x = function(jObj, level) { let attrStr = ''; let val = ''; for (let key in jObj) { - if(!Object.prototype.hasOwnProperty.call(jObj, key)) continue; if (typeof jObj[key] === 'undefined') { - // supress undefined node only if it is not an attribute - if (this.isAttribute(key)) { - val += ''; - } + // supress undefined node } else if (jObj[key] === null) { - // null attribute should be ignored by the attribute list, but should not cause the tag closing - if (this.isAttribute(key)) { - val += ''; - } else if (key[0] === '?') { - val += this.indentate(level) + '<' + key + '?' + this.tagEndChar; - } else { - val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; - } + if(key[0] === "?") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar; + else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; } else if (jObj[key] instanceof Date) { val += this.buildTextValNode(jObj[key], key, '', level); @@ -52251,8 +55460,7 @@ Builder.prototype.buildObjectNode = function(val, key, attrStr, level) { tagEndExp = ""; } - // attrStr is an empty string in case the attribute came as undefined or null - if ((attrStr || attrStr === '') && val.indexOf('<') === -1) { + if (attrStr && val.indexOf('<') === -1) { return ( this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp ); } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) { return this.indentate(level) + `` + this.newLine; @@ -52325,7 +55533,7 @@ function indentate(level) { } function isAttribute(name /*, options*/) { - if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) { + if (name.startsWith(this.options.attributeNamePrefix)) { return name.substr(this.attrPrefixLen); } else { return false; @@ -52363,8 +55571,6 @@ function arrToStr(arr, options, jPath, indentation) { for (let i = 0; i < arr.length; i++) { const tagObj = arr[i]; const tagName = propName(tagObj); - if(tagName === undefined) continue; - let newJPath = ""; if (jPath.length === 0) newJPath = tagName else newJPath = `${jPath}.${tagName}`; @@ -52434,7 +55640,6 @@ function propName(obj) { const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if(!obj.hasOwnProperty(key)) continue; if (key !== ":@") return key; } } @@ -52443,7 +55648,6 @@ function attr_to_str(attrMap, options) { let attrStr = ""; if (attrMap && !options.ignoreAttributes) { for (let attr in attrMap) { - if(!attrMap.hasOwnProperty(attr)) continue; let attrVal = options.attributeValueProcessor(attr, attrMap[attr]); attrVal = replaceEntitiesValue(attrVal, options); if (attrVal === true && options.suppressBooleanAttributes) { @@ -52480,9 +55684,7 @@ module.exports = toXml; /***/ }), /***/ 6072: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const util = __nccwpck_require__(8280); +/***/ ((module) => { //TODO: handle comments function readDocType(xmlData, i){ @@ -52505,7 +55707,7 @@ function readDocType(xmlData, i){ i += 7; [entityName, val,i] = readEntityExp(xmlData,i+1); if(val.indexOf("&") === -1) //Parameter entities are not supported - entities[ validateEntityName(entityName) ] = { + entities[ entityName ] = { regx : RegExp( `&${entityName};`,"g"), val: val }; @@ -52626,16 +55828,8 @@ function isNotation(xmlData, i){ return false } -function validateEntityName(name){ - if (util.isName(name)) - return name; - else - throw new Error(`Invalid entity name ${name}`); -} - module.exports = readDocType; - /***/ }), /***/ 2821: @@ -52704,9 +55898,9 @@ const xmlNode = __nccwpck_require__(7462); const readDocType = __nccwpck_require__(6072); const toNumber = __nccwpck_require__(4526); -// const regx = -// '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)' -// .replace(/NAME/g, util.nameRegexp); +const regx = + '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)' + .replace(/NAME/g, util.nameRegexp); //const tagsRegx = new RegExp("<(\\/?[\\w:\\-\._]+)([^>]*)>(\\s*"+cdataRegx+")*([^<]+)?","g"); //const tagsRegx = new RegExp("<(\\/?)((\\w*:)?([\\w:\\-\._]+))([^>]*)>([^<]*)("+cdataRegx+"([^<]*))*([^<]+)?","g"); @@ -52963,13 +56157,14 @@ const parseXml = function(xmlData) { textData = this.saveTextToParentTag(textData, currentNode, jPath); - let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true); - if(val == undefined) val = ""; - //cdata should be set even if it is 0 length string if(this.options.cdataPropName){ + // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + "." + this.options.cdataPropName, true, false, true); + // if(!val) val = ""; currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]); }else{ + let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true); + if(val == undefined) val = ""; currentNode.add(this.options.textNodeName, val); } @@ -52977,7 +56172,6 @@ const parseXml = function(xmlData) { }else {//Opening tag let result = readTagExp(xmlData,i, this.options.removeNSPrefix); let tagName= result.tagName; - const rawTagName = result.rawTagName; let tagExp = result.tagExp; let attrExpPresent = result.attrExpPresent; let closeIndex = result.closeIndex; @@ -53003,7 +56197,7 @@ const parseXml = function(xmlData) { if(tagName !== xmlObj.tagname){ jPath += jPath ? "." + tagName : tagName; } - if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { + if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace let tagContent = ""; //self-closing tag if(tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1){ @@ -53016,8 +56210,8 @@ const parseXml = function(xmlData) { //normal tag else{ //read until closing tag is found - const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1); - if(!result) throw new Error(`Unexpected end of ${rawTagName}`); + const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1); + if(!result) throw new Error(`Unexpected end of ${tagName}`); i = result.i; tagContent = result.tagContent; } @@ -53039,7 +56233,6 @@ const parseXml = function(xmlData) { if(tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1){ if(tagName[tagName.length - 1] === "/"){ //remove trailing '/' tagName = tagName.substr(0, tagName.length - 1); - jPath = jPath.substr(0, jPath.length - 1); tagExp = tagName; }else{ tagExp = tagExp.substr(0, tagExp.length - 1); @@ -53198,11 +56391,10 @@ function readTagExp(xmlData,i, removeNSPrefix, closingChar = ">"){ let tagName = tagExp; let attrExpPresent = true; if(separatorIndex !== -1){//separate tag name and attributes expression - tagName = tagExp.substring(0, separatorIndex); - tagExp = tagExp.substring(separatorIndex + 1).trimStart(); + tagName = tagExp.substr(0, separatorIndex).replace(/\s\s*$/, ''); + tagExp = tagExp.substr(separatorIndex + 1); } - const rawTagName = tagName; if(removeNSPrefix){ const colonIndex = tagName.indexOf(":"); if(colonIndex !== -1){ @@ -53216,7 +56408,6 @@ function readTagExp(xmlData,i, removeNSPrefix, closingChar = ">"){ tagExp: tagExp, closeIndex: closeIndex, attrExpPresent: attrExpPresent, - rawTagName: rawTagName, } } /** @@ -75069,7 +78260,6 @@ module.exports = { stringify, stripBom } /*! * mime-db * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -76435,35 +79625,230 @@ class InvalidDateError extends ExtendableError {} exports.InvalidDateError = InvalidDateError; class InvalidPrefixError extends ExtendableError {} -/** - * InvalidBucketPolicyError generated when the given bucket policy is invalid. - */ -exports.InvalidPrefixError = InvalidPrefixError; -class InvalidBucketPolicyError extends ExtendableError {} +/** + * InvalidBucketPolicyError generated when the given bucket policy is invalid. + */ +exports.InvalidPrefixError = InvalidPrefixError; +class InvalidBucketPolicyError extends ExtendableError {} + +/** + * IncorrectSizeError generated when total data read mismatches with + * the input size. + */ +exports.InvalidBucketPolicyError = InvalidBucketPolicyError; +class IncorrectSizeError extends ExtendableError {} + +/** + * InvalidXMLError generated when an unknown XML is found. + */ +exports.IncorrectSizeError = IncorrectSizeError; +class InvalidXMLError extends ExtendableError {} + +/** + * S3Error is generated for errors returned from S3 server. + * see getErrorTransformer for details + */ +exports.InvalidXMLError = InvalidXMLError; +class S3Error extends ExtendableError {} +exports.S3Error = S3Error; +class IsValidBucketNameError extends ExtendableError {} +exports.IsValidBucketNameError = IsValidBucketNameError; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHRlbmRhYmxlRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsIm9wdCIsIm5hbWUiLCJBbm9ueW1vdXNSZXF1ZXN0RXJyb3IiLCJleHBvcnRzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJJbnZhbGlkUG9ydEVycm9yIiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiSW52YWxpZE9iamVjdE5hbWVFcnJvciIsIkFjY2Vzc0tleVJlcXVpcmVkRXJyb3IiLCJTZWNyZXRLZXlSZXF1aXJlZEVycm9yIiwiRXhwaXJlc1BhcmFtRXJyb3IiLCJJbnZhbGlkRGF0ZUVycm9yIiwiSW52YWxpZFByZWZpeEVycm9yIiwiSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIiwiSW5jb3JyZWN0U2l6ZUVycm9yIiwiSW52YWxpZFhNTEVycm9yIiwiUzNFcnJvciIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiXSwic291cmNlcyI6WyJlcnJvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiRVMyMDIyLkVycm9yXCIgLz5cblxuY2xhc3MgRXh0ZW5kYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHQ/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAvLyBlcnJvciBPcHRpb24ge2NhdXNlPzogdW5rbm93bn0gaXMgYSAnbmljZSB0byBoYXZlJyxcbiAgICAvLyBkb24ndCB1c2UgaXQgaW50ZXJuYWxseVxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdClcbiAgICAvLyBzZXQgZXJyb3IgbmFtZSwgb3RoZXJ3aXNlIGl0J3MgYWx3YXlzICdFcnJvcidcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxufVxuXG4vKipcbiAqIEFub255bW91c1JlcXVlc3RFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFub255bW91cyBrZXlzIG9uIHNwZWNpZmljXG4gKiBBUElzLiBOT1RFOiBQcmVzaWduZWRVUkwgZ2VuZXJhdGlvbiBhbHdheXMgcmVxdWlyZXMgYWNjZXNzIGtleXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFsbCBpbnZhbGlkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFBvcnRFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhIG5vbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkXG4gKiBmb3IgcG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUG9ydEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZEVuZHBvaW50RXJyb3IgaXMgZ2VuZXJhdGVkIHdoZW4gYW4gaW52YWxpZCBlbmQgcG9pbnQgdmFsdWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBkb21haW4gc3RhbmRhcmRzLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEVuZHBvaW50RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludmFsaWQgYnVja2V0IG5hbWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBBV1MgUzMgc3BlY2lmaWNhdGlvbnMuXG4gKiBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L0J1Y2tldFJlc3RyaWN0aW9ucy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZE9iamVjdE5hbWVFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhbiBpbnZhbGlkIG9iamVjdCBuYW1lIGlzXG4gKiBwcm92aWRlZCB3aGljaCBkb2VzIG5vdCBmb2xsb3cgQVdTIFMzIHNwZWNpZmljYXRpb25zLlxuICogaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ01ldGFkYXRhLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRPYmplY3ROYW1lRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3NLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIGFjY2Vzc1xuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY2Vzc0tleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBTZWNyZXRLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIHNlY3JldFxuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBFeHBpcmVzUGFyYW1FcnJvciBnZW5lcmF0ZWQgd2hlbiBleHBpcmVzIHBhcmFtZXRlciB2YWx1ZSBpcyBub3RcbiAqIHdlbGwgd2l0aGluIHN0aXB1bGF0ZWQgbGltaXRzLlxuICovXG5leHBvcnQgY2xhc3MgRXhwaXJlc1BhcmFtRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkRGF0ZUVycm9yIGdlbmVyYXRlZCB3aGVuIGludmFsaWQgZGF0ZSBpcyBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkUHJlZml4RXJyb3IgZ2VuZXJhdGVkIHdoZW4gb2JqZWN0IHByZWZpeCBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKiBvciBkb2VzIG5vdCBjb25mb3JtIHRvIEFXUyBTMyBvYmplY3Qga2V5IHJlc3RyaWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRQcmVmaXhFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuXG4vKipcbiAqIEludmFsaWRCdWNrZXRQb2xpY3lFcnJvciBnZW5lcmF0ZWQgd2hlbiB0aGUgZ2l2ZW4gYnVja2V0IHBvbGljeSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW5jb3JyZWN0U2l6ZUVycm9yIGdlbmVyYXRlZCB3aGVuIHRvdGFsIGRhdGEgcmVhZCBtaXNtYXRjaGVzIHdpdGhcbiAqIHRoZSBpbnB1dCBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgSW5jb3JyZWN0U2l6ZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFhNTEVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIHVua25vd24gWE1MIGlzIGZvdW5kLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFhNTEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogUzNFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGVycm9ycyByZXR1cm5lZCBmcm9tIFMzIHNlcnZlci5cbiAqIHNlZSBnZXRFcnJvclRyYW5zZm9ybWVyIGZvciBkZXRhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0Vycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBJc1ZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE1BQU1BLGVBQWUsU0FBU0MsS0FBSyxDQUFDO0VBQ2xDQyxXQUFXQSxDQUFDQyxPQUFnQixFQUFFQyxHQUFrQixFQUFFO0lBQ2hEO0lBQ0E7SUFDQSxLQUFLLENB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 + +/***/ }), + +/***/ 2895: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var Stream = _interopRequireWildcard(__nccwpck_require__(2781), true); +var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); +var _helper = __nccwpck_require__(9921); +var transformers = _interopRequireWildcard(__nccwpck_require__(9237), true); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +/* + * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class extensions { + constructor(client) { + this.client = client; + } + + // List the objects in the bucket using S3 ListObjects V2 With Metadata + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `prefix` _string_: the prefix of the objects that should be listed (optional, default `''`) + // * `recursive` _bool_: `true` indicates recursive style listing and `false` indicates directory style listing delimited by '/'. (optional, default `false`) + // * `startAfter` _string_: Specifies the key to start after when listing objects in a bucket. (optional, default `''`) + // + // __Return Value__ + // * `stream` _Stream_: stream emitting the objects in the bucket, the object is of the format: + // * `obj.name` _string_: name of the object + // * `obj.prefix` _string_: name of the object prefix + // * `obj.size` _number_: size of the object + // * `obj.etag` _string_: etag of the object + // * `obj.lastModified` _Date_: modified time stamp + // * `obj.metadata` _object_: metadata of the object + + listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter) { + if (prefix === undefined) { + prefix = ''; + } + if (recursive === undefined) { + recursive = false; + } + if (startAfter === undefined) { + startAfter = ''; + } + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidPrefix)(prefix)) { + throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`); + } + if (!(0, _helper.isString)(prefix)) { + throw new TypeError('prefix should be of type "string"'); + } + if (!(0, _helper.isBoolean)(recursive)) { + throw new TypeError('recursive should be of type "boolean"'); + } + if (!(0, _helper.isString)(startAfter)) { + throw new TypeError('startAfter should be of type "string"'); + } + // if recursive is false set delimiter to '/' + var delimiter = recursive ? '' : '/'; + var continuationToken = ''; + var objects = []; + var ended = false; + var readStream = Stream.Readable({ + objectMode: true + }); + readStream._read = () => { + // push one object per _read() + if (objects.length) { + readStream.push(objects.shift()); + return; + } + if (ended) { + return readStream.push(null); + } + // if there are no objects to push do query for the next batch of objects + this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, 1000, startAfter).on('error', e => readStream.emit('error', e)).on('data', result => { + if (result.isTruncated) { + continuationToken = result.nextContinuationToken; + } else { + ended = true; + } + objects = result.objects; + readStream._read(); + }); + }; + return readStream; + } + + // listObjectsV2WithMetadataQuery - (List Objects V2 with metadata) - List some or all (up to 1000) of the objects in a bucket. + // + // You can use the request parameters as selection criteria to return a subset of the objects in a bucket. + // request parameters :- + // * `bucketName` _string_: name of the bucket + // * `prefix` _string_: Limits the response to keys that begin with the specified prefix. + // * `continuation-token` _string_: Used to continue iterating over a set of objects. + // * `delimiter` _string_: A delimiter is a character you use to group keys. + // * `max-keys` _number_: Sets the maximum number of keys returned in the response body. + // * `start-after` _string_: Specifies the key to start after when listing objects in a bucket. -/** - * IncorrectSizeError generated when total data read mismatches with - * the input size. - */ -exports.InvalidBucketPolicyError = InvalidBucketPolicyError; -class IncorrectSizeError extends ExtendableError {} + listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, maxKeys, startAfter) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isString)(prefix)) { + throw new TypeError('prefix should be of type "string"'); + } + if (!(0, _helper.isString)(continuationToken)) { + throw new TypeError('continuationToken should be of type "string"'); + } + if (!(0, _helper.isString)(delimiter)) { + throw new TypeError('delimiter should be of type "string"'); + } + if (!(0, _helper.isNumber)(maxKeys)) { + throw new TypeError('maxKeys should be of type "number"'); + } + if (!(0, _helper.isString)(startAfter)) { + throw new TypeError('startAfter should be of type "string"'); + } + var queries = []; -/** - * InvalidXMLError generated when an unknown XML is found. - */ -exports.IncorrectSizeError = IncorrectSizeError; -class InvalidXMLError extends ExtendableError {} + // Call for listing objects v2 API + queries.push(`list-type=2`); + queries.push(`encoding-type=url`); + // escape every value in query string, except maxKeys + queries.push(`prefix=${(0, _helper.uriEscape)(prefix)}`); + queries.push(`delimiter=${(0, _helper.uriEscape)(delimiter)}`); + queries.push(`metadata=true`); + if (continuationToken) { + continuationToken = (0, _helper.uriEscape)(continuationToken); + queries.push(`continuation-token=${continuationToken}`); + } + // Set start-after + if (startAfter) { + startAfter = (0, _helper.uriEscape)(startAfter); + queries.push(`start-after=${startAfter}`); + } + // no need to escape maxKeys + if (maxKeys) { + if (maxKeys >= 1000) { + maxKeys = 1000; + } + queries.push(`max-keys=${maxKeys}`); + } + queries.sort(); + var query = ''; + if (queries.length > 0) { + query = `${queries.join('&')}`; + } + var method = 'GET'; + var transformer = transformers.getListObjectsV2WithMetadataTransformer(); + this.client.makeRequest({ + method, + bucketName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return transformer.emit('error', e); + } + (0, _helper.pipesetup)(response, transformer); + }); + return transformer; + } +} -/** - * S3Error is generated for errors returned from S3 server. - * see getErrorTransformer for details - */ -exports.InvalidXMLError = InvalidXMLError; -class S3Error extends ExtendableError {} -exports.S3Error = S3Error; -class IsValidBucketNameError extends ExtendableError {} -exports.IsValidBucketNameError = IsValidBucketNameError; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHRlbmRhYmxlRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsIm9wdCIsIm5hbWUiLCJBbm9ueW1vdXNSZXF1ZXN0RXJyb3IiLCJleHBvcnRzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJJbnZhbGlkUG9ydEVycm9yIiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiSW52YWxpZE9iamVjdE5hbWVFcnJvciIsIkFjY2Vzc0tleVJlcXVpcmVkRXJyb3IiLCJTZWNyZXRLZXlSZXF1aXJlZEVycm9yIiwiRXhwaXJlc1BhcmFtRXJyb3IiLCJJbnZhbGlkRGF0ZUVycm9yIiwiSW52YWxpZFByZWZpeEVycm9yIiwiSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIiwiSW5jb3JyZWN0U2l6ZUVycm9yIiwiSW52YWxpZFhNTEVycm9yIiwiUzNFcnJvciIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiXSwic291cmNlcyI6WyJlcnJvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiRVMyMDIyLkVycm9yXCIgLz5cblxuY2xhc3MgRXh0ZW5kYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHQ/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAvLyBlcnJvciBPcHRpb24ge2NhdXNlPzogdW5rbm93bn0gaXMgYSAnbmljZSB0byBoYXZlJyxcbiAgICAvLyBkb24ndCB1c2UgaXQgaW50ZXJuYWxseVxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdClcbiAgICAvLyBzZXQgZXJyb3IgbmFtZSwgb3RoZXJ3aXNlIGl0J3MgYWx3YXlzICdFcnJvcidcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxufVxuXG4vKipcbiAqIEFub255bW91c1JlcXVlc3RFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFub255bW91cyBrZXlzIG9uIHNwZWNpZmljXG4gKiBBUElzLiBOT1RFOiBQcmVzaWduZWRVUkwgZ2VuZXJhdGlvbiBhbHdheXMgcmVxdWlyZXMgYWNjZXNzIGtleXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFsbCBpbnZhbGlkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFBvcnRFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhIG5vbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkXG4gKiBmb3IgcG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUG9ydEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZEVuZHBvaW50RXJyb3IgaXMgZ2VuZXJhdGVkIHdoZW4gYW4gaW52YWxpZCBlbmQgcG9pbnQgdmFsdWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBkb21haW4gc3RhbmRhcmRzLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEVuZHBvaW50RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludmFsaWQgYnVja2V0IG5hbWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBBV1MgUzMgc3BlY2lmaWNhdGlvbnMuXG4gKiBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L0J1Y2tldFJlc3RyaWN0aW9ucy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZE9iamVjdE5hbWVFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhbiBpbnZhbGlkIG9iamVjdCBuYW1lIGlzXG4gKiBwcm92aWRlZCB3aGljaCBkb2VzIG5vdCBmb2xsb3cgQVdTIFMzIHNwZWNpZmljYXRpb25zLlxuICogaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ01ldGFkYXRhLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRPYmplY3ROYW1lRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3NLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIGFjY2Vzc1xuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY2Vzc0tleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBTZWNyZXRLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIHNlY3JldFxuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBFeHBpcmVzUGFyYW1FcnJvciBnZW5lcmF0ZWQgd2hlbiBleHBpcmVzIHBhcmFtZXRlciB2YWx1ZSBpcyBub3RcbiAqIHdlbGwgd2l0aGluIHN0aXB1bGF0ZWQgbGltaXRzLlxuICovXG5leHBvcnQgY2xhc3MgRXhwaXJlc1BhcmFtRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkRGF0ZUVycm9yIGdlbmVyYXRlZCB3aGVuIGludmFsaWQgZGF0ZSBpcyBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkUHJlZml4RXJyb3IgZ2VuZXJhdGVkIHdoZW4gb2JqZWN0IHByZWZpeCBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKiBvciBkb2VzIG5vdCBjb25mb3JtIHRvIEFXUyBTMyBvYmplY3Qga2V5IHJlc3RyaWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRQcmVmaXhFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuXG4vKipcbiAqIEludmFsaWRCdWNrZXRQb2xpY3lFcnJvciBnZW5lcmF0ZWQgd2hlbiB0aGUgZ2l2ZW4gYnVja2V0IHBvbGljeSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW5jb3JyZWN0U2l6ZUVycm9yIGdlbmVyYXRlZCB3aGVuIHRvdGFsIGRhdGEgcmVhZCBtaXNtYXRjaGVzIHdpdGhcbiAqIHRoZSBpbnB1dCBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgSW5jb3JyZWN0U2l6ZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFhNTEVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIHVua25vd24gWE1MIGlzIGZvdW5kLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFhNTEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogUzNFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGVycm9ycyByZXR1cm5lZCBmcm9tIFMzIHNlcnZlci5cbiAqIHNlZSBnZXRFcnJvclRyYW5zZm9ybWVyIGZvciBkZXRhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0Vycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHtcbiAgY29kZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSXNWYWxpZEJ1Y2tldE5hbWVFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxNQUFNQSxlQUFlLFNBQVNDLEtBQUssQ0FBQztFQUNsQ0MsV0FBV0EsQ0FBQ0MsT0FBZ0IsRUFBRUMsR0FBa0IsRUFBRTtJQUNo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 +// deprecated default export, please use named exports. +// keep for backward compatibility. +// eslint-disable-next-line import/no-default-export +exports.extensions = extensions; +var _default = extensions; +exports["default"] = _default; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdHJlYW0iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaGVscGVyIiwidHJhbnNmb3JtZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsImV4dGVuc2lvbnMiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJidWNrZXROYW1lIiwicHJlZml4IiwicmVjdXJzaXZlIiwic3RhcnRBZnRlciIsInVuZGVmaW5lZCIsImlzVmFsaWRCdWNrZXROYW1lIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsImlzVmFsaWRQcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJpc1N0cmluZyIsIlR5cGVFcnJvciIsImlzQm9vbGVhbiIsImRlbGltaXRlciIsImNvbnRpbnVhdGlvblRva2VuIiwib2JqZWN0cyIsImVuZGVkIiwicmVhZFN0cmVhbSIsIlJlYWRhYmxlIiwib2JqZWN0TW9kZSIsIl9yZWFkIiwibGVuZ3RoIiwicHVzaCIsInNoaWZ0IiwibGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVF1ZXJ5Iiwib24iLCJlIiwiZW1pdCIsInJlc3VsdCIsImlzVHJ1bmNhdGVkIiwibmV4dENvbnRpbnVhdGlvblRva2VuIiwibWF4S2V5cyIsImlzTnVtYmVyIiwicXVlcmllcyIsInVyaUVzY2FwZSIsInNvcnQiLCJxdWVyeSIsImpvaW4iLCJtZXRob2QiLCJ0cmFuc2Zvcm1lciIsImdldExpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFUcmFuc2Zvcm1lciIsIm1ha2VSZXF1ZXN0IiwicmVzcG9uc2UiLCJwaXBlc2V0dXAiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyJleHRlbnNpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDIwIE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzLnRzJ1xuaW1wb3J0IHtcbiAgaXNCb29sZWFuLFxuICBpc051bWJlcixcbiAgaXNTdHJpbmcsXG4gIGlzVmFsaWRCdWNrZXROYW1lLFxuICBpc1ZhbGlkUHJlZml4LFxuICBwaXBlc2V0dXAsXG4gIHVyaUVzY2FwZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1lcnMgZnJvbSAnLi90cmFuc2Zvcm1lcnMuanMnXG5cbmV4cG9ydCBjbGFzcyBleHRlbnNpb25zIHtcbiAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgfVxuXG4gIC8vIExpc3QgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCB1c2luZyBTMyBMaXN0T2JqZWN0cyBWMiBXaXRoIE1ldGFkYXRhXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiB0aGUgcHJlZml4IG9mIHRoZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGB0cnVlYCBpbmRpY2F0ZXMgcmVjdXJzaXZlIHN0eWxlIGxpc3RpbmcgYW5kIGBmYWxzZWAgaW5kaWNhdGVzIGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIGRlbGltaXRlZCBieSAnLycuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvLyAqIGBzdGFydEFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoucHJlZml4YCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0IHByZWZpeFxuICAvLyAgICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoubGFzdE1vZGlmaWVkYCBfRGF0ZV86IG1vZGlmaWVkIHRpbWUgc3RhbXBcbiAgLy8gICAqIGBvYmoubWV0YWRhdGFgIF9vYmplY3RfOiBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0XG5cbiAgbGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YShidWNrZXROYW1lLCBwcmVmaXgsIHJlY3Vyc2l2ZSwgc3RhcnRBZnRlcikge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhcnRBZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydEFmdGVyID0gJydcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN0YXJ0QWZ0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdGFydEFmdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIgY29udGludWF0aW9uVG9rZW4gPSAnJ1xuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIDEwMDAsIHN0YXJ0QWZ0ZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RzID0gcmVzdWx0Lm9iamVjdHNcbiAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRTdHJlYW1cbiAgfVxuXG4gIC8vIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeSAtIChMaXN0IE9iamVjdHMgVjIgd2l0aCBtZXRhZGF0YSkgLSBMaXN0IHNvbWUgb3IgYWxsICh1cCB0byAxMDAwKSBvZiB0aGUgb2JqZWN0cyBpbiBhIGJ1Y2tldC5cbiAgLy9cbiAgLy8gWW91IGNhbiB1c2UgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBhcyBzZWxlY3Rpb24gY3JpdGVyaWEgdG8gcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvLyByZXF1ZXN0IHBhcmFtZXRlcnMgOi1cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiBMaW1pdHMgdGhlIHJlc3BvbnNlIHRvIGtleXMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LlxuICAvLyAqIGBjb250aW51YXRpb24tdG9rZW5gIF9zdHJpbmdfOiBVc2VkIHRvIGNvbnRpbnVlIGl0ZXJhdGluZyBvdmVyIGEgc2V0IG9mIG9iamVjdHMuXG4gIC8vICogYGRlbGltaXRlcmAgX3N0cmluZ186IEEgZGVsaW1pdGVyIGlzIGEgY2hhcmFjdGVyIHlvdSB1c2UgdG8gZ3JvdXAga2V5cy5cbiAgLy8gKiBgbWF4LWtleXNgIF9udW1iZXJfOiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICAvLyAqIGBzdGFydC1hZnRlcmAgX3N0cmluZ186IFNwZWNpZmllcyB0aGUga2V5IHRvIHN0YXJ0IGFmdGVyIHdoZW4gbGlzdGluZyBvYmplY3RzIGluIGEgYnVja2V0LlxuXG4gIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIG1heEtleXMsIHN0YXJ0QWZ0ZXIpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhjb250aW51YXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRpbnVhdGlvblRva2VuIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihtYXhLZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4S2V5cyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdGFydEFmdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhcnRBZnRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYG1ldGFkYXRhPXRydWVgKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIC8vIG5vIG5lZWQgdG8gZXNjYXBlIG1heEtleXNcbiAgICBpZiAobWF4S2V5cykge1xuICAgICAgaWYgKG1heEtleXMgPj0gMTAwMCkge1xuICAgICAgICBtYXhLZXlzID0gMTAwMFxuICAgICAgfVxuICAgICAgcXVlcmllcy5wdXNoKGBtYXgta2V5cz0ke21heEtleXN9YClcbiAgICB9XG4gICAgcXVlcmllcy5zb3J0KClcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVRyYW5zZm9ybWVyKClcbiAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG59XG5cbi8vIGRlcHJlY2F0ZWQgZGVmYXVsdCBleHBvcnQsIHBsZWFzZSB1c2UgbmFtZWQgZXhwb3J0cy5cbi8vIGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zXG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQVNBLElBQUFHLFlBQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUFpRCxTQUFBSSx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBTix3QkFBQVUsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcsR0FBQSxjQUFBSSxJQUFBLEtBQUFBLElBQUEsQ0FBQVYsR0FBQSxJQUFBVSxJQUFBLENBQUFDLEdBQUEsS0FBQVIsTUFBQSxDQUFBQyxjQUFBLENBQUFILE1BQUEsRUFBQUssR0FBQSxFQUFBSSxJQUFBLFlBQUFULE1BQUEsQ0FBQUssR0FBQSxJQUFBWCxHQUFBLENBQUFXLEdBQUEsU0FBQUwsTUFBQSxDQUFBSixPQUFBLEdBQUFGLEdBQUEsTUFBQUcsS0FBQSxJQUFBQSxLQUFBLENBQUFhLEdBQUEsQ0FBQWhCLEdBQUEsRUFBQU0sTUFBQSxZQUFBQSxNQUFBO0FBNUJqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBZ0JPLE1BQU1XLFVBQVUsQ0FBQztFQUN0QkMsV0FBV0EsQ0FBQ0MsTUFBTSxFQUFFO0lBQ2xCLElBQUksQ0FBQ0EsTUFBTSxHQUFHQSxNQUFNO0VBQ3RCOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBQyx5QkFBeUJBLENBQUNDLFVBQVUsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFVBQVUsRUFBRTtJQUNuRSxJQUFJRixNQUFNLEtBQUtHLFNBQVMsRUFBRTtNQUN4QkgsTUFBTSxHQUFHLEVBQUU7SUFDYjtJQUNBLElBQUlDLFNBQVMsS0FBS0UsU0FBUyxFQUFFO01BQzNCRixTQUFTLEdBQUcsS0FBSztJQUNuQjtJQUNBLElBQUlDLFVBQVUsS0FBS0MsU0FBUyxFQUFFO01BQzVCRCxVQUFVLEdBQUcsRUFBRTtJQUNqQjtJQUNBLElBQUksQ0FBQyxJQUFBRSx5QkFBaUIsRUFBQ0wsVUFBVSxDQUFDLEVBQUU7TUFDbEMsTUFBTSxJQUFJN0IsTUFBTSxDQUFDbUMsc0JBQXNCLENBQUMsdUJBQXVCLEdBQUdOLFVBQVUsQ0FBQztJQUMvRTtJQUNBLElBQUksQ0FBQyxJQUFBTyxxQkFBYSxFQUFDTixNQUFNLENBQUMsRUFBRTtNQUMxQixNQUFNLElBQUk5QixNQUFNLENBQUNxQyxrQkFBa0IsQ0FBRSxvQkFBbUJQLE1BQU8sRUFBQyxDQUFDO0lBQ25FO0lBQ0EsSUFBSSxDQUFDLElBQUFRLGdCQUFRLEVBQUNSLE1BQU0sQ0FBQyxFQUFFO01BQ3JCLE1BQU0sSUFBSVMsU0FBUyxDQUFDLG1DQUFtQyxDQUFDO0lBQzFEO0lBQ0EsSUFBSSxDQUFDLElBQUFDLGlCQUFTLEVBQUNULFNBQVMsQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSVEsU0FBUyxDQUFDLHVDQUF1QyxDQUFDO0lBQzlEO0lBQ0EsSUFBSSxDQUFDLElBQUFELGdCQUFRLEVBQUNOLFVBQVUsQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSU8sU0FBUyxDQUFDLHVDQUF1QyxDQUFDO0lBQzlEO0lBQ0E7SUFDQSxJQUFJRSxTQUFTLEdBQUdWLFNBQVMsR0FBRyxFQUFFLEdBQUcsR0FBRztJQUNwQyxJQUFJVyxpQkFBaUIsR0FBRyxFQUFFO0lBQzFCLElBQUlDLE9BQU8sR0FBRyxFQUFFO0lBQ2hCLElBQUlDLEtBQUssR0FBRyxLQUFLO0lBQ2pCLElBQUlDLFVBQVUsR0FBR2hELE1BQU0sQ0FBQ2lELFFBQVEsQ0FBQztNQUFFQyxVQUFVLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFDdERGLFVBQVUsQ0FBQ0csS0FBSyxHQUFHLE1BQU07TUFDdkI7TUFDQSxJQUFJTCxPQUFPLENBQUNNLE1BQU0sRUFBRTtRQUNsQkosVUFBVSxDQUFDSyxJQUFJLENBQUNQLE9BQU8sQ0FBQ1EsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoQztNQUNGO01BQ0EsSUFBSVAsS0FBSyxFQUFFO1FBQ1QsT0FBT0MsVUFBVSxDQUFDSyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQzlCO01BQ0E7TUFDQSxJQUFJLENBQUNFLDhCQUE4QixDQUFDdkIsVUFBVSxFQUFFQyxNQUFNLEVBQUVZLGlCQUFpQixFQUFFRCxTQUFTLEVBQUUsSUFBSSxFQUFFVCxVQUFVLENBQUMsQ0FDcEdxQixFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFDLElBQUtULFVBQVUsQ0FBQ1UsSUFBSSxDQUFDLE9BQU8sRUFBRUQsQ0FBQyxDQUFDLENBQUMsQ0FDL0NELEVBQUUsQ0FBQyxNQUFNLEVBQUdHLE1BQU0sSUFBSztRQUN0QixJQUFJQSxNQUFNLENBQUNDLFdBQVcsRUFBRTtVQUN0QmYsaUJBQWlCLEdBQUdjLE1BQU0sQ0FBQ0UscUJBQXFCO1FBQ2xELENBQUMsTUFBTTtVQUNMZCxLQUFLLEdBQUcsSUFBSTtRQUNkO1FBQ0FELE9BQU8sR0FBR2EsTUFBTSxDQUFDYixPQUFPO1FBQ3hCRSxVQUFVLENBQUNHLEtBQUssQ0FBQyxDQUFDO01BQ3BCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxPQUFPSCxVQUFVO0VBQ25COztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBTyw4QkFBOEJBLENBQUN2QixVQUFVLEVBQUVDLE1BQU0sRUFBRVksaUJBQWlCLEVBQUVELFNBQVMsRUFBRWtCLE9BQU8sRUFBRTNCLFVBQVUsRUFBRTtJQUNwRyxJQUFJLENBQUMsSUFBQUUseUJBQWlCLEVBQUNMLFVBQVUsQ0FBQyxFQUFFO01BQ2xDLE1BQU0sSUFBSTdCLE1BQU0sQ0FBQ21DLHNCQUFzQixDQUFDLHVCQUF1QixHQUFHTixVQUFVLENBQUM7SUFDL0U7SUFDQSxJQUFJLENBQUMsSUFBQVMsZ0JBQVEsRUFBQ1IsTUFBTSxDQUFDLEVBQUU7TUFDckIsTUFBTSxJQUFJUyxTQUFTLENBQUMsbUNBQW1DLENBQUM7SUFDMUQ7SUFDQSxJQUFJLENBQUMsSUFBQUQsZ0JBQVEsRUFBQ0ksaUJBQWlCLENBQUMsRUFBRTtNQUNoQyxNQUFNLElBQUlILFNBQVMsQ0FBQyw4Q0FBOEMsQ0FBQztJQUNyRTtJQUNBLElBQUksQ0FBQyxJQUFBRCxnQkFBUSxFQUFDRyxTQUFTLENBQUMsRUFBRTtNQUN4QixNQUFNLElBQUlGLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQztJQUM3RDtJQUNBLElBQUksQ0FBQyxJQUFBcUIsZ0JBQVEsRUFBQ0QsT0FBTyxDQUFDLEVBQUU7TUFDdEIsTUFBTSxJQUFJcEIsU0FBUyxDQUFDLG9DQUFvQyxDQUFDO0lBQzNEO0lBQ0EsSUFBSSxDQUFDLElBQUFELGdCQUFRLEVBQUNOLFVBQVUsQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSU8sU0FBUyxDQUFDLHVDQUF1QyxDQUFDO0lBQzlEO0lBQ0EsSUFBSXNCLE9BQU8sR0FBRyxFQUFFOztJQUVoQjtJQUNBQSxPQUFPLENBQUNYLElBQUksQ0FBRSxhQUFZLENBQUM7SUFDM0JXLE9BQU8sQ0FBQ1gsSUFBSSxDQUFFLG1CQUFrQixDQUFDO0lBQ2pDO0lBQ0FXLE9BQU8sQ0FBQ1gsSUFBSSxDQUFFLFVBQVMsSUFBQVksaUJBQVMsRUFBQ2hDLE1BQU0sQ0FBRSxFQUFDLENBQUM7SUFDM0MrQixPQUFPLENBQUNYLElBQUksQ0FBRSxhQUFZLElBQUFZLGlCQUFTLEVBQUNyQixTQUFTLENBQUUsRUFBQyxDQUFDO0lBQ2pEb0IsT0FBTyxDQUFDWCxJQUFJLENBQUUsZUFBYyxDQUFDO0lBRTdCLElBQUlSLGlCQUFpQixFQUFFO01BQ3JCQSxpQkFBaUIsR0FBRyxJQUFBb0IsaUJBQVMsRUFBQ3BCLGlCQUFpQixDQUFDO01BQ2hEbUIsT0FBTyxDQUFDWCxJQUFJLENBQUUsc0JBQXFCUixpQkFBa0IsRUFBQyxDQUFDO0lBQ3pEO0lBQ0E7SUFDQSxJQUFJVixVQUFVLEVBQUU7TUFDZEEsVUFBVSxHQUFHLElBQUE4QixpQkFBUyxFQUFDOUIsVUFBVSxDQUFDO01BQ2xDNkIsT0FBTyxDQUFDWCxJQUFJLENBQUUsZUFBY2xCLFVBQVcsRUFBQyxDQUFDO0lBQzNDO0lBQ0E7SUFDQSxJQUFJMkIsT0FBTyxFQUFFO01BQ1gsSUFBSUEsT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQkEsT0FBTyxHQUFHLElBQUk7TUFDaEI7TUFDQUUsT0FBTyxDQUFDWCxJQUFJLENBQUUsWUFBV1MsT0FBUSxFQUFDLENBQUM7SUFDckM7SUFDQUUsT0FBTyxDQUFDRSxJQUFJLENBQUMsQ0FBQztJQUNkLElBQUlDLEtBQUssR0FBRyxFQUFFO0lBQ2QsSUFBSUgsT0FBTyxDQUFDWixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3RCZSxLQUFLLEdBQUksR0FBRUgsT0FBTyxDQUFDSSxJQUFJLENBQUMsR0FBRyxDQUFFLEVBQUM7SUFDaEM7SUFDQSxJQUFJQyxNQUFNLEdBQUcsS0FBSztJQUNsQixJQUFJQyxXQUFXLEdBQUdqRSxZQUFZLENBQUNrRSx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQ3pDLE1BQU0sQ0FBQzBDLFdBQVcsQ0FBQztNQUFFSCxNQUFNO01BQUVyQyxVQUFVO01BQUVtQztJQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUNWLENBQUMsRUFBRWdCLFFBQVEsS0FBSztNQUMzRixJQUFJaEIsQ0FBQyxFQUFFO1FBQ0wsT0FBT2EsV0FBVyxDQUFDWixJQUFJLENBQUMsT0FBTyxFQUFFRCxDQUFDLENBQUM7TUFDckM7TUFDQSxJQUFBaUIsaUJBQVMsRUFBQ0QsUUFBUSxFQUFFSCxXQUFXLENBQUM7SUFDbEMsQ0FBQyxDQUFDO0lBQ0YsT0FBT0EsV0FBVztFQUNwQjtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUFBSyxPQUFBLENBQUEvQyxVQUFBLEdBQUFBLFVBQUE7QUFBQSxJQUFBZ0QsUUFBQSxHQUNlaEQsVUFBVTtBQUFBK0MsT0FBQSxDQUFBOUQsT0FBQSxHQUFBK0QsUUFBQSJ9 /***/ }), @@ -76698,34 +80083,6 @@ exports.SelectResults = SelectResults; /***/ }), -/***/ 3826: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.callbackify = callbackify; -// wrapper an async function that support callback style API. -// It will preserve 'this'. -function callbackify(fn) { - return function () { - const args = [...arguments]; - const callback = args.pop(); - - // If the last argument is a function, assume it's the callback. - if (typeof callback === 'function') { - return fn.apply(this, args).then(result => callback(null, result), err => callback(err)); - } - return fn.apply(this, arguments); - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsYmFja2lmeSIsImZuIiwiYXJncyIsImFyZ3VtZW50cyIsImNhbGxiYWNrIiwicG9wIiwiYXBwbHkiLCJ0aGVuIiwicmVzdWx0IiwiZXJyIl0sInNvdXJjZXMiOlsiY2FsbGJhY2tpZnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gd3JhcHBlciBhbiBhc3luYyBmdW5jdGlvbiB0aGF0IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUgQVBJLlxuLy8gSXQgd2lsbCBwcmVzZXJ2ZSAndGhpcycuXG5leHBvcnQgZnVuY3Rpb24gY2FsbGJhY2tpZnkoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gWy4uLmFyZ3VtZW50c11cbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKClcblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIHRoZSBjYWxsYmFjay5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncykudGhlbihcbiAgICAgICAgKHJlc3VsdCkgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0KSxcbiAgICAgICAgKGVycikgPT4gY2FsbGJhY2soZXJyKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDTyxTQUFTQSxXQUFXQSxDQUFDQyxFQUFFLEVBQUU7RUFDOUIsT0FBTyxZQUFZO0lBQ2pCLE1BQU1DLElBQUksR0FBRyxDQUFDLEdBQUdDLFNBQVMsQ0FBQztJQUMzQixNQUFNQyxRQUFRLEdBQUdGLElBQUksQ0FBQ0csR0FBRyxDQUFDLENBQUM7O0lBRTNCO0lBQ0EsSUFBSSxPQUFPRCxRQUFRLEtBQUssVUFBVSxFQUFFO01BQ2xDLE9BQU9ILEVBQUUsQ0FBQ0ssS0FBSyxDQUFDLElBQUksRUFBRUosSUFBSSxDQUFDLENBQUNLLElBQUksQ0FDN0JDLE1BQU0sSUFBS0osUUFBUSxDQUFDLElBQUksRUFBRUksTUFBTSxDQUFDLEVBQ2pDQyxHQUFHLElBQUtMLFFBQVEsQ0FBQ0ssR0FBRyxDQUN2QixDQUFDO0lBQ0g7SUFFQSxPQUFPUixFQUFFLENBQUNLLEtBQUssQ0FBQyxJQUFJLEVBQUVILFNBQVMsQ0FBQztFQUNsQyxDQUFDO0FBQ0gifQ== - -/***/ }), - /***/ 5586: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -76737,25 +80094,16 @@ Object.defineProperty(exports, "__esModule", ({ })); var http = _interopRequireWildcard(__nccwpck_require__(3685), true); var https = _interopRequireWildcard(__nccwpck_require__(5687), true); -var _browserOrNode = __nccwpck_require__(9107); var _lodash = __nccwpck_require__(250); -var qs = _interopRequireWildcard(__nccwpck_require__(293), true); -var _xml2js = __nccwpck_require__(4659); var _CredentialProvider = __nccwpck_require__(6570); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helpers = __nccwpck_require__(9455); -var _signing = __nccwpck_require__(2029); -var _extensions = __nccwpck_require__(1159); var _helper = __nccwpck_require__(9921); -var _request = __nccwpck_require__(9093); -var _response = __nccwpck_require__(2644); var _s3Endpoints = __nccwpck_require__(6314); -var xmlParsers = _interopRequireWildcard(__nccwpck_require__(4040), true); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // will be replaced by bundler. const Package = { - version: "7.1.3" || 0 + version: "7.1.1" || 0 }; const requestOptionProperties = ['agent', 'ca', 'cert', 'ciphers', 'clientCertEngine', 'crl', 'dhparam', 'ecdhCurve', 'family', 'honorCipherOrder', 'key', 'passphrase', 'pfx', 'rejectUnauthorized', 'secureOptions', 'secureProtocol', 'servername', 'sessionIdContext']; class TypedClient { @@ -76877,14 +80225,6 @@ class TypedClient { this.enableSHA256 = !this.anonymous && !params.useSSL; this.s3AccelerateEndpoint = params.s3AccelerateEndpoint || undefined; this.reqOptions = {}; - this.clientExtensions = new _extensions.Extensions(this); - } - - /** - * Minio extensions that aren't necessary present for Amazon S3 compatible storage servers - */ - get extensions() { - return this.clientExtensions; } /** @@ -77034,581 +80374,9 @@ class TypedClient { } } } - /** - * log the request, response, error - */ - logHTTP(reqOptions, response, err) { - // if no logStream available return. - if (!this.logStream) { - return; - } - if (!(0, _helper.isObject)(reqOptions)) { - throw new TypeError('reqOptions should be of type "object"'); - } - if (response && !(0, _helper.isReadableStream)(response)) { - throw new TypeError('response should be of type "Stream"'); - } - if (err && !(err instanceof Error)) { - throw new TypeError('err should be of type "Error"'); - } - const logStream = this.logStream; - const logHeaders = headers => { - Object.entries(headers).forEach(([k, v]) => { - if (k == 'authorization') { - if ((0, _helper.isString)(v)) { - const redactor = new RegExp('Signature=([0-9a-f]+)'); - v = v.replace(redactor, 'Signature=**REDACTED**'); - } - } - logStream.write(`${k}: ${v}\n`); - }); - logStream.write('\n'); - }; - logStream.write(`REQUEST: ${reqOptions.method} ${reqOptions.path}\n`); - logHeaders(reqOptions.headers); - if (response) { - this.logStream.write(`RESPONSE: ${response.statusCode}\n`); - logHeaders(response.headers); - } - if (err) { - logStream.write('ERROR BODY:\n'); - const errJSON = JSON.stringify(err, null, '\t'); - logStream.write(`${errJSON}\n`); - } - } - - /** - * Enable tracing - */ - traceOn(stream) { - if (!stream) { - stream = process.stdout; - } - this.logStream = stream; - } - - /** - * Disable tracing - */ - traceOff() { - this.logStream = undefined; - } - - /** - * makeRequest is the primitive used by the apis for making S3 requests. - * payload can be empty string in case of no payload. - * statusCode is the expected statusCode. If response.statusCode does not match - * we parse the XML error and call the callback with the error message. - * - * A valid region is passed by the calls - listBuckets, makeBucket and getBucketRegion. - * - * @internal - */ - async makeRequestAsync(options, payload = '', expectedCodes = [200], region = '') { - if (!(0, _helper.isObject)(options)) { - throw new TypeError('options should be of type "object"'); - } - if (!(0, _helper.isString)(payload) && !(0, _helper.isObject)(payload)) { - // Buffer is of type 'object' - throw new TypeError('payload should be of type "string" or "Buffer"'); - } - expectedCodes.forEach(statusCode => { - if (!(0, _helper.isNumber)(statusCode)) { - throw new TypeError('statusCode should be of type "number"'); - } - }); - if (!(0, _helper.isString)(region)) { - throw new TypeError('region should be of type "string"'); - } - if (!options.headers) { - options.headers = {}; - } - if (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE') { - options.headers['content-length'] = payload.length.toString(); - } - const sha256sum = this.enableSHA256 ? (0, _helper.toSha256)(payload) : ''; - return this.makeRequestStreamAsync(options, payload, sha256sum, expectedCodes, region); - } - - /** - * new request with promise - * - * No need to drain response, response body is not valid - */ - async makeRequestAsyncOmit(options, payload = '', statusCodes = [200], region = '') { - const res = await this.makeRequestAsync(options, payload, statusCodes, region); - await (0, _response.drainResponse)(res); - return res; - } - - /** - * makeRequestStream will be used directly instead of makeRequest in case the payload - * is available as a stream. for ex. putObject - * - * @internal - */ - async makeRequestStreamAsync(options, body, sha256sum, statusCodes, region) { - if (!(0, _helper.isObject)(options)) { - throw new TypeError('options should be of type "object"'); - } - if (!(Buffer.isBuffer(body) || typeof body === 'string' || (0, _helper.isReadableStream)(body))) { - throw new errors.InvalidArgumentError(`stream should be a Buffer, string or readable Stream, got ${typeof body} instead`); - } - if (!(0, _helper.isString)(sha256sum)) { - throw new TypeError('sha256sum should be of type "string"'); - } - statusCodes.forEach(statusCode => { - if (!(0, _helper.isNumber)(statusCode)) { - throw new TypeError('statusCode should be of type "number"'); - } - }); - if (!(0, _helper.isString)(region)) { - throw new TypeError('region should be of type "string"'); - } - // sha256sum will be empty for anonymous or https requests - if (!this.enableSHA256 && sha256sum.length !== 0) { - throw new errors.InvalidArgumentError(`sha256sum expected to be empty for anonymous or https requests`); - } - // sha256sum should be valid for non-anonymous http requests. - if (this.enableSHA256 && sha256sum.length !== 64) { - throw new errors.InvalidArgumentError(`Invalid sha256sum : ${sha256sum}`); - } - await this.checkAndRefreshCreds(); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - region = region || (await this.getBucketRegionAsync(options.bucketName)); - const reqOptions = this.getRequestOptions({ - ...options, - region - }); - if (!this.anonymous) { - // For non-anonymous https requests sha256sum is 'UNSIGNED-PAYLOAD' for signature calculation. - if (!this.enableSHA256) { - sha256sum = 'UNSIGNED-PAYLOAD'; - } - const date = new Date(); - reqOptions.headers['x-amz-date'] = (0, _helper.makeDateLong)(date); - reqOptions.headers['x-amz-content-sha256'] = sha256sum; - if (this.sessionToken) { - reqOptions.headers['x-amz-security-token'] = this.sessionToken; - } - reqOptions.headers.authorization = (0, _signing.signV4)(reqOptions, this.accessKey, this.secretKey, region, date, sha256sum); - } - const response = await (0, _request.request)(this.transport, reqOptions, body); - if (!response.statusCode) { - throw new Error("BUG: response doesn't have a statusCode"); - } - if (!statusCodes.includes(response.statusCode)) { - // For an incorrect region, S3 server always sends back 400. - // But we will do cache invalidation for all errors so that, - // in future, if AWS S3 decides to send a different status code or - // XML error code we will still work fine. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - delete this.regionMap[options.bucketName]; - const err = await xmlParsers.parseResponseError(response); - this.logHTTP(reqOptions, response, err); - throw err; - } - this.logHTTP(reqOptions, response); - return response; - } - - /** - * gets the region of the bucket - * - * @param bucketName - * - * @internal - */ - async getBucketRegionAsync(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`); - } - - // Region is set with constructor, return the region right here. - if (this.region) { - return this.region; - } - const cached = this.regionMap[bucketName]; - if (cached) { - return cached; - } - const extractRegionAsync = async response => { - const body = await (0, _response.readAsString)(response); - const region = xmlParsers.parseBucketRegion(body) || _helpers.DEFAULT_REGION; - this.regionMap[bucketName] = region; - return region; - }; - const method = 'GET'; - const query = 'location'; - // `getBucketLocation` behaves differently in following ways for - // different environments. - // - // - For nodejs env we default to path style requests. - // - For browser env path style requests on buckets yields CORS - // error. To circumvent this problem we make a virtual host - // style request signed with 'us-east-1'. This request fails - // with an error 'AuthorizationHeaderMalformed', additionally - // the error XML also provides Region of the bucket. To validate - // this region is proper we retry the same request with the newly - // obtained region. - const pathStyle = this.pathStyle && !_browserOrNode.isBrowser; - let region; - try { - const res = await this.makeRequestAsync({ - method, - bucketName, - query, - pathStyle - }, '', [200], _helpers.DEFAULT_REGION); - return extractRegionAsync(res); - } catch (e) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - if (!(e.name === 'AuthorizationHeaderMalformed')) { - throw e; - } - // @ts-expect-error we set extra properties on error object - region = e.Region; - if (!region) { - throw e; - } - } - const res = await this.makeRequestAsync({ - method, - bucketName, - query, - pathStyle - }, '', [200], region); - return await extractRegionAsync(res); - } - - /** - * makeRequest is the primitive used by the apis for making S3 requests. - * payload can be empty string in case of no payload. - * statusCode is the expected statusCode. If response.statusCode does not match - * we parse the XML error and call the callback with the error message. - * A valid region is passed by the calls - listBuckets, makeBucket and - * getBucketRegion. - * - * @deprecated use `makeRequestAsync` instead - */ - makeRequest(options, payload = '', expectedCodes = [200], region = '', returnResponse, cb) { - let prom; - if (returnResponse) { - prom = this.makeRequestAsync(options, payload, expectedCodes, region); - } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error compatible for old behaviour - prom = this.makeRequestAsyncOmit(options, payload, expectedCodes, region); - } - prom.then(result => cb(null, result), err => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - cb(err); - }); - } - - /** - * makeRequestStream will be used directly instead of makeRequest in case the payload - * is available as a stream. for ex. putObject - * - * @deprecated use `makeRequestStreamAsync` instead - */ - makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb) { - const executor = async () => { - const res = await this.makeRequestStreamAsync(options, stream, sha256sum, statusCodes, region); - if (!returnResponse) { - await (0, _response.drainResponse)(res); - } - return res; - }; - executor().then(result => cb(null, result), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - err => cb(err)); - } - - /** - * @deprecated use `getBucketRegionAsync` instead - */ - getBucketRegion(bucketName, cb) { - return this.getBucketRegionAsync(bucketName).then(result => cb(null, result), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - err => cb(err)); - } - - /** - * @deprecated use promise style API - */ - - async removeBucket(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'DELETE'; - await this.makeRequestAsyncOmit({ - method, - bucketName - }, '', [204]); - delete this.regionMap[bucketName]; - } - - /** - * Stat information of the object. - */ - async statObject(bucketName, objectName, statOpts = {}) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(statOpts)) { - throw new errors.InvalidArgumentError('statOpts should be of type "object"'); - } - const query = qs.stringify(statOpts); - const method = 'HEAD'; - const res = await this.makeRequestAsyncOmit({ - method, - bucketName, - objectName, - query - }); - return { - size: parseInt(res.headers['content-length']), - metaData: (0, _helper.extractMetadata)(res.headers), - lastModified: new Date(res.headers['last-modified']), - versionId: (0, _helper.getVersionId)(res.headers), - etag: (0, _helper.sanitizeETag)(res.headers.etag) - }; - } - - /** - * Remove the specified object. - * @deprecated use new promise style API - */ - - /** - * @deprecated use new promise style API - */ // @ts-ignore - async removeObject(bucketName, objectName, removeOpts = {}) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(removeOpts)) { - throw new errors.InvalidArgumentError('removeOpts should be of type "object"'); - } - const method = 'DELETE'; - const headers = {}; - if (removeOpts.governanceBypass) { - headers['X-Amz-Bypass-Governance-Retention'] = true; - } - if (removeOpts.forceDelete) { - headers['x-minio-force-delete'] = true; - } - const queryParams = {}; - if (removeOpts.versionId) { - queryParams.versionId = `${removeOpts.versionId}`; - } - const query = qs.stringify(queryParams); - await this.makeRequestAsyncOmit({ - method, - bucketName, - objectName, - headers, - query - }, '', [200, 204]); - } - - // Calls implemented below are related to multipart. - - /** - * Initiate a new multipart upload. - * @internal - */ - async initiateNewMultipartUpload(bucketName, objectName, headers) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(headers)) { - throw new errors.InvalidObjectNameError('contentType should be of type "object"'); - } - const method = 'POST'; - const query = 'uploads'; - const res = await this.makeRequestAsync({ - method, - bucketName, - objectName, - query, - headers - }); - const body = await (0, _response.readAsBuffer)(res); - return (0, xmlParsers.parseInitiateMultipart)(body.toString()); - } - - /** - * Internal Method to abort a multipart upload request in case of any errors. - * - * @param bucketName - Bucket Name - * @param objectName - Object Name - * @param uploadId - id of a multipart upload to cancel during compose object sequence. - */ - async abortMultipartUpload(bucketName, objectName, uploadId) { - const method = 'DELETE'; - const query = `uploadId=${uploadId}`; - const requestOptions = { - method, - bucketName, - objectName: objectName, - query - }; - await this.makeRequestAsyncOmit(requestOptions, '', [204]); - } - - /** - * Get part-info of all parts of an incomplete upload specified by uploadId. - */ - async listParts(bucketName, objectName, uploadId) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isString)(uploadId)) { - throw new TypeError('uploadId should be of type "string"'); - } - if (!uploadId) { - throw new errors.InvalidArgumentError('uploadId cannot be empty'); - } - const parts = []; - let marker = 0; - let result; - do { - result = await this.listPartsQuery(bucketName, objectName, uploadId, marker); - marker = result.marker; - parts.push(...result.parts); - } while (result.isTruncated); - return parts; - } - - /** - * Called by listParts to fetch a batch of part-info - */ - async listPartsQuery(bucketName, objectName, uploadId, marker) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isString)(uploadId)) { - throw new TypeError('uploadId should be of type "string"'); - } - if (!(0, _helper.isNumber)(marker)) { - throw new TypeError('marker should be of type "number"'); - } - if (!uploadId) { - throw new errors.InvalidArgumentError('uploadId cannot be empty'); - } - let query = `uploadId=${(0, _helper.uriEscape)(uploadId)}`; - if (marker) { - query += `&part-number-marker=${marker}`; - } - const method = 'GET'; - const res = await this.makeRequestAsync({ - method, - bucketName, - objectName, - query - }); - return xmlParsers.parseListParts(await (0, _response.readAsString)(res)); - } - async listBuckets() { - const method = 'GET'; - const httpRes = await this.makeRequestAsync({ - method - }, '', [200], _helpers.DEFAULT_REGION); - const xmlResult = await (0, _response.readAsString)(httpRes); - return xmlParsers.parseListBucket(xmlResult); - } - async removeBucketReplication(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'DELETE'; - const query = 'replication'; - await this.makeRequestAsyncOmit({ - method, - bucketName, - query - }, '', [200, 204], ''); - } - async setBucketReplication(bucketName, replicationConfig) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isObject)(replicationConfig)) { - throw new errors.InvalidArgumentError('replicationConfig should be of type "object"'); - } else { - if (_lodash.isEmpty(replicationConfig.role)) { - throw new errors.InvalidArgumentError('Role cannot be empty'); - } else if (replicationConfig.role && !(0, _helper.isString)(replicationConfig.role)) { - throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role); - } - if (_lodash.isEmpty(replicationConfig.rules)) { - throw new errors.InvalidArgumentError('Minimum one replication rule must be specified'); - } - } - const method = 'PUT'; - const query = 'replication'; - const headers = {}; - const replicationParamsConfig = { - ReplicationConfiguration: { - Role: replicationConfig.role, - Rule: replicationConfig.rules - } - }; - const builder = new _xml2js.Builder({ - renderOpts: { - pretty: false - }, - headless: true - }); - const payload = builder.buildObject(replicationParamsConfig); - headers['Content-MD5'] = (0, _helper.toMd5)(payload); - await this.makeRequestAsyncOmit({ - method, - bucketName, - query, - headers - }, payload); - } - async getBucketReplication(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'GET'; - const query = 'replication'; - const httpRes = await this.makeRequestAsync({ - method, - bucketName, - query - }, '', [200, 204]); - const xmlResult = await (0, _response.readAsString)(httpRes); - return xmlParsers.parseReplicationConfig(xmlResult); - } } exports.TypedClient = TypedClient; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiaHR0cHMiLCJfYnJvd3Nlck9yTm9kZSIsIl9sb2Rhc2giLCJxcyIsIl94bWwyanMiLCJfQ3JlZGVudGlhbFByb3ZpZGVyIiwiZXJyb3JzIiwiX2hlbHBlcnMiLCJfc2lnbmluZyIsIl9leHRlbnNpb25zIiwiX2hlbHBlciIsIl9yZXF1ZXN0IiwiX3Jlc3BvbnNlIiwiX3MzRW5kcG9pbnRzIiwieG1sUGFyc2VycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJQYWNrYWdlIiwidmVyc2lvbiIsInJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzIiwiVHlwZWRDbGllbnQiLCJwYXJ0U2l6ZSIsIm1heGltdW1QYXJ0U2l6ZSIsIm1heE9iamVjdFNpemUiLCJjb25zdHJ1Y3RvciIsInBhcmFtcyIsInNlY3VyZSIsInVuZGVmaW5lZCIsIkVycm9yIiwidXNlU1NMIiwicG9ydCIsImlzVmFsaWRFbmRwb2ludCIsImVuZFBvaW50IiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJpc1ZhbGlkUG9ydCIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNCb29sZWFuIiwicmVnaW9uIiwiaXNTdHJpbmciLCJob3N0IiwidG9Mb3dlckNhc2UiLCJwcm90b2NvbCIsInRyYW5zcG9ydCIsInRyYW5zcG9ydEFnZW50IiwiZ2xvYmFsQWdlbnQiLCJpc09iamVjdCIsImxpYnJhcnlDb21tZW50cyIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImFyY2giLCJsaWJyYXJ5QWdlbnQiLCJ1c2VyQWdlbnQiLCJwYXRoU3R5bGUiLCJhY2Nlc3NLZXkiLCJzZWNyZXRLZXkiLCJzZXNzaW9uVG9rZW4iLCJhbm9ueW1vdXMiLCJjcmVkZW50aWFsc1Byb3ZpZGVyIiwicmVnaW9uTWFwIiwib3ZlclJpZGVQYXJ0U2l6ZSIsImVuYWJsZVNIQTI1NiIsInMzQWNjZWxlcmF0ZUVuZHBvaW50IiwicmVxT3B0aW9ucyIsImNsaWVudEV4dGVuc2lvbnMiLCJFeHRlbnNpb25zIiwiZXh0ZW5zaW9ucyIsInNldFMzVHJhbnNmZXJBY2NlbGVyYXRlIiwic2V0UmVxdWVzdE9wdGlvbnMiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwiXyIsInBpY2siLCJnZXRBY2NlbGVyYXRlRW5kUG9pbnRJZlNldCIsImJ1Y2tldE5hbWUiLCJvYmplY3ROYW1lIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwiZ2V0UmVxdWVzdE9wdGlvbnMiLCJvcHRzIiwibWV0aG9kIiwiaGVhZGVycyIsInF1ZXJ5IiwiYWdlbnQiLCJ2aXJ0dWFsSG9zdFN0eWxlIiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicGF0aCIsInVyaVJlc291cmNlRXNjYXBlIiwiaXNBbWF6b25FbmRwb2ludCIsImFjY2VsZXJhdGVFbmRQb2ludCIsImdldFMzRW5kcG9pbnQiLCJrIiwidiIsImVudHJpZXMiLCJhc3NpZ24iLCJtYXBWYWx1ZXMiLCJwaWNrQnkiLCJpc0RlZmluZWQiLCJ0b1N0cmluZyIsInNldENyZWRlbnRpYWxzUHJvdmlkZXIiLCJDcmVkZW50aWFsUHJvdmlkZXIiLCJjaGVja0FuZFJlZnJlc2hDcmVkcyIsImNyZWRlbnRpYWxzQ29uZiIsImdldENyZWRlbnRpYWxzIiwiZ2V0QWNjZXNzS2V5IiwiZ2V0U2VjcmV0S2V5IiwiZ2V0U2Vzc2lvblRva2VuIiwiZSIsImNhdXNlIiwibG9nSFRUUCIsInJlc3BvbnNlIiwiZXJyIiwibG9nU3RyZWFtIiwiaXNSZWFkYWJsZVN0cmVhbSIsImxvZ0hlYWRlcnMiLCJmb3JFYWNoIiwicmVkYWN0b3IiLCJSZWdFeHAiLCJyZXBsYWNlIiwid3JpdGUiLCJzdGF0dXNDb2RlIiwiZXJySlNPTiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZU9uIiwic3RyZWFtIiwic3Rkb3V0IiwidHJhY2VPZmYiLCJtYWtlUmVxdWVzdEFzeW5jIiwicGF5bG9hZCIsImV4cGVjdGVkQ29kZXMiLCJpc051bWJlciIsImxlbmd0aCIsInNoYTI1NnN1bSIsInRvU2hhMjU2IiwibWFrZVJlcXVlc3RTdHJlYW1Bc3luYyIsIm1ha2VSZXF1ZXN0QXN5bmNPbWl0Iiwic3RhdHVzQ29kZXMiLCJyZXMiLCJkcmFpblJlc3BvbnNlIiwiYm9keSIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZ2V0QnVja2V0UmVnaW9uQXN5bmMiLCJkYXRlIiwiRGF0ZSIsIm1ha2VEYXRlTG9uZyIsImF1dGhvcml6YXRpb24iLCJzaWduVjQiLCJyZXF1ZXN0IiwicGFyc2VSZXNwb25zZUVycm9yIiwiaXNWYWxpZEJ1Y2tldE5hbWUiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiY2FjaGVkIiwiZXh0cmFjdFJlZ2lvbkFzeW5jIiwicmVhZEFzU3RyaW5nIiwicGFyc2VCdWNrZXRSZWdpb24iLCJERUZBVUxUX1JFR0lPTiIsImlzQnJvd3NlciIsIm5hbWUiLCJSZWdpb24iLCJtYWtlUmVxdWVzdCIsInJldHVyblJlc3BvbnNlIiwiY2IiLCJwcm9tIiwidGhlbiIsInJlc3VsdCIsIm1ha2VSZXF1ZXN0U3RyZWFtIiwiZXhlY3V0b3IiLCJnZXRCdWNrZXRSZWdpb24iLCJyZW1vdmVCdWNrZXQiLCJzdGF0T2JqZWN0Iiwic3RhdE9wdHMiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJzaXplIiwicGFyc2VJbnQiLCJtZXRhRGF0YSIsImV4dHJhY3RNZXRhZGF0YSIsImxhc3RNb2RpZmllZCIsInZlcnNpb25JZCIsImdldFZlcnNpb25JZCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJyZW1vdmVPYmplY3QiLCJyZW1vdmVPcHRzIiwiZ292ZXJuYW5jZUJ5cGFzcyIsImZvcmNlRGVsZXRlIiwicXVlcnlQYXJhbXMiLCJpbml0aWF0ZU5ld011bHRpcGFydFVwbG9hZCIsInJlYWRBc0J1ZmZlciIsInBhcnNlSW5pdGlhdGVNdWx0aXBhcnQiLCJhYm9ydE11bHRpcGFydFVwbG9hZCIsInVwbG9hZElkIiwicmVxdWVzdE9wdGlvbnMiLCJsaXN0UGFydHMiLCJwYXJ0cyIsIm1hcmtlciIsImxpc3RQYXJ0c1F1ZXJ5IiwicHVzaCIsImlzVHJ1bmNhdGVkIiwidXJpRXNjYXBlIiwicGFyc2VMaXN0UGFydHMiLCJsaXN0QnVja2V0cyIsImh0dHBSZXMiLCJ4bWxSZXN1bHQiLCJwYXJzZUxpc3RCdWNrZXQiLCJyZW1vdmVCdWNrZXRSZXBsaWNhdGlvbiIsInNldEJ1Y2tldFJlcGxpY2F0aW9uIiwicmVwbGljYXRpb25Db25maWciLCJyb2xlIiwicnVsZXMiLCJyZXBsaWNhdGlvblBhcmFtc0NvbmZpZyIsIlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIsIlJvbGUiLCJSdWxlIiwiYnVpbGRlciIsInhtbDJqcyIsIkJ1aWxkZXIiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwiaGVhZGxlc3MiLCJidWlsZE9iamVjdCIsInRvTWQ1IiwiZ2V0QnVja2V0UmVwbGljYXRpb24iLCJwYXJzZVJlcGxpY2F0aW9uQ29uZmlnIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbImNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBodHRwIGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ25vZGU6aHR0cHMnXG5pbXBvcnQgdHlwZSAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnYnJvd3Nlci1vci1ub2RlJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXMgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHhtbDJqcyBmcm9tICd4bWwyanMnXG5cbmltcG9ydCB7IENyZWRlbnRpYWxQcm92aWRlciB9IGZyb20gJy4uL0NyZWRlbnRpYWxQcm92aWRlci50cydcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBERUZBVUxUX1JFR0lPTiB9IGZyb20gJy4uL2hlbHBlcnMudHMnXG5pbXBvcnQgeyBzaWduVjQgfSBmcm9tICcuLi9zaWduaW5nLnRzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy50cydcbmltcG9ydCB7XG4gIGV4dHJhY3RNZXRhZGF0YSxcbiAgZ2V0VmVyc2lvbklkLFxuICBpc0FtYXpvbkVuZHBvaW50LFxuICBpc0Jvb2xlYW4sXG4gIGlzRGVmaW5lZCxcbiAgaXNFbXB0eSxcbiAgaXNOdW1iZXIsXG4gIGlzT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1N0cmluZyxcbiAgaXNWYWxpZEJ1Y2tldE5hbWUsXG4gIGlzVmFsaWRFbmRwb2ludCxcbiAgaXNWYWxpZE9iamVjdE5hbWUsXG4gIGlzVmFsaWRQb3J0LFxuICBpc1ZpcnR1YWxIb3N0U3R5bGUsXG4gIG1ha2VEYXRlTG9uZyxcbiAgc2FuaXRpemVFVGFnLFxuICB0b01kNSxcbiAgdG9TaGEyNTYsXG4gIHVyaUVzY2FwZSxcbiAgdXJpUmVzb3VyY2VFc2NhcGUsXG59IGZyb20gJy4vaGVscGVyLnRzJ1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdC50cydcbmltcG9ydCB7IGRyYWluUmVzcG9uc2UsIHJlYWRBc0J1ZmZlciwgcmVhZEFzU3RyaW5nIH0gZnJvbSAnLi9yZXNwb25zZS50cydcbmltcG9ydCB0eXBlIHsgUmVnaW9uIH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgeyBnZXRTM0VuZHBvaW50IH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgdHlwZSB7XG4gIEJpbmFyeSxcbiAgQnVja2V0SXRlbUZyb21MaXN0LFxuICBCdWNrZXRJdGVtU3RhdCxcbiAgSVJlcXVlc3QsXG4gIFJlcGxpY2F0aW9uQ29uZmlnLFxuICBSZXBsaWNhdGlvbkNvbmZpZ09wdHMsXG4gIFJlcXVlc3RIZWFkZXJzLFxuICBSZXNwb25zZUhlYWRlcixcbiAgUmVzdWx0Q2FsbGJhY2ssXG4gIFN0YXRPYmplY3RPcHRzLFxuICBUcmFuc3BvcnQsXG59IGZyb20gJy4vdHlwZS50cydcbmltcG9ydCB0eXBlIHsgVXBsb2FkZWRQYXJ0IH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuaW1wb3J0ICogYXMgeG1sUGFyc2VycyBmcm9tICcuL3htbC1wYXJzZXIudHMnXG5pbXBvcnQgeyBwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJ1bmRsZXIuXG5jb25zdCBQYWNrYWdlID0geyB2ZXJzaW9uOiBwcm9jZXNzLmVudi5NSU5JT19KU19QQUNLQUdFX1ZFUlNJT04gfHwgJ2RldmVsb3BtZW50JyB9XG5cbmNvbnN0IHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzID0gW1xuICAnYWdlbnQnLFxuICAnY2EnLFxuICAnY2VydCcsXG4gICdjaXBoZXJzJyxcbiAgJ2NsaWVudENlcnRFbmdpbmUnLFxuICAnY3JsJyxcbiAgJ2RocGFyYW0nLFxuICAnZWNkaEN1cnZlJyxcbiAgJ2ZhbWlseScsXG4gICdob25vckNpcGhlck9yZGVyJyxcbiAgJ2tleScsXG4gICdwYXNzcGhyYXNlJyxcbiAgJ3BmeCcsXG4gICdyZWplY3RVbmF1dGhvcml6ZWQnLFxuICAnc2VjdXJlT3B0aW9ucycsXG4gICdzZWN1cmVQcm90b2NvbCcsXG4gICdzZXJ2ZXJuYW1lJyxcbiAgJ3Nlc3Npb25JZENvbnRleHQnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICBlbmRQb2ludDogc3RyaW5nXG4gIGFjY2Vzc0tleTogc3RyaW5nXG4gIHNlY3JldEtleTogc3RyaW5nXG4gIHVzZVNTTD86IGJvb2xlYW5cbiAgcG9ydD86IG51bWJlclxuICByZWdpb24/OiBSZWdpb25cbiAgdHJhbnNwb3J0PzogVHJhbnNwb3J0XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBwYXJ0U2l6ZT86IG51bWJlclxuICBwYXRoU3R5bGU/OiBib29sZWFuXG4gIGNyZWRlbnRpYWxzUHJvdmlkZXI/OiBDcmVkZW50aWFsUHJvdmlkZXJcbiAgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgdHJhbnNwb3J0QWdlbnQ/OiBodHRwLkFnZW50XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb24gPSBQYXJ0aWFsPElSZXF1ZXN0PiAmIHtcbiAgbWV0aG9kOiBzdHJpbmdcbiAgYnVja2V0TmFtZT86IHN0cmluZ1xuICBvYmplY3ROYW1lPzogc3RyaW5nXG4gIHF1ZXJ5Pzogc3RyaW5nXG4gIHBhdGhTdHlsZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgTm9SZXN1bHRDYWxsYmFjayA9IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZU9wdGlvbnMge1xuICB2ZXJzaW9uSWQ/OiBzdHJpbmdcbiAgZ292ZXJuYW5jZUJ5cGFzcz86IGJvb2xlYW5cbiAgZm9yY2VEZWxldGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlZENsaWVudCB7XG4gIHByb3RlY3RlZCB0cmFuc3BvcnQ6IFRyYW5zcG9ydFxuICBwcm90ZWN0ZWQgaG9zdDogc3RyaW5nXG4gIHByb3RlY3RlZCBwb3J0OiBudW1iZXJcbiAgcHJvdGVjdGVkIHByb3RvY29sOiBzdHJpbmdcbiAgcHJvdGVjdGVkIGFjY2Vzc0tleTogc3RyaW5nXG4gIHByb3RlY3RlZCBzZWNyZXRLZXk6IHN0cmluZ1xuICBwcm90ZWN0ZWQgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIHByb3RlY3RlZCB1c2VyQWdlbnQ6IHN0cmluZ1xuICBwcm90ZWN0ZWQgYW5vbnltb3VzOiBib29sZWFuXG4gIHByb3RlY3RlZCBwYXRoU3R5bGU6IGJvb2xlYW5cbiAgcHJvdGVjdGVkIHJlZ2lvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaWMgcmVnaW9uPzogc3RyaW5nXG4gIHByb3RlY3RlZCBjcmVkZW50aWFsc1Byb3ZpZGVyPzogQ3JlZGVudGlhbFByb3ZpZGVyXG4gIHBhcnRTaXplOiBudW1iZXIgPSA2NCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBvdmVyUmlkZVBhcnRTaXplPzogYm9vbGVhblxuXG4gIHByb3RlY3RlZCBtYXhpbXVtUGFydFNpemUgPSA1ICogMTAyNCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBtYXhPYmplY3RTaXplID0gNSAqIDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjRcbiAgcHVibGljIGVuYWJsZVNIQTI1NjogYm9vbGVhblxuICBwcm90ZWN0ZWQgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgcHJvdGVjdGVkIHJlcU9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgcHJvdGVjdGVkIHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50RXh0ZW5zaW9uczogRXh0ZW5zaW9uc1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogQ2xpZW50T3B0aW9ucykge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGVwcmVjYXRlZCBwcm9wZXJ0eVxuICAgIGlmIChwYXJhbXMuc2VjdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJzZWN1cmVcIiBvcHRpb24gZGVwcmVjYXRlZCwgXCJ1c2VTU0xcIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkJylcbiAgICB9XG4gICAgLy8gRGVmYXVsdCB2YWx1ZXMgaWYgbm90IHNwZWNpZmllZC5cbiAgICBpZiAocGFyYW1zLnVzZVNTTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudXNlU1NMID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wb3J0KSB7XG4gICAgICBwYXJhbXMucG9ydCA9IDBcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgcGFyYW1zLlxuICAgIGlmICghaXNWYWxpZEVuZHBvaW50KHBhcmFtcy5lbmRQb2ludCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEVuZHBvaW50RXJyb3IoYEludmFsaWQgZW5kUG9pbnQgOiAke3BhcmFtcy5lbmRQb2ludH1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQb3J0KHBhcmFtcy5wb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSW52YWxpZCBwb3J0IDogJHtwYXJhbXMucG9ydH1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihwYXJhbXMudXNlU1NMKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYEludmFsaWQgdXNlU1NMIGZsYWcgdHlwZSA6ICR7cGFyYW1zLnVzZVNTTH0sIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgXCJib29sZWFuXCJgLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJlZ2lvbiBvbmx5IGlmIGl0cyBzZXQuXG4gICAgaWYgKHBhcmFtcy5yZWdpb24pIHtcbiAgICAgIGlmICghaXNTdHJpbmcocGFyYW1zLnJlZ2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSW52YWxpZCByZWdpb24gOiAke3BhcmFtcy5yZWdpb259YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBob3N0ID0gcGFyYW1zLmVuZFBvaW50LnRvTG93ZXJDYXNlKClcbiAgICBsZXQgcG9ydCA9IHBhcmFtcy5wb3J0XG4gICAgbGV0IHByb3RvY29sOiBzdHJpbmdcbiAgICBsZXQgdHJhbnNwb3J0XG4gICAgbGV0IHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG4gICAgLy8gVmFsaWRhdGUgaWYgY29uZmlndXJhdGlvbiBpcyBub3QgdXNpbmcgU1NMXG4gICAgLy8gZm9yIGNvbnN0cnVjdGluZyByZWxldmFudCBlbmRwb2ludHMuXG4gICAgaWYgKHBhcmFtcy51c2VTU0wpIHtcbiAgICAgIC8vIERlZmF1bHRzIHRvIHNlY3VyZS5cbiAgICAgIHRyYW5zcG9ydCA9IGh0dHBzXG4gICAgICBwcm90b2NvbCA9ICdodHRwczonXG4gICAgICBwb3J0ID0gcG9ydCB8fCA0NDNcbiAgICAgIHRyYW5zcG9ydEFnZW50ID0gaHR0cHMuZ2xvYmFsQWdlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNwb3J0ID0gaHR0cFxuICAgICAgcHJvdG9jb2wgPSAnaHR0cDonXG4gICAgICBwb3J0ID0gcG9ydCB8fCA4MFxuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBodHRwLmdsb2JhbEFnZW50XG4gICAgfVxuXG4gICAgLy8gaWYgY3VzdG9tIHRyYW5zcG9ydCBpcyBzZXQsIHVzZSBpdC5cbiAgICBpZiAocGFyYW1zLnRyYW5zcG9ydCkge1xuICAgICAgaWYgKCFpc09iamVjdChwYXJhbXMudHJhbnNwb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHRyYW5zcG9ydCB0eXBlIDogJHtwYXJhbXMudHJhbnNwb3J0fSwgZXhwZWN0ZWQgdG8gYmUgdHlwZSBcIm9iamVjdFwiYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdHJhbnNwb3J0ID0gcGFyYW1zLnRyYW5zcG9ydFxuICAgIH1cblxuICAgIC8vIGlmIGN1c3RvbSB0cmFuc3BvcnQgYWdlbnQgaXMgc2V0LCB1c2UgaXQuXG4gICAgaWYgKHBhcmFtcy50cmFuc3BvcnRBZ2VudCkge1xuICAgICAgaWYgKCFpc09iamVjdChwYXJhbXMudHJhbnNwb3J0QWdlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdHJhbnNwb3J0QWdlbnQgdHlwZTogJHtwYXJhbXMudHJhbnNwb3J0QWdlbnR9LCBleHBlY3RlZCB0byBiZSB0eXBlIFwib2JqZWN0XCJgLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHRyYW5zcG9ydEFnZW50ID0gcGFyYW1zLnRyYW5zcG9ydEFnZW50XG4gICAgfVxuXG4gICAgLy8gVXNlciBBZ2VudCBzaG91bGQgYWx3YXlzIGZvbGxvd2luZyB0aGUgYmVsb3cgc3R5bGUuXG4gICAgLy8gUGxlYXNlIG9wZW4gYW4gaXNzdWUgdG8gZGlzY3VzcyBhbnkgbmV3IGNoYW5nZXMgaGVyZS5cbiAgICAvL1xuICAgIC8vICAgICAgIE1pbklPIChPUzsgQVJDSCkgTElCL1ZFUiBBUFAvVkVSXG4gICAgLy9cbiAgICBjb25zdCBsaWJyYXJ5Q29tbWVudHMgPSBgKCR7cHJvY2Vzcy5wbGF0Zm9ybX07ICR7cHJvY2Vzcy5hcmNofSlgXG4gICAgY29uc3QgbGlicmFyeUFnZW50ID0gYE1pbklPICR7bGlicmFyeUNvbW1lbnRzfSBtaW5pby1qcy8ke1BhY2thZ2UudmVyc2lvbn1gXG4gICAgLy8gVXNlciBhZ2VudCBibG9jayBlbmRzLlxuXG4gICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnRcbiAgICB0aGlzLnRyYW5zcG9ydEFnZW50ID0gdHJhbnNwb3J0QWdlbnRcbiAgICB0aGlzLmhvc3QgPSBob3N0XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbFxuICAgIHRoaXMudXNlckFnZW50ID0gYCR7bGlicmFyeUFnZW50fWBcblxuICAgIC8vIERlZmF1bHQgcGF0aCBzdHlsZSBpcyB0cnVlXG4gICAgaWYgKHBhcmFtcy5wYXRoU3R5bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYXRoU3R5bGUgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGF0aFN0eWxlID0gcGFyYW1zLnBhdGhTdHlsZVxuICAgIH1cblxuICAgIHRoaXMuYWNjZXNzS2V5ID0gcGFyYW1zLmFjY2Vzc0tleSA/PyAnJ1xuICAgIHRoaXMuc2VjcmV0S2V5ID0gcGFyYW1zLnNlY3JldEtleSA/PyAnJ1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gcGFyYW1zLnNlc3Npb25Ub2tlblxuICAgIHRoaXMuYW5vbnltb3VzID0gIXRoaXMuYWNjZXNzS2V5IHx8ICF0aGlzLnNlY3JldEtleVxuXG4gICAgaWYgKHBhcmFtcy5jcmVkZW50aWFsc1Byb3ZpZGVyKSB7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIgPSBwYXJhbXMuY3JlZGVudGlhbHNQcm92aWRlclxuICAgIH1cblxuICAgIHRoaXMucmVnaW9uTWFwID0ge31cbiAgICBpZiAocGFyYW1zLnJlZ2lvbikge1xuICAgICAgdGhpcy5yZWdpb24gPSBwYXJhbXMucmVnaW9uXG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wYXJ0U2l6ZSkge1xuICAgICAgdGhpcy5wYXJ0U2l6ZSA9IHBhcmFtcy5wYXJ0U2l6ZVxuICAgICAgdGhpcy5vdmVyUmlkZVBhcnRTaXplID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0U2l6ZSA8IDUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgUGFydCBzaXplIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gNU1CYClcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydFNpemUgPiA1ICogMTAyNCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBQYXJ0IHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiA1R0JgKVxuICAgIH1cblxuICAgIC8vIFNIQTI1NiBpcyBlbmFibGVkIG9ubHkgZm9yIGF1dGhlbnRpY2F0ZWQgaHR0cCByZXF1ZXN0cy4gSWYgdGhlIHJlcXVlc3QgaXMgYXV0aGVudGljYXRlZFxuICAgIC8vIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBodHRwcyB3ZSB1c2UgeC1hbXotY29udGVudC1zaGEyNTY9VU5TSUdORUQtUEFZTE9BRFxuICAgIC8vIGhlYWRlciBmb3Igc2lnbmF0dXJlIGNhbGN1bGF0aW9uLlxuICAgIHRoaXMuZW5hYmxlU0hBMjU2ID0gIXRoaXMuYW5vbnltb3VzICYmICFwYXJhbXMudXNlU1NMXG5cbiAgICB0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50ID0gcGFyYW1zLnMzQWNjZWxlcmF0ZUVuZHBvaW50IHx8IHVuZGVmaW5lZFxuICAgIHRoaXMucmVxT3B0aW9ucyA9IHt9XG4gICAgdGhpcy5jbGllbnRFeHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnModGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW5pbyBleHRlbnNpb25zIHRoYXQgYXJlbid0IG5lY2Vzc2FyeSBwcmVzZW50IGZvciBBbWF6b24gUzMgY29tcGF0aWJsZSBzdG9yYWdlIHNlcnZlcnNcbiAgICovXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudEV4dGVuc2lvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZW5kUG9pbnQgLSB2YWxpZCBTMyBhY2NlbGVyYXRpb24gZW5kIHBvaW50XG4gICAqL1xuICBzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZShlbmRQb2ludDogc3RyaW5nKSB7XG4gICAgdGhpcy5zM0FjY2VsZXJhdGVFbmRwb2ludCA9IGVuZFBvaW50XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3VwcG9ydGVkIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zOiBQaWNrPGh0dHBzLlJlcXVlc3RPcHRpb25zLCAodHlwZW9mIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVtudW1iZXJdPikge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcXVlc3Qgb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgdGhpcy5yZXFPcHRpb25zID0gXy5waWNrKG9wdGlvbnMsIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVxuICB9XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIHMzIFNwZWNpZmljIGFuZCBkb2VzIG5vdCBob2xkIHZhbGlkaXR5IGluIGFueSBvdGhlciBPYmplY3Qgc3RvcmFnZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZT86IHN0cmluZywgb2JqZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmICghaXNFbXB0eSh0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50KSAmJiAhaXNFbXB0eShidWNrZXROYW1lKSAmJiAhaXNFbXB0eShvYmplY3ROYW1lKSkge1xuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2ZlciBhY2NlbGVyYXRpb24gZm9yIG5vbi1jb21wbGlhbnQgYnVja2V0IG5hbWVzLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBub24gY29tcGxpYW50IGJ1Y2tldDoke2J1Y2tldE5hbWV9YClcbiAgICAgIH1cbiAgICAgIC8vIElmIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBpcyByZXF1ZXN0ZWQgc2V0IG5ldyBob3N0LlxuICAgICAgLy8gRm9yIG1vcmUgZGV0YWlscyBhYm91dCBlbmFibGluZyB0cmFuc2ZlciBhY2NlbGVyYXRpb24gcmVhZCBoZXJlLlxuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgcmV0dXJuIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnRcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggaHR0cC5yZXF1ZXN0KClcbiAgICogVGFrZXMgY2FyZSBvZiBjb25zdHJ1Y3RpbmcgdmlydHVhbC1ob3N0LXN0eWxlIG9yIHBhdGgtc3R5bGUgaG9zdG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0T3B0aW9ucyhcbiAgICBvcHRzOiBSZXF1ZXN0T3B0aW9uICYgeyByZWdpb246IHN0cmluZyB9LFxuICApOiBJUmVxdWVzdCAmIHsgaG9zdDogc3RyaW5nOyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0ge1xuICAgIGNvbnN0IG1ldGhvZCA9IG9wdHMubWV0aG9kXG4gICAgY29uc3QgcmVnaW9uID0gb3B0cy5yZWdpb25cbiAgICBjb25zdCBidWNrZXROYW1lID0gb3B0cy5idWNrZXROYW1lXG4gICAgbGV0IG9iamVjdE5hbWUgPSBvcHRzLm9iamVjdE5hbWVcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgcXVlcnkgPSBvcHRzLnF1ZXJ5XG5cbiAgICBsZXQgcmVxT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHt9IGFzIFJlcXVlc3RIZWFkZXJzLFxuICAgICAgcHJvdG9jb2w6IHRoaXMucHJvdG9jb2wsXG4gICAgICAvLyBJZiBjdXN0b20gdHJhbnNwb3J0QWdlbnQgd2FzIHN1cHBsaWVkIGVhcmxpZXIsIHdlJ2xsIGluamVjdCBpdCBoZXJlXG4gICAgICBhZ2VudDogdGhpcy50cmFuc3BvcnRBZ2VudCxcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgaWYgdmlydHVhbCBob3N0IHN1cHBvcnRlZC5cbiAgICBsZXQgdmlydHVhbEhvc3RTdHlsZVxuICAgIGlmIChidWNrZXROYW1lKSB7XG4gICAgICB2aXJ0dWFsSG9zdFN0eWxlID0gaXNWaXJ0dWFsSG9zdFN0eWxlKHRoaXMuaG9zdCwgdGhpcy5wcm90b2NvbCwgYnVja2V0TmFtZSwgdGhpcy5wYXRoU3R5bGUpXG4gICAgfVxuXG4gICAgbGV0IHBhdGggPSAnLydcbiAgICBsZXQgaG9zdCA9IHRoaXMuaG9zdFxuXG4gICAgbGV0IHBvcnQ6IHVuZGVmaW5lZCB8IG51bWJlclxuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIHBvcnQgPSB0aGlzLnBvcnRcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgb2JqZWN0TmFtZSA9IHVyaVJlc291cmNlRXNjYXBlKG9iamVjdE5hbWUpXG4gICAgfVxuXG4gICAgLy8gRm9yIEFtYXpvbiBTMyBlbmRwb2ludCwgZ2V0IGVuZHBvaW50IGJhc2VkIG9uIHJlZ2lvbi5cbiAgICBpZiAoaXNBbWF6b25FbmRwb2ludChob3N0KSkge1xuICAgICAgY29uc3QgYWNjZWxlcmF0ZUVuZFBvaW50ID0gdGhpcy5nZXRBY2NlbGVyYXRlRW5kUG9pbnRJZlNldChidWNrZXROYW1lLCBvYmplY3ROYW1lKVxuICAgICAgaWYgKGFjY2VsZXJhdGVFbmRQb2ludCkge1xuICAgICAgICBob3N0ID0gYCR7YWNjZWxlcmF0ZUVuZFBvaW50fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvc3QgPSBnZXRTM0VuZHBvaW50KHJlZ2lvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlydHVhbEhvc3RTdHlsZSAmJiAhb3B0cy5wYXRoU3R5bGUpIHtcbiAgICAgIC8vIEZvciBhbGwgaG9zdHMgd2hpY2ggc3VwcG9ydCB2aXJ0dWFsIGhvc3Qgc3R5bGUsIGBidWNrZXROYW1lYFxuICAgICAgLy8gaXMgcGFydCBvZiB0aGUgaG9zdG5hbWUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICAvL1xuICAgICAgLy8gIHZhciBob3N0ID0gJ2J1Y2tldE5hbWUuZXhhbXBsZS5jb20nXG4gICAgICAvL1xuICAgICAgaWYgKGJ1Y2tldE5hbWUpIHtcbiAgICAgICAgaG9zdCA9IGAke2J1Y2tldE5hbWV9LiR7aG9zdH1gXG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgICBwYXRoID0gYC8ke29iamVjdE5hbWV9YFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIFMzIGNvbXBhdGlibGUgc3RvcmFnZSBzZXJ2aWNlcyB3ZSB3aWxsIGZhbGxiYWNrIHRvXG4gICAgICAvLyBwYXRoIHN0eWxlIHJlcXVlc3RzLCB3aGVyZSBgYnVja2V0TmFtZWAgaXMgcGFydCBvZiB0aGUgVVJJXG4gICAgICAvLyBwYXRoLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtidWNrZXROYW1lfWBcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICAgIHBhdGggPSBgLyR7YnVja2V0TmFtZX0vJHtvYmplY3ROYW1lfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHBhdGggKz0gYD8ke3F1ZXJ5fWBcbiAgICB9XG4gICAgcmVxT3B0aW9ucy5oZWFkZXJzLmhvc3QgPSBob3N0XG4gICAgaWYgKChyZXFPcHRpb25zLnByb3RvY29sID09PSAnaHR0cDonICYmIHBvcnQgIT09IDgwKSB8fCAocmVxT3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgcG9ydCAhPT0gNDQzKSkge1xuICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzLmhvc3QgPSBgJHtob3N0fToke3BvcnR9YFxuICAgIH1cbiAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9IHRoaXMudXNlckFnZW50XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIC8vIGhhdmUgYWxsIGhlYWRlciBrZXlzIGluIGxvd2VyIGNhc2UgLSB0byBtYWtlIHNpZ25pbmcgZWFzeVxuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzW2sudG9Mb3dlckNhc2UoKV0gPSB2XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIGFueSByZXF1ZXN0IG9wdGlvbiBzcGVjaWZpZWQgaW4gbWluaW9DbGllbnQuc2V0UmVxdWVzdE9wdGlvbnMoKVxuICAgIHJlcU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnJlcU9wdGlvbnMsIHJlcU9wdGlvbnMpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVxT3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IF8ubWFwVmFsdWVzKF8ucGlja0J5KHJlcU9wdGlvbnMuaGVhZGVycywgaXNEZWZpbmVkKSwgKHYpID0+IHYudG9TdHJpbmcoKSksXG4gICAgICBob3N0LFxuICAgICAgcG9ydCxcbiAgICAgIHBhdGgsXG4gICAgfSBzYXRpc2ZpZXMgaHR0cHMuUmVxdWVzdE9wdGlvbnNcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRDcmVkZW50aWFsc1Byb3ZpZGVyKGNyZWRlbnRpYWxzUHJvdmlkZXI6IENyZWRlbnRpYWxQcm92aWRlcikge1xuICAgIGlmICghKGNyZWRlbnRpYWxzUHJvdmlkZXIgaW5zdGFuY2VvZiBDcmVkZW50aWFsUHJvdmlkZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgY3JlZGVudGlhbHMuIEV4cGVjdGVkIGluc3RhbmNlIG9mIENyZWRlbnRpYWxQcm92aWRlcicpXG4gICAgfVxuICAgIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciA9IGNyZWRlbnRpYWxzUHJvdmlkZXJcbiAgICBhd2FpdCB0aGlzLmNoZWNrQW5kUmVmcmVzaENyZWRzKClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKSB7XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbHNDb25mID0gYXdhaXQgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLmdldENyZWRlbnRpYWxzKClcbiAgICAgICAgdGhpcy5hY2Nlc3NLZXkgPSBjcmVkZW50aWFsc0NvbmYuZ2V0QWNjZXNzS2V5KClcbiAgICAgICAgdGhpcy5zZWNyZXRLZXkgPSBjcmVkZW50aWFsc0NvbmYuZ2V0U2VjcmV0S2V5KClcbiAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBjcmVkZW50aWFsc0NvbmYuZ2V0U2Vzc2lvblRva2VuKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZ2V0IGNyZWRlbnRpYWxzOiAke2V9YCwgeyBjYXVzZTogZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nU3RyZWFtPzogc3RyZWFtLldyaXRhYmxlXG5cbiAgLyoqXG4gICAqIGxvZyB0aGUgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yXG4gICAqL1xuICBwcml2YXRlIGxvZ0hUVFAocmVxT3B0aW9uczogSVJlcXVlc3QsIHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSB8IG51bGwsIGVycj86IHVua25vd24pIHtcbiAgICAvLyBpZiBubyBsb2dTdHJlYW0gYXZhaWxhYmxlIHJldHVybi5cbiAgICBpZiAoIXRoaXMubG9nU3RyZWFtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChyZXFPcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxT3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlICYmICFpc1JlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzcG9uc2Ugc2hvdWxkIGJlIG9mIHR5cGUgXCJTdHJlYW1cIicpXG4gICAgfVxuICAgIGlmIChlcnIgJiYgIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VyciBzaG91bGQgYmUgb2YgdHlwZSBcIkVycm9yXCInKVxuICAgIH1cbiAgICBjb25zdCBsb2dTdHJlYW0gPSB0aGlzLmxvZ1N0cmVhbVxuICAgIGNvbnN0IGxvZ0hlYWRlcnMgPSAoaGVhZGVyczogUmVxdWVzdEhlYWRlcnMpID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBpZiAoayA9PSAnYXV0aG9yaXphdGlvbicpIHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmcodikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGFjdG9yID0gbmV3IFJlZ0V4cCgnU2lnbmF0dXJlPShbMC05YS1mXSspJylcbiAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocmVkYWN0b3IsICdTaWduYXR1cmU9KipSRURBQ1RFRCoqJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3RyZWFtLndyaXRlKGAke2t9OiAke3Z9XFxuYClcbiAgICAgIH0pXG4gICAgICBsb2dTdHJlYW0ud3JpdGUoJ1xcbicpXG4gICAgfVxuICAgIGxvZ1N0cmVhbS53cml0ZShgUkVRVUVTVDogJHtyZXFPcHRpb25zLm1ldGhvZH0gJHtyZXFPcHRpb25zLnBhdGh9XFxuYClcbiAgICBsb2dIZWFkZXJzKHJlcU9wdGlvbnMuaGVhZGVycylcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMubG9nU3RyZWFtLndyaXRlKGBSRVNQT05TRTogJHtyZXNwb25zZS5zdGF0dXNDb2RlfVxcbmApXG4gICAgICBsb2dIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMgYXMgUmVxdWVzdEhlYWRlcnMpXG4gICAgfVxuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ1N0cmVhbS53cml0ZSgnRVJST1IgQk9EWTpcXG4nKVxuICAgICAgY29uc3QgZXJySlNPTiA9IEpTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgJ1xcdCcpXG4gICAgICBsb2dTdHJlYW0ud3JpdGUoYCR7ZXJySlNPTn1cXG5gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdHJhY2luZ1xuICAgKi9cbiAgcHVibGljIHRyYWNlT24oc3RyZWFtPzogc3RyZWFtLldyaXRhYmxlKSB7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHN0cmVhbSA9IHByb2Nlc3Muc3Rkb3V0XG4gICAgfVxuICAgIHRoaXMubG9nU3RyZWFtID0gc3RyZWFtXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSB0cmFjaW5nXG4gICAqL1xuICBwdWJsaWMgdHJhY2VPZmYoKSB7XG4gICAgdGhpcy5sb2dTdHJlYW0gPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlUmVxdWVzdCBpcyB0aGUgcHJpbWl0aXZlIHVzZWQgYnkgdGhlIGFwaXMgZm9yIG1ha2luZyBTMyByZXF1ZXN0cy5cbiAgICogcGF5bG9hZCBjYW4gYmUgZW1wdHkgc3RyaW5nIGluIGNhc2Ugb2Ygbm8gcGF5bG9hZC5cbiAgICogc3RhdHVzQ29kZSBpcyB0aGUgZXhwZWN0ZWQgc3RhdHVzQ29kZS4gSWYgcmVzcG9uc2Uuc3RhdHVzQ29kZSBkb2VzIG5vdCBtYXRjaFxuICAgKiB3ZSBwYXJzZSB0aGUgWE1MIGVycm9yIGFuZCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiBBIHZhbGlkIHJlZ2lvbiBpcyBwYXNzZWQgYnkgdGhlIGNhbGxzIC0gbGlzdEJ1Y2tldHMsIG1ha2VCdWNrZXQgYW5kIGdldEJ1Y2tldFJlZ2lvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBtYWtlUmVxdWVzdEFzeW5jKFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgcGF5bG9hZDogQmluYXJ5ID0gJycsXG4gICAgZXhwZWN0ZWRDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocGF5bG9hZCkgJiYgIWlzT2JqZWN0KHBheWxvYWQpKSB7XG4gICAgICAvLyBCdWZmZXIgaXMgb2YgdHlwZSAnb2JqZWN0J1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF5bG9hZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiIG9yIFwiQnVmZmVyXCInKVxuICAgIH1cbiAgICBleHBlY3RlZENvZGVzLmZvckVhY2goKHN0YXR1c0NvZGUpID0+IHtcbiAgICAgIGlmICghaXNOdW1iZXIoc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhdHVzQ29kZSBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICghaXNTdHJpbmcocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVnaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge31cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubWV0aG9kID09PSAnUE9TVCcgfHwgb3B0aW9ucy5tZXRob2QgPT09ICdQVVQnIHx8IG9wdGlvbnMubWV0aG9kID09PSAnREVMRVRFJykge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gcGF5bG9hZC5sZW5ndGgudG9TdHJpbmcoKVxuICAgIH1cbiAgICBjb25zdCBzaGEyNTZzdW0gPSB0aGlzLmVuYWJsZVNIQTI1NiA/IHRvU2hhMjU2KHBheWxvYWQpIDogJydcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdFN0cmVhbUFzeW5jKG9wdGlvbnMsIHBheWxvYWQsIHNoYTI1NnN1bSwgZXhwZWN0ZWRDb2RlcywgcmVnaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIG5ldyByZXF1ZXN0IHdpdGggcHJvbWlzZVxuICAgKlxuICAgKiBObyBuZWVkIHRvIGRyYWluIHJlc3BvbnNlLCByZXNwb25zZSBib2R5IGlzIG5vdCB2YWxpZFxuICAgKi9cbiAgYXN5bmMgbWFrZVJlcXVlc3RBc3luY09taXQoXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbixcbiAgICBwYXlsb2FkOiBCaW5hcnkgPSAnJyxcbiAgICBzdGF0dXNDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgKTogUHJvbWlzZTxPbWl0PGh0dHAuSW5jb21pbmdNZXNzYWdlLCAnb24nPj4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luYyhvcHRpb25zLCBwYXlsb2FkLCBzdGF0dXNDb2RlcywgcmVnaW9uKVxuICAgIGF3YWl0IGRyYWluUmVzcG9uc2UocmVzKVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlUmVxdWVzdFN0cmVhbSB3aWxsIGJlIHVzZWQgZGlyZWN0bHkgaW5zdGVhZCBvZiBtYWtlUmVxdWVzdCBpbiBjYXNlIHRoZSBwYXlsb2FkXG4gICAqIGlzIGF2YWlsYWJsZSBhcyBhIHN0cmVhbS4gZm9yIGV4LiBwdXRPYmplY3RcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBtYWtlUmVxdWVzdFN0cmVhbUFzeW5jKFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgYm9keTogc3RyZWFtLlJlYWRhYmxlIHwgQmluYXJ5LFxuICAgIHNoYTI1NnN1bTogc3RyaW5nLFxuICAgIHN0YXR1c0NvZGVzOiBudW1iZXJbXSxcbiAgICByZWdpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSB8fCB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHwgaXNSZWFkYWJsZVN0cmVhbShib2R5KSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBzdHJlYW0gc2hvdWxkIGJlIGEgQnVmZmVyLCBzdHJpbmcgb3IgcmVhZGFibGUgU3RyZWFtLCBnb3QgJHt0eXBlb2YgYm9keX0gaW5zdGVhZGAsXG4gICAgICApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc2hhMjU2c3VtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBzdGF0dXNDb2Rlcy5mb3JFYWNoKChzdGF0dXNDb2RlKSA9PiB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHN0YXR1c0NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXR1c0NvZGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoIWlzU3RyaW5nKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lvbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgLy8gc2hhMjU2c3VtIHdpbGwgYmUgZW1wdHkgZm9yIGFub255bW91cyBvciBodHRwcyByZXF1ZXN0c1xuICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYgJiYgc2hhMjU2c3VtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgc2hhMjU2c3VtIGV4cGVjdGVkIHRvIGJlIGVtcHR5IGZvciBhbm9ueW1vdXMgb3IgaHR0cHMgcmVxdWVzdHNgKVxuICAgIH1cbiAgICAvLyBzaGEyNTZzdW0gc2hvdWxkIGJlIHZhbGlkIGZvciBub24tYW5vbnltb3VzIGh0dHAgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU0hBMjU2ICYmIHNoYTI1NnN1bS5sZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHNoYTI1NnN1bSA6ICR7c2hhMjU2c3VtfWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIHJlZ2lvbiA9IHJlZ2lvbiB8fCAoYXdhaXQgdGhpcy5nZXRCdWNrZXRSZWdpb25Bc3luYyhvcHRpb25zLmJ1Y2tldE5hbWUhKSlcblxuICAgIGNvbnN0IHJlcU9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKHsgLi4ub3B0aW9ucywgcmVnaW9uIH0pXG4gICAgaWYgKCF0aGlzLmFub255bW91cykge1xuICAgICAgLy8gRm9yIG5vbi1hbm9ueW1vdXMgaHR0cHMgcmVxdWVzdHMgc2hhMjU2c3VtIGlzICdVTlNJR05FRC1QQVlMT0FEJyBmb3Igc2lnbmF0dXJlIGNhbGN1bGF0aW9uLlxuICAgICAgaWYgKCF0aGlzLmVuYWJsZVNIQTI1Nikge1xuICAgICAgICBzaGEyNTZzdW0gPSAnVU5TSUdORUQtUEFZTE9BRCdcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3gtYW16LWRhdGUnXSA9IG1ha2VEYXRlTG9uZyhkYXRlKVxuICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzWyd4LWFtei1jb250ZW50LXNoYTI1NiddID0gc2hhMjU2c3VtXG4gICAgICBpZiAodGhpcy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzWyd4LWFtei1zZWN1cml0eS10b2tlbiddID0gdGhpcy5zZXNzaW9uVG9rZW5cbiAgICAgIH1cbiAgICAgIHJlcU9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID0gc2lnblY0KHJlcU9wdGlvbnMsIHRoaXMuYWNjZXNzS2V5LCB0aGlzLnNlY3JldEtleSwgcmVnaW9uLCBkYXRlLCBzaGEyNTZzdW0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHRoaXMudHJhbnNwb3J0LCByZXFPcHRpb25zLCBib2R5KVxuICAgIGlmICghcmVzcG9uc2Uuc3RhdHVzQ29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQlVHOiByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBzdGF0dXNDb2RlXCIpXG4gICAgfVxuXG4gICAgaWYgKCFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXNDb2RlKSkge1xuICAgICAgLy8gRm9yIGFuIGluY29ycmVjdCByZWdpb24sIFMzIHNlcnZlciBhbHdheXMgc2VuZHMgYmFjayA0MDAuXG4gICAgICAvLyBCdXQgd2Ugd2lsbCBkbyBjYWNoZSBpbnZhbGlkYXRpb24gZm9yIGFsbCBlcnJvcnMgc28gdGhhdCxcbiAgICAgIC8vIGluIGZ1dHVyZSwgaWYgQVdTIFMzIGRlY2lkZXMgdG8gc2VuZCBhIGRpZmZlcmVudCBzdGF0dXMgY29kZSBvclxuICAgICAgLy8gWE1MIGVycm9yIGNvZGUgd2Ugd2lsbCBzdGlsbCB3b3JrIGZpbmUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgZGVsZXRlIHRoaXMucmVnaW9uTWFwW29wdGlvbnMuYnVja2V0TmFtZSFdXG5cbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHhtbFBhcnNlcnMucGFyc2VSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgICAgdGhpcy5sb2dIVFRQKHJlcU9wdGlvbnMsIHJlc3BvbnNlLCBlcnIpXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0hUVFAocmVxT3B0aW9ucywgcmVzcG9uc2UpXG5cbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRzIHRoZSByZWdpb24gb2YgdGhlIGJ1Y2tldFxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0TmFtZVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRCdWNrZXRSZWdpb25Bc3luYyhidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZSA6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cblxuICAgIC8vIFJlZ2lvbiBpcyBzZXQgd2l0aCBjb25zdHJ1Y3RvciwgcmV0dXJuIHRoZSByZWdpb24gcmlnaHQgaGVyZS5cbiAgICBpZiAodGhpcy5yZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lvblxuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhY3RSZWdpb25Bc3luYyA9IGFzeW5jIChyZXNwb25zZTogaHR0cC5JbmNvbWluZ01lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkQXNTdHJpbmcocmVzcG9uc2UpXG4gICAgICBjb25zdCByZWdpb24gPSB4bWxQYXJzZXJzLnBhcnNlQnVja2V0UmVnaW9uKGJvZHkpIHx8IERFRkFVTFRfUkVHSU9OXG4gICAgICB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSA9IHJlZ2lvblxuICAgICAgcmV0dXJuIHJlZ2lvblxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbG9jYXRpb24nXG4gICAgLy8gYGdldEJ1Y2tldExvY2F0aW9uYCBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGZvbGxvd2luZyB3YXlzIGZvclxuICAgIC8vIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4gICAgLy9cbiAgICAvLyAtIEZvciBub2RlanMgZW52IHdlIGRlZmF1bHQgdG8gcGF0aCBzdHlsZSByZXF1ZXN0cy5cbiAgICAvLyAtIEZvciBicm93c2VyIGVudiBwYXRoIHN0eWxlIHJlcXVlc3RzIG9uIGJ1Y2tldHMgeWllbGRzIENPUlNcbiAgICAvLyAgIGVycm9yLiBUbyBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSB3ZSBtYWtlIGEgdmlydHVhbCBob3N0XG4gICAgLy8gICBzdHlsZSByZXF1ZXN0IHNpZ25lZCB3aXRoICd1cy1lYXN0LTEnLiBUaGlzIHJlcXVlc3QgZmFpbHNcbiAgICAvLyAgIHdpdGggYW4gZXJyb3IgJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnLCBhZGRpdGlvbmFsbHlcbiAgICAvLyAgIHRoZSBlcnJvciBYTUwgYWxzbyBwcm92aWRlcyBSZWdpb24gb2YgdGhlIGJ1Y2tldC4gVG8gdmFsaWRhdGVcbiAgICAvLyAgIHRoaXMgcmVnaW9uIGlzIHByb3BlciB3ZSByZXRyeSB0aGUgc2FtZSByZXF1ZXN0IHdpdGggdGhlIG5ld2x5XG4gICAgLy8gICBvYnRhaW5lZCByZWdpb24uXG4gICAgY29uc3QgcGF0aFN0eWxlID0gdGhpcy5wYXRoU3R5bGUgJiYgIWlzQnJvd3NlclxuICAgIGxldCByZWdpb246IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBwYXRoU3R5bGUgfSwgJycsIFsyMDBdLCBERUZBVUxUX1JFR0lPTilcbiAgICAgIHJldHVybiBleHRyYWN0UmVnaW9uQXN5bmMocmVzKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICghKGUubmFtZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnKSkge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHdlIHNldCBleHRyYSBwcm9wZXJ0aWVzIG9uIGVycm9yIG9iamVjdFxuICAgICAgcmVnaW9uID0gZS5SZWdpb24gYXMgc3RyaW5nXG4gICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgcGF0aFN0eWxlIH0sICcnLCBbMjAwXSwgcmVnaW9uKVxuICAgIHJldHVybiBhd2FpdCBleHRyYWN0UmVnaW9uQXN5bmMocmVzKVxuICB9XG5cbiAgLyoqXG4gICAqIG1ha2VSZXF1ZXN0IGlzIHRoZSBwcmltaXRpdmUgdXNlZCBieSB0aGUgYXBpcyBmb3IgbWFraW5nIFMzIHJlcXVlc3RzLlxuICAgKiBwYXlsb2FkIGNhbiBiZSBlbXB0eSBzdHJpbmcgaW4gY2FzZSBvZiBubyBwYXlsb2FkLlxuICAgKiBzdGF0dXNDb2RlIGlzIHRoZSBleHBlY3RlZCBzdGF0dXNDb2RlLiBJZiByZXNwb25zZS5zdGF0dXNDb2RlIGRvZXMgbm90IG1hdGNoXG4gICAqIHdlIHBhcnNlIHRoZSBYTUwgZXJyb3IgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqIEEgdmFsaWQgcmVnaW9uIGlzIHBhc3NlZCBieSB0aGUgY2FsbHMgLSBsaXN0QnVja2V0cywgbWFrZUJ1Y2tldCBhbmRcbiAgICogZ2V0QnVja2V0UmVnaW9uLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYG1ha2VSZXF1ZXN0QXN5bmNgIGluc3RlYWRcbiAgICovXG4gIG1ha2VSZXF1ZXN0KFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgcGF5bG9hZDogQmluYXJ5ID0gJycsXG4gICAgZXhwZWN0ZWRDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgICByZXR1cm5SZXNwb25zZTogYm9vbGVhbixcbiAgICBjYjogKGNiOiB1bmtub3duLCByZXN1bHQ6IGh0dHAuSW5jb21pbmdNZXNzYWdlKSA9PiB2b2lkLFxuICApIHtcbiAgICBsZXQgcHJvbTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT5cbiAgICBpZiAocmV0dXJuUmVzcG9uc2UpIHtcbiAgICAgIHByb20gPSB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMob3B0aW9ucywgcGF5bG9hZCwgZXhwZWN0ZWRDb2RlcywgcmVnaW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNvbXBhdGlibGUgZm9yIG9sZCBiZWhhdmlvdXJcbiAgICAgIHByb20gPSB0aGlzLm1ha2VSZXF1ZXN0QXN5bmNPbWl0KG9wdGlvbnMsIHBheWxvYWQsIGV4cGVjdGVkQ29kZXMsIHJlZ2lvbilcbiAgICB9XG5cbiAgICBwcm9tLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiBjYihudWxsLCByZXN1bHQpLFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2IoZXJyKVxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogbWFrZVJlcXVlc3RTdHJlYW0gd2lsbCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFrZVJlcXVlc3QgaW4gY2FzZSB0aGUgcGF5bG9hZFxuICAgKiBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0uIGZvciBleC4gcHV0T2JqZWN0XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgbWFrZVJlcXVlc3RTdHJlYW1Bc3luY2AgaW5zdGVhZFxuICAgKi9cbiAgbWFrZVJlcXVlc3RTdHJlYW0oXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbixcbiAgICBzdHJlYW06IHN0cmVhbS5SZWFkYWJsZSB8IEJ1ZmZlcixcbiAgICBzaGEyNTZzdW06IHN0cmluZyxcbiAgICBzdGF0dXNDb2RlczogbnVtYmVyW10sXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcmV0dXJuUmVzcG9uc2U6IGJvb2xlYW4sXG4gICAgY2I6IChjYjogdW5rbm93biwgcmVzdWx0OiBodHRwLkluY29taW5nTWVzc2FnZSkgPT4gdm9pZCxcbiAgKSB7XG4gICAgY29uc3QgZXhlY3V0b3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0U3RyZWFtQXN5bmMob3B0aW9ucywgc3RyZWFtLCBzaGEyNTZzdW0sIHN0YXR1c0NvZGVzLCByZWdpb24pXG4gICAgICBpZiAoIXJldHVyblJlc3BvbnNlKSB7XG4gICAgICAgIGF3YWl0IGRyYWluUmVzcG9uc2UocmVzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgZXhlY3V0b3IoKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4gY2IobnVsbCwgcmVzdWx0KSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChlcnIpID0+IGNiKGVyciksXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0QnVja2V0UmVnaW9uQXN5bmNgIGluc3RlYWRcbiAgICovXG4gIGdldEJ1Y2tldFJlZ2lvbihidWNrZXROYW1lOiBzdHJpbmcsIGNiOiAoZXJyOiB1bmtub3duLCByZWdpb246IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHJldHVybiB0aGlzLmdldEJ1Y2tldFJlZ2lvbkFzeW5jKGJ1Y2tldE5hbWUpLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiBjYihudWxsLCByZXN1bHQpLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKGVycikgPT4gY2IoZXJyKSxcbiAgICApXG4gIH1cblxuICBhc3luYyByZW1vdmVCdWNrZXQoYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcHJvbWlzZSBzdHlsZSBBUElcbiAgICovXG4gIHJlbW92ZUJ1Y2tldChidWNrZXROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBOb1Jlc3VsdENhbGxiYWNrKTogdm9pZFxuXG4gIGFzeW5jIHJlbW92ZUJ1Y2tldChidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUgfSwgJycsIFsyMDRdKVxuICAgIGRlbGV0ZSB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXQgaW5mb3JtYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIHN0YXRPYmplY3QoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHN0YXRPcHRzOiBTdGF0T2JqZWN0T3B0cyA9IHt9KTogUHJvbWlzZTxCdWNrZXRJdGVtU3RhdD4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChzdGF0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3N0YXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXMuc3RyaW5naWZ5KHN0YXRPcHRzKVxuICAgIGNvbnN0IG1ldGhvZCA9ICdIRUFEJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogcGFyc2VJbnQocmVzLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gYXMgc3RyaW5nKSxcbiAgICAgIG1ldGFEYXRhOiBleHRyYWN0TWV0YWRhdGEocmVzLmhlYWRlcnMgYXMgUmVzcG9uc2VIZWFkZXIpLFxuICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZShyZXMuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddIGFzIHN0cmluZyksXG4gICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXMuaGVhZGVycyBhcyBSZXNwb25zZUhlYWRlciksXG4gICAgICBldGFnOiBzYW5pdGl6ZUVUYWcocmVzLmhlYWRlcnMuZXRhZyksXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIG5ldyBwcm9taXNlIHN0eWxlIEFQSVxuICAgKi9cbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCByZW1vdmVPcHRzOiBSZW1vdmVPcHRpb25zLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBuZXcgcHJvbWlzZSBzdHlsZSBBUElcbiAgICovXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgYXN5bmMgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCByZW1vdmVPcHRzPzogUmVtb3ZlT3B0aW9ucyk6IFByb21pc2U8dm9pZD5cblxuICBhc3luYyByZW1vdmVPYmplY3QoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHJlbW92ZU9wdHM6IFJlbW92ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChyZW1vdmVPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncmVtb3ZlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuXG4gICAgY29uc3QgaGVhZGVyczogUmVxdWVzdEhlYWRlcnMgPSB7fVxuICAgIGlmIChyZW1vdmVPcHRzLmdvdmVybmFuY2VCeXBhc3MpIHtcbiAgICAgIGhlYWRlcnNbJ1gtQW16LUJ5cGFzcy1Hb3Zlcm5hbmNlLVJldGVudGlvbiddID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocmVtb3ZlT3B0cy5mb3JjZURlbGV0ZSkge1xuICAgICAgaGVhZGVyc1sneC1taW5pby1mb3JjZS1kZWxldGUnXSA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgaWYgKHJlbW92ZU9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeVBhcmFtcy52ZXJzaW9uSWQgPSBgJHtyZW1vdmVPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5ID0gcXMuc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gICAgYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jT21pdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycywgcXVlcnkgfSwgJycsIFsyMDAsIDIwNF0pXG4gIH1cblxuICAvLyBDYWxscyBpbXBsZW1lbnRlZCBiZWxvdyBhcmUgcmVsYXRlZCB0byBtdWx0aXBhcnQuXG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIGEgbmV3IG11bHRpcGFydCB1cGxvYWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGhlYWRlcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoJ2NvbnRlbnRUeXBlIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnUE9TVCdcbiAgICBjb25zdCBxdWVyeSA9ICd1cGxvYWRzJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luYyh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSlcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEFzQnVmZmVyKHJlcylcbiAgICByZXR1cm4gcGFyc2VJbml0aWF0ZU11bHRpcGFydChib2R5LnRvU3RyaW5nKCkpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgTWV0aG9kIHRvIGFib3J0IGEgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IGluIGNhc2Ugb2YgYW55IGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgLSBCdWNrZXQgTmFtZVxuICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIE9iamVjdCBOYW1lXG4gICAqIEBwYXJhbSB1cGxvYWRJZCAtIGlkIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCB0byBjYW5jZWwgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgYWJvcnRNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXBsb2FkSWR9YFxuXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZTogb2JqZWN0TmFtZSwgcXVlcnkgfVxuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQocmVxdWVzdE9wdGlvbnMsICcnLCBbMjA0XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFydC1pbmZvIG9mIGFsbCBwYXJ0cyBvZiBhbiBpbmNvbXBsZXRlIHVwbG9hZCBzcGVjaWZpZWQgYnkgdXBsb2FkSWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbGlzdFBhcnRzKGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nKTogUHJvbWlzZTxVcGxvYWRlZFBhcnRbXT4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0czogVXBsb2FkZWRQYXJ0W10gPSBbXVxuICAgIGxldCBtYXJrZXIgPSAwXG4gICAgbGV0IHJlc3VsdFxuICAgIGRvIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIG1hcmtlcilcbiAgICAgIG1hcmtlciA9IHJlc3VsdC5tYXJrZXJcbiAgICAgIHBhcnRzLnB1c2goLi4ucmVzdWx0LnBhcnRzKVxuICAgIH0gd2hpbGUgKHJlc3VsdC5pc1RydW5jYXRlZClcblxuICAgIHJldHVybiBwYXJ0c1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSBsaXN0UGFydHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBwYXJ0LWluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcsIG1hcmtlcjogbnVtYmVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyh1cGxvYWRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKG1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hcmtlciBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICBsZXQgcXVlcnkgPSBgdXBsb2FkSWQ9JHt1cmlFc2NhcGUodXBsb2FkSWQpfWBcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBxdWVyeSArPSBgJnBhcnQtbnVtYmVyLW1hcmtlcj0ke21hcmtlcn1gXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG4gICAgcmV0dXJuIHhtbFBhcnNlcnMucGFyc2VMaXN0UGFydHMoYXdhaXQgcmVhZEFzU3RyaW5nKHJlcykpXG4gIH1cblxuICBhc3luYyBsaXN0QnVja2V0cygpOiBQcm9taXNlPEJ1Y2tldEl0ZW1Gcm9tTGlzdFtdPiB7XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBodHRwUmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kIH0sICcnLCBbMjAwXSwgREVGQVVMVF9SRUdJT04pXG4gICAgY29uc3QgeG1sUmVzdWx0ID0gYXdhaXQgcmVhZEFzU3RyaW5nKGh0dHBSZXMpXG4gICAgcmV0dXJuIHhtbFBhcnNlcnMucGFyc2VMaXN0QnVja2V0KHhtbFJlc3VsdClcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cbiAgcmVtb3ZlQnVja2V0UmVwbGljYXRpb24oYnVja2V0TmFtZTogc3RyaW5nLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgYXN5bmMgcmVtb3ZlQnVja2V0UmVwbGljYXRpb24oYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBjb25zdCBxdWVyeSA9ICdyZXBsaWNhdGlvbidcbiAgICBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmNPbWl0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMCwgMjA0XSwgJycpXG4gIH1cblxuICBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIHJlcGxpY2F0aW9uQ29uZmlnOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHMsIGNhbGxiYWNrOiBOb1Jlc3VsdENhbGxiYWNrKTogdm9pZFxuICBhc3luYyBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIHJlcGxpY2F0aW9uQ29uZmlnOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHMpOiBQcm9taXNlPHZvaWQ+XG4gIGFzeW5jIHNldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZywgcmVwbGljYXRpb25Db25maWc6IFJlcGxpY2F0aW9uQ29uZmlnT3B0cykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVwbGljYXRpb25Db25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXBsaWNhdGlvbkNvbmZpZyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5yb2xlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdSb2xlIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgICB9IGVsc2UgaWYgKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUgJiYgIWlzU3RyaW5nKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJvbGUnLCByZXBsaWNhdGlvbkNvbmZpZy5yb2xlKVxuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5ydWxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWluaW11bSBvbmUgcmVwbGljYXRpb24gcnVsZSBtdXN0IGJlIHNwZWNpZmllZCcpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByZXBsaWNhdGlvblBhcmFtc0NvbmZpZyA9IHtcbiAgICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBSb2xlOiByZXBsaWNhdGlvbkNvbmZpZy5yb2xlLFxuICAgICAgICBSdWxlOiByZXBsaWNhdGlvbkNvbmZpZy5ydWxlcyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuICAgIGNvbnN0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnKVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQpXG4gIH1cblxuICBnZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBSZXN1bHRDYWxsYmFjazxSZXBsaWNhdGlvbkNvbmZpZz4pOiB2b2lkXG4gIGFzeW5jIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVwbGljYXRpb25Db25maWc+XG4gIGFzeW5jIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG5cbiAgICBjb25zdCBodHRwUmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMCwgMjA0XSlcbiAgICBjb25zdCB4bWxSZXN1bHQgPSBhd2FpdCByZWFkQXNTdHJpbmcoaHR0cFJlcylcbiAgICByZXR1cm4geG1sUGFyc2Vycy5wYXJzZVJlcGxpY2F0aW9uQ29uZmlnKHhtbFJlc3VsdClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEVBQUEsR0FBQUwsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLG1CQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFSLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxRQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxRQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxXQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxPQUFBLEdBQUFYLE9BQUE7QUF1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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiaHR0cHMiLCJfbG9kYXNoIiwiX0NyZWRlbnRpYWxQcm92aWRlciIsImVycm9ycyIsIl9oZWxwZXIiLCJfczNFbmRwb2ludHMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiUGFja2FnZSIsInZlcnNpb24iLCJyZXF1ZXN0T3B0aW9uUHJvcGVydGllcyIsIlR5cGVkQ2xpZW50IiwicGFydFNpemUiLCJtYXhpbXVtUGFydFNpemUiLCJtYXhPYmplY3RTaXplIiwiY29uc3RydWN0b3IiLCJwYXJhbXMiLCJzZWN1cmUiLCJ1bmRlZmluZWQiLCJFcnJvciIsInVzZVNTTCIsInBvcnQiLCJpc1ZhbGlkRW5kcG9pbnQiLCJlbmRQb2ludCIsIkludmFsaWRFbmRwb2ludEVycm9yIiwiaXNWYWxpZFBvcnQiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImlzQm9vbGVhbiIsInJlZ2lvbiIsImlzU3RyaW5nIiwiaG9zdCIsInRvTG93ZXJDYXNlIiwicHJvdG9jb2wiLCJ0cmFuc3BvcnQiLCJ0cmFuc3BvcnRBZ2VudCIsImdsb2JhbEFnZW50IiwiaXNPYmplY3QiLCJsaWJyYXJ5Q29tbWVudHMiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJhcmNoIiwibGlicmFyeUFnZW50IiwidXNlckFnZW50IiwicGF0aFN0eWxlIiwiYWNjZXNzS2V5Iiwic2VjcmV0S2V5Iiwic2Vzc2lvblRva2VuIiwiYW5vbnltb3VzIiwiY3JlZGVudGlhbHNQcm92aWRlciIsInJlZ2lvbk1hcCIsIm92ZXJSaWRlUGFydFNpemUiLCJlbmFibGVTSEEyNTYiLCJzM0FjY2VsZXJhdGVFbmRwb2ludCIsInJlcU9wdGlvbnMiLCJzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZSIsInNldFJlcXVlc3RPcHRpb25zIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJwaWNrIiwiZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsImlzRW1wdHkiLCJpbmNsdWRlcyIsImdldFJlcXVlc3RPcHRpb25zIiwib3B0cyIsIm1ldGhvZCIsImhlYWRlcnMiLCJxdWVyeSIsImFnZW50IiwidmlydHVhbEhvc3RTdHlsZSIsImlzVmlydHVhbEhvc3RTdHlsZSIsInBhdGgiLCJ1cmlSZXNvdXJjZUVzY2FwZSIsImlzQW1hem9uRW5kcG9pbnQiLCJhY2NlbGVyYXRlRW5kUG9pbnQiLCJnZXRTM0VuZHBvaW50IiwiayIsInYiLCJlbnRyaWVzIiwiYXNzaWduIiwibWFwVmFsdWVzIiwicGlja0J5IiwiaXNEZWZpbmVkIiwidG9TdHJpbmciLCJzZXRDcmVkZW50aWFsc1Byb3ZpZGVyIiwiQ3JlZGVudGlhbFByb3ZpZGVyIiwiY2hlY2tBbmRSZWZyZXNoQ3JlZHMiLCJjcmVkZW50aWFsc0NvbmYiLCJnZXRDcmVkZW50aWFscyIsImdldEFjY2Vzc0tleSIsImdldFNlY3JldEtleSIsImdldFNlc3Npb25Ub2tlbiIsImUiLCJjYXVzZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyJjbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdub2RlOmh0dHBzJ1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5cbmltcG9ydCB7IENyZWRlbnRpYWxQcm92aWRlciB9IGZyb20gJy4uL0NyZWRlbnRpYWxQcm92aWRlci50cydcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuLi9lcnJvcnMudHMnXG5pbXBvcnQge1xuICBpc0FtYXpvbkVuZHBvaW50LFxuICBpc0Jvb2xlYW4sXG4gIGlzRGVmaW5lZCxcbiAgaXNFbXB0eSxcbiAgaXNPYmplY3QsXG4gIGlzU3RyaW5nLFxuICBpc1ZhbGlkRW5kcG9pbnQsXG4gIGlzVmFsaWRQb3J0LFxuICBpc1ZpcnR1YWxIb3N0U3R5bGUsXG4gIHVyaVJlc291cmNlRXNjYXBlLFxufSBmcm9tICcuL2hlbHBlci50cydcbmltcG9ydCB0eXBlIHsgUmVnaW9uIH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgeyBnZXRTM0VuZHBvaW50IH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgdHlwZSB7IElSZXF1ZXN0LCBSZXF1ZXN0SGVhZGVycywgVHJhbnNwb3J0IH0gZnJvbSAnLi90eXBlLnRzJ1xuXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJ1bmRsZXIuXG5jb25zdCBQYWNrYWdlID0geyB2ZXJzaW9uOiBwcm9jZXNzLmVudi5NSU5JT19KU19QQUNLQUdFX1ZFUlNJT04gfHwgJ2RldmVsb3BtZW50JyB9XG5cbmNvbnN0IHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzID0gW1xuICAnYWdlbnQnLFxuICAnY2EnLFxuICAnY2VydCcsXG4gICdjaXBoZXJzJyxcbiAgJ2NsaWVudENlcnRFbmdpbmUnLFxuICAnY3JsJyxcbiAgJ2RocGFyYW0nLFxuICAnZWNkaEN1cnZlJyxcbiAgJ2ZhbWlseScsXG4gICdob25vckNpcGhlck9yZGVyJyxcbiAgJ2tleScsXG4gICdwYXNzcGhyYXNlJyxcbiAgJ3BmeCcsXG4gICdyZWplY3RVbmF1dGhvcml6ZWQnLFxuICAnc2VjdXJlT3B0aW9ucycsXG4gICdzZWN1cmVQcm90b2NvbCcsXG4gICdzZXJ2ZXJuYW1lJyxcbiAgJ3Nlc3Npb25JZENvbnRleHQnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICBlbmRQb2ludDogc3RyaW5nXG4gIGFjY2Vzc0tleTogc3RyaW5nXG4gIHNlY3JldEtleTogc3RyaW5nXG4gIHVzZVNTTD86IGJvb2xlYW5cbiAgcG9ydD86IG51bWJlclxuICByZWdpb24/OiBSZWdpb25cbiAgdHJhbnNwb3J0PzogVHJhbnNwb3J0XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBwYXJ0U2l6ZT86IG51bWJlclxuICBwYXRoU3R5bGU/OiBib29sZWFuXG4gIGNyZWRlbnRpYWxzUHJvdmlkZXI/OiBDcmVkZW50aWFsUHJvdmlkZXJcbiAgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgdHJhbnNwb3J0QWdlbnQ/OiBodHRwLkFnZW50XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb24gPSBQYXJ0aWFsPElSZXF1ZXN0PiAmIHtcbiAgbWV0aG9kOiBzdHJpbmdcbiAgYnVja2V0TmFtZT86IHN0cmluZ1xuICBvYmplY3ROYW1lPzogc3RyaW5nXG4gIHJlZ2lvbj86IHN0cmluZ1xuICBxdWVyeT86IHN0cmluZ1xuICBwYXRoU3R5bGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlZENsaWVudCB7XG4gIHByb3RlY3RlZCB0cmFuc3BvcnQ6IFRyYW5zcG9ydFxuICBwcm90ZWN0ZWQgaG9zdDogc3RyaW5nXG4gIHByb3RlY3RlZCBwb3J0OiBudW1iZXJcbiAgcHJvdGVjdGVkIHByb3RvY29sOiBzdHJpbmdcbiAgcHJvdGVjdGVkIGFjY2Vzc0tleTogc3RyaW5nXG4gIHByb3RlY3RlZCBzZWNyZXRLZXk6IHN0cmluZ1xuICBwcm90ZWN0ZWQgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIHByb3RlY3RlZCB1c2VyQWdlbnQ6IHN0cmluZ1xuICBwcm90ZWN0ZWQgYW5vbnltb3VzOiBib29sZWFuXG4gIHByb3RlY3RlZCBwYXRoU3R5bGU6IGJvb2xlYW5cbiAgcHJvdGVjdGVkIHJlZ2lvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaWMgcmVnaW9uPzogc3RyaW5nXG4gIHByb3RlY3RlZCBjcmVkZW50aWFsc1Byb3ZpZGVyPzogQ3JlZGVudGlhbFByb3ZpZGVyXG4gIHBhcnRTaXplOiBudW1iZXIgPSA2NCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBvdmVyUmlkZVBhcnRTaXplPzogYm9vbGVhblxuXG4gIHByb3RlY3RlZCBtYXhpbXVtUGFydFNpemUgPSA1ICogMTAyNCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBtYXhPYmplY3RTaXplID0gNSAqIDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjRcbiAgcHVibGljIGVuYWJsZVNIQTI1NjogYm9vbGVhblxuICBwcm90ZWN0ZWQgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgcHJvdGVjdGVkIHJlcU9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgcHJvdGVjdGVkIHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBDbGllbnRPcHRpb25zKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZXByZWNhdGVkIHByb3BlcnR5XG4gICAgaWYgKHBhcmFtcy5zZWN1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcInNlY3VyZVwiIG9wdGlvbiBkZXByZWNhdGVkLCBcInVzZVNTTFwiIHNob3VsZCBiZSB1c2VkIGluc3RlYWQnKVxuICAgIH1cbiAgICAvLyBEZWZhdWx0IHZhbHVlcyBpZiBub3Qgc3BlY2lmaWVkLlxuICAgIGlmIChwYXJhbXMudXNlU1NMID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VTU0wgPSB0cnVlXG4gICAgfVxuICAgIGlmICghcGFyYW1zLnBvcnQpIHtcbiAgICAgIHBhcmFtcy5wb3J0ID0gMFxuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBpbnB1dCBwYXJhbXMuXG4gICAgaWYgKCFpc1ZhbGlkRW5kcG9pbnQocGFyYW1zLmVuZFBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkRW5kcG9pbnRFcnJvcihgSW52YWxpZCBlbmRQb2ludCA6ICR7cGFyYW1zLmVuZFBvaW50fWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFBvcnQocGFyYW1zLnBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHBvcnQgOiAke3BhcmFtcy5wb3J0fWApXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHBhcmFtcy51c2VTU0wpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgSW52YWxpZCB1c2VTU0wgZmxhZyB0eXBlIDogJHtwYXJhbXMudXNlU1NMfSwgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBcImJvb2xlYW5cImAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmVnaW9uIG9ubHkgaWYgaXRzIHNldC5cbiAgICBpZiAocGFyYW1zLnJlZ2lvbikge1xuICAgICAgaWYgKCFpc1N0cmluZyhwYXJhbXMucmVnaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHJlZ2lvbiA6ICR7cGFyYW1zLnJlZ2lvbn1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZW5kUG9pbnQudG9Mb3dlckNhc2UoKVxuICAgIGxldCBwb3J0ID0gcGFyYW1zLnBvcnRcbiAgICBsZXQgcHJvdG9jb2w6IHN0cmluZ1xuICAgIGxldCB0cmFuc3BvcnRcbiAgICBsZXQgdHJhbnNwb3J0QWdlbnQ6IGh0dHAuQWdlbnRcbiAgICAvLyBWYWxpZGF0ZSBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCB1c2luZyBTU0xcbiAgICAvLyBmb3IgY29uc3RydWN0aW5nIHJlbGV2YW50IGVuZHBvaW50cy5cbiAgICBpZiAocGFyYW1zLnVzZVNTTCkge1xuICAgICAgLy8gRGVmYXVsdHMgdG8gc2VjdXJlLlxuICAgICAgdHJhbnNwb3J0ID0gaHR0cHNcbiAgICAgIHByb3RvY29sID0gJ2h0dHBzOidcbiAgICAgIHBvcnQgPSBwb3J0IHx8IDQ0M1xuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBodHRwcy5nbG9iYWxBZ2VudFxuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc3BvcnQgPSBodHRwXG4gICAgICBwcm90b2NvbCA9ICdodHRwOidcbiAgICAgIHBvcnQgPSBwb3J0IHx8IDgwXG4gICAgICB0cmFuc3BvcnRBZ2VudCA9IGh0dHAuZ2xvYmFsQWdlbnRcbiAgICB9XG5cbiAgICAvLyBpZiBjdXN0b20gdHJhbnNwb3J0IGlzIHNldCwgdXNlIGl0LlxuICAgIGlmIChwYXJhbXMudHJhbnNwb3J0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHBhcmFtcy50cmFuc3BvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdHJhbnNwb3J0IHR5cGUgOiAke3BhcmFtcy50cmFuc3BvcnR9LCBleHBlY3RlZCB0byBiZSB0eXBlIFwib2JqZWN0XCJgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0cmFuc3BvcnQgPSBwYXJhbXMudHJhbnNwb3J0XG4gICAgfVxuXG4gICAgLy8gaWYgY3VzdG9tIHRyYW5zcG9ydCBhZ2VudCBpcyBzZXQsIHVzZSBpdC5cbiAgICBpZiAocGFyYW1zLnRyYW5zcG9ydEFnZW50KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHBhcmFtcy50cmFuc3BvcnRBZ2VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB0cmFuc3BvcnRBZ2VudCB0eXBlOiAke3BhcmFtcy50cmFuc3BvcnRBZ2VudH0sIGV4cGVjdGVkIHRvIGJlIHR5cGUgXCJvYmplY3RcImAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBwYXJhbXMudHJhbnNwb3J0QWdlbnRcbiAgICB9XG5cbiAgICAvLyBVc2VyIEFnZW50IHNob3VsZCBhbHdheXMgZm9sbG93aW5nIHRoZSBiZWxvdyBzdHlsZS5cbiAgICAvLyBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSB0byBkaXNjdXNzIGFueSBuZXcgY2hhbmdlcyBoZXJlLlxuICAgIC8vXG4gICAgLy8gICAgICAgTWluSU8gKE9TOyBBUkNIKSBMSUIvVkVSIEFQUC9WRVJcbiAgICAvL1xuICAgIGNvbnN0IGxpYnJhcnlDb21tZW50cyA9IGAoJHtwcm9jZXNzLnBsYXRmb3JtfTsgJHtwcm9jZXNzLmFyY2h9KWBcbiAgICBjb25zdCBsaWJyYXJ5QWdlbnQgPSBgTWluSU8gJHtsaWJyYXJ5Q29tbWVudHN9IG1pbmlvLWpzLyR7UGFja2FnZS52ZXJzaW9ufWBcbiAgICAvLyBVc2VyIGFnZW50IGJsb2NrIGVuZHMuXG5cbiAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydFxuICAgIHRoaXMudHJhbnNwb3J0QWdlbnQgPSB0cmFuc3BvcnRBZ2VudFxuICAgIHRoaXMuaG9zdCA9IGhvc3RcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sXG4gICAgdGhpcy51c2VyQWdlbnQgPSBgJHtsaWJyYXJ5QWdlbnR9YFxuXG4gICAgLy8gRGVmYXVsdCBwYXRoIHN0eWxlIGlzIHRydWVcbiAgICBpZiAocGFyYW1zLnBhdGhTdHlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGhTdHlsZSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXRoU3R5bGUgPSBwYXJhbXMucGF0aFN0eWxlXG4gICAgfVxuXG4gICAgdGhpcy5hY2Nlc3NLZXkgPSBwYXJhbXMuYWNjZXNzS2V5ID8/ICcnXG4gICAgdGhpcy5zZWNyZXRLZXkgPSBwYXJhbXMuc2VjcmV0S2V5ID8/ICcnXG4gICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBwYXJhbXMuc2Vzc2lvblRva2VuXG4gICAgdGhpcy5hbm9ueW1vdXMgPSAhdGhpcy5hY2Nlc3NLZXkgfHwgIXRoaXMuc2VjcmV0S2V5XG5cbiAgICBpZiAocGFyYW1zLmNyZWRlbnRpYWxzUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciA9IHBhcmFtcy5jcmVkZW50aWFsc1Byb3ZpZGVyXG4gICAgfVxuXG4gICAgdGhpcy5yZWdpb25NYXAgPSB7fVxuICAgIGlmIChwYXJhbXMucmVnaW9uKSB7XG4gICAgICB0aGlzLnJlZ2lvbiA9IHBhcmFtcy5yZWdpb25cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBhcnRTaXplKSB7XG4gICAgICB0aGlzLnBhcnRTaXplID0gcGFyYW1zLnBhcnRTaXplXG4gICAgICB0aGlzLm92ZXJSaWRlUGFydFNpemUgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnRTaXplIDwgNSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBQYXJ0IHNpemUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiA1TUJgKVxuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0U2l6ZSA+IDUgKiAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFBhcnQgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDVHQmApXG4gICAgfVxuXG4gICAgLy8gU0hBMjU2IGlzIGVuYWJsZWQgb25seSBmb3IgYXV0aGVudGljYXRlZCBodHRwIHJlcXVlc3RzLiBJZiB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIGlzIGh0dHBzIHdlIHVzZSB4LWFtei1jb250ZW50LXNoYTI1Nj1VTlNJR05FRC1QQVlMT0FEXG4gICAgLy8gaGVhZGVyIGZvciBzaWduYXR1cmUgY2FsY3VsYXRpb24uXG4gICAgdGhpcy5lbmFibGVTSEEyNTYgPSAhdGhpcy5hbm9ueW1vdXMgJiYgIXBhcmFtcy51c2VTU0xcblxuICAgIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnQgPSBwYXJhbXMuczNBY2NlbGVyYXRlRW5kcG9pbnQgfHwgdW5kZWZpbmVkXG4gICAgdGhpcy5yZXFPcHRpb25zID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZW5kUG9pbnQgLSB2YWxpZCBTMyBhY2NlbGVyYXRpb24gZW5kIHBvaW50XG4gICAqL1xuICBzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZShlbmRQb2ludDogc3RyaW5nKSB7XG4gICAgdGhpcy5zM0FjY2VsZXJhdGVFbmRwb2ludCA9IGVuZFBvaW50XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3VwcG9ydGVkIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zOiBQaWNrPGh0dHBzLlJlcXVlc3RPcHRpb25zLCAodHlwZW9mIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVtudW1iZXJdPikge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcXVlc3Qgb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgdGhpcy5yZXFPcHRpb25zID0gXy5waWNrKG9wdGlvbnMsIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVxuICB9XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIHMzIFNwZWNpZmljIGFuZCBkb2VzIG5vdCBob2xkIHZhbGlkaXR5IGluIGFueSBvdGhlciBPYmplY3Qgc3RvcmFnZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZT86IHN0cmluZywgb2JqZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmICghaXNFbXB0eSh0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50KSAmJiAhaXNFbXB0eShidWNrZXROYW1lKSAmJiAhaXNFbXB0eShvYmplY3ROYW1lKSkge1xuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2ZlciBhY2NlbGVyYXRpb24gZm9yIG5vbi1jb21wbGlhbnQgYnVja2V0IG5hbWVzLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBub24gY29tcGxpYW50IGJ1Y2tldDoke2J1Y2tldE5hbWV9YClcbiAgICAgIH1cbiAgICAgIC8vIElmIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBpcyByZXF1ZXN0ZWQgc2V0IG5ldyBob3N0LlxuICAgICAgLy8gRm9yIG1vcmUgZGV0YWlscyBhYm91dCBlbmFibGluZyB0cmFuc2ZlciBhY2NlbGVyYXRpb24gcmVhZCBoZXJlLlxuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgcmV0dXJuIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnRcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggaHR0cC5yZXF1ZXN0KClcbiAgICogVGFrZXMgY2FyZSBvZiBjb25zdHJ1Y3RpbmcgdmlydHVhbC1ob3N0LXN0eWxlIG9yIHBhdGgtc3R5bGUgaG9zdG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0T3B0aW9ucyhvcHRzOiBSZXF1ZXN0T3B0aW9uKTogSVJlcXVlc3QgJiB7IGhvc3Q6IHN0cmluZzsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgICBjb25zdCBtZXRob2QgPSBvcHRzLm1ldGhvZFxuICAgIGNvbnN0IHJlZ2lvbiA9IG9wdHMucmVnaW9uXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IG9wdHMuYnVja2V0TmFtZVxuICAgIGxldCBvYmplY3ROYW1lID0gb3B0cy5vYmplY3ROYW1lXG4gICAgY29uc3QgaGVhZGVycyA9IG9wdHMuaGVhZGVyc1xuICAgIGNvbnN0IHF1ZXJ5ID0gb3B0cy5xdWVyeVxuXG4gICAgbGV0IHJlcU9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBoZWFkZXJzOiB7fSBhcyBSZXF1ZXN0SGVhZGVycyxcbiAgICAgIHByb3RvY29sOiB0aGlzLnByb3RvY29sLFxuICAgICAgLy8gSWYgY3VzdG9tIHRyYW5zcG9ydEFnZW50IHdhcyBzdXBwbGllZCBlYXJsaWVyLCB3ZSdsbCBpbmplY3QgaXQgaGVyZVxuICAgICAgYWdlbnQ6IHRoaXMudHJhbnNwb3J0QWdlbnQsXG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IGlmIHZpcnR1YWwgaG9zdCBzdXBwb3J0ZWQuXG4gICAgbGV0IHZpcnR1YWxIb3N0U3R5bGVcbiAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgdmlydHVhbEhvc3RTdHlsZSA9IGlzVmlydHVhbEhvc3RTdHlsZSh0aGlzLmhvc3QsIHRoaXMucHJvdG9jb2wsIGJ1Y2tldE5hbWUsIHRoaXMucGF0aFN0eWxlKVxuICAgIH1cblxuICAgIGxldCBwYXRoID0gJy8nXG4gICAgbGV0IGhvc3QgPSB0aGlzLmhvc3RcblxuICAgIGxldCBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXJcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBwb3J0ID0gdGhpcy5wb3J0XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIG9iamVjdE5hbWUgPSB1cmlSZXNvdXJjZUVzY2FwZShvYmplY3ROYW1lKVxuICAgIH1cblxuICAgIC8vIEZvciBBbWF6b24gUzMgZW5kcG9pbnQsIGdldCBlbmRwb2ludCBiYXNlZCBvbiByZWdpb24uXG4gICAgaWYgKGlzQW1hem9uRW5kcG9pbnQoaG9zdCkpIHtcbiAgICAgIGNvbnN0IGFjY2VsZXJhdGVFbmRQb2ludCA9IHRoaXMuZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSlcbiAgICAgIGlmIChhY2NlbGVyYXRlRW5kUG9pbnQpIHtcbiAgICAgICAgaG9zdCA9IGAke2FjY2VsZXJhdGVFbmRQb2ludH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBob3N0ID0gZ2V0UzNFbmRwb2ludChyZWdpb24hKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aXJ0dWFsSG9zdFN0eWxlICYmICFvcHRzLnBhdGhTdHlsZSkge1xuICAgICAgLy8gRm9yIGFsbCBob3N0cyB3aGljaCBzdXBwb3J0IHZpcnR1YWwgaG9zdCBzdHlsZSwgYGJ1Y2tldE5hbWVgXG4gICAgICAvLyBpcyBwYXJ0IG9mIHRoZSBob3N0bmFtZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICAgIC8vXG4gICAgICAvLyAgdmFyIGhvc3QgPSAnYnVja2V0TmFtZS5leGFtcGxlLmNvbSdcbiAgICAgIC8vXG4gICAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgICBob3N0ID0gYCR7YnVja2V0TmFtZX0uJHtob3N0fWBcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICAgIHBhdGggPSBgLyR7b2JqZWN0TmFtZX1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgUzMgY29tcGF0aWJsZSBzdG9yYWdlIHNlcnZpY2VzIHdlIHdpbGwgZmFsbGJhY2sgdG9cbiAgICAgIC8vIHBhdGggc3R5bGUgcmVxdWVzdHMsIHdoZXJlIGBidWNrZXROYW1lYCBpcyBwYXJ0IG9mIHRoZSBVUklcbiAgICAgIC8vIHBhdGguXG4gICAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgICBwYXRoID0gYC8ke2J1Y2tldE5hbWV9YFxuICAgICAgfVxuICAgICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtidWNrZXROYW1lfS8ke29iamVjdE5hbWV9YFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcGF0aCArPSBgPyR7cXVlcnl9YFxuICAgIH1cbiAgICByZXFPcHRpb25zLmhlYWRlcnMuaG9zdCA9IGhvc3RcbiAgICBpZiAoKHJlcU9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwOicgJiYgcG9ydCAhPT0gODApIHx8IChyZXFPcHRpb25zLnByb3RvY29sID09PSAnaHR0cHM6JyAmJiBwb3J0ICE9PSA0NDMpKSB7XG4gICAgICByZXFPcHRpb25zLmhlYWRlcnMuaG9zdCA9IGAke2hvc3R9OiR7cG9ydH1gXG4gICAgfVxuICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sndXNlci1hZ2VudCddID0gdGhpcy51c2VyQWdlbnRcbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgLy8gaGF2ZSBhbGwgaGVhZGVyIGtleXMgaW4gbG93ZXIgY2FzZSAtIHRvIG1ha2Ugc2lnbmluZyBlYXN5XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgICAgICByZXFPcHRpb25zLmhlYWRlcnNbay50b0xvd2VyQ2FzZSgpXSA9IHZcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgYW55IHJlcXVlc3Qgb3B0aW9uIHNwZWNpZmllZCBpbiBtaW5pb0NsaWVudC5zZXRSZXF1ZXN0T3B0aW9ucygpXG4gICAgcmVxT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVxT3B0aW9ucywgcmVxT3B0aW9ucylcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXFPcHRpb25zLFxuICAgICAgaGVhZGVyczogXy5tYXBWYWx1ZXMoXy5waWNrQnkocmVxT3B0aW9ucy5oZWFkZXJzLCBpc0RlZmluZWQpLCAodikgPT4gdi50b1N0cmluZygpKSxcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgcGF0aCxcbiAgICB9IHNhdGlzZmllcyBodHRwcy5SZXF1ZXN0T3B0aW9uc1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzUHJvdmlkZXIoY3JlZGVudGlhbHNQcm92aWRlcjogQ3JlZGVudGlhbFByb3ZpZGVyKSB7XG4gICAgaWYgKCEoY3JlZGVudGlhbHNQcm92aWRlciBpbnN0YW5jZW9mIENyZWRlbnRpYWxQcm92aWRlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBjcmVkZW50aWFscy4gRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgQ3JlZGVudGlhbFByb3ZpZGVyJylcbiAgICB9XG4gICAgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyID0gY3JlZGVudGlhbHNQcm92aWRlclxuICAgIGF3YWl0IHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0FuZFJlZnJlc2hDcmVkcygpIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVkZW50aWFsc0NvbmYgPSBhd2FpdCB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgICB0aGlzLmFjY2Vzc0tleSA9IGNyZWRlbnRpYWxzQ29uZi5nZXRBY2Nlc3NLZXkoKVxuICAgICAgICB0aGlzLnNlY3JldEtleSA9IGNyZWRlbnRpYWxzQ29uZi5nZXRTZWNyZXRLZXkoKVxuICAgICAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IGNyZWRlbnRpYWxzQ29uZi5nZXRTZXNzaW9uVG9rZW4oKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgY3Jl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 /***/ }), @@ -77650,135 +80418,6 @@ exports.CopyConditions = CopyConditions; /***/ }), -/***/ 1159: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var stream = _interopRequireWildcard(__nccwpck_require__(2781), true); -var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helper = __nccwpck_require__(9921); -var _response = __nccwpck_require__(2644); -var _xmlParser = __nccwpck_require__(4040); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -/* - * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class Extensions { - constructor(client) { - this.client = client; - } - - /** - * List the objects in the bucket using S3 ListObjects V2 With Metadata - * - * @param bucketName - name of the bucket - * @param prefix - the prefix of the objects that should be listed (optional, default `''`) - * @param recursive - `true` indicates recursive style listing and `false` indicates directory style listing delimited by '/'. (optional, default `false`) - * @param startAfter - Specifies the key to start after when listing objects in a bucket. (optional, default `''`) - * @returns stream emitting the objects in the bucket, the object is of the format: - */ - listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter) { - if (prefix === undefined) { - prefix = ''; - } - if (recursive === undefined) { - recursive = false; - } - if (startAfter === undefined) { - startAfter = ''; - } - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidPrefix)(prefix)) { - throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`); - } - if (!(0, _helper.isString)(prefix)) { - throw new TypeError('prefix should be of type "string"'); - } - if (!(0, _helper.isBoolean)(recursive)) { - throw new TypeError('recursive should be of type "boolean"'); - } - if (!(0, _helper.isString)(startAfter)) { - throw new TypeError('startAfter should be of type "string"'); - } - - // if recursive is false set delimiter to '/' - const delimiter = recursive ? '' : '/'; - return stream.Readable.from(this.listObjectsV2WithMetadataGen(bucketName, prefix, delimiter, startAfter), { - objectMode: true - }); - } - async *listObjectsV2WithMetadataGen(bucketName, prefix, delimiter, startAfter) { - let ended = false; - let continuationToken = ''; - do { - const result = await this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, startAfter); - ended = !result.isTruncated; - continuationToken = result.nextContinuationToken; - for (const obj of result.objects) { - yield obj; - } - } while (!ended); - } - async listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, startAfter) { - const queries = []; - - // Call for listing objects v2 API - queries.push(`list-type=2`); - queries.push(`encoding-type=url`); - // escape every value in query string, except maxKeys - queries.push(`prefix=${(0, _helper.uriEscape)(prefix)}`); - queries.push(`delimiter=${(0, _helper.uriEscape)(delimiter)}`); - queries.push(`metadata=true`); - if (continuationToken) { - continuationToken = (0, _helper.uriEscape)(continuationToken); - queries.push(`continuation-token=${continuationToken}`); - } - // Set start-after - if (startAfter) { - startAfter = (0, _helper.uriEscape)(startAfter); - queries.push(`start-after=${startAfter}`); - } - queries.push(`max-keys=1000`); - queries.sort(); - let query = ''; - if (queries.length > 0) { - query = `${queries.join('&')}`; - } - const method = 'GET'; - const res = await this.client.makeRequestAsync({ - method, - bucketName, - query - }); - return (0, _xmlParser.parseListObjectsV2WithMetadata)(await (0, _response.readAsString)(res)); - } -} -exports.Extensions = Extensions; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHJlYW0iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaGVscGVyIiwiX3Jlc3BvbnNlIiwiX3htbFBhcnNlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJFeHRlbnNpb25zIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIiwiYnVja2V0TmFtZSIsInByZWZpeCIsInJlY3Vyc2l2ZSIsInN0YXJ0QWZ0ZXIiLCJ1bmRlZmluZWQiLCJpc1ZhbGlkQnVja2V0TmFtZSIsIkludmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkUHJlZml4IiwiSW52YWxpZFByZWZpeEVycm9yIiwiaXNTdHJpbmciLCJUeXBlRXJyb3IiLCJpc0Jvb2xlYW4iLCJkZWxpbWl0ZXIiLCJSZWFkYWJsZSIsImZyb20iLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhR2VuIiwib2JqZWN0TW9kZSIsImVuZGVkIiwiY29udGludWF0aW9uVG9rZW4iLCJyZXN1bHQiLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhUXVlcnkiLCJpc1RydW5jYXRlZCIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsIm9iamVjdHMiLCJxdWVyaWVzIiwicHVzaCIsInVyaUVzY2FwZSIsInNvcnQiLCJxdWVyeSIsImxlbmd0aCIsImpvaW4iLCJtZXRob2QiLCJyZXMiLCJtYWtlUmVxdWVzdEFzeW5jIiwicGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIiwicmVhZEFzU3RyaW5nIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbImV4dGVuc2lvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMjAgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgc3RyZWFtIGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi4vZXJyb3JzLnRzJ1xuaW1wb3J0IHR5cGUgeyBUeXBlZENsaWVudCB9IGZyb20gJy4vY2xpZW50LnRzJ1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc1N0cmluZywgaXNWYWxpZEJ1Y2tldE5hbWUsIGlzVmFsaWRQcmVmaXgsIHVyaUVzY2FwZSB9IGZyb20gJy4vaGVscGVyLnRzJ1xuaW1wb3J0IHsgcmVhZEFzU3RyaW5nIH0gZnJvbSAnLi9yZXNwb25zZS50cydcbmltcG9ydCB0eXBlIHsgQnVja2V0SXRlbVdpdGhNZXRhZGF0YSwgQnVja2V0U3RyZWFtIH0gZnJvbSAnLi90eXBlLnRzJ1xuaW1wb3J0IHsgcGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBUeXBlZENsaWVudCkge31cblxuICAvKipcbiAgICogTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHVzaW5nIFMzIExpc3RPYmplY3RzIFYyIFdpdGggTWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgLSBuYW1lIG9mIHRoZSBidWNrZXRcbiAgICogQHBhcmFtIHByZWZpeCAtIHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAgKiBAcGFyYW0gcmVjdXJzaXZlIC0gYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gICAqIEBwYXJhbSBzdGFydEFmdGVyIC0gU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAgKiBAcmV0dXJucyBzdHJlYW0gZW1pdHRpbmcgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCwgdGhlIG9iamVjdCBpcyBvZiB0aGUgZm9ybWF0OlxuICAgKi9cbiAgcHVibGljIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEoXG4gICAgYnVja2V0TmFtZTogc3RyaW5nLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgICByZWN1cnNpdmU/OiBib29sZWFuLFxuICAgIHN0YXJ0QWZ0ZXI/OiBzdHJpbmcsXG4gICk6IEJ1Y2tldFN0cmVhbTxCdWNrZXRJdGVtV2l0aE1ldGFkYXRhPiB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGFydEFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSAnJ1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkUHJlZml4RXJyb3IoYEludmFsaWQgcHJlZml4IDogJHtwcmVmaXh9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuXG4gICAgLy8gaWYgcmVjdXJzaXZlIGlzIGZhbHNlIHNldCBkZWxpbWl0ZXIgdG8gJy8nXG4gICAgY29uc3QgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICByZXR1cm4gc3RyZWFtLlJlYWRhYmxlLmZyb20odGhpcy5saXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhR2VuKGJ1Y2tldE5hbWUsIHByZWZpeCwgZGVsaW1pdGVyLCBzdGFydEFmdGVyKSwge1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyAqbGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YUdlbihcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyOiBzdHJpbmcsXG4gICAgc3RhcnRBZnRlcjogc3RyaW5nLFxuICApOiBBc3luY0l0ZXJhYmxlPEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGE+IHtcbiAgICBsZXQgZW5kZWQgPSBmYWxzZVxuICAgIGxldCBjb250aW51YXRpb25Ub2tlbiA9ICcnXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhUXVlcnkoXG4gICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgY29udGludWF0aW9uVG9rZW4sXG4gICAgICAgIGRlbGltaXRlcixcbiAgICAgICAgc3RhcnRBZnRlcixcbiAgICAgIClcbiAgICAgIGVuZGVkID0gIXJlc3VsdC5pc1RydW5jYXRlZFxuICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICBmb3IgKGNvbnN0IG9iaiBvZiByZXN1bHQub2JqZWN0cykge1xuICAgICAgICB5aWVsZCBvYmpcbiAgICAgIH1cbiAgICB9IHdoaWxlICghZW5kZWQpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgY29udGludWF0aW9uVG9rZW46IHN0cmluZyxcbiAgICBkZWxpbWl0ZXI6IHN0cmluZyxcbiAgICBzdGFydEFmdGVyOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYG1ldGFkYXRhPXRydWVgKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9MTAwMGApXG4gICAgcXVlcmllcy5zb3J0KClcbiAgICBsZXQgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0pXG4gICAgcmV0dXJuIHBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YShhd2FpdCByZWFkQXNTdHJpbmcocmVzKSlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxNQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFBZ0UsU0FBQUsseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQVAsd0JBQUFXLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FBQVIsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBTyxL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 - -/***/ }), - /***/ 9921: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -77827,7 +80466,6 @@ exports.probeContentType = probeContentType; exports.readableStream = readableStream; exports.sanitizeETag = sanitizeETag; exports.sanitizeObjectKey = sanitizeObjectKey; -exports.sanitizeSize = sanitizeSize; exports.toArray = toArray; exports.toMd5 = toMd5; exports.toSha256 = toSha256; @@ -77838,7 +80476,7 @@ var stream = _interopRequireWildcard(__nccwpck_require__(2781), true); var _fastXmlParser = __nccwpck_require__(2603); var _ipaddr = __nccwpck_require__(7263); var _lodash = __nccwpck_require__(250); -var mime = _interopRequireWildcard(__nccwpck_require__(3583), true); +var mime = _interopRequireWildcard(__nccwpck_require__(7920), true); var _type = __nccwpck_require__(7293); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -78249,9 +80887,6 @@ function sanitizeObjectKey(objectName) { const asStrName = (objectName ? objectName.toString() : '').replace(/\+/g, ' '); return decodeURIComponent(asStrName); } -function sanitizeSize(size) { - return size ? Number.parseInt(size) : undefined; -} const PART_CONSTRAINTS = { // absMinPartSize - absolute minimum part size (5 MiB) ABS_MIN_PART_SIZE: 1024 * 1024 * 5, @@ -78356,7 +80991,7 @@ function parseXml(xml) { } return result; } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJzdHJlYW0iLCJfZmFzdFhtbFBhcnNlciIsIl9pcGFkZHIiLCJfbG9kYXNoIiwibWltZSIsIl90eXBlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk1ldGFEYXRhSGVhZGVyUHJlZml4IiwidXJpRXNjYXBlIiwic3RyaW5nIiwic3BsaXQiLCJyZWR1Y2UiLCJhY2MiLCJlbGVtIiwiYnVmIiwiQnVmZmVyIiwiZnJvbSIsImxlbmd0aCIsImNoYXIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwidXJpUmVzb3VyY2VFc2NhcGUiLCJyZXBsYWNlIiwiZ2V0U2NvcGUiLCJyZWdpb24iLCJkYXRlIiwic2VydmljZU5hbWUiLCJtYWtlRGF0ZVNob3J0IiwiaXNBbWF6b25FbmRwb2ludCIsImVuZHBvaW50IiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicHJvdG9jb2wiLCJidWNrZXQiLCJwYXRoU3R5bGUiLCJpbmNsdWRlcyIsImlzVmFsaWRJUCIsImlwIiwiaXBhZGRyIiwiaXNWYWxpZCIsImlzVmFsaWRFbmRwb2ludCIsImlzVmFsaWREb21haW4iLCJob3N0IiwiaXNTdHJpbmciLCJzbGljZSIsImFscGhhTnVtZXJpY3MiLCJwcm9iZUNvbnRlbnRUeXBlIiwicGF0aCIsImNvbnRlbnRUeXBlIiwibG9va3VwIiwiaXNWYWxpZFBvcnQiLCJwb3J0IiwiaXNOdW1iZXIiLCJpc1ZhbGlkQnVja2V0TmFtZSIsInRlc3QiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIm9iamVjdE5hbWUiLCJpc1ZhbGlkUHJlZml4IiwicHJlZml4IiwiYXJnIiwiaXNGdW5jdGlvbiIsImlzT2JqZWN0IiwiaXNSZWFkYWJsZVN0cmVhbSIsIl9yZWFkIiwiaXNCb29sZWFuIiwiaXNFbXB0eSIsIm8iLCJfIiwiaXNFbXB0eU9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsIngiLCJ1bmRlZmluZWQiLCJpc0RlZmluZWQiLCJpc1ZhbGlkRGF0ZSIsIkRhdGUiLCJpc05hTiIsIm1ha2VEYXRlTG9uZyIsInMiLCJ0b0lTT1N0cmluZyIsInBpcGVzZXR1cCIsInN0cmVhbXMiLCJzcmMiLCJkc3QiLCJvbiIsImVyciIsImVtaXQiLCJwaXBlIiwicmVhZGFibGVTdHJlYW0iLCJkYXRhIiwiUmVhZGFibGUiLCJwdXNoIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJtZXRhRGF0YSIsImZpbGVQYXRoIiwidG9Mb3dlckNhc2UiLCJwcmVwZW5kWEFNWk1ldGEiLCJtYXBLZXlzIiwidmFsdWUiLCJpc0FtekhlYWRlciIsImlzU3VwcG9ydGVkSGVhZGVyIiwiaXNTdG9yYWdlQ2xhc3NIZWFkZXIiLCJ0ZW1wIiwic3RhcnRzV2l0aCIsInN1cHBvcnRlZF9oZWFkZXJzIiwiZXh0cmFjdE1ldGFkYXRhIiwiaGVhZGVycyIsInBpY2tCeSIsImxvd2VyIiwiZ2V0VmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwic2FuaXRpemVFVGFnIiwiZXRhZyIsInJlcGxhY2VDaGFycyIsIm0iLCJ0b01kNSIsInBheWxvYWQiLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiZGlnZXN0IiwidG9TaGEyNTYiLCJ0b0FycmF5IiwicGFyYW0iLCJBcnJheSIsImlzQXJyYXkiLCJzYW5pdGl6ZU9iamVjdEtleSIsImFzU3RyTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsInNhbml0aXplU2l6ZSIsInNpemUiLCJOdW1iZXIiLCJwYXJzZUludCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJBQlNfTUlOX1BBUlRfU0laRSIsIk1JTl9QQVJUX1NJWkUiLCJNQVhfUEFSVFNfQ09VTlQiLCJNQVhfUEFSVF9TSVpFIiwiTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsImV4cG9ydHMiLCJHRU5FUklDX1NTRV9IRUFERVIiLCJFTkNSWVBUSU9OX0hFQURFUlMiLCJzc2VHZW5lcmljSGVhZGVyIiwic3NlS21zS2V5SUQiLCJnZXRFbmNyeXB0aW9uSGVhZGVycyIsImVuY0NvbmZpZyIsImVuY1R5cGUiLCJ0eXBlIiwiRU5DUllQVElPTl9UWVBFUyIsIlNTRUMiLCJLTVMiLCJTU0VBbGdvcml0aG0iLCJLTVNNYXN0ZXJLZXlJRCIsInBhcnRzUmVxdWlyZWQiLCJtYXhQYXJ0U2l6ZSIsInJlcXVpcmVkUGFydFNpemUiLCJNYXRoIiwidHJ1bmMiLCJjYWxjdWxhdGVFdmVuU3BsaXRzIiwib2JqSW5mbyIsInJlcVBhcnRzIiwic3RhcnRJbmRleFBhcnRzIiwiZW5kSW5kZXhQYXJ0cyIsInN0YXJ0IiwiU3RhcnQiLCJkaXZpc29yVmFsdWUiLCJyZW1pbmRlclZhbHVlIiwibmV4dFN0YXJ0IiwiaSIsImN1clBhcnRTaXplIiwiY3VycmVudFN0YXJ0IiwiY3VycmVudEVuZCIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsImZ4cCIsIlhNTFBhcnNlciIsInBhcnNlWG1sIiwieG1sIiwicmVzdWx0IiwicGFyc2UiLCJFcnJvciJdLCJzb3VyY2VzIjpbImhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgKiBhcyBzdHJlYW0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcbmltcG9ydCBpcGFkZHIgZnJvbSAnaXBhZGRyLmpzJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xuXG5pbXBvcnQgdHlwZSB7IEJpbmFyeSwgRW5jcnlwdGlvbiwgT2JqZWN0TWV0YURhdGEsIFJlcXVlc3RIZWFkZXJzLCBSZXNwb25zZUhlYWRlciB9IGZyb20gJy4vdHlwZS50cydcbmltcG9ydCB7IEVOQ1JZUFRJT05fVFlQRVMgfSBmcm9tICcuL3R5cGUudHMnXG5cbmNvbnN0IE1ldGFEYXRhSGVhZGVyUHJlZml4ID0gJ3gtYW16LW1ldGEtJ1xuXG4vKipcbiAqIEFsbCBjaGFyYWN0ZXJzIGluIHN0cmluZyB3aGljaCBhcmUgTk9UIHVucmVzZXJ2ZWQgc2hvdWxkIGJlIHBlcmNlbnQgZW5jb2RlZC5cbiAqIFVucmVzZXJ2ZWQgY2hhcmFjdGVycyBhcmUgOiBBTFBIQSAvIERJR0lUIC8gXCItXCIgLyBcIi5cIiAvIFwiX1wiIC8gXCJ+XCJcbiAqIFJlZmVyZW5jZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJpRXNjYXBlKHN0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuc3BsaXQoJycpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGVsZW06IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGVsZW0pXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGxlbmd0aCAxIGluZGljYXRlcyB0aGF0IGVsZW0gaXMgbm90IGEgdW5pY29kZSBjaGFyYWN0ZXIuXG4gICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbiB1bnJlc2VydmVkIGNoYXJhY2VyLlxuICAgICAgaWYgKFxuICAgICAgICAoJ0EnIDw9IGVsZW0gJiYgZWxlbSA8PSAnWicpIHx8XG4gICAgICAgICgnYScgPD0gZWxlbSAmJiBlbGVtIDw9ICd6JykgfHxcbiAgICAgICAgKCcwJyA8PSBlbGVtICYmIGVsZW0gPD0gJzknKSB8fFxuICAgICAgICBlbGVtID09PSAnXycgfHxcbiAgICAgICAgZWxlbSA9PT0gJy4nIHx8XG4gICAgICAgIGVsZW0gPT09ICd+JyB8fFxuICAgICAgICBlbGVtID09PSAnLSdcbiAgICAgICkge1xuICAgICAgICAvLyBVbnJlc2VydmVkIGNoYXJhY2VyIHNob3VsZCBub3QgYmUgZW5jb2RlZC5cbiAgICAgICAgYWNjID0gYWNjICsgZWxlbVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG4gICAgfVxuICAgIC8vIGVsZW0gbmVlZHMgZW5jb2RpbmcgLSBpLmUgZWxlbSBzaG91bGQgYmUgZW5jb2RlZCBpZiBpdCdzIG5vdCB1bnJlc2VydmVkXG4gICAgLy8gY2hhcmFjdGVyIG9yIGlmIGl0J3MgYSB1bmljb2RlIGNoYXJhY3Rlci5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYnVmKSB7XG4gICAgICBhY2MgPSBhY2MgKyAnJScgKyBjaGFyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgfVxuICAgIHJldHVybiBhY2NcbiAgfSwgJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmlSZXNvdXJjZUVzY2FwZShzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gdXJpRXNjYXBlKHN0cmluZykucmVwbGFjZSgvJTJGL2csICcvJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjb3BlKHJlZ2lvbjogc3RyaW5nLCBkYXRlOiBEYXRlLCBzZXJ2aWNlTmFtZSA9ICdzMycpIHtcbiAgcmV0dXJuIGAke21ha2VEYXRlU2hvcnQoZGF0ZSl9LyR7cmVnaW9ufS8ke3NlcnZpY2VOYW1lfS9hd3M0X3JlcXVlc3RgXG59XG5cbi8qKlxuICogaXNBbWF6b25FbmRwb2ludCAtIHRydWUgaWYgZW5kcG9pbnQgaXMgJ3MzLmFtYXpvbmF3cy5jb20nIG9yICdzMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FtYXpvbkVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGVuZHBvaW50ID09PSAnczMuYW1hem9uYXdzLmNvbScgfHwgZW5kcG9pbnQgPT09ICdzMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24nXG59XG5cbi8qKlxuICogaXNWaXJ0dWFsSG9zdFN0eWxlIC0gdmVyaWZ5IGlmIGJ1Y2tldCBuYW1lIGlzIHN1cHBvcnQgd2l0aCB2aXJ0dWFsXG4gKiBob3N0cy4gYnVja2V0TmFtZXMgd2l0aCBwZXJpb2RzIHNob3VsZCBiZSBhbHdheXMgdHJlYXRlZCBhcyBwYXRoXG4gKiBzdHlsZSBpZiB0aGUgcHJvdG9jb2wgaXMgJ2h0dHBzOicsIHRoaXMgaXMgZHVlIHRvIFNTTCB3aWxkY2FyZFxuICogbGltaXRhdGlvbi4gRm9yIGFsbCBvdGhlciBidWNrZXRzIGFuZCBBbWF6b24gUzMgZW5kcG9pbnQgd2Ugd2lsbFxuICogZGVmYXVsdCB0byB2aXJ0dWFsIGhvc3Qgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpcnR1YWxIb3N0U3R5bGUoZW5kcG9pbnQ6IHN0cmluZywgcHJvdG9jb2w6IHN0cmluZywgYnVja2V0OiBzdHJpbmcsIHBhdGhTdHlsZTogYm9vbGVhbikge1xuICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonICYmIGJ1Y2tldC5pbmNsdWRlcygnLicpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGlzQW1hem9uRW5kcG9pbnQoZW5kcG9pbnQpIHx8ICFwYXRoU3R5bGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRJUChpcDogc3RyaW5nKSB7XG4gIHJldHVybiBpcGFkZHIuaXNWYWxpZChpcClcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBpZiBlbmRwb2ludCBpcyB2YWxpZCBkb21haW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xuICByZXR1cm4gaXNWYWxpZERvbWFpbihlbmRwb2ludCkgfHwgaXNWYWxpZElQKGVuZHBvaW50KVxufVxuXG4vKipcbiAqIEByZXR1cm5zIGlmIGlucHV0IGhvc3QgaXMgYSB2YWxpZCBkb21haW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRG9tYWluKGhvc3Q6IHN0cmluZykge1xuICBpZiAoIWlzU3RyaW5nKGhvc3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gU2VlIFJGQyAxMDM1LCBSRkMgMzY5Ni5cbiAgaWYgKGhvc3QubGVuZ3RoID09PSAwIHx8IGhvc3QubGVuZ3RoID4gMjU1KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSAnLSdcbiAgaWYgKGhvc3RbMF0gPT09ICctJyB8fCBob3N0LnNsaWNlKC0xKSA9PT0gJy0nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSAnXydcbiAgaWYgKGhvc3RbMF0gPT09ICdfJyB8fCBob3N0LnNsaWNlKC0xKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgd2l0aCBhICcuJ1xuICBpZiAoaG9zdFswXSA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBhbHBoYU51bWVyaWNzID0gJ2B+IUAjJCVeJiooKSs9e31bXXxcXFxcXCJcXCc7Oj48Py8nXG4gIC8vIEFsbCBub24gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIGludmFsaWQuXG4gIGZvciAoY29uc3QgY2hhciBvZiBhbHBoYU51bWVyaWNzKSB7XG4gICAgaWYgKGhvc3QuaW5jbHVkZXMoY2hhcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICAvLyBObyBuZWVkIHRvIHJlZ2V4cCBtYXRjaCwgc2luY2UgdGhlIGxpc3QgaXMgbm9uLWV4aGF1c3RpdmUuXG4gIC8vIFdlIGxldCBpdCBiZSB2YWxpZCBhbmQgZmFpbCBsYXRlci5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBQcm9iZXMgY29udGVudFR5cGUgdXNpbmcgZmlsZSBleHRlbnNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIC8vIHJldHVybiAnaW1hZ2UvcG5nJ1xuICogcHJvYmVDb250ZW50VHlwZSgnZmlsZS5wbmcnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9iZUNvbnRlbnRUeXBlKHBhdGg6IHN0cmluZykge1xuICBsZXQgY29udGVudFR5cGUgPSBtaW1lLmxvb2t1cChwYXRoKVxuICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICB9XG4gIHJldHVybiBjb250ZW50VHlwZVxufVxuXG4vKipcbiAqIGlzIGlucHV0IHBvcnQgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUG9ydChwb3J0OiB1bmtub3duKTogcG9ydCBpcyBudW1iZXIge1xuICAvLyB2ZXJpZnkgaWYgcG9ydCBpcyBhIG51bWJlci5cbiAgaWYgKCFpc051bWJlcihwb3J0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gcG9ydCBgMGAgaXMgdmFsaWQgYW5kIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gMCA8PSBwb3J0ICYmIHBvcnQgPD0gNjU1MzVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldDogdW5rbm93bikge1xuICBpZiAoIWlzU3RyaW5nKGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGJ1Y2tldCBsZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiBhbmQgbm8gbW9yZSB0aGFuIDYzXG4gIC8vIGNoYXJhY3RlcnMgbG9uZy5cbiAgaWYgKGJ1Y2tldC5sZW5ndGggPCAzIHx8IGJ1Y2tldC5sZW5ndGggPiA2Mykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIGJ1Y2tldCB3aXRoIHN1Y2Nlc3NpdmUgcGVyaW9kcyBpcyBpbnZhbGlkLlxuICBpZiAoYnVja2V0LmluY2x1ZGVzKCcuLicpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gYnVja2V0IGNhbm5vdCBoYXZlIGlwIGFkZHJlc3Mgc3R5bGUuXG4gIGlmICgvWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rLy50ZXN0KGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBidWNrZXQgc2hvdWxkIGJlZ2luIHdpdGggYWxwaGFiZXQvbnVtYmVyIGFuZCBlbmQgd2l0aCBhbHBoYWJldC9udW1iZXIsXG4gIC8vIHdpdGggYWxwaGFiZXQvbnVtYmVyLy4tIGluIHRoZSBtaWRkbGUuXG4gIGlmICgvXlthLXowLTldW2EtejAtOS4tXStbYS16MC05XSQvLnRlc3QoYnVja2V0KSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogY2hlY2sgaWYgb2JqZWN0TmFtZSBpcyBhIHZhbGlkIG9iamVjdCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lOiB1bmtub3duKSB7XG4gIGlmICghaXNWYWxpZFByZWZpeChvYmplY3ROYW1lKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdE5hbWUubGVuZ3RoICE9PSAwXG59XG5cbi8qKlxuICogY2hlY2sgaWYgcHJlZml4IGlzIHZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJlZml4KHByZWZpeDogdW5rbm93bik6IHByZWZpeCBpcyBzdHJpbmcge1xuICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAocHJlZml4Lmxlbmd0aCA+IDEwMjQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihhcmc6IHVua25vd24pOiBhcmcgaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBBbnlGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5cbi8qKlxuICogY2hlY2sgaWYgdHlwZW9mIGFyZyBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihhcmc6IHVua25vd24pOiBhcmcgaXMgQW55RnVuY3Rpb24ge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhhcmc6IHVua25vd24pOiBhcmcgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnXG59XG5cbi8qKlxuICogY2hlY2sgaWYgdHlwZW9mIGFyZyBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGFyZzogdW5rbm93bik6IGFyZyBpcyBvYmplY3Qge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsXG59XG5cbi8qKlxuICogY2hlY2sgaWYgb2JqZWN0IGlzIHJlYWRhYmxlIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbShhcmc6IHVua25vd24pOiBhcmcgaXMgc3RyZWFtLlJlYWRhYmxlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICByZXR1cm4gaXNPYmplY3QoYXJnKSAmJiBpc0Z1bmN0aW9uKChhcmcgYXMgc3RyZWFtLlJlYWRhYmxlKS5fcmVhZClcbn1cblxuLyoqXG4gKiBjaGVjayBpZiBhcmcgaXMgYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKGFyZzogdW5rbm93bik6IGFyZyBpcyBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvOiB1bmtub3duKTogbyBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIF8uaXNFbXB0eShvKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvKS5maWx0ZXIoKHgpID0+IHggIT09IHVuZGVmaW5lZCkubGVuZ3RoICE9PSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQ8VD4obzogVCk6IG8gaXMgRXhjbHVkZTxULCBudWxsIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBvICE9PSBudWxsICYmIG8gIT09IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIGFyZyBpcyBhIHZhbGlkIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKGFyZzogdW5rbm93bik6IGFyZyBpcyBEYXRlIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBjaGVja25ldyBEYXRlKE1hdGguTmFOKVxuICByZXR1cm4gYXJnIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oYXJnKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIERhdGUgc3RyaW5nIHdpdGggZm9ybWF0OiAnWVlZWU1NRERUSEhtbXNzJyArIFpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEYXRlTG9uZyhkYXRlPzogRGF0ZSk6IHN0cmluZyB7XG4gIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlKClcblxuICAvLyBHaXZlcyBmb3JtYXQgbGlrZTogJzIwMTctMDgtMDdUMTY6Mjg6NTkuODg5WidcbiAgY29uc3QgcyA9IGRhdGUudG9JU09TdHJpbmcoKVxuXG4gIHJldHVybiBzLnNsaWNlKDAsIDQpICsgcy5zbGljZSg1LCA3KSArIHMuc2xpY2UoOCwgMTMpICsgcy5zbGljZSgxNCwgMTYpICsgcy5zbGljZSgxNywgMTkpICsgJ1onXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgRGF0ZSBzdHJpbmcgd2l0aCBmb3JtYXQ6ICdZWVlZTU1ERCdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEYXRlU2hvcnQoZGF0ZT86IERhdGUpIHtcbiAgZGF0ZSA9IGRhdGUgfHwgbmV3IERhdGUoKVxuXG4gIC8vIEdpdmVzIGZvcm1hdCBsaWtlOiAnMjAxNy0wOC0wN1QxNjoyODo1OS44ODlaJ1xuICBjb25zdCBzID0gZGF0ZS50b0lTT1N0cmluZygpXG5cbiAgcmV0dXJuIHMuc2xpY2UoMCwgNCkgKyBzLnNsaWNlKDUsIDcpICsgcy5zbGljZSg4LCAxMClcbn1cblxuLyoqXG4gKiBwaXBlc2V0dXAgc2V0cyB1cCBwaXBlKCkgZnJvbSBsZWZ0IHRvIHJpZ2h0IG9zIHN0cmVhbXMgYXJyYXlcbiAqIHBpcGVzZXR1cCB3aWxsIGFsc28gbWFrZSBzdXJlIHRoYXQgZXJyb3IgZW1pdHRlZCBhdCBhbnkgb2YgdGhlIHVwc3RyZWFtIFN0cmVhbVxuICogd2lsbCBiZSBlbWl0dGVkIGF0IHRoZSBsYXN0IHN0cmVhbS4gVGhpcyBtYWtlcyBlcnJvciBoYW5kbGluZyBzaW1wbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGVzZXR1cCguLi5zdHJlYW1zOiBbc3RyZWFtLlJlYWRhYmxlLCAuLi5zdHJlYW0uRHVwbGV4W10sIHN0cmVhbS5Xcml0YWJsZV0pIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cyBjYW4ndCBuYXJyb3cgdGhpc1xuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UoKHNyYzogc3RyZWFtLlJlYWRhYmxlLCBkc3Q6IHN0cmVhbS5Xcml0YWJsZSkgPT4ge1xuICAgIHNyYy5vbignZXJyb3InLCAoZXJyKSA9PiBkc3QuZW1pdCgnZXJyb3InLCBlcnIpKVxuICAgIHJldHVybiBzcmMucGlwZShkc3QpXG4gIH0pXG59XG5cbi8qKlxuICogcmV0dXJuIGEgUmVhZGFibGUgc3RyZWFtIHRoYXQgZW1pdHMgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZGFibGVTdHJlYW0oZGF0YTogdW5rbm93bik6IHN0cmVhbS5SZWFkYWJsZSB7XG4gIGNvbnN0IHMgPSBuZXcgc3RyZWFtLlJlYWRhYmxlKClcbiAgcy5fcmVhZCA9ICgpID0+IHt9XG4gIHMucHVzaChkYXRhKVxuICBzLnB1c2gobnVsbClcbiAgcmV0dXJuIHNcbn1cblxuLyoqXG4gKiBQcm9jZXNzIG1ldGFkYXRhIHRvIGluc2VydCBhcHByb3ByaWF0ZSB2YWx1ZSB0byBgY29udGVudC10eXBlYCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydENvbnRlbnRUeXBlKG1ldGFEYXRhOiBPYmplY3RNZXRhRGF0YSwgZmlsZVBhdGg6IHN0cmluZyk6IE9iamVjdE1ldGFEYXRhIHtcbiAgLy8gY2hlY2sgaWYgY29udGVudC10eXBlIGF0dHJpYnV0ZSBwcmVzZW50IGluIG1ldGFEYXRhXG4gIGZvciAoY29uc3Qga2V5IGluIG1ldGFEYXRhKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgcmV0dXJuIG1ldGFEYXRhXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGluIG1ldGFkYXRhLCB0aGVuIGluZmVyIGl0IGZyb20gdGhlIGV4dGVuc2lvbiBpbiBmaWxlUGF0aFxuICByZXR1cm4ge1xuICAgIC4uLm1ldGFEYXRhLFxuICAgICdjb250ZW50LXR5cGUnOiBwcm9iZUNvbnRlbnRUeXBlKGZpbGVQYXRoKSxcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHByZXBlbmRzIG1ldGFkYXRhIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByZWZpeCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZFhBTVpNZXRhKG1ldGFEYXRhPzogT2JqZWN0TWV0YURhdGEpOiBSZXF1ZXN0SGVhZGVycyB7XG4gIGlmICghbWV0YURhdGEpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHJldHVybiBfLm1hcEtleXMobWV0YURhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKGlzQW16SGVhZGVyKGtleSkgfHwgaXNTdXBwb3J0ZWRIZWFkZXIoa2V5KSB8fCBpc1N0b3JhZ2VDbGFzc0hlYWRlcihrZXkpKSB7XG4gICAgICByZXR1cm4ga2V5XG4gICAgfVxuXG4gICAgcmV0dXJuIE1ldGFEYXRhSGVhZGVyUHJlZml4ICsga2V5XG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgaGVhZGVyIGFjY29yZGluZyB0byB0aGUgQW1hem9uUzMgQVBJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FtekhlYWRlcihrZXk6IHN0cmluZykge1xuICBjb25zdCB0ZW1wID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIChcbiAgICB0ZW1wLnN0YXJ0c1dpdGgoTWV0YURhdGFIZWFkZXJQcmVmaXgpIHx8XG4gICAgdGVtcCA9PT0gJ3gtYW16LWFjbCcgfHxcbiAgICB0ZW1wLnN0YXJ0c1dpdGgoJ3gtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24tJykgfHxcbiAgICB0ZW1wID09PSAneC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbidcbiAgKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHN1cHBvcnRlZCBIZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydGVkSGVhZGVyKGtleTogc3RyaW5nKSB7XG4gIGNvbnN0IHN1cHBvcnRlZF9oZWFkZXJzID0gW1xuICAgICdjb250ZW50LXR5cGUnLFxuICAgICdjYWNoZS1jb250cm9sJyxcbiAgICAnY29udGVudC1lbmNvZGluZycsXG4gICAgJ2NvbnRlbnQtZGlzcG9zaXRpb24nLFxuICAgICdjb250ZW50LWxhbmd1YWdlJyxcbiAgICAneC1hbXotd2Vic2l0ZS1yZWRpcmVjdC1sb2NhdGlvbicsXG4gIF1cbiAgcmV0dXJuIHN1cHBvcnRlZF9oZWFkZXJzLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHN0b3JhZ2UgaGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0b3JhZ2VDbGFzc0hlYWRlcihrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd4LWFtei1zdG9yYWdlLWNsYXNzJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1ldGFkYXRhKGhlYWRlcnM6IFJlc3BvbnNlSGVhZGVyKSB7XG4gIHJldHVybiBfLm1hcEtleXMoXG4gICAgXy5waWNrQnkoaGVhZGVycywgKHZhbHVlLCBrZXkpID0+IGlzU3VwcG9ydGVkSGVhZGVyKGtleSkgfHwgaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5KSB8fCBpc0FtekhlYWRlcihrZXkpKSxcbiAgICAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgY29uc3QgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgoTWV0YURhdGFIZWFkZXJQcmVmaXgpKSB7XG4gICAgICAgIHJldHVybiBsb3dlci5zbGljZShNZXRhRGF0YUhlYWRlclByZWZpeC5sZW5ndGgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXlcbiAgICB9LFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uSWQoaGVhZGVyczogUmVzcG9uc2VIZWFkZXIgPSB7fSkge1xuICByZXR1cm4gaGVhZGVyc1sneC1hbXotdmVyc2lvbi1pZCddIHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZVZlcnNpb25JZChoZWFkZXJzOiBSZXNwb25zZUhlYWRlciA9IHt9KSB7XG4gIHJldHVybiBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS12ZXJzaW9uLWlkJ10gfHwgbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVFVGFnKGV0YWcgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcGxhY2VDaGFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnXCInOiAnJyxcbiAgICAnJnF1b3Q7JzogJycsXG4gICAgJyYjMzQ7JzogJycsXG4gICAgJyZRVU9UOyc6ICcnLFxuICAgICcmI3gwMDAyMic6ICcnLFxuICB9XG4gIHJldHVybiBldGFnLnJlcGxhY2UoL14oXCJ8JnF1b3Q7fCYjMzQ7KXwoXCJ8JnF1b3Q7fCYjMzQ7KSQvZywgKG0pID0+IHJlcGxhY2VDaGFyc1ttXSBhcyBzdHJpbmcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01kNShwYXlsb2FkOiBCaW5hcnkpOiBzdHJpbmcge1xuICAvLyB1c2Ugc3RyaW5nIGZyb20gYnJvd3NlciBhbmQgYnVmZmVyIGZyb20gbm9kZWpzXG4gIC8vIGJyb3dzZXIgc3VwcG9ydCBpcyB0ZXN0ZWQgb25seSBhZ2FpbnN0IG1pbmlvIHNlcnZlclxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShCdWZmZXIuZnJvbShwYXlsb2FkKSkuZGlnZXN0KCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NoYTI1NihwYXlsb2FkOiBCaW5hcnkpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwYXlsb2FkKS5kaWdlc3QoJ2hleCcpXG59XG5cbi8qKlxuICogdG9BcnJheSByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQgYXJyYXkgd2l0aCBwYXJhbSBiZWluZyB0aGUgZWxlbWVudCxcbiAqIGlmIHBhcmFtIGlzIGp1c3QgYSBzdHJpbmcsIGFuZCByZXR1cm5zICdwYXJhbScgYmFjayBpZiBpdCBpcyBhbiBhcnJheVxuICogU28sIGl0IG1ha2VzIHN1cmUgcGFyYW0gaXMgYWx3YXlzIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQgPSB1bmtub3duPihwYXJhbTogVCB8IFRbXSk6IEFycmF5PFQ+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgIHJldHVybiBbcGFyYW1dIGFzIFRbXVxuICB9XG4gIHJldHVybiBwYXJhbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPYmplY3RLZXkob2JqZWN0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gKyBzeW1ib2wgY2hhcmFjdGVycyBhcmUgbm90IGRlY29kZWQgYXMgc3BhY2VzIGluIEpTLiBzbyByZXBsYWNlIHRoZW0gZmlyc3QgYW5kIGRlY29kZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LlxuICBjb25zdCBhc1N0ck5hbWUgPSAob2JqZWN0TmFtZSA/IG9iamVjdE5hbWUudG9TdHJpbmcoKSA6ICcnKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGFzU3RyTmFtZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplU2l6ZShzaXplPzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNpemUgPyBOdW1iZXIucGFyc2VJbnQoc2l6ZSkgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IFBBUlRfQ09OU1RSQUlOVFMgPSB7XG4gIC8vIGFic01pblBhcnRTaXplIC0gYWJzb2x1dGUgbWluaW11bSBwYXJ0IHNpemUgKDUgTWlCKVxuICBBQlNfTUlOX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiA1LFxuICAvLyBNSU5fUEFSVF9TSVpFIC0gbWluaW11bSBwYXJ0IHNpemUgMTZNaUIgcGVyIG9iamVjdCBhZnRlciB3aGljaFxuICBNSU5fUEFSVF9TSVpFOiAxMDI0ICogMTAyNCAqIDE2LFxuICAvLyBNQVhfUEFSVFNfQ09VTlQgLSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0cyBmb3IgYSBzaW5nbGUgbXVsdGlwYXJ0IHNlc3Npb24uXG4gIE1BWF9QQVJUU19DT1VOVDogMTAwMDAsXG4gIC8vIE1BWF9QQVJUX1NJWkUgLSBtYXhpbXVtIHBhcnQgc2l6ZSA1R2lCIGZvciBhIHNpbmdsZSBtdWx0aXBhcnQgdXBsb2FkXG4gIC8vIG9wZXJhdGlvbi5cbiAgTUFYX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUgLSBtYXhpbXVtIHNpemUgNUdpQiBvZiBvYmplY3QgcGVyIFBVVFxuICAvLyBvcGVyYXRpb24uXG4gIE1BWF9TSU5HTEVfUFVUX09CSkVDVF9TSVpFOiAxMDI0ICogMTAyNCAqIDEwMjQgKiA1LFxuICAvLyBNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSAtIG1heGltdW0gc2l6ZSA1VGlCIG9mIG9iamVjdCBmb3JcbiAgLy8gTXVsdGlwYXJ0IG9wZXJhdGlvbi5cbiAgTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkU6IDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjQgKiA1LFxufVxuXG5jb25zdCBHRU5FUklDX1NTRV9IRUFERVIgPSAnWC1BbXotU2VydmVyLVNpZGUtRW5jcnlwdGlvbidcblxuY29uc3QgRU5DUllQVElPTl9IRUFERVJTID0ge1xuICAvLyBzc2VHZW5lcmljSGVhZGVyIGlzIHRoZSBBV1MgU1NFIGhlYWRlciB1c2VkIGZvciBTU0UtUzMgYW5kIFNTRS1LTVMuXG4gIHNzZUdlbmVyaWNIZWFkZXI6IEdFTkVSSUNfU1NFX0hFQURFUixcbiAgLy8gc3NlS21zS2V5SUQgaXMgdGhlIEFXUyBTU0UtS01TIGtleSBpZC5cbiAgc3NlS21zS2V5SUQ6IEdFTkVSSUNfU1NFX0hFQURFUiArICctQXdzLUttcy1LZXktSWQnLFxufSBhcyBjb25zdFxuXG4vKipcbiAqIFJldHVybiBFbmNyeXB0aW9uIGhlYWRlcnNcbiAqIEBwYXJhbSBlbmNDb25maWdcbiAqIEByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGtleSB2YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSB1c2VkIGluIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmNyeXB0aW9uSGVhZGVycyhlbmNDb25maWc6IEVuY3J5cHRpb24pOiBSZXF1ZXN0SGVhZGVycyB7XG4gIGNvbnN0IGVuY1R5cGUgPSBlbmNDb25maWcudHlwZVxuXG4gIGlmICghaXNFbXB0eShlbmNUeXBlKSkge1xuICAgIGlmIChlbmNUeXBlID09PSBFTkNSWVBUSU9OX1RZUEVTLlNTRUMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlR2VuZXJpY0hlYWRlcl06ICdBRVMyNTYnLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jVHlwZSA9PT0gRU5DUllQVElPTl9UWVBFUy5LTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlR2VuZXJpY0hlYWRlcl06IGVuY0NvbmZpZy5TU0VBbGdvcml0aG0sXG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlS21zS2V5SURdOiBlbmNDb25maWcuS01TTWFzdGVyS2V5SUQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0c1JlcXVpcmVkKHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG1heFBhcnRTaXplID0gUEFSVF9DT05TVFJBSU5UUy5NQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSAvIChQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVCAtIDEpXG4gIGxldCByZXF1aXJlZFBhcnRTaXplID0gc2l6ZSAvIG1heFBhcnRTaXplXG4gIGlmIChzaXplICUgbWF4UGFydFNpemUgPiAwKSB7XG4gICAgcmVxdWlyZWRQYXJ0U2l6ZSsrXG4gIH1cbiAgcmVxdWlyZWRQYXJ0U2l6ZSA9IE1hdGgudHJ1bmMocmVxdWlyZWRQYXJ0U2l6ZSlcbiAgcmV0dXJuIHJlcXVpcmVkUGFydFNpemVcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGVFdmVuU3BsaXRzIC0gY29tcHV0ZXMgc3BsaXRzIGZvciBhIHNvdXJjZSBhbmQgcmV0dXJuc1xuICogc3RhcnQgYW5kIGVuZCBpbmRleCBzbGljZXMuIFNwbGl0cyBoYXBwZW4gZXZlbmx5IHRvIGJlIHN1cmUgdGhhdCBub1xuICogcGFydCBpcyBsZXNzIHRoYW4gNU1pQiwgYXMgdGhhdCBjb3VsZCBmYWlsIHRoZSBtdWx0aXBhcnQgcmVxdWVzdCBpZlxuICogaXQgaXMgbm90IHRoZSBsYXN0IHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVFdmVuU3BsaXRzPFQgZXh0ZW5kcyB7IFN0YXJ0PzogbnVtYmVyIH0+KFxuICBzaXplOiBudW1iZXIsXG4gIG9iakluZm86IFQsXG4pOiB7XG4gIHN0YXJ0SW5kZXg6IG51bWJlcltdXG4gIG9iakluZm86IFRcbiAgZW5kSW5kZXg6IG51bWJlcltdXG59IHwgbnVsbCB7XG4gIGlmIChzaXplID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZXFQYXJ0cyA9IHBhcnRzUmVxdWlyZWQoc2l6ZSlcbiAgY29uc3Qgc3RhcnRJbmRleFBhcnRzOiBudW1iZXJbXSA9IFtdXG4gIGNvbnN0IGVuZEluZGV4UGFydHM6IG51bWJlcltdID0gW11cblxuICBsZXQgc3RhcnQgPSBvYmpJbmZvLlN0YXJ0XG4gIGlmIChpc0VtcHR5KHN0YXJ0KSB8fCBzdGFydCA9PT0gLTEpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBjb25zdCBkaXZpc29yVmFsdWUgPSBNYXRoLnRydW5jKHNpemUgLyByZXFQYXJ0cylcblxuICBjb25zdCByZW1pbmRlclZhbHVlID0gc2l6ZSAlIHJlcVBhcnRzXG5cbiAgbGV0IG5leHRTdGFydCA9IHN0YXJ0XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXFQYXJ0czsgaSsrKSB7XG4gICAgbGV0IGN1clBhcnRTaXplID0gZGl2aXNvclZhbHVlXG4gICAgaWYgKGkgPCByZW1pbmRlclZhbHVlKSB7XG4gICAgICBjdXJQYXJ0U2l6ZSsrXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gbmV4dFN0YXJ0XG4gICAgY29uc3QgY3VycmVudEVuZCA9IGN1cnJlbnRTdGFydCArIGN1clBhcnRTaXplIC0gMVxuICAgIG5leHRTdGFydCA9IGN1cnJlbnRFbmQgKyAxXG5cbiAgICBzdGFydEluZGV4UGFydHMucHVzaChjdXJyZW50U3RhcnQpXG4gICAgZW5kSW5kZXhQYXJ0cy5wdXNoKGN1cnJlbnRFbmQpXG4gIH1cblxuICByZXR1cm4geyBzdGFydEluZGV4OiBzdGFydEluZGV4UGFydHMsIGVuZEluZGV4OiBlbmRJbmRleFBhcnRzLCBvYmpJbmZvOiBvYmpJbmZvIH1cbn1cblxuY29uc3QgZnhwID0gbmV3IFhNTFBhcnNlcigpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYbWwoeG1sOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCByZXN1bHQgPSBmeHAucGFyc2UoeG1sKVxuICBpZiAocmVzdWx0LkVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0LkVycm9yXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQU4sdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUE0QyxTQUFBTyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMs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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJzdHJlYW0iLCJfZmFzdFhtbFBhcnNlciIsIl9pcGFkZHIiLCJfbG9kYXNoIiwibWltZSIsIl90eXBlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk1ldGFEYXRhSGVhZGVyUHJlZml4IiwidXJpRXNjYXBlIiwic3RyaW5nIiwic3BsaXQiLCJyZWR1Y2UiLCJhY2MiLCJlbGVtIiwiYnVmIiwiQnVmZmVyIiwiZnJvbSIsImxlbmd0aCIsImNoYXIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwidXJpUmVzb3VyY2VFc2NhcGUiLCJyZXBsYWNlIiwiZ2V0U2NvcGUiLCJyZWdpb24iLCJkYXRlIiwic2VydmljZU5hbWUiLCJtYWtlRGF0ZVNob3J0IiwiaXNBbWF6b25FbmRwb2ludCIsImVuZHBvaW50IiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicHJvdG9jb2wiLCJidWNrZXQiLCJwYXRoU3R5bGUiLCJpbmNsdWRlcyIsImlzVmFsaWRJUCIsImlwIiwiaXBhZGRyIiwiaXNWYWxpZCIsImlzVmFsaWRFbmRwb2ludCIsImlzVmFsaWREb21haW4iLCJob3N0IiwiaXNTdHJpbmciLCJzbGljZSIsImFscGhhTnVtZXJpY3MiLCJwcm9iZUNvbnRlbnRUeXBlIiwicGF0aCIsImNvbnRlbnRUeXBlIiwibG9va3VwIiwiaXNWYWxpZFBvcnQiLCJwb3J0IiwiaXNOdW1iZXIiLCJpc1ZhbGlkQnVja2V0TmFtZSIsInRlc3QiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIm9iamVjdE5hbWUiLCJpc1ZhbGlkUHJlZml4IiwicHJlZml4IiwiYXJnIiwiaXNGdW5jdGlvbiIsImlzT2JqZWN0IiwiaXNSZWFkYWJsZVN0cmVhbSIsIl9yZWFkIiwiaXNCb29sZWFuIiwiaXNFbXB0eSIsIm8iLCJfIiwiaXNFbXB0eU9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsIngiLCJ1bmRlZmluZWQiLCJpc0RlZmluZWQiLCJpc1ZhbGlkRGF0ZSIsIkRhdGUiLCJpc05hTiIsIm1ha2VEYXRlTG9uZyIsInMiLCJ0b0lTT1N0cmluZyIsInBpcGVzZXR1cCIsInN0cmVhbXMiLCJzcmMiLCJkc3QiLCJvbiIsImVyciIsImVtaXQiLCJwaXBlIiwicmVhZGFibGVTdHJlYW0iLCJkYXRhIiwiUmVhZGFibGUiLCJwdXNoIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJtZXRhRGF0YSIsImZpbGVQYXRoIiwidG9Mb3dlckNhc2UiLCJwcmVwZW5kWEFNWk1ldGEiLCJtYXBLZXlzIiwidmFsdWUiLCJpc0FtekhlYWRlciIsImlzU3VwcG9ydGVkSGVhZGVyIiwiaXNTdG9yYWdlQ2xhc3NIZWFkZXIiLCJ0ZW1wIiwic3RhcnRzV2l0aCIsInN1cHBvcnRlZF9oZWFkZXJzIiwiZXh0cmFjdE1ldGFkYXRhIiwiaGVhZGVycyIsInBpY2tCeSIsImxvd2VyIiwiZ2V0VmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwic2FuaXRpemVFVGFnIiwiZXRhZyIsInJlcGxhY2VDaGFycyIsIm0iLCJ0b01kNSIsInBheWxvYWQiLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiZGlnZXN0IiwidG9TaGEyNTYiLCJ0b0FycmF5IiwicGFyYW0iLCJBcnJheSIsImlzQXJyYXkiLCJzYW5pdGl6ZU9iamVjdEtleSIsImFzU3RyTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJBQlNfTUlOX1BBUlRfU0laRSIsIk1JTl9QQVJUX1NJWkUiLCJNQVhfUEFSVFNfQ09VTlQiLCJNQVhfUEFSVF9TSVpFIiwiTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsImV4cG9ydHMiLCJHRU5FUklDX1NTRV9IRUFERVIiLCJFTkNSWVBUSU9OX0hFQURFUlMiLCJzc2VHZW5lcmljSGVhZGVyIiwic3NlS21zS2V5SUQiLCJnZXRFbmNyeXB0aW9uSGVhZGVycyIsImVuY0NvbmZpZyIsImVuY1R5cGUiLCJ0eXBlIiwiRU5DUllQVElPTl9UWVBFUyIsIlNTRUMiLCJLTVMiLCJTU0VBbGdvcml0aG0iLCJLTVNNYXN0ZXJLZXlJRCIsInBhcnRzUmVxdWlyZWQiLCJzaXplIiwibWF4UGFydFNpemUiLCJyZXF1aXJlZFBhcnRTaXplIiwiTWF0aCIsInRydW5jIiwiY2FsY3VsYXRlRXZlblNwbGl0cyIsIm9iakluZm8iLCJyZXFQYXJ0cyIsInN0YXJ0SW5kZXhQYXJ0cyIsImVuZEluZGV4UGFydHMiLCJzdGFydCIsIlN0YXJ0IiwiZGl2aXNvclZhbHVlIiwicmVtaW5kZXJWYWx1ZSIsIm5leHRTdGFydCIsImkiLCJjdXJQYXJ0U2l6ZSIsImN1cnJlbnRTdGFydCIsImN1cnJlbnRFbmQiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJmeHAiLCJYTUxQYXJzZXIiLCJwYXJzZVhtbCIsInhtbCIsInJlc3VsdCIsInBhcnNlIiwiRXJyb3IiXSwic291cmNlcyI6WyJoZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0ICogYXMgc3RyZWFtIGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInXG5pbXBvcnQgaXBhZGRyIGZyb20gJ2lwYWRkci5qcydcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCAqIGFzIG1pbWUgZnJvbSAnbWltZS10eXBlcydcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnksIEVuY3J5cHRpb24sIE9iamVjdE1ldGFEYXRhLCBSZXF1ZXN0SGVhZGVycywgUmVzcG9uc2VIZWFkZXIgfSBmcm9tICcuL3R5cGUudHMnXG5pbXBvcnQgeyBFTkNSWVBUSU9OX1RZUEVTIH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5jb25zdCBNZXRhRGF0YUhlYWRlclByZWZpeCA9ICd4LWFtei1tZXRhLSdcblxuLyoqXG4gKiBBbGwgY2hhcmFjdGVycyBpbiBzdHJpbmcgd2hpY2ggYXJlIE5PVCB1bnJlc2VydmVkIHNob3VsZCBiZSBwZXJjZW50IGVuY29kZWQuXG4gKiBVbnJlc2VydmVkIGNoYXJhY3RlcnMgYXJlIDogQUxQSEEgLyBESUdJVCAvIFwiLVwiIC8gXCIuXCIgLyBcIl9cIiAvIFwiflwiXG4gKiBSZWZlcmVuY2UgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVyaUVzY2FwZShzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKS5yZWR1Y2UoKGFjYzogc3RyaW5nLCBlbGVtOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShlbGVtKVxuICAgIGlmIChidWYubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBsZW5ndGggMSBpbmRpY2F0ZXMgdGhhdCBlbGVtIGlzIG5vdCBhIHVuaWNvZGUgY2hhcmFjdGVyLlxuICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYW4gdW5yZXNlcnZlZCBjaGFyYWNlci5cbiAgICAgIGlmIChcbiAgICAgICAgKCdBJyA8PSBlbGVtICYmIGVsZW0gPD0gJ1onKSB8fFxuICAgICAgICAoJ2EnIDw9IGVsZW0gJiYgZWxlbSA8PSAneicpIHx8XG4gICAgICAgICgnMCcgPD0gZWxlbSAmJiBlbGVtIDw9ICc5JykgfHxcbiAgICAgICAgZWxlbSA9PT0gJ18nIHx8XG4gICAgICAgIGVsZW0gPT09ICcuJyB8fFxuICAgICAgICBlbGVtID09PSAnficgfHxcbiAgICAgICAgZWxlbSA9PT0gJy0nXG4gICAgICApIHtcbiAgICAgICAgLy8gVW5yZXNlcnZlZCBjaGFyYWNlciBzaG91bGQgbm90IGJlIGVuY29kZWQuXG4gICAgICAgIGFjYyA9IGFjYyArIGVsZW1cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBlbGVtIG5lZWRzIGVuY29kaW5nIC0gaS5lIGVsZW0gc2hvdWxkIGJlIGVuY29kZWQgaWYgaXQncyBub3QgdW5yZXNlcnZlZFxuICAgIC8vIGNoYXJhY3RlciBvciBpZiBpdCdzIGEgdW5pY29kZSBjaGFyYWN0ZXIuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGJ1Zikge1xuICAgICAgYWNjID0gYWNjICsgJyUnICsgY2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICAgIH1cbiAgICByZXR1cm4gYWNjXG4gIH0sICcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXJpUmVzb3VyY2VFc2NhcGUoc3RyaW5nOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHVyaUVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyUyRi9nLCAnLycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY29wZShyZWdpb246IHN0cmluZywgZGF0ZTogRGF0ZSwgc2VydmljZU5hbWUgPSAnczMnKSB7XG4gIHJldHVybiBgJHttYWtlRGF0ZVNob3J0KGRhdGUpfS8ke3JlZ2lvbn0vJHtzZXJ2aWNlTmFtZX0vYXdzNF9yZXF1ZXN0YFxufVxuXG4vKipcbiAqIGlzQW1hem9uRW5kcG9pbnQgLSB0cnVlIGlmIGVuZHBvaW50IGlzICdzMy5hbWF6b25hd3MuY29tJyBvciAnczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbWF6b25FbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiBlbmRwb2ludCA9PT0gJ3MzLmFtYXpvbmF3cy5jb20nIHx8IGVuZHBvaW50ID09PSAnczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuJ1xufVxuXG4vKipcbiAqIGlzVmlydHVhbEhvc3RTdHlsZSAtIHZlcmlmeSBpZiBidWNrZXQgbmFtZSBpcyBzdXBwb3J0IHdpdGggdmlydHVhbFxuICogaG9zdHMuIGJ1Y2tldE5hbWVzIHdpdGggcGVyaW9kcyBzaG91bGQgYmUgYWx3YXlzIHRyZWF0ZWQgYXMgcGF0aFxuICogc3R5bGUgaWYgdGhlIHByb3RvY29sIGlzICdodHRwczonLCB0aGlzIGlzIGR1ZSB0byBTU0wgd2lsZGNhcmRcbiAqIGxpbWl0YXRpb24uIEZvciBhbGwgb3RoZXIgYnVja2V0cyBhbmQgQW1hem9uIFMzIGVuZHBvaW50IHdlIHdpbGxcbiAqIGRlZmF1bHQgdG8gdmlydHVhbCBob3N0IHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWaXJ0dWFsSG9zdFN0eWxlKGVuZHBvaW50OiBzdHJpbmcsIHByb3RvY29sOiBzdHJpbmcsIGJ1Y2tldDogc3RyaW5nLCBwYXRoU3R5bGU6IGJvb2xlYW4pIHtcbiAgaWYgKHByb3RvY29sID09PSAnaHR0cHM6JyAmJiBidWNrZXQuaW5jbHVkZXMoJy4nKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBpc0FtYXpvbkVuZHBvaW50KGVuZHBvaW50KSB8fCAhcGF0aFN0eWxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSVAoaXA6IHN0cmluZykge1xuICByZXR1cm4gaXBhZGRyLmlzVmFsaWQoaXApXG59XG5cbi8qKlxuICogQHJldHVybnMgaWYgZW5kcG9pbnQgaXMgdmFsaWQgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWREb21haW4oZW5kcG9pbnQpIHx8IGlzVmFsaWRJUChlbmRwb2ludClcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBpZiBpbnB1dCBob3N0IGlzIGEgdmFsaWQgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERvbWFpbihob3N0OiBzdHJpbmcpIHtcbiAgaWYgKCFpc1N0cmluZyhob3N0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIFNlZSBSRkMgMTAzNSwgUkZDIDM2OTYuXG4gIGlmIChob3N0Lmxlbmd0aCA9PT0gMCB8fCBob3N0Lmxlbmd0aCA+IDI1NSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgJy0nXG4gIGlmIChob3N0WzBdID09PSAnLScgfHwgaG9zdC5zbGljZSgtMSkgPT09ICctJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgJ18nXG4gIGlmIChob3N0WzBdID09PSAnXycgfHwgaG9zdC5zbGljZSgtMSkgPT09ICdfJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IHdpdGggYSAnLidcbiAgaWYgKGhvc3RbMF0gPT09ICcuJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgYWxwaGFOdW1lcmljcyA9ICdgfiFAIyQlXiYqKCkrPXt9W118XFxcXFwiXFwnOzo+PD8vJ1xuICAvLyBBbGwgbm9uIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBpbnZhbGlkLlxuICBmb3IgKGNvbnN0IGNoYXIgb2YgYWxwaGFOdW1lcmljcykge1xuICAgIGlmIChob3N0LmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgLy8gTm8gbmVlZCB0byByZWdleHAgbWF0Y2gsIHNpbmNlIHRoZSBsaXN0IGlzIG5vbi1leGhhdXN0aXZlLlxuICAvLyBXZSBsZXQgaXQgYmUgdmFsaWQgYW5kIGZhaWwgbGF0ZXIuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogUHJvYmVzIGNvbnRlbnRUeXBlIHVzaW5nIGZpbGUgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiAvLyByZXR1cm4gJ2ltYWdlL3BuZydcbiAqIHByb2JlQ29udGVudFR5cGUoJ2ZpbGUucG5nJylcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvYmVDb250ZW50VHlwZShwYXRoOiBzdHJpbmcpIHtcbiAgbGV0IGNvbnRlbnRUeXBlID0gbWltZS5sb29rdXAocGF0aClcbiAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgfVxuICByZXR1cm4gY29udGVudFR5cGVcbn1cblxuLyoqXG4gKiBpcyBpbnB1dCBwb3J0IHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBvcnQocG9ydDogdW5rbm93bik6IHBvcnQgaXMgbnVtYmVyIHtcbiAgLy8gdmVyaWZ5IGlmIHBvcnQgaXMgYSBudW1iZXIuXG4gIGlmICghaXNOdW1iZXIocG9ydCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHBvcnQgYDBgIGlzIHZhbGlkIGFuZCBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIDAgPD0gcG9ydCAmJiBwb3J0IDw9IDY1NTM1XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQnVja2V0TmFtZShidWNrZXQ6IHVua25vd24pIHtcbiAgaWYgKCFpc1N0cmluZyhidWNrZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBidWNrZXQgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gYW5kIG5vIG1vcmUgdGhhbiA2M1xuICAvLyBjaGFyYWN0ZXJzIGxvbmcuXG4gIGlmIChidWNrZXQubGVuZ3RoIDwgMyB8fCBidWNrZXQubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBidWNrZXQgd2l0aCBzdWNjZXNzaXZlIHBlcmlvZHMgaXMgaW52YWxpZC5cbiAgaWYgKGJ1Y2tldC5pbmNsdWRlcygnLi4nKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIGJ1Y2tldCBjYW5ub3QgaGF2ZSBpcCBhZGRyZXNzIHN0eWxlLlxuICBpZiAoL1swLTldK1xcLlswLTldK1xcLlswLTldK1xcLlswLTldKy8udGVzdChidWNrZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gYnVja2V0IHNob3VsZCBiZWdpbiB3aXRoIGFscGhhYmV0L251bWJlciBhbmQgZW5kIHdpdGggYWxwaGFiZXQvbnVtYmVyLFxuICAvLyB3aXRoIGFscGhhYmV0L251bWJlci8uLSBpbiB0aGUgbWlkZGxlLlxuICBpZiAoL15bYS16MC05XVthLXowLTkuLV0rW2EtejAtOV0kLy50ZXN0KGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIGNoZWNrIGlmIG9iamVjdE5hbWUgaXMgYSB2YWxpZCBvYmplY3QgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZTogdW5rbm93bikge1xuICBpZiAoIWlzVmFsaWRQcmVmaXgob2JqZWN0TmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBvYmplY3ROYW1lLmxlbmd0aCAhPT0gMFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIHByZWZpeCBpcyB2YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByZWZpeChwcmVmaXg6IHVua25vd24pOiBwcmVmaXggaXMgc3RyaW5nIHtcbiAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKHByZWZpeC5sZW5ndGggPiAxMDI0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0eXBlb2YgYXJnIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIoYXJnOiB1bmtub3duKTogYXJnIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJ1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgQW55RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGFueVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnOiB1bmtub3duKTogYXJnIGlzIEFueUZ1bmN0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0eXBlb2YgYXJnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoYXJnOiB1bmtub3duKTogYXJnIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJ1xufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChhcmc6IHVua25vd24pOiBhcmcgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIG9iamVjdCBpcyByZWFkYWJsZSBzdHJlYW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0oYXJnOiB1bmtub3duKTogYXJnIGlzIHN0cmVhbS5SZWFkYWJsZSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgcmV0dXJuIGlzT2JqZWN0KGFyZykgJiYgaXNGdW5jdGlvbigoYXJnIGFzIHN0cmVhbS5SZWFkYWJsZSkuX3JlYWQpXG59XG5cbi8qKlxuICogY2hlY2sgaWYgYXJnIGlzIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihhcmc6IHVua25vd24pOiBhcmcgaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkobzogdW5rbm93bik6IG8gaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBfLmlzRW1wdHkobylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmplY3QobzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMobykuZmlsdGVyKCh4KSA9PiB4ICE9PSB1bmRlZmluZWQpLmxlbmd0aCAhPT0gMFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkPFQ+KG86IFQpOiBvIGlzIEV4Y2x1ZGU8VCwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiBvICE9PSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBjaGVjayBpZiBhcmcgaXMgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShhcmc6IHVua25vd24pOiBhcmcgaXMgRGF0ZSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tuZXcgRGF0ZShNYXRoLk5hTilcbiAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGFyZylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBEYXRlIHN0cmluZyB3aXRoIGZvcm1hdDogJ1lZWVlNTUREVEhIbW1zcycgKyBaXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGF0ZUxvbmcoZGF0ZT86IERhdGUpOiBzdHJpbmcge1xuICBkYXRlID0gZGF0ZSB8fCBuZXcgRGF0ZSgpXG5cbiAgLy8gR2l2ZXMgZm9ybWF0IGxpa2U6ICcyMDE3LTA4LTA3VDE2OjI4OjU5Ljg4OVonXG4gIGNvbnN0IHMgPSBkYXRlLnRvSVNPU3RyaW5nKClcblxuICByZXR1cm4gcy5zbGljZSgwLCA0KSArIHMuc2xpY2UoNSwgNykgKyBzLnNsaWNlKDgsIDEzKSArIHMuc2xpY2UoMTQsIDE2KSArIHMuc2xpY2UoMTcsIDE5KSArICdaJ1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIERhdGUgc3RyaW5nIHdpdGggZm9ybWF0OiAnWVlZWU1NREQnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGF0ZVNob3J0KGRhdGU/OiBEYXRlKSB7XG4gIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlKClcblxuICAvLyBHaXZlcyBmb3JtYXQgbGlrZTogJzIwMTctMDgtMDdUMTY6Mjg6NTkuODg5WidcbiAgY29uc3QgcyA9IGRhdGUudG9JU09TdHJpbmcoKVxuXG4gIHJldHVybiBzLnNsaWNlKDAsIDQpICsgcy5zbGljZSg1LCA3KSArIHMuc2xpY2UoOCwgMTApXG59XG5cbi8qKlxuICogcGlwZXNldHVwIHNldHMgdXAgcGlwZSgpIGZyb20gbGVmdCB0byByaWdodCBvcyBzdHJlYW1zIGFycmF5XG4gKiBwaXBlc2V0dXAgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGF0IGVycm9yIGVtaXR0ZWQgYXQgYW55IG9mIHRoZSB1cHN0cmVhbSBTdHJlYW1cbiAqIHdpbGwgYmUgZW1pdHRlZCBhdCB0aGUgbGFzdCBzdHJlYW0uIFRoaXMgbWFrZXMgZXJyb3IgaGFuZGxpbmcgc2ltcGxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlc2V0dXAoLi4uc3RyZWFtczogW3N0cmVhbS5SZWFkYWJsZSwgLi4uc3RyZWFtLkR1cGxleFtdLCBzdHJlYW0uV3JpdGFibGVdKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHMgY2FuJ3QgbmFycm93IHRoaXNcbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKChzcmM6IHN0cmVhbS5SZWFkYWJsZSwgZHN0OiBzdHJlYW0uV3JpdGFibGUpID0+IHtcbiAgICBzcmMub24oJ2Vycm9yJywgKGVycikgPT4gZHN0LmVtaXQoJ2Vycm9yJywgZXJyKSlcbiAgICByZXR1cm4gc3JjLnBpcGUoZHN0KVxuICB9KVxufVxuXG4vKipcbiAqIHJldHVybiBhIFJlYWRhYmxlIHN0cmVhbSB0aGF0IGVtaXRzIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtKGRhdGE6IHVua25vd24pOiBzdHJlYW0uUmVhZGFibGUge1xuICBjb25zdCBzID0gbmV3IHN0cmVhbS5SZWFkYWJsZSgpXG4gIHMuX3JlYWQgPSAoKSA9PiB7fVxuICBzLnB1c2goZGF0YSlcbiAgcy5wdXNoKG51bGwpXG4gIHJldHVybiBzXG59XG5cbi8qKlxuICogUHJvY2VzcyBtZXRhZGF0YSB0byBpbnNlcnQgYXBwcm9wcmlhdGUgdmFsdWUgdG8gYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRDb250ZW50VHlwZShtZXRhRGF0YTogT2JqZWN0TWV0YURhdGEsIGZpbGVQYXRoOiBzdHJpbmcpOiBPYmplY3RNZXRhRGF0YSB7XG4gIC8vIGNoZWNrIGlmIGNvbnRlbnQtdHlwZSBhdHRyaWJ1dGUgcHJlc2VudCBpbiBtZXRhRGF0YVxuICBmb3IgKGNvbnN0IGtleSBpbiBtZXRhRGF0YSkge1xuICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgIHJldHVybiBtZXRhRGF0YVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIGBjb250ZW50LXR5cGVgIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudCBpbiBtZXRhZGF0YSwgdGhlbiBpbmZlciBpdCBmcm9tIHRoZSBleHRlbnNpb24gaW4gZmlsZVBhdGhcbiAgcmV0dXJuIHtcbiAgICAuLi5tZXRhRGF0YSxcbiAgICAnY29udGVudC10eXBlJzogcHJvYmVDb250ZW50VHlwZShmaWxlUGF0aCksXG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBwcmVwZW5kcyBtZXRhZGF0YSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXggaWYgaXQgaXMgbm90IGFscmVhZHkgb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YT86IE9iamVjdE1ldGFEYXRhKTogUmVxdWVzdEhlYWRlcnMge1xuICBpZiAoIW1ldGFEYXRhKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICByZXR1cm4gXy5tYXBLZXlzKG1ldGFEYXRhLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChpc0FtekhlYWRlcihrZXkpIHx8IGlzU3VwcG9ydGVkSGVhZGVyKGtleSkgfHwgaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5KSkge1xuICAgICAgcmV0dXJuIGtleVxuICAgIH1cblxuICAgIHJldHVybiBNZXRhRGF0YUhlYWRlclByZWZpeCArIGtleVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHZhbGlkIGhlYWRlciBhY2NvcmRpbmcgdG8gdGhlIEFtYXpvblMzIEFQSVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbXpIZWFkZXIoa2V5OiBzdHJpbmcpIHtcbiAgY29uc3QgdGVtcCA9IGtleS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiAoXG4gICAgdGVtcC5zdGFydHNXaXRoKE1ldGFEYXRhSGVhZGVyUHJlZml4KSB8fFxuICAgIHRlbXAgPT09ICd4LWFtei1hY2wnIHx8XG4gICAgdGVtcC5zdGFydHNXaXRoKCd4LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uLScpIHx8XG4gICAgdGVtcCA9PT0gJ3gtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgaXQgaXMgYSBzdXBwb3J0ZWQgSGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRlZEhlYWRlcihrZXk6IHN0cmluZykge1xuICBjb25zdCBzdXBwb3J0ZWRfaGVhZGVycyA9IFtcbiAgICAnY29udGVudC10eXBlJyxcbiAgICAnY2FjaGUtY29udHJvbCcsXG4gICAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAgICdjb250ZW50LWRpc3Bvc2l0aW9uJyxcbiAgICAnY29udGVudC1sYW5ndWFnZScsXG4gICAgJ3gtYW16LXdlYnNpdGUtcmVkaXJlY3QtbG9jYXRpb24nLFxuICBdXG4gIHJldHVybiBzdXBwb3J0ZWRfaGVhZGVycy5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgaXQgaXMgYSBzdG9yYWdlIGhlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGtleS50b0xvd2VyQ2FzZSgpID09PSAneC1hbXotc3RvcmFnZS1jbGFzcydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNZXRhZGF0YShoZWFkZXJzOiBSZXNwb25zZUhlYWRlcikge1xuICByZXR1cm4gXy5tYXBLZXlzKFxuICAgIF8ucGlja0J5KGhlYWRlcnMsICh2YWx1ZSwga2V5KSA9PiBpc1N1cHBvcnRlZEhlYWRlcihrZXkpIHx8IGlzU3RvcmFnZUNsYXNzSGVhZGVyKGtleSkgfHwgaXNBbXpIZWFkZXIoa2V5KSksXG4gICAgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGxvd2VyID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgICAgIGlmIChsb3dlci5zdGFydHNXaXRoKE1ldGFEYXRhSGVhZGVyUHJlZml4KSkge1xuICAgICAgICByZXR1cm4gbG93ZXIuc2xpY2UoTWV0YURhdGFIZWFkZXJQcmVmaXgubGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5XG4gICAgfSxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVyc2lvbklkKGhlYWRlcnM6IFJlc3BvbnNlSGVhZGVyID0ge30pIHtcbiAgcmV0dXJuIGhlYWRlcnNbJ3gtYW16LXZlcnNpb24taWQnXSB8fCBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VWZXJzaW9uSWQoaGVhZGVyczogUmVzcG9uc2VIZWFkZXIgPSB7fSkge1xuICByZXR1cm4gaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtdmVyc2lvbi1pZCddIHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplRVRhZyhldGFnID0gJycpOiBzdHJpbmcge1xuICBjb25zdCByZXBsYWNlQ2hhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ1wiJzogJycsXG4gICAgJyZxdW90Oyc6ICcnLFxuICAgICcmIzM0Oyc6ICcnLFxuICAgICcmUVVPVDsnOiAnJyxcbiAgICAnJiN4MDAwMjInOiAnJyxcbiAgfVxuICByZXR1cm4gZXRhZy5yZXBsYWNlKC9eKFwifCZxdW90O3wmIzM0Oyl8KFwifCZxdW90O3wmIzM0OykkL2csIChtKSA9PiByZXBsYWNlQ2hhcnNbbV0gYXMgc3RyaW5nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9NZDUocGF5bG9hZDogQmluYXJ5KTogc3RyaW5nIHtcbiAgLy8gdXNlIHN0cmluZyBmcm9tIGJyb3dzZXIgYW5kIGJ1ZmZlciBmcm9tIG5vZGVqc1xuICAvLyBicm93c2VyIHN1cHBvcnQgaXMgdGVzdGVkIG9ubHkgYWdhaW5zdCBtaW5pbyBzZXJ2ZXJcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoQnVmZmVyLmZyb20ocGF5bG9hZCkpLmRpZ2VzdCgpLnRvU3RyaW5nKCdiYXNlNjQnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TaGEyNTYocGF5bG9hZDogQmluYXJ5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocGF5bG9hZCkuZGlnZXN0KCdoZXgnKVxufVxuXG4vKipcbiAqIHRvQXJyYXkgcmV0dXJucyBhIHNpbmdsZSBlbGVtZW50IGFycmF5IHdpdGggcGFyYW0gYmVpbmcgdGhlIGVsZW1lbnQsXG4gKiBpZiBwYXJhbSBpcyBqdXN0IGEgc3RyaW5nLCBhbmQgcmV0dXJucyAncGFyYW0nIGJhY2sgaWYgaXQgaXMgYW4gYXJyYXlcbiAqIFNvLCBpdCBtYWtlcyBzdXJlIHBhcmFtIGlzIGFsd2F5cyBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUID0gdW5rbm93bj4ocGFyYW06IFQgfCBUW10pOiBBcnJheTxUPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICByZXR1cm4gW3BhcmFtXSBhcyBUW11cbiAgfVxuICByZXR1cm4gcGFyYW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT2JqZWN0S2V5KG9iamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vICsgc3ltYm9sIGNoYXJhY3RlcnMgYXJlIG5vdCBkZWNvZGVkIGFzIHNwYWNlcyBpbiBKUy4gc28gcmVwbGFjZSB0aGVtIGZpcnN0IGFuZCBkZWNvZGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdC5cbiAgY29uc3QgYXNTdHJOYW1lID0gKG9iamVjdE5hbWUgPyBvYmplY3ROYW1lLnRvU3RyaW5nKCkgOiAnJykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhc1N0ck5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBQQVJUX0NPTlNUUkFJTlRTID0ge1xuICAvLyBhYnNNaW5QYXJ0U2l6ZSAtIGFic29sdXRlIG1pbmltdW0gcGFydCBzaXplICg1IE1pQilcbiAgQUJTX01JTl9QQVJUX1NJWkU6IDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUlOX1BBUlRfU0laRSAtIG1pbmltdW0gcGFydCBzaXplIDE2TWlCIHBlciBvYmplY3QgYWZ0ZXIgd2hpY2hcbiAgTUlOX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiAxNixcbiAgLy8gTUFYX1BBUlRTX0NPVU5UIC0gbWF4aW11bSBudW1iZXIgb2YgcGFydHMgZm9yIGEgc2luZ2xlIG11bHRpcGFydCBzZXNzaW9uLlxuICBNQVhfUEFSVFNfQ09VTlQ6IDEwMDAwLFxuICAvLyBNQVhfUEFSVF9TSVpFIC0gbWF4aW11bSBwYXJ0IHNpemUgNUdpQiBmb3IgYSBzaW5nbGUgbXVsdGlwYXJ0IHVwbG9hZFxuICAvLyBvcGVyYXRpb24uXG4gIE1BWF9QQVJUX1NJWkU6IDEwMjQgKiAxMDI0ICogMTAyNCAqIDUsXG4gIC8vIE1BWF9TSU5HTEVfUFVUX09CSkVDVF9TSVpFIC0gbWF4aW11bSBzaXplIDVHaUIgb2Ygb2JqZWN0IHBlciBQVVRcbiAgLy8gb3BlcmF0aW9uLlxuICBNQVhfU0lOR0xFX1BVVF9PQkpFQ1RfU0laRTogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUgLSBtYXhpbXVtIHNpemUgNVRpQiBvZiBvYmplY3QgZm9yXG4gIC8vIE11bHRpcGFydCBvcGVyYXRpb24uXG4gIE1BWF9NVUxUSVBBUlRfUFVUX09CSkVDVF9TSVpFOiAxMDI0ICogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbn1cblxuY29uc3QgR0VORVJJQ19TU0VfSEVBREVSID0gJ1gtQW16LVNlcnZlci1TaWRlLUVuY3J5cHRpb24nXG5cbmNvbnN0IEVOQ1JZUFRJT05fSEVBREVSUyA9IHtcbiAgLy8gc3NlR2VuZXJpY0hlYWRlciBpcyB0aGUgQVdTIFNTRSBoZWFkZXIgdXNlZCBmb3IgU1NFLVMzIGFuZCBTU0UtS01TLlxuICBzc2VHZW5lcmljSGVhZGVyOiBHRU5FUklDX1NTRV9IRUFERVIsXG4gIC8vIHNzZUttc0tleUlEIGlzIHRoZSBBV1MgU1NFLUtNUyBrZXkgaWQuXG4gIHNzZUttc0tleUlEOiBHRU5FUklDX1NTRV9IRUFERVIgKyAnLUF3cy1LbXMtS2V5LUlkJyxcbn0gYXMgY29uc3RcblxuLyoqXG4gKiBSZXR1cm4gRW5jcnlwdGlvbiBoZWFkZXJzXG4gKiBAcGFyYW0gZW5jQ29uZmlnXG4gKiBAcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBrZXkgdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBoZWFkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5jcnlwdGlvbkhlYWRlcnMoZW5jQ29uZmlnOiBFbmNyeXB0aW9uKTogUmVxdWVzdEhlYWRlcnMge1xuICBjb25zdCBlbmNUeXBlID0gZW5jQ29uZmlnLnR5cGVcblxuICBpZiAoIWlzRW1wdHkoZW5jVHlwZSkpIHtcbiAgICBpZiAoZW5jVHlwZSA9PT0gRU5DUllQVElPTl9UWVBFUy5TU0VDKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUdlbmVyaWNIZWFkZXJdOiAnQUVTMjU2JyxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuY1R5cGUgPT09IEVOQ1JZUFRJT05fVFlQRVMuS01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUdlbmVyaWNIZWFkZXJdOiBlbmNDb25maWcuU1NFQWxnb3JpdGhtLFxuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUttc0tleUlEXTogZW5jQ29uZmlnLktNU01hc3RlcktleUlELFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFydHNSZXF1aXJlZChzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBtYXhQYXJ0U2l6ZSA9IFBBUlRfQ09OU1RSQUlOVFMuTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUgLyAoUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQgLSAxKVxuICBsZXQgcmVxdWlyZWRQYXJ0U2l6ZSA9IHNpemUgLyBtYXhQYXJ0U2l6ZVxuICBpZiAoc2l6ZSAlIG1heFBhcnRTaXplID4gMCkge1xuICAgIHJlcXVpcmVkUGFydFNpemUrK1xuICB9XG4gIHJlcXVpcmVkUGFydFNpemUgPSBNYXRoLnRydW5jKHJlcXVpcmVkUGFydFNpemUpXG4gIHJldHVybiByZXF1aXJlZFBhcnRTaXplXG59XG5cbi8qKlxuICogY2FsY3VsYXRlRXZlblNwbGl0cyAtIGNvbXB1dGVzIHNwbGl0cyBmb3IgYSBzb3VyY2UgYW5kIHJldHVybnNcbiAqIHN0YXJ0IGFuZCBlbmQgaW5kZXggc2xpY2VzLiBTcGxpdHMgaGFwcGVuIGV2ZW5seSB0byBiZSBzdXJlIHRoYXQgbm9cbiAqIHBhcnQgaXMgbGVzcyB0aGFuIDVNaUIsIGFzIHRoYXQgY291bGQgZmFpbCB0aGUgbXVsdGlwYXJ0IHJlcXVlc3QgaWZcbiAqIGl0IGlzIG5vdCB0aGUgbGFzdCBwYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXZlblNwbGl0czxUIGV4dGVuZHMgeyBTdGFydD86IG51bWJlciB9PihcbiAgc2l6ZTogbnVtYmVyLFxuICBvYmpJbmZvOiBULFxuKToge1xuICBzdGFydEluZGV4OiBudW1iZXJbXVxuICBvYmpJbmZvOiBUXG4gIGVuZEluZGV4OiBudW1iZXJbXVxufSB8IG51bGwge1xuICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVxUGFydHMgPSBwYXJ0c1JlcXVpcmVkKHNpemUpXG4gIGNvbnN0IHN0YXJ0SW5kZXhQYXJ0czogbnVtYmVyW10gPSBbXVxuICBjb25zdCBlbmRJbmRleFBhcnRzOiBudW1iZXJbXSA9IFtdXG5cbiAgbGV0IHN0YXJ0ID0gb2JqSW5mby5TdGFydFxuICBpZiAoaXNFbXB0eShzdGFydCkgfHwgc3RhcnQgPT09IC0xKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgY29uc3QgZGl2aXNvclZhbHVlID0gTWF0aC50cnVuYyhzaXplIC8gcmVxUGFydHMpXG5cbiAgY29uc3QgcmVtaW5kZXJWYWx1ZSA9IHNpemUgJSByZXFQYXJ0c1xuXG4gIGxldCBuZXh0U3RhcnQgPSBzdGFydFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxUGFydHM7IGkrKykge1xuICAgIGxldCBjdXJQYXJ0U2l6ZSA9IGRpdmlzb3JWYWx1ZVxuICAgIGlmIChpIDwgcmVtaW5kZXJWYWx1ZSkge1xuICAgICAgY3VyUGFydFNpemUrK1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IG5leHRTdGFydFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSBjdXJyZW50U3RhcnQgKyBjdXJQYXJ0U2l6ZSAtIDFcbiAgICBuZXh0U3RhcnQgPSBjdXJyZW50RW5kICsgMVxuXG4gICAgc3RhcnRJbmRleFBhcnRzLnB1c2goY3VycmVudFN0YXJ0KVxuICAgIGVuZEluZGV4UGFydHMucHVzaChjdXJyZW50RW5kKVxuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnRJbmRleDogc3RhcnRJbmRleFBhcnRzLCBlbmRJbmRleDogZW5kSW5kZXhQYXJ0cywgb2JqSW5mbzogb2JqSW5mbyB9XG59XG5cbmNvbnN0IGZ4cCA9IG5ldyBYTUxQYXJzZXIoKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWG1sKHhtbDogc3RyaW5nKTogYW55IHtcbiAgY29uc3QgcmVzdWx0ID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHJlc3VsdC5FcnJvcikge1xuICAgIHRocm93IHJlc3VsdC5FcnJvclxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQU4sdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUE0QyxTQUFBTyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBVCx3QkFBQWEsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxH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 /***/ }), @@ -78474,72 +81109,6 @@ exports.PostPolicy = PostPolicy; /***/ }), -/***/ 9093: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.request = request; -var _stream = __nccwpck_require__(2781); -async function request(transport, opt, body = null) { - return new Promise((resolve, reject) => { - const requestObj = transport.request(opt, resp => { - resolve(resp); - }); - if (!body || Buffer.isBuffer(body) || typeof body === 'string') { - requestObj.on('error', e => { - reject(e); - }).end(body); - return; - } - - // pump readable stream - (0, _stream.pipeline)(body, requestObj, err => { - if (err) { - reject(err); - } - }); - }); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RyZWFtIiwicmVxdWlyZSIsInJlcXVlc3QiLCJ0cmFuc3BvcnQiLCJvcHQiLCJib2R5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXF1ZXN0T2JqIiwicmVzcCIsIkJ1ZmZlciIsImlzQnVmZmVyIiwib24iLCJlIiwiZW5kIiwicGlwZWxpbmUiLCJlcnIiXSwic291cmNlcyI6WyJyZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgdHlwZSAqIGFzIGh0dHBzIGZyb20gJ25vZGU6aHR0cHMnXG5pbXBvcnQgdHlwZSAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNwb3J0IH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gIG9wdDogaHR0cHMuUmVxdWVzdE9wdGlvbnMsXG4gIGJvZHk6IEJ1ZmZlciB8IHN0cmluZyB8IHN0cmVhbS5SZWFkYWJsZSB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0gdHJhbnNwb3J0LnJlcXVlc3Qob3B0LCAocmVzcCkgPT4ge1xuICAgICAgcmVzb2x2ZShyZXNwKVxuICAgIH0pXG5cbiAgICBpZiAoIWJvZHkgfHwgQnVmZmVyLmlzQnVmZmVyKGJvZHkpIHx8IHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdE9ialxuICAgICAgICAub24oJ2Vycm9yJywgKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgfSlcbiAgICAgICAgLmVuZChib2R5KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBwdW1wIHJlYWRhYmxlIHN0cmVhbVxuICAgIHBpcGVsaW5lKGJvZHksIHJlcXVlc3RPYmosIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9KVxuICB9KVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFJTyxlQUFlQyxPQUFPQSxDQUMzQkMsU0FBb0IsRUFDcEJDLEdBQXlCLEVBQ3pCQyxJQUE4QyxHQUFHLElBQUksRUFDdEI7RUFDL0IsT0FBTyxJQUFJQyxPQUFPLENBQXVCLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO0lBQzVELE1BQU1DLFVBQVUsR0FBR04sU0FBUyxDQUFDRCxPQUFPLENBQUNFLEdBQUcsRUFBR00sSUFBSSxJQUFLO01BQ2xESCxPQUFPLENBQUNHLElBQUksQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ0wsSUFBSSxJQUFJTSxNQUFNLENBQUNDLFFBQVEsQ0FBQ1AsSUFBSSxDQUFDLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM5REksVUFBVSxDQUNQSSxFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFVLElBQUs7UUFDM0JOLE1BQU0sQ0FBQ00sQ0FBQyxDQUFDO01BQ1gsQ0FBQyxDQUFDLENBQ0RDLEdBQUcsQ0FBQ1YsSUFBSSxDQUFDO01BRVo7SUFDRjs7SUFFQTtJQUNBLElBQUFXLGdCQUFRLEVBQUNYLElBQUksRUFBRUksVUFBVSxFQUFHUSxHQUFHLElBQUs7TUFDbEMsSUFBSUEsR0FBRyxFQUFFO1FBQ1BULE1BQU0sQ0FBQ1MsR0FBRyxDQUFDO01BQ2I7SUFDRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSiJ9 - -/***/ }), - -/***/ 2644: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.drainResponse = drainResponse; -exports.readAsBuffer = readAsBuffer; -exports.readAsString = readAsString; -async function readAsBuffer(res) { - return new Promise((resolve, reject) => { - const body = []; - res.on('data', chunk => body.push(chunk)).on('error', e => reject(e)).on('end', () => resolve(Buffer.concat(body))); - }); -} -async function readAsString(res) { - const body = await readAsBuffer(res); - return body.toString(); -} -async function drainResponse(res) { - return new Promise((resolve, reject) => { - res.on('data', () => {}).on('error', e => reject(e)).on('end', () => resolve()); - }); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkQXNCdWZmZXIiLCJyZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImJvZHkiLCJvbiIsImNodW5rIiwicHVzaCIsImUiLCJCdWZmZXIiLCJjb25jYXQiLCJyZWFkQXNTdHJpbmciLCJ0b1N0cmluZyIsImRyYWluUmVzcG9uc2UiXSwic291cmNlcyI6WyJyZXNwb25zZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBodHRwIGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCB0eXBlIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc0J1ZmZlcihyZXM6IHN0cmVhbS5SZWFkYWJsZSk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgYm9keTogQnVmZmVyW10gPSBbXVxuICAgIHJlc1xuICAgICAgLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IGJvZHkucHVzaChjaHVuaykpXG4gICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlamVjdChlKSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc1N0cmluZyhyZXM6IGh0dHAuSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRBc0J1ZmZlcihyZXMpXG4gIHJldHVybiBib2R5LnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyYWluUmVzcG9uc2UocmVzOiBzdHJlYW0uUmVhZGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXNcbiAgICAgIC5vbignZGF0YScsICgpID0+IHt9KVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWplY3QoZSkpXG4gICAgICAub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSlcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHTyxlQUFlQSxZQUFZQSxDQUFDQyxHQUFvQixFQUFtQjtFQUN4RSxPQUFPLElBQUlDLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUN0QyxNQUFNQyxJQUFjLEdBQUcsRUFBRTtJQUN6QkosR0FBRyxDQUNBSyxFQUFFLENBQUMsTUFBTSxFQUFHQyxLQUFhLElBQUtGLElBQUksQ0FBQ0csSUFBSSxDQUFDRCxLQUFLLENBQUMsQ0FBQyxDQUMvQ0QsRUFBRSxDQUFDLE9BQU8sRUFBR0csQ0FBQyxJQUFLTCxNQUFNLENBQUNLLENBQUMsQ0FBQyxDQUFDLENBQzdCSCxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU1ILE9BQU8sQ0FBQ08sTUFBTSxDQUFDQyxNQUFNLENBQUNOLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDbEQsQ0FBQyxDQUFDO0FBQ0o7QUFFTyxlQUFlTyxZQUFZQSxDQUFDWCxHQUF5QixFQUFtQjtFQUM3RSxNQUFNSSxJQUFJLEdBQUcsTUFBTUwsWUFBWSxDQUFDQyxHQUFHLENBQUM7RUFDcEMsT0FBT0ksSUFBSSxDQUFDUSxRQUFRLENBQUMsQ0FBQztBQUN4QjtBQUVPLGVBQWVDLGFBQWFBLENBQUNiLEdBQW9CLEVBQWlCO0VBQ3ZFLE9BQU8sSUFBSUMsT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO0lBQ3RDSCxHQUFHLENBQ0FLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNwQkEsRUFBRSxDQUFDLE9BQU8sRUFBR0csQ0FBQyxJQUFLTCxNQUFNLENBQUNLLENBQUMsQ0FBQyxDQUFDLENBQzdCSCxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU1ILE9BQU8sQ0FBQyxDQUFDLENBQUM7RUFDL0IsQ0FBQyxDQUFDO0FBQ0oifQ== - -/***/ }), - /***/ 6314: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -78636,249 +81205,8 @@ let LEGAL_HOLD_STATUS = /*#__PURE__*/function (LEGAL_HOLD_STATUS) { LEGAL_HOLD_STATUS["DISABLED"] = "OFF"; return LEGAL_HOLD_STATUS; }({}); -/* Replication Config types */ -/* Replication Config types */ exports.LEGAL_HOLD_STATUS = LEGAL_HOLD_STATUS; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTkNSWVBUSU9OX1RZUEVTIiwiZXhwb3J0cyIsIlJFVEVOVElPTl9NT0RFUyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkxFR0FMX0hPTERfU1RBVFVTIl0sInNvdXJjZXMiOlsidHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGh0dHAgZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSBhcyBSZWFkYWJsZVN0cmVhbSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5leHBvcnQgdHlwZSBCaW5hcnkgPSBzdHJpbmcgfCBCdWZmZXJcblxuLy8gbm9kZWpzIEluY29taW5nSHR0cEhlYWRlcnMgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LCBidXQgaXQncyBhY3R1YWxseSB0aGlzOlxuZXhwb3J0IHR5cGUgUmVzcG9uc2VIZWFkZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbmV4cG9ydCB0eXBlIE9iamVjdE1ldGFEYXRhID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCB1bmRlZmluZWQ+XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb24gPVxuICB8IHtcbiAgICAgIHR5cGU6IEVOQ1JZUFRJT05fVFlQRVMuU1NFQ1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBFTkNSWVBUSU9OX1RZUEVTLktNU1xuICAgICAgU1NFQWxnb3JpdGhtPzogc3RyaW5nXG4gICAgICBLTVNNYXN0ZXJLZXlJRD86IHN0cmluZ1xuICAgIH1cblxuZXhwb3J0IGVudW0gRU5DUllQVElPTl9UWVBFUyB7XG4gIC8qKlxuICAgKiBTU0VDIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIGN1c3RvbWVyIHByb3ZpZGVkIGtleXNcbiAgICovXG4gIFNTRUMgPSAnU1NFLUMnLFxuICAvKipcbiAgICogS01TIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIG1hbmFnZWQga2V5c1xuICAgKi9cbiAgS01TID0gJ0tNUycsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9NT0RFUyB7XG4gIEdPVkVSTkFOQ0UgPSAnR09WRVJOQU5DRScsXG4gIENPTVBMSUFOQ0UgPSAnQ09NUExJQU5DRScsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB7XG4gIERBWVMgPSAnRGF5cycsXG4gIFlFQVJTID0gJ1llYXJzJyxcbn1cblxuZXhwb3J0IGVudW0gTEVHQUxfSE9MRF9TVEFUVVMge1xuICBFTkFCTEVEID0gJ09OJyxcbiAgRElTQUJMRUQgPSAnT0ZGJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0ID0gUGljazx0eXBlb2YgaHR0cCwgJ3JlcXVlc3QnPlxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXF1ZXN0IHtcbiAgcHJvdG9jb2w6IHN0cmluZ1xuICBwb3J0PzogbnVtYmVyIHwgc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVyc1xufVxuXG5leHBvcnQgdHlwZSBJQ2Fub25pY2FsUmVxdWVzdCA9IHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEluY29tcGxldGVVcGxvYWRlZEJ1Y2tldEl0ZW0ge1xuICBrZXk6IHN0cmluZ1xuICB1cGxvYWRJZDogc3RyaW5nXG4gIHNpemU6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhSXRlbSB7XG4gIEtleTogc3RyaW5nXG4gIFZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVtQnVja2V0TWV0YWRhdGFMaXN0IHtcbiAgSXRlbXM6IE1ldGFkYXRhSXRlbVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUJ1Y2tldE1ldGFkYXRhIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0SXRlbUZyb21MaXN0IHtcbiAgbmFtZTogc3RyaW5nXG4gIGNyZWF0aW9uRGF0ZTogRGF0ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldEl0ZW1Db3B5IHtcbiAgZXRhZzogc3RyaW5nXG4gIGxhc3RNb2RpZmllZDogRGF0ZVxufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRJdGVtID1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHNpemU6IG51bWJlclxuICAgICAgZXRhZzogc3RyaW5nXG4gICAgICBwcmVmaXg/OiBuZXZlclxuICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlXG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU/OiBuZXZlclxuICAgICAgZXRhZz86IG5ldmVyXG4gICAgICBsYXN0TW9kaWZpZWQ/OiBuZXZlclxuICAgICAgcHJlZml4OiBzdHJpbmdcbiAgICAgIHNpemU6IDBcbiAgICB9XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGEgPSBCdWNrZXRJdGVtICYge1xuICBtZXRhZGF0YT86IEl0ZW1CdWNrZXRNZXRhZGF0YSB8IEl0ZW1CdWNrZXRNZXRhZGF0YUxpc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTdHJlYW08VD4gZXh0ZW5kcyBSZWFkYWJsZVN0cmVhbSB7XG4gIG9uKGV2ZW50OiAnZGF0YScsIGxpc3RlbmVyOiAoaXRlbTogVCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogJ2VuZCcgfCAncGF1c2UnIHwgJ3JlYWRhYmxlJyB8ICdyZXN1bWUnIHwgJ2Nsb3NlJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgb24oZXZlbnQ6ICdlcnJvcicsIGxpc3RlbmVyOiAoZXJyOiBFcnJvcikgPT4gdm9pZCk6IHRoaXNcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBvbihldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldEl0ZW1TdGF0IHtcbiAgc2l6ZTogbnVtYmVyXG4gIGV0YWc6IHN0cmluZ1xuICBsYXN0TW9kaWZpZWQ6IERhdGVcbiAgbWV0YURhdGE6IEl0ZW1CdWNrZXRNZXRhZGF0YVxuICB2ZXJzaW9uSWQ/OiBzdHJpbmcgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFN0YXRPYmplY3RPcHRzID0ge1xuICB2ZXJzaW9uSWQ/OiBzdHJpbmdcbn1cblxuLyogUmVwbGljYXRpb24gQ29uZmlnIHR5cGVzICovXG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvblJ1bGVTdGF0dXMgPSB7XG4gIFN0YXR1czogJ0VuYWJsZWQnIHwgJ0Rpc2FibGVkJ1xufVxuXG5leHBvcnQgdHlwZSBUYWcgPSB7XG4gIEtleTogc3RyaW5nXG4gIFZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYXRpb25SdWxlRGVzdGluYXRpb24gPSB7XG4gIEJ1Y2tldDogc3RyaW5nXG4gIFN0b3JhZ2VDbGFzczogc3RyaW5nXG59XG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvblJ1bGVBbmQgPSB7XG4gIFByZWZpeDogc3RyaW5nXG4gIFRhZ3M6IFRhZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxpY2F0aW9uUnVsZUZpbHRlciA9IHtcbiAgUHJlZml4OiBzdHJpbmdcbiAgQW5kOiBSZXBsaWNhdGlvblJ1bGVBbmRcbiAgVGFnOiBUYWdcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYU1vZGlmaWNhdGlvbnMgPSB7XG4gIFN0YXR1czogUmVwbGljYXRpb25SdWxlU3RhdHVzXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZVNlbGVjdGlvbkNyaXRlcmlhID0ge1xuICBSZXBsaWNhTW9kaWZpY2F0aW9uczogUmVwbGljYU1vZGlmaWNhdGlvbnNcbn1cblxuZXhwb3J0IHR5cGUgRXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvbiA9IHtcbiAgU3RhdHVzOiBSZXBsaWNhdGlvblJ1bGVTdGF0dXNcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYXRpb25SdWxlID0ge1xuICBJRDogc3RyaW5nXG4gIFN0YXR1czogUmVwbGljYXRpb25SdWxlU3RhdHVzXG4gIFByaW9yaXR5OiBudW1iZXJcbiAgRGVsZXRlTWFya2VyUmVwbGljYXRpb246IFJlcGxpY2F0aW9uUnVsZVN0YXR1cyAvLyBzaG91bGQgYmUgc2V0IHRvIFwiRGlzYWJsZWRcIiBieSBkZWZhdWx0XG4gIERlbGV0ZVJlcGxpY2F0aW9uOiBSZXBsaWNhdGlvblJ1bGVTdGF0dXNcbiAgRGVzdGluYXRpb246IFJlcGxpY2F0aW9uUnVsZURlc3RpbmF0aW9uXG4gIEZpbHRlcjogUmVwbGljYXRpb25SdWxlRmlsdGVyXG4gIFNvdXJjZVNlbGVjdGlvbkNyaXRlcmlhOiBTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVxuICBFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uOiBFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxpY2F0aW9uQ29uZmlnT3B0cyA9IHtcbiAgcm9sZTogc3RyaW5nXG4gIHJ1bGVzOiBSZXBsaWNhdGlvblJ1bGVbXVxufVxuXG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvbkNvbmZpZyA9IHtcbiAgUmVwbGljYXRpb25Db25maWd1cmF0aW9uOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHNcbn1cbi8qIFJlcGxpY2F0aW9uIENvbmZpZyB0eXBlcyAqL1xuXG5leHBvcnQgdHlwZSBSZXN1bHRDYWxsYmFjazxUPiA9IChlcnJvcjogRXJyb3IgfCBudWxsLCByZXN1bHQ6IFQpID0+IHZvaWRcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQTtBQUFBLElBaUJZQSxnQkFBZ0IsMEJBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQUEsT0FBaEJBLGdCQUFnQjtBQUFBO0FBQUFDLE9BQUEsQ0FBQUQsZ0JBQUEsR0FBQUEsZ0JBQUE7QUFBQSxJQVdoQkUsZUFBZSwwQkFBZkEsZUFBZTtFQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBQSxPQUFmQSxlQUFlO0FBQUE7QUFBQUQsT0FBQSxDQUFBQyxlQUFBLEdBQUFBLGVBQUE7QUFBQSxJQUtmQyx3QkFBd0IsMEJBQXhCQSx3QkFBd0I7RUFBeEJBLHdCQUF3QjtFQUF4QkEsd0JBQXdCO0VBQUEsT0FBeEJBLHdCQUF3QjtBQUFBO0FBQUFGLE9BQUEsQ0FBQUUsd0JBQUEsR0FBQUEsd0JBQUE7QUFBQSxJQUt4QkMsaUJBQWlCLDBCQUFqQkEsaUJBQWlCO0VBQWpCQSxpQkFBaUI7RUFBakJBLGlCQUFpQjtFQUFBLE9BQWpCQSxpQkFBaUI7QUFBQTtBQTBGN0I7QUF5REE7QUFBQUgsT0FBQSxDQUFBRyxpQkFBQSxHQUFBQSxpQkFBQSJ9 - -/***/ }), - -/***/ 4040: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.parseBucketRegion = parseBucketRegion; -exports.parseError = parseError; -exports.parseInitiateMultipart = parseInitiateMultipart; -exports.parseListBucket = parseListBucket; -exports.parseListObjectsV2WithMetadata = parseListObjectsV2WithMetadata; -exports.parseListParts = parseListParts; -exports.parseReplicationConfig = parseReplicationConfig; -exports.parseResponseError = parseResponseError; -var _fastXmlParser = __nccwpck_require__(2603); -var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helper = __nccwpck_require__(9921); -var _response = __nccwpck_require__(2644); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -// parse XML response for bucket region -function parseBucketRegion(xml) { - // return region information - return (0, _helper.parseXml)(xml).LocationConstraint; -} -const fxp = new _fastXmlParser.XMLParser(); - -// Parse XML and return information as Javascript types -// parse error XML response -function parseError(xml, headerInfo) { - let xmlErr = {}; - const xmlObj = fxp.parse(xml); - if (xmlObj.Error) { - xmlErr = xmlObj.Error; - } - const e = new errors.S3Error(); - Object.entries(xmlErr).forEach(([key, value]) => { - e[key.toLowerCase()] = value; - }); - Object.entries(headerInfo).forEach(([key, value]) => { - e[key] = value; - }); - return e; -} - -// Generates an Error object depending on http statusCode and XML body -async function parseResponseError(response) { - const statusCode = response.statusCode; - let code, message; - if (statusCode === 301) { - code = 'MovedPermanently'; - message = 'Moved Permanently'; - } else if (statusCode === 307) { - code = 'TemporaryRedirect'; - message = 'Are you using the correct endpoint URL?'; - } else if (statusCode === 403) { - code = 'AccessDenied'; - message = 'Valid and authorized credentials required'; - } else if (statusCode === 404) { - code = 'NotFound'; - message = 'Not Found'; - } else if (statusCode === 405) { - code = 'MethodNotAllowed'; - message = 'Method Not Allowed'; - } else if (statusCode === 501) { - code = 'MethodNotAllowed'; - message = 'Method Not Allowed'; - } else { - code = 'UnknownError'; - message = `${statusCode}`; - } - const headerInfo = {}; - // A value created by S3 compatible server that uniquely identifies the request. - headerInfo.amzRequestid = response.headers['x-amz-request-id']; - // A special token that helps troubleshoot API replies and issues. - headerInfo.amzId2 = response.headers['x-amz-id-2']; - - // Region where the bucket is located. This header is returned only - // in HEAD bucket and ListObjects response. - headerInfo.amzBucketRegion = response.headers['x-amz-bucket-region']; - const xmlString = await (0, _response.readAsString)(response); - if (xmlString) { - throw parseError(xmlString, headerInfo); - } - - // Message should be instantiated for each S3Errors. - const e = new errors.S3Error(message, { - cause: headerInfo - }); - // S3 Error code. - e.code = code; - Object.entries(headerInfo).forEach(([key, value]) => { - // @ts-expect-error force set error properties - e[key] = value; - }); - throw e; -} - -/** - * parse XML response for list objects v2 with metadata in a bucket - */ -function parseListObjectsV2WithMetadata(xml) { - const result = { - objects: [], - isTruncated: false, - nextContinuationToken: '' - }; - let xmlobj = (0, _helper.parseXml)(xml); - if (!xmlobj.ListBucketResult) { - throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"'); - } - xmlobj = xmlobj.ListBucketResult; - if (xmlobj.IsTruncated) { - result.isTruncated = xmlobj.IsTruncated; - } - if (xmlobj.NextContinuationToken) { - result.nextContinuationToken = xmlobj.NextContinuationToken; - } - if (xmlobj.Contents) { - (0, _helper.toArray)(xmlobj.Contents).forEach(content => { - const name = (0, _helper.sanitizeObjectKey)(content.Key); - const lastModified = new Date(content.LastModified); - const etag = (0, _helper.sanitizeETag)(content.ETag); - const size = content.Size; - let metadata; - if (content.UserMetadata != null) { - metadata = (0, _helper.toArray)(content.UserMetadata)[0]; - } else { - metadata = null; - } - result.objects.push({ - name, - lastModified, - etag, - size, - metadata - }); - }); - } - if (xmlobj.CommonPrefixes) { - (0, _helper.toArray)(xmlobj.CommonPrefixes).forEach(commonPrefix => { - result.objects.push({ - prefix: (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(commonPrefix.Prefix)[0]), - size: 0 - }); - }); - } - return result; -} -// parse XML response for list parts of an in progress multipart upload -function parseListParts(xml) { - let xmlobj = (0, _helper.parseXml)(xml); - const result = { - isTruncated: false, - parts: [], - marker: 0 - }; - if (!xmlobj.ListPartsResult) { - throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"'); - } - xmlobj = xmlobj.ListPartsResult; - if (xmlobj.IsTruncated) { - result.isTruncated = xmlobj.IsTruncated; - } - if (xmlobj.NextPartNumberMarker) { - result.marker = (0, _helper.toArray)(xmlobj.NextPartNumberMarker)[0] || ''; - } - if (xmlobj.Part) { - (0, _helper.toArray)(xmlobj.Part).forEach(p => { - const part = parseInt((0, _helper.toArray)(p.PartNumber)[0], 10); - const lastModified = new Date(p.LastModified); - const etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, ''); - result.parts.push({ - part, - lastModified, - etag, - size: parseInt(p.Size, 10) - }); - }); - } - return result; -} -function parseListBucket(xml) { - let result = []; - const parsedXmlRes = (0, _helper.parseXml)(xml); - if (!parsedXmlRes.ListAllMyBucketsResult) { - throw new errors.InvalidXMLError('Missing tag: "ListAllMyBucketsResult"'); - } - const { - ListAllMyBucketsResult: { - Buckets = {} - } = {} - } = parsedXmlRes; - if (Buckets.Bucket) { - result = (0, _helper.toArray)(Buckets.Bucket).map((bucket = {}) => { - const { - Name: bucketName, - CreationDate - } = bucket; - const creationDate = new Date(CreationDate); - return { - name: bucketName, - creationDate: creationDate - }; - }); - } - return result; -} -function parseInitiateMultipart(xml) { - let xmlobj = (0, _helper.parseXml)(xml); - if (!xmlobj.InitiateMultipartUploadResult) { - throw new errors.InvalidXMLError('Missing tag: "InitiateMultipartUploadResult"'); - } - xmlobj = xmlobj.InitiateMultipartUploadResult; - if (xmlobj.UploadId) { - return xmlobj.UploadId; - } - throw new errors.InvalidXMLError('Missing tag: "UploadId"'); -} -function parseReplicationConfig(xml) { - const xmlObj = (0, _helper.parseXml)(xml); - const { - Role, - Rule - } = xmlObj.ReplicationConfiguration; - return { - ReplicationConfiguration: { - role: Role, - rules: (0, _helper.toArray)(Rule) - } - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmFzdFhtbFBhcnNlciIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9oZWxwZXIiLCJfcmVzcG9uc2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwicGFyc2VCdWNrZXRSZWdpb24iLCJ4bWwiLCJwYXJzZVhtbCIsIkxvY2F0aW9uQ29uc3RyYWludCIsImZ4cCIsIlhNTFBhcnNlciIsInBhcnNlRXJyb3IiLCJoZWFkZXJJbmZvIiwieG1sRXJyIiwieG1sT2JqIiwicGFyc2UiLCJFcnJvciIsImUiLCJTM0Vycm9yIiwiZW50cmllcyIsImZvckVhY2giLCJ2YWx1ZSIsInRvTG93ZXJDYXNlIiwicGFyc2VSZXNwb25zZUVycm9yIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiY29kZSIsIm1lc3NhZ2UiLCJhbXpSZXF1ZXN0aWQiLCJoZWFkZXJzIiwiYW16SWQyIiwiYW16QnVja2V0UmVnaW9uIiwieG1sU3RyaW5nIiwicmVhZEFzU3RyaW5nIiwiY2F1c2UiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJyZXN1bHQiLCJvYmplY3RzIiwiaXNUcnVuY2F0ZWQiLCJuZXh0Q29udGludWF0aW9uVG9rZW4iLCJ4bWxvYmoiLCJMaXN0QnVja2V0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiSXNUcnVuY2F0ZWQiLCJOZXh0Q29udGludWF0aW9uVG9rZW4iLCJDb250ZW50cyIsInRvQXJyYXkiLCJjb250ZW50IiwibmFtZSIsInNhbml0aXplT2JqZWN0S2V5IiwiS2V5IiwibGFzdE1vZGlmaWVkIiwiRGF0ZSIsIkxhc3RNb2RpZmllZCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJFVGFnIiwic2l6ZSIsIlNpemUiLCJtZXRhZGF0YSIsIlVzZXJNZXRhZGF0YSIsInB1c2giLCJDb21tb25QcmVmaXhlcyIsImNvbW1vblByZWZpeCIsInByZWZpeCIsIlByZWZpeCIsInBhcnNlTGlzdFBhcnRzIiwicGFydHMiLCJtYXJrZXIiLCJMaXN0UGFydHNSZXN1bHQiLCJOZXh0UGFydE51bWJlck1hcmtlciIsIlBhcnQiLCJwIiwicGFydCIsInBhcnNlSW50IiwiUGFydE51bWJlciIsInJlcGxhY2UiLCJwYXJzZUxpc3RCdWNrZXQiLCJwYXJzZWRYbWxSZXMiLCJMaXN0QWxsTXlCdWNrZXRzUmVzdWx0IiwiQnVja2V0cyIsIkJ1Y2tldCIsIm1hcCIsImJ1Y2tldCIsIk5hbWUiLCJidWNrZXROYW1lIiwiQ3JlYXRpb25EYXRlIiwiY3JlYXRpb25EYXRlIiwicGFyc2VJbml0aWF0ZU11bHRpcGFydCIsIkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0IiwiVXBsb2FkSWQiLCJwYXJzZVJlcGxpY2F0aW9uQ29uZmlnIiwiUm9sZSIsIlJ1bGUiLCJSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJyb2xlIiwicnVsZXMiXSwic291cmNlcyI6WyJ4bWwtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5cbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4uL2Vycm9ycy50cydcbmltcG9ydCB7IHBhcnNlWG1sLCBzYW5pdGl6ZUVUYWcsIHNhbml0aXplT2JqZWN0S2V5LCB0b0FycmF5IH0gZnJvbSAnLi9oZWxwZXIudHMnXG5pbXBvcnQgeyByZWFkQXNTdHJpbmcgfSBmcm9tICcuL3Jlc3BvbnNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBCdWNrZXRJdGVtRnJvbUxpc3QsIEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGEsIFJlcGxpY2F0aW9uQ29uZmlnIH0gZnJvbSAnLi90eXBlLnRzJ1xuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCByZWdpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldFJlZ2lvbih4bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIHJldHVybiByZWdpb24gaW5mb3JtYXRpb25cbiAgcmV0dXJuIHBhcnNlWG1sKHhtbCkuTG9jYXRpb25Db25zdHJhaW50XG59XG5cbmNvbnN0IGZ4cCA9IG5ldyBYTUxQYXJzZXIoKVxuXG4vLyBQYXJzZSBYTUwgYW5kIHJldHVybiBpbmZvcm1hdGlvbiBhcyBKYXZhc2NyaXB0IHR5cGVzXG4vLyBwYXJzZSBlcnJvciBYTUwgcmVzcG9uc2VcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVycm9yKHhtbDogc3RyaW5nLCBoZWFkZXJJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBsZXQgeG1sRXJyID0ge31cbiAgY29uc3QgeG1sT2JqID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHhtbE9iai5FcnJvcikge1xuICAgIHhtbEVyciA9IHhtbE9iai5FcnJvclxuICB9XG4gIGNvbnN0IGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IoKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIE9iamVjdC5lbnRyaWVzKHhtbEVycikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgZVtrZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZVxuICB9KVxuICBPYmplY3QuZW50cmllcyhoZWFkZXJJbmZvKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlW2tleV0gPSB2YWx1ZVxuICB9KVxuICByZXR1cm4gZVxufVxuXG4vLyBHZW5lcmF0ZXMgYW4gRXJyb3Igb2JqZWN0IGRlcGVuZGluZyBvbiBodHRwIHN0YXR1c0NvZGUgYW5kIFhNTCBib2R5XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VSZXNwb25zZUVycm9yKHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSkge1xuICBjb25zdCBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZVxuICBsZXQgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmdcbiAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMSkge1xuICAgIGNvZGUgPSAnTW92ZWRQZXJtYW5lbnRseSdcbiAgICBtZXNzYWdlID0gJ01vdmVkIFBlcm1hbmVudGx5J1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDMwNykge1xuICAgIGNvZGUgPSAnVGVtcG9yYXJ5UmVkaXJlY3QnXG4gICAgbWVzc2FnZSA9ICdBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IGVuZHBvaW50IFVSTD8nXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgY29kZSA9ICdBY2Nlc3NEZW5pZWQnXG4gICAgbWVzc2FnZSA9ICdWYWxpZCBhbmQgYXV0aG9yaXplZCBjcmVkZW50aWFscyByZXF1aXJlZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICBjb2RlID0gJ05vdEZvdW5kJ1xuICAgIG1lc3NhZ2UgPSAnTm90IEZvdW5kJ1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwNSkge1xuICAgIGNvZGUgPSAnTWV0aG9kTm90QWxsb3dlZCdcbiAgICBtZXNzYWdlID0gJ01ldGhvZCBOb3QgQWxsb3dlZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA1MDEpIHtcbiAgICBjb2RlID0gJ01ldGhvZE5vdEFsbG93ZWQnXG4gICAgbWVzc2FnZSA9ICdNZXRob2QgTm90IEFsbG93ZWQnXG4gIH0gZWxzZSB7XG4gICAgY29kZSA9ICdVbmtub3duRXJyb3InXG4gICAgbWVzc2FnZSA9IGAke3N0YXR1c0NvZGV9YFxuICB9XG4gIGNvbnN0IGhlYWRlckluZm86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw+ID0ge31cbiAgLy8gQSB2YWx1ZSBjcmVhdGVkIGJ5IFMzIGNvbXBhdGlibGUgc2VydmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVxdWVzdC5cbiAgaGVhZGVySW5mby5hbXpSZXF1ZXN0aWQgPSByZXNwb25zZS5oZWFkZXJzWyd4LWFtei1yZXF1ZXN0LWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gIC8vIEEgc3BlY2lhbCB0b2tlbiB0aGF0IGhlbHBzIHRyb3VibGVzaG9vdCBBUEkgcmVwbGllcyBhbmQgaXNzdWVzLlxuICBoZWFkZXJJbmZvLmFteklkMiA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtYW16LWlkLTInXSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvLyBSZWdpb24gd2hlcmUgdGhlIGJ1Y2tldCBpcyBsb2NhdGVkLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5XG4gIC8vIGluIEhFQUQgYnVja2V0IGFuZCBMaXN0T2JqZWN0cyByZXNwb25zZS5cbiAgaGVhZGVySW5mby5hbXpCdWNrZXRSZWdpb24gPSByZXNwb25zZS5oZWFkZXJzWyd4LWFtei1idWNrZXQtcmVnaW9uJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgeG1sU3RyaW5nID0gYXdhaXQgcmVhZEFzU3RyaW5nKHJlc3BvbnNlKVxuXG4gIGlmICh4bWxTdHJpbmcpIHtcbiAgICB0aHJvdyBwYXJzZUVycm9yKHhtbFN0cmluZywgaGVhZGVySW5mbylcbiAgfVxuXG4gIC8vIE1lc3NhZ2Ugc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCBTM0Vycm9ycy5cbiAgY29uc3QgZSA9IG5ldyBlcnJvcnMuUzNFcnJvcihtZXNzYWdlLCB7IGNhdXNlOiBoZWFkZXJJbmZvIH0pXG4gIC8vIFMzIEVycm9yIGNvZGUuXG4gIGUuY29kZSA9IGNvZGVcbiAgT2JqZWN0LmVudHJpZXMoaGVhZGVySW5mbykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmb3JjZSBzZXQgZXJyb3IgcHJvcGVydGllc1xuICAgIGVba2V5XSA9IHZhbHVlXG4gIH0pXG5cbiAgdGhyb3cgZVxufVxuXG4vKipcbiAqIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIHdpdGggbWV0YWRhdGEgaW4gYSBidWNrZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSh4bWw6IHN0cmluZykge1xuICBjb25zdCByZXN1bHQ6IHtcbiAgICBvYmplY3RzOiBBcnJheTxCdWNrZXRJdGVtV2l0aE1ldGFkYXRhPlxuICAgIGlzVHJ1bmNhdGVkOiBib29sZWFuXG4gICAgbmV4dENvbnRpbnVhdGlvblRva2VuOiBzdHJpbmdcbiAgfSA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgbmV4dENvbnRpbnVhdGlvblRva2VuOiAnJyxcbiAgfVxuXG4gIGxldCB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIGlmICgheG1sb2JqLkxpc3RCdWNrZXRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdEJ1Y2tldFJlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdFxuICBpZiAoeG1sb2JqLklzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0LmlzVHJ1bmNhdGVkID0geG1sb2JqLklzVHJ1bmNhdGVkXG4gIH1cbiAgaWYgKHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW4pIHtcbiAgICByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuID0geG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlblxuICB9XG5cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkoY29udGVudC5LZXkpXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShjb250ZW50Lkxhc3RNb2RpZmllZClcbiAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgY29uc3Qgc2l6ZSA9IGNvbnRlbnQuU2l6ZVxuICAgICAgbGV0IG1ldGFkYXRhXG4gICAgICBpZiAoY29udGVudC5Vc2VyTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgICBtZXRhZGF0YSA9IHRvQXJyYXkoY29udGVudC5Vc2VyTWV0YWRhdGEpWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUsIG1ldGFkYXRhIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouQ29tbW9uUHJlZml4ZXMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db21tb25QcmVmaXhlcykuZm9yRWFjaCgoY29tbW9uUHJlZml4KSA9PiB7XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBNdWx0aXBhcnQgPSB7XG4gIHVwbG9hZHM6IEFycmF5PHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHVwbG9hZElkOiBzdHJpbmdcbiAgICBpbml0aWF0b3I6IHVua25vd25cbiAgICBvd25lcjogdW5rbm93blxuICAgIHN0b3JhZ2VDbGFzczogdW5rbm93blxuICAgIGluaXRpYXRlZDogdW5rbm93blxuICB9PlxuICBwcmVmaXhlczogeyBwcmVmaXg6IHN0cmluZyB9W11cbiAgaXNUcnVuY2F0ZWQ6IGJvb2xlYW5cbiAgbmV4dEtleU1hcmtlcjogdW5kZWZpbmVkXG4gIG5leHRVcGxvYWRJZE1hcmtlcjogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCB0eXBlIFVwbG9hZGVkUGFydCA9IHtcbiAgcGFydDogbnVtYmVyXG4gIGxhc3RNb2RpZmllZD86IERhdGVcbiAgZXRhZzogc3RyaW5nXG4gIHNpemU6IG51bWJlclxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3QgcGFydHMgb2YgYW4gaW4gcHJvZ3Jlc3MgbXVsdGlwYXJ0IHVwbG9hZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdFBhcnRzKHhtbDogc3RyaW5nKToge1xuICBpc1RydW5jYXRlZDogYm9vbGVhblxuICBtYXJrZXI6IG51bWJlclxuICBwYXJ0czogVXBsb2FkZWRQYXJ0W11cbn0ge1xuICBsZXQgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXN1bHQ6IHsgaXNUcnVuY2F0ZWQ6IGJvb2xlYW47IG1hcmtlcjogbnVtYmVyOyBwYXJ0czogVXBsb2FkZWRQYXJ0W10gfSA9IHtcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgcGFydHM6IFtdLFxuICAgIG1hcmtlcjogMCxcbiAgfVxuICBpZiAoIXhtbG9iai5MaXN0UGFydHNSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdFBhcnRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0UGFydHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpIHtcbiAgICByZXN1bHQubWFya2VyID0gdG9BcnJheSh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpWzBdIHx8ICcnXG4gIH1cbiAgaWYgKHhtbG9iai5QYXJ0KSB7XG4gICAgdG9BcnJheSh4bWxvYmouUGFydCkuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgY29uc3QgcGFydCA9IHBhcnNlSW50KHRvQXJyYXkocC5QYXJ0TnVtYmVyKVswXSwgMTApXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShwLkxhc3RNb2RpZmllZClcbiAgICAgIGNvbnN0IGV0YWcgPSBwLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXiZxdW90Oy9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC8mIzM0OyQvZywgJycpXG4gICAgICByZXN1bHQucGFydHMucHVzaCh7IHBhcnQsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZTogcGFyc2VJbnQocC5TaXplLCAxMCkgfSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdEJ1Y2tldCh4bWw6IHN0cmluZykge1xuICBsZXQgcmVzdWx0OiBCdWNrZXRJdGVtRnJvbUxpc3RbXSA9IFtdXG4gIGNvbnN0IHBhcnNlZFhtbFJlcyA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXBhcnNlZFhtbFJlcy5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RBbGxNeUJ1Y2tldHNSZXN1bHRcIicpXG4gIH1cbiAgY29uc3QgeyBMaXN0QWxsTXlCdWNrZXRzUmVzdWx0OiB7IEJ1Y2tldHMgPSB7fSB9ID0ge30gfSA9IHBhcnNlZFhtbFJlc1xuXG4gIGlmIChCdWNrZXRzLkJ1Y2tldCkge1xuICAgIHJlc3VsdCA9IHRvQXJyYXkoQnVja2V0cy5CdWNrZXQpLm1hcCgoYnVja2V0ID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHsgTmFtZTogYnVja2V0TmFtZSwgQ3JlYXRpb25EYXRlIH0gPSBidWNrZXRcbiAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKENyZWF0aW9uRGF0ZSlcblxuICAgICAgcmV0dXJuIHsgbmFtZTogYnVja2V0TmFtZSwgY3JlYXRpb25EYXRlOiBjcmVhdGlvbkRhdGUgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbml0aWF0ZU11bHRpcGFydCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5VcGxvYWRJZCkge1xuICAgIHJldHVybiB4bWxvYmouVXBsb2FkSWRcbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiVXBsb2FkSWRcIicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlcGxpY2F0aW9uQ29uZmlnKHhtbDogc3RyaW5nKTogUmVwbGljYXRpb25Db25maWcge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGNvbnN0IHsgUm9sZSwgUnVsZSB9ID0geG1sT2JqLlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICByZXR1cm4ge1xuICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgcm9sZTogUm9sZSxcbiAgICAgIHJ1bGVzOiB0b0FycmF5KFJ1bGUpLFxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUVBLElBQUFBLGNBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUE0QyxTQUFBSyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBSix3QkFBQVEsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcs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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTkNSWVBUSU9OX1RZUEVTIiwiZXhwb3J0cyIsIlJFVEVOVElPTl9NT0RFUyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkxFR0FMX0hPTERfU1RBVFVTIl0sInNvdXJjZXMiOlsidHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGh0dHAgZnJvbSAnbm9kZTpodHRwJ1xuXG5leHBvcnQgdHlwZSBCaW5hcnkgPSBzdHJpbmcgfCBCdWZmZXJcblxuLy8gbm9kZWpzIEluY29taW5nSHR0cEhlYWRlcnMgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LCBidXQgaXQncyBhY3R1YWxseSB0aGlzOlxuZXhwb3J0IHR5cGUgUmVzcG9uc2VIZWFkZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbmV4cG9ydCB0eXBlIE9iamVjdE1ldGFEYXRhID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCB1bmRlZmluZWQ+XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb24gPVxuICB8IHtcbiAgICAgIHR5cGU6IEVOQ1JZUFRJT05fVFlQRVMuU1NFQ1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBFTkNSWVBUSU9OX1RZUEVTLktNU1xuICAgICAgU1NFQWxnb3JpdGhtPzogc3RyaW5nXG4gICAgICBLTVNNYXN0ZXJLZXlJRD86IHN0cmluZ1xuICAgIH1cblxuZXhwb3J0IGVudW0gRU5DUllQVElPTl9UWVBFUyB7XG4gIC8qKlxuICAgKiBTU0VDIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIGN1c3RvbWVyIHByb3ZpZGVkIGtleXNcbiAgICovXG4gIFNTRUMgPSAnU1NFLUMnLFxuICAvKipcbiAgICogS01TIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIG1hbmFnZWQga2V5c1xuICAgKi9cbiAgS01TID0gJ0tNUycsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9NT0RFUyB7XG4gIEdPVkVSTkFOQ0UgPSAnR09WRVJOQU5DRScsXG4gIENPTVBMSUFOQ0UgPSAnQ09NUExJQU5DRScsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB7XG4gIERBWVMgPSAnRGF5cycsXG4gIFlFQVJTID0gJ1llYXJzJyxcbn1cblxuZXhwb3J0IGVudW0gTEVHQUxfSE9MRF9TVEFUVVMge1xuICBFTkFCTEVEID0gJ09OJyxcbiAgRElTQUJMRUQgPSAnT0ZGJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0ID0gUGljazx0eXBlb2YgaHR0cCwgJ3JlcXVlc3QnPlxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXF1ZXN0IHtcbiAgcHJvdG9jb2w6IHN0cmluZ1xuICBwb3J0PzogbnVtYmVyIHwgc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVyc1xufVxuXG5leHBvcnQgdHlwZSBJQ2Fub25pY2FsUmVxdWVzdCA9IHN0cmluZ1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUlBO0FBQUEsSUFpQllBLGdCQUFnQiwwQkFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBQSxPQUFoQkEsZ0JBQWdCO0FBQUE7QUFBQUMsT0FBQSxDQUFBRCxnQkFBQSxHQUFBQSxnQkFBQTtBQUFBLElBV2hCRSxlQUFlLDBCQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBZkEsZUFBZTtFQUFBLE9BQWZBLGVBQWU7QUFBQTtBQUFBRCxPQUFBLENBQUFDLGVBQUEsR0FBQUEsZUFBQTtBQUFBLElBS2ZDLHdCQUF3QiwwQkFBeEJBLHdCQUF3QjtFQUF4QkEsd0JBQXdCO0VBQXhCQSx3QkFBd0I7RUFBQSxPQUF4QkEsd0JBQXdCO0FBQUE7QUFBQUYsT0FBQSxDQUFBRSx3QkFBQSxHQUFBQSx3QkFBQTtBQUFBLElBS3hCQyxpQkFBaUIsMEJBQWpCQSxpQkFBaUI7RUFBakJBLGlCQUFpQjtFQUFqQkEsaUJBQWlCO0VBQUEsT0FBakJBLGlCQUFpQjtBQUFBO0FBQUFILE9BQUEsQ0FBQUcsaUJBQUEsR0FBQUEsaUJBQUEifQ== /***/ }), @@ -78907,6 +81235,7 @@ var _webEncoding = __nccwpck_require__(1430); var _xml = __nccwpck_require__(7578); var _xml2js = __nccwpck_require__(4659); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); +var _extensions = __nccwpck_require__(2895); var _helpers = __nccwpck_require__(9455); Object.keys(_helpers).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -78914,7 +81243,6 @@ Object.keys(_helpers).forEach(function (key) { if (key in exports && exports[key] === _helpers[key]) return; exports[key] = _helpers[key]; }); -var _callbackify = __nccwpck_require__(3826); var _client = __nccwpck_require__(5586); var _copyConditions = __nccwpck_require__(3250); exports.CopyConditions = _copyConditions.CopyConditions; @@ -79001,6 +81329,263 @@ class Client extends _client.TypedClient { } } + // log the request, response, error + logHTTP(reqOptions, response, err) { + // if no logstreamer available return. + if (!this.logStream) { + return; + } + if (!(0, _helper.isObject)(reqOptions)) { + throw new TypeError('reqOptions should be of type "object"'); + } + if (response && !(0, _helper.isReadableStream)(response)) { + throw new TypeError('response should be of type "Stream"'); + } + if (err && !(err instanceof Error)) { + throw new TypeError('err should be of type "Error"'); + } + var logHeaders = headers => { + _lodash.forEach(headers, (v, k) => { + if (k == 'authorization') { + var redacter = new RegExp('Signature=([0-9a-f]+)'); + v = v.replace(redacter, 'Signature=**REDACTED**'); + } + this.logStream.write(`${k}: ${v}\n`); + }); + this.logStream.write('\n'); + }; + this.logStream.write(`REQUEST: ${reqOptions.method} ${reqOptions.path}\n`); + logHeaders(reqOptions.headers); + if (response) { + this.logStream.write(`RESPONSE: ${response.statusCode}\n`); + logHeaders(response.headers); + } + if (err) { + this.logStream.write('ERROR BODY:\n'); + var errJSON = JSON.stringify(err, null, '\t'); + this.logStream.write(`${errJSON}\n`); + } + } + + // Enable tracing + traceOn(stream) { + if (!stream) { + stream = process.stdout; + } + this.logStream = stream; + } + + // Disable tracing + traceOff() { + this.logStream = null; + } + + // makeRequest is the primitive used by the apis for making S3 requests. + // payload can be empty string in case of no payload. + // statusCode is the expected statusCode. If response.statusCode does not match + // we parse the XML error and call the callback with the error message. + // A valid region is passed by the calls - listBuckets, makeBucket and + // getBucketRegion. + makeRequest(options, payload, statusCodes, region, returnResponse, cb) { + if (!(0, _helper.isObject)(options)) { + throw new TypeError('options should be of type "object"'); + } + if (!(0, _helper.isString)(payload) && !(0, _helper.isObject)(payload)) { + // Buffer is of type 'object' + throw new TypeError('payload should be of type "string" or "Buffer"'); + } + statusCodes.forEach(statusCode => { + if (!(0, _helper.isNumber)(statusCode)) { + throw new TypeError('statusCode should be of type "number"'); + } + }); + if (!(0, _helper.isString)(region)) { + throw new TypeError('region should be of type "string"'); + } + if (!(0, _helper.isBoolean)(returnResponse)) { + throw new TypeError('returnResponse should be of type "boolean"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + if (!options.headers) { + options.headers = {}; + } + if (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE') { + options.headers['content-length'] = payload.length; + } + var sha256sum = ''; + if (this.enableSHA256) { + sha256sum = (0, _helper.toSha256)(payload); + } + var stream = (0, _helper.readableStream)(payload); + this.makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb); + } + + // makeRequestStream will be used directly instead of makeRequest in case the payload + // is available as a stream. for ex. putObject + makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb) { + if (!(0, _helper.isObject)(options)) { + throw new TypeError('options should be of type "object"'); + } + if (!(0, _helper.isReadableStream)(stream)) { + throw new errors.InvalidArgumentError('stream should be a readable Stream'); + } + if (!(0, _helper.isString)(sha256sum)) { + throw new TypeError('sha256sum should be of type "string"'); + } + statusCodes.forEach(statusCode => { + if (!(0, _helper.isNumber)(statusCode)) { + throw new TypeError('statusCode should be of type "number"'); + } + }); + if (!(0, _helper.isString)(region)) { + throw new TypeError('region should be of type "string"'); + } + if (!(0, _helper.isBoolean)(returnResponse)) { + throw new TypeError('returnResponse should be of type "boolean"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + + // sha256sum will be empty for anonymous or https requests + if (!this.enableSHA256 && sha256sum.length !== 0) { + throw new errors.InvalidArgumentError(`sha256sum expected to be empty for anonymous or https requests`); + } + // sha256sum should be valid for non-anonymous http requests. + if (this.enableSHA256 && sha256sum.length !== 64) { + throw new errors.InvalidArgumentError(`Invalid sha256sum : ${sha256sum}`); + } + var _makeRequest = (e, region) => { + if (e) { + return cb(e); + } + options.region = region; + var reqOptions = this.getRequestOptions(options); + if (!this.anonymous) { + // For non-anonymous https requests sha256sum is 'UNSIGNED-PAYLOAD' for signature calculation. + if (!this.enableSHA256) { + sha256sum = 'UNSIGNED-PAYLOAD'; + } + let date = new Date(); + reqOptions.headers['x-amz-date'] = (0, _helper.makeDateLong)(date); + reqOptions.headers['x-amz-content-sha256'] = sha256sum; + if (this.sessionToken) { + reqOptions.headers['x-amz-security-token'] = this.sessionToken; + } + this.checkAndRefreshCreds(); + var authorization = (0, _signing.signV4)(reqOptions, this.accessKey, this.secretKey, region, date, sha256sum); + reqOptions.headers.authorization = authorization; + } + var req = this.transport.request(reqOptions, response => { + if (!statusCodes.includes(response.statusCode)) { + // For an incorrect region, S3 server always sends back 400. + // But we will do cache invalidation for all errors so that, + // in future, if AWS S3 decides to send a different status code or + // XML error code we will still work fine. + delete this.regionMap[options.bucketName]; + var errorTransformer = transformers.getErrorTransformer(response); + (0, _helper.pipesetup)(response, errorTransformer).on('error', e => { + this.logHTTP(reqOptions, response, e); + cb(e); + }); + return; + } + this.logHTTP(reqOptions, response); + if (returnResponse) { + return cb(null, response); + } + // We drain the socket so that the connection gets closed. Note that this + // is not expensive as the socket will not have any data. + response.on('data', () => {}); + cb(null); + }); + let pipe = (0, _helper.pipesetup)(stream, req); + pipe.on('error', e => { + this.logHTTP(reqOptions, null, e); + cb(e); + }); + }; + if (region) { + return _makeRequest(null, region); + } + this.getBucketRegion(options.bucketName, _makeRequest); + } + + // gets the region of the bucket + getBucketRegion(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('cb should be of type "function"'); + } + + // Region is set with constructor, return the region right here. + if (this.region) { + return cb(null, this.region); + } + if (this.regionMap[bucketName]) { + return cb(null, this.regionMap[bucketName]); + } + var extractRegion = response => { + var transformer = transformers.getBucketRegionTransformer(); + var region = _helpers.DEFAULT_REGION; + (0, _helper.pipesetup)(response, transformer).on('error', cb).on('data', data => { + if (data) { + region = data; + } + }).on('end', () => { + this.regionMap[bucketName] = region; + cb(null, region); + }); + }; + var method = 'GET'; + var query = 'location'; + + // `getBucketLocation` behaves differently in following ways for + // different environments. + // + // - For nodejs env we default to path style requests. + // - For browser env path style requests on buckets yields CORS + // error. To circumvent this problem we make a virtual host + // style request signed with 'us-east-1'. This request fails + // with an error 'AuthorizationHeaderMalformed', additionally + // the error XML also provides Region of the bucket. To validate + // this region is proper we retry the same request with the newly + // obtained region. + var pathStyle = this.pathStyle && typeof window === 'undefined'; + this.makeRequest({ + method, + bucketName, + query, + pathStyle + }, '', [200], _helpers.DEFAULT_REGION, true, (e, response) => { + if (e) { + if (e.name === 'AuthorizationHeaderMalformed') { + var region = e.Region; + if (!region) { + return cb(e); + } + this.makeRequest({ + method, + bucketName, + query + }, '', [200], region, true, (e, response) => { + if (e) { + return cb(e); + } + extractRegion(response); + }); + return; + } + return cb(e); + } + extractRegion(response); + }); + } + // Creates the bucket `bucketName`. // // __Arguments__ @@ -79092,6 +81677,31 @@ class Client extends _client.TypedClient { }, payload, [200], region, false, processWithRetry); } + // List of buckets created. + // + // __Arguments__ + // * `callback(err, buckets)` _function_ - callback function with error as the first argument. `buckets` is an array of bucket information + // + // `buckets` array element: + // * `bucket.name` _string_ : bucket name + // * `bucket.creationDate` _Date_: date when bucket was created + listBuckets(cb) { + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var method = 'GET'; + this.makeRequest({ + method + }, '', [200], _helpers.DEFAULT_REGION, true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getListBucketTransformer(); + var buckets; + (0, _helper.pipesetup)(response, transformer).on('data', result => buckets = result).on('error', e => cb(e)).on('end', () => cb(null, buckets)); + }); + } + // Returns a stream that emits objects that are partially uploaded. // // __Arguments__ @@ -79140,11 +81750,14 @@ class Client extends _client.TypedClient { result.prefixes.forEach(prefix => uploads.push(prefix)); _async.eachSeries(result.uploads, (upload, cb) => { // for each incomplete upload add the sizes of its uploaded parts - this.listParts(bucket, upload.key, upload.uploadId).then(parts => { + this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { + if (err) { + return cb(err); + } upload.size = parts.reduce((acc, item) => acc + item.size, 0); uploads.push(upload); cb(); - }, cb); + }); }, err => { if (err) { readStream.emit('error', err); @@ -79190,6 +81803,31 @@ class Client extends _client.TypedClient { }); } + // Remove a bucket. + // + // __Arguments__ + // * `bucketName` _string_ : name of the bucket + // * `callback(err)` _function_ : `err` is `null` if the bucket is removed successfully. + removeBucket(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var method = 'DELETE'; + this.makeRequest({ + method, + bucketName + }, '', [204], '', false, e => { + // If the bucket was successfully removed, remove the region map entry. + if (!e) { + delete this.regionMap[bucketName]; + } + cb(e); + }); + } + // Remove the partially uploaded object. // // __Arguments__ @@ -79421,11 +82059,150 @@ class Client extends _client.TypedClient { // Inserts correct `content-type` attribute based on metaData and filePath metaData = (0, _helper.insertContentType)(metaData, filePath); - fs.lstat(filePath, (err, stat) => { - if (err) { - return callback(err); + + // Updates metaData to have the correct prefix if needed + metaData = (0, _helper.prependXAMZMeta)(metaData); + var size; + var partSize; + _async.waterfall([cb => fs.stat(filePath, cb), (stats, cb) => { + size = stats.size; + var stream; + var cbTriggered = false; + var origCb = cb; + cb = function () { + if (cbTriggered) { + return; + } + cbTriggered = true; + if (stream) { + stream.destroy(); + } + return origCb.apply(this, arguments); + }; + if (size > this.maxObjectSize) { + return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)); + } + if (size <= this.partSize) { + // simple PUT request, no multipart + var multipart = false; + var uploader = this.getUploader(bucketName, objectName, metaData, multipart); + var hash = transformers.getHashSummer(this.enableSHA256); + var start = 0; + var end = size - 1; + var autoClose = true; + if (size === 0) { + end = 0; + } + var options = { + start, + end, + autoClose + }; + (0, _helper.pipesetup)(fs.createReadStream(filePath, options), hash).on('data', data => { + var md5sum = data.md5sum; + var sha256sum = data.sha256sum; + stream = fs.createReadStream(filePath, options); + uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { + callback(err, objInfo); + cb(true); + }); + }).on('error', e => cb(e)); + return; } - return this.putObject(bucketName, objectName, fs.createReadStream(filePath), stat.size, metaData, callback); + this.findUploadId(bucketName, objectName, cb); + }, (uploadId, cb) => { + // if there was a previous incomplete upload, fetch all its uploaded parts info + if (uploadId) { + return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)); + } + // there was no previous upload, initiate a new one + this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])); + }, (uploadId, etags, cb) => { + partSize = this.calculatePartSize(size); + var multipart = true; + var uploader = this.getUploader(bucketName, objectName, metaData, multipart); + + // convert array to object to make things easy + var parts = etags.reduce(function (acc, item) { + if (!acc[item.part]) { + acc[item.part] = item; + } + return acc; + }, {}); + var partsDone = []; + var partNumber = 1; + var uploadedSize = 0; + _async.whilst(cb => { + cb(null, uploadedSize < size); + }, cb => { + var stream; + var cbTriggered = false; + var origCb = cb; + cb = function () { + if (cbTriggered) { + return; + } + cbTriggered = true; + if (stream) { + stream.destroy(); + } + return origCb.apply(this, arguments); + }; + var part = parts[partNumber]; + var hash = transformers.getHashSummer(this.enableSHA256); + var length = partSize; + if (length > size - uploadedSize) { + length = size - uploadedSize; + } + var start = uploadedSize; + var end = uploadedSize + length - 1; + var autoClose = true; + var options = { + autoClose, + start, + end + }; + // verify md5sum of each part + (0, _helper.pipesetup)(fs.createReadStream(filePath, options), hash).on('data', data => { + var md5sumHex = Buffer.from(data.md5sum, 'base64').toString('hex'); + if (part && md5sumHex === part.etag) { + // md5 matches, chunk already uploaded + partsDone.push({ + part: partNumber, + etag: part.etag + }); + partNumber++; + uploadedSize += length; + return cb(); + } + // part is not uploaded yet, or md5 mismatch + stream = fs.createReadStream(filePath, options); + uploader(uploadId, partNumber, stream, length, data.sha256sum, data.md5sum, (e, objInfo) => { + if (e) { + return cb(e); + } + partsDone.push({ + part: partNumber, + etag: objInfo.etag + }); + partNumber++; + uploadedSize += length; + return cb(); + }); + }).on('error', e => cb(e)); + }, e => { + if (e) { + return cb(e); + } + cb(null, partsDone, uploadId); + }); + }, + // all parts uploaded, complete the multipart upload + (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb)], (err, ...rest) => { + if (err === true) { + return; + } + callback(err, ...rest); }); } @@ -79925,6 +82702,112 @@ class Client extends _client.TypedClient { return readStream; } + // Stat information of the object. + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `objectName` _string_: name of the object + // * `statOpts` _object_ : Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional). + // * `callback(err, stat)` _function_: `err` is not `null` in case of error, `stat` contains the object information: + // * `stat.size` _number_: size of the object + // * `stat.etag` _string_: etag of the object + // * `stat.metaData` _string_: MetaData of the object + // * `stat.lastModified` _Date_: modified time stamp + // * `stat.versionId` _string_: version id of the object if available + statObject(bucketName, objectName, statOpts = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + // backward compatibility + if ((0, _helper.isFunction)(statOpts)) { + cb = statOpts; + statOpts = {}; + } + if (!(0, _helper.isObject)(statOpts)) { + throw new errors.InvalidArgumentError('statOpts should be of type "object"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var query = querystring.stringify(statOpts); + var method = 'HEAD'; + this.makeRequest({ + method, + bucketName, + objectName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + + // We drain the socket so that the connection gets closed. Note that this + // is not expensive as the socket will not have any data. + response.on('data', () => {}); + const result = { + size: +response.headers['content-length'], + metaData: (0, _helper.extractMetadata)(response.headers), + lastModified: new Date(response.headers['last-modified']), + versionId: (0, _helper.getVersionId)(response.headers), + etag: (0, _helper.sanitizeETag)(response.headers.etag) + }; + cb(null, result); + }); + } + + // Remove the specified object. + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `objectName` _string_: name of the object + // * `removeOpts` _object_: Version of the object in the form `{versionId:'my-uuid', governanceBypass:true|false, forceDelete:true|false}`. Default is `{}`. (optional) + // * `callback(err)` _function_: callback function is called with non `null` value in case of error + removeObject(bucketName, objectName, removeOpts = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + // backward compatibility + if ((0, _helper.isFunction)(removeOpts)) { + cb = removeOpts; + removeOpts = {}; + } + if (!(0, _helper.isObject)(removeOpts)) { + throw new errors.InvalidArgumentError('removeOpts should be of type "object"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + const method = 'DELETE'; + const queryParams = {}; + if (removeOpts.versionId) { + queryParams.versionId = `${removeOpts.versionId}`; + } + const headers = {}; + if (removeOpts.governanceBypass) { + headers['X-Amz-Bypass-Governance-Retention'] = true; + } + if (removeOpts.forceDelete) { + headers['x-minio-force-delete'] = true; + } + const query = querystring.stringify(queryParams); + let requestOptions = { + method, + bucketName, + objectName, + headers + }; + if (query) { + requestOptions['query'] = query; + } + this.makeRequest(requestOptions, '', [200, 204], '', false, cb); + } + // Remove all the objects residing in the objectsList. // // __Arguments__ @@ -79986,7 +82869,7 @@ class Client extends _client.TypedClient { headless: true }); let payload = builder.buildObject(deleteObjects); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); const headers = {}; headers['Content-MD5'] = (0, _helper.toMd5)(payload); let removeObjectsResult; @@ -80242,6 +83125,37 @@ class Client extends _client.TypedClient { }); } + // Calls implemented below are related to multipart. + + // Initiate a new multipart upload. + initiateNewMultipartUpload(bucketName, objectName, metaData, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isObject)(metaData)) { + throw new errors.InvalidObjectNameError('contentType should be of type "object"'); + } + var method = 'POST'; + let headers = Object.assign({}, metaData); + var query = 'uploads'; + this.makeRequest({ + method, + bucketName, + objectName, + query, + headers + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getInitiateMultipartTransformer(); + (0, _helper.pipesetup)(response, transformer).on('error', e => cb(e)).on('data', uploadId => cb(null, uploadId)); + }); + } + // Complete the multipart upload. After all the parts are uploaded issuing // this call will aggregate the parts on the server into a single object. completeMultipartUpload(bucketName, objectName, uploadId, etags, cb) { @@ -80304,6 +83218,78 @@ class Client extends _client.TypedClient { }); } + // Get part-info of all parts of an incomplete upload specified by uploadId. + listParts(bucketName, objectName, uploadId, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('uploadId cannot be empty'); + } + var parts = []; + var listNext = marker => { + this.listPartsQuery(bucketName, objectName, uploadId, marker, (e, result) => { + if (e) { + cb(e); + return; + } + parts = parts.concat(result.parts); + if (result.isTruncated) { + listNext(result.marker); + return; + } + cb(null, parts); + }); + }; + listNext(0); + } + + // Called by listParts to fetch a batch of part-info + listPartsQuery(bucketName, objectName, uploadId, marker, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!(0, _helper.isNumber)(marker)) { + throw new TypeError('marker should be of type "number"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('uploadId cannot be empty'); + } + var query = ''; + if (marker && marker !== 0) { + query += `part-number-marker=${marker}&`; + } + query += `uploadId=${(0, _helper.uriEscape)(uploadId)}`; + var method = 'GET'; + this.makeRequest({ + method, + bucketName, + objectName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getListPartsTransformer(); + (0, _helper.pipesetup)(response, transformer).on('error', e => cb(e)).on('data', data => cb(null, data)); + }); + } + // Called by listIncompleteUploads to fetch a batch of incomplete uploads. listIncompleteUploadsQuery(bucketName, prefix, keyMarker, uploadIdMarker, delimiter) { if (!(0, _helper.isValidBucketName)(bucketName)) { @@ -80389,6 +83375,97 @@ class Client extends _client.TypedClient { listNext('', ''); } + // Returns a function that can be used for uploading objects. + // If multipart === true, it returns function that is used to upload + // a part of the multipart. + getUploader(bucketName, objectName, metaData, multipart) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isBoolean)(multipart)) { + throw new TypeError('multipart should be of type "boolean"'); + } + if (!(0, _helper.isObject)(metaData)) { + throw new TypeError('metadata should be of type "object"'); + } + var validate = (stream, length, sha256sum, md5sum, cb) => { + if (!(0, _helper.isReadableStream)(stream)) { + throw new TypeError('stream should be of type "Stream"'); + } + if (!(0, _helper.isNumber)(length)) { + throw new TypeError('length should be of type "number"'); + } + if (!(0, _helper.isString)(sha256sum)) { + throw new TypeError('sha256sum should be of type "string"'); + } + if (!(0, _helper.isString)(md5sum)) { + throw new TypeError('md5sum should be of type "string"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + }; + var simpleUploader = (...args) => { + validate(...args); + var query = ''; + upload(query, ...args); + }; + var multipartUploader = (uploadId, partNumber, ...rest) => { + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!(0, _helper.isNumber)(partNumber)) { + throw new TypeError('partNumber should be of type "number"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('Empty uploadId'); + } + if (!partNumber) { + throw new errors.InvalidArgumentError('partNumber cannot be 0'); + } + validate(...rest); + var query = `partNumber=${partNumber}&uploadId=${(0, _helper.uriEscape)(uploadId)}`; + upload(query, ...rest); + }; + var upload = (query, stream, length, sha256sum, md5sum, cb) => { + var method = 'PUT'; + let headers = { + 'Content-Length': length + }; + if (!multipart) { + headers = Object.assign({}, metaData, headers); + } + if (!this.enableSHA256) { + headers['Content-MD5'] = md5sum; + } + this.makeRequestStream({ + method, + bucketName, + objectName, + query, + headers + }, stream, sha256sum, [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + const result = { + etag: (0, _helper.sanitizeETag)(response.headers.etag), + versionId: (0, _helper.getVersionId)(response.headers) + }; + // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) + response.on('data', () => {}); + cb(null, result); + }); + }; + if (multipart) { + return multipartUploader; + } + return simpleUploader; + } + // Remove all the notification configurations in the S3 provider setBucketNotification(bucketName, config, cb) { if (!(0, _helper.isValidBucketName)(bucketName)) { @@ -80560,7 +83637,7 @@ class Client extends _client.TypedClient { } }); let payload = builder.buildObject(taggingConfig); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); headers['Content-MD5'] = (0, _helper.toMd5)(payload); const requestOptions = { method, @@ -80724,9 +83801,6 @@ class Client extends _client.TypedClient { * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ getBucketTagging(bucketName, cb) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`); - } const method = 'GET'; const query = 'tagging'; const requestOptions = { @@ -80809,7 +83883,7 @@ class Client extends _client.TypedClient { } }); let payload = builder.buildObject(policyConfig); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); const requestOptions = { method, bucketName, @@ -81138,6 +84212,86 @@ class Client extends _client.TypedClient { query }, '', [204], '', false, cb); } + setBucketReplication(bucketName, replicationConfig = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isObject)(replicationConfig)) { + throw new errors.InvalidArgumentError('replicationConfig should be of type "object"'); + } else { + if (_lodash.isEmpty(replicationConfig.role)) { + throw new errors.InvalidArgumentError('Role cannot be empty'); + } else if (replicationConfig.role && !(0, _helper.isString)(replicationConfig.role)) { + throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role); + } + if (_lodash.isEmpty(replicationConfig.rules)) { + throw new errors.InvalidArgumentError('Minimum one replication rule must be specified'); + } + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + const method = 'PUT'; + let query = 'replication'; + const headers = {}; + const replicationParamsConfig = { + ReplicationConfiguration: { + Role: replicationConfig.role, + Rule: replicationConfig.rules + } + }; + const builder = new _xml2js.Builder({ + renderOpts: { + pretty: false + }, + headless: true + }); + let payload = builder.buildObject(replicationParamsConfig); + headers['Content-MD5'] = (0, _helper.toMd5)(payload); + this.makeRequest({ + method, + bucketName, + query, + headers + }, payload, [200], '', false, cb); + } + getBucketReplication(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isFunction)(cb)) { + throw new errors.InvalidArgumentError('callback should be of type "function"'); + } + const method = 'GET'; + const query = 'replication'; + this.makeRequest({ + method, + bucketName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + let replicationConfig = Buffer.from(''); + (0, _helper.pipesetup)(response, transformers.replicationConfigTransformer()).on('data', data => { + replicationConfig = data; + }).on('error', cb).on('end', () => { + cb(null, replicationConfig); + }); + }); + } + removeBucketReplication(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + const method = 'DELETE'; + const query = 'replication'; + this.makeRequest({ + method, + bucketName, + query + }, '', [200, 204], '', false, cb); + } getObjectLegalHold(bucketName, objectName, getOpts = {}, cb) { if (!(0, _helper.isValidBucketName)(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); @@ -81238,6 +84392,25 @@ class Client extends _client.TypedClient { }, payload, [200], '', false, cb); } + /** + * Internal Method to abort a multipart upload request in case of any errors. + * @param bucketName __string__ Bucket Name + * @param objectName __string__ Object Name + * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. + * @param cb __function__ callback function + */ + abortMultipartUpload(bucketName, objectName, uploadId, cb) { + const method = 'DELETE'; + let query = `uploadId=${uploadId}`; + const requestOptions = { + method, + bucketName, + objectName: objectName, + query + }; + this.makeRequest(requestOptions, '', [204], '', false, cb); + } + /** * Internal method to upload a part during compose object. * @param partConfig __object__ contains the following. @@ -81403,8 +84576,7 @@ class Client extends _client.TypedClient { const uploadList = getUploadPartConfigList(uploadId); _async.map(uploadList, me.uploadPartCopy.bind(me), (err, res) => { if (err) { - this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId).then(() => cb(), err => cb(err)); - return; + return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb); } const partsDone = res.map(partCopy => ({ etag: partCopy.etag, @@ -81414,10 +84586,11 @@ class Client extends _client.TypedClient { }); }; const newUploadHeaders = destObjConfig.getHeaders(); - me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders).then(uploadId => { + me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId) => { + if (err) { + return cb(err, null); + } performUploadParts(uploadId); - }, err => { - cb(err, null); }); }).catch(error => { cb(error, null); @@ -81504,18 +84677,28 @@ class Client extends _client.TypedClient { }); }); } + get extensions() { + if (!this.clientExtensions) { + this.clientExtensions = new _extensions.extensions(this); + } + return this.clientExtensions; + } } // Promisify various public-facing APIs on the Client module. exports.Client = Client; Client.prototype.makeBucket = (0, _promisify.promisify)(Client.prototype.makeBucket); +Client.prototype.listBuckets = (0, _promisify.promisify)(Client.prototype.listBuckets); Client.prototype.bucketExists = (0, _promisify.promisify)(Client.prototype.bucketExists); +Client.prototype.removeBucket = (0, _promisify.promisify)(Client.prototype.removeBucket); Client.prototype.getObject = (0, _promisify.promisify)(Client.prototype.getObject); Client.prototype.getPartialObject = (0, _promisify.promisify)(Client.prototype.getPartialObject); Client.prototype.fGetObject = (0, _promisify.promisify)(Client.prototype.fGetObject); Client.prototype.putObject = (0, _promisify.promisify)(Client.prototype.putObject); Client.prototype.fPutObject = (0, _promisify.promisify)(Client.prototype.fPutObject); Client.prototype.copyObject = (0, _promisify.promisify)(Client.prototype.copyObject); +Client.prototype.statObject = (0, _promisify.promisify)(Client.prototype.statObject); +Client.prototype.removeObject = (0, _promisify.promisify)(Client.prototype.removeObject); Client.prototype.removeObjects = (0, _promisify.promisify)(Client.prototype.removeObjects); Client.prototype.presignedUrl = (0, _promisify.promisify)(Client.prototype.presignedUrl); Client.prototype.presignedGetObject = (0, _promisify.promisify)(Client.prototype.presignedGetObject); @@ -81545,20 +84728,14 @@ Client.prototype.getObjectRetention = (0, _promisify.promisify)(Client.prototype Client.prototype.setBucketEncryption = (0, _promisify.promisify)(Client.prototype.setBucketEncryption); Client.prototype.getBucketEncryption = (0, _promisify.promisify)(Client.prototype.getBucketEncryption); Client.prototype.removeBucketEncryption = (0, _promisify.promisify)(Client.prototype.removeBucketEncryption); +Client.prototype.setBucketReplication = (0, _promisify.promisify)(Client.prototype.setBucketReplication); +Client.prototype.getBucketReplication = (0, _promisify.promisify)(Client.prototype.getBucketReplication); +Client.prototype.removeBucketReplication = (0, _promisify.promisify)(Client.prototype.removeBucketReplication); Client.prototype.setObjectLegalHold = (0, _promisify.promisify)(Client.prototype.setObjectLegalHold); Client.prototype.getObjectLegalHold = (0, _promisify.promisify)(Client.prototype.getObjectLegalHold); Client.prototype.composeObject = (0, _promisify.promisify)(Client.prototype.composeObject); Client.prototype.selectObjectContent = (0, _promisify.promisify)(Client.prototype.selectObjectContent); - -// refactored API use promise internally -Client.prototype.removeObject = (0, _callbackify.callbackify)(Client.prototype.removeObject); -Client.prototype.statObject = (0, _callbackify.callbackify)(Client.prototype.statObject); -Client.prototype.removeBucket = (0, _callbackify.callbackify)(Client.prototype.removeBucket); -Client.prototype.listBuckets = (0, _callbackify.callbackify)(Client.prototype.listBuckets); -Client.prototype.removeBucketReplication = (0, _callbackify.callbackify)(Client.prototype.removeBucketReplication); -Client.prototype.setBucketReplication = (0, _callbackify.callbackify)(Client.prototype.setBucketReplication); -Client.prototype.getBucketReplication = (0, _callbackify.callbackify)(Client.prototype.getBucketReplication); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInBhdGgiLCJTdHJlYW0iLCJfYXN5bmMiLCJfYmxvY2tTdHJlYW0iLCJfbG9kYXNoIiwicXVlcnlzdHJpbmciLCJfd2ViRW5jb2RpbmciLCJfeG1sIiwiX3htbDJqcyIsImVycm9ycyIsIl9oZWxwZXJzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfZXhwb3J0TmFtZXMiLCJleHBvcnRzIiwiX2NhbGxiYWNraWZ5IiwiX2NsaWVudCIsIl9jb3B5Q29uZGl0aW9ucyIsIkNvcHlDb25kaXRpb25zIiwiX2hlbHBlciIsIl9wb3N0UG9saWN5IiwiUG9zdFBvbGljeSIsIl90eXBlIiwiX25vdGlmaWNhdGlvbiIsIl9vYmplY3RVcGxvYWRlciIsIl9wcm9taXNpZnkiLCJfc2lnbmluZyIsInRyYW5zZm9ybWVycyIsIl94bWxQYXJzZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVzYyIsInNldCIsIkNsaWVudCIsIlR5cGVkQ2xpZW50Iiwic2V0QXBwSW5mbyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwiaXNTdHJpbmciLCJUeXBlRXJyb3IiLCJ0cmltIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJ1c2VyQWdlbnQiLCJjYWxjdWxhdGVQYXJ0U2l6ZSIsInNpemUiLCJpc051bWJlciIsIm1heE9iamVjdFNpemUiLCJvdmVyUmlkZVBhcnRTaXplIiwicGFydFNpemUiLCJtYWtlQnVja2V0IiwiYnVja2V0TmFtZSIsInJlZ2lvbiIsIm1ha2VPcHRzIiwiY2IiLCJpc1ZhbGlkQnVja2V0TmFtZSIsIkludmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJwYXlsb2FkIiwiREVGQVVMVF9SRUdJT04iLCJjcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uIiwicHVzaCIsIl9hdHRyIiwieG1sbnMiLCJMb2NhdGlvbkNvbnN0cmFpbnQiLCJwYXlsb2FkT2JqZWN0IiwiQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiIsIlhtbCIsIm1ldGhvZCIsImhlYWRlcnMiLCJPYmplY3RMb2NraW5nIiwicHJvY2Vzc1dpdGhSZXRyeSIsImVyciIsImNvZGUiLCJtYWtlUmVxdWVzdCIsImxpc3RJbmNvbXBsZXRlVXBsb2FkcyIsImJ1Y2tldCIsInByZWZpeCIsInJlY3Vyc2l2ZSIsInVuZGVmaW5lZCIsImlzVmFsaWRQcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJpc0Jvb2xlYW4iLCJkZWxpbWl0ZXIiLCJrZXlNYXJrZXIiLCJ1cGxvYWRJZE1hcmtlciIsInVwbG9hZHMiLCJlbmRlZCIsInJlYWRTdHJlYW0iLCJSZWFkYWJsZSIsIm9iamVjdE1vZGUiLCJfcmVhZCIsImxlbmd0aCIsInNoaWZ0IiwibGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkiLCJvbiIsImUiLCJlbWl0IiwicmVzdWx0IiwicHJlZml4ZXMiLCJhc3luYyIsImVhY2hTZXJpZXMiLCJ1cGxvYWQiLCJsaXN0UGFydHMiLCJ1cGxvYWRJZCIsInRoZW4iLCJwYXJ0cyIsInJlZHVjZSIsImFjYyIsIml0ZW0iLCJpc1RydW5jYXRlZCIsIm5leHRLZXlNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJidWNrZXRFeGlzdHMiLCJyZW1vdmVJbmNvbXBsZXRlVXBsb2FkIiwib2JqZWN0TmFtZSIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJyZW1vdmVVcGxvYWRJZCIsImR1cmluZyIsImZpbmRVcGxvYWRJZCIsInF1ZXJ5IiwiZkdldE9iamVjdCIsImZpbGVQYXRoIiwiZ2V0T3B0cyIsInBhcnRGaWxlIiwicGFydEZpbGVTdHJlYW0iLCJvYmpTdGF0IiwicmVuYW1lIiwid2F0ZXJmYWxsIiwic3RhdE9iamVjdCIsIm1rZGlyIiwiZGlybmFtZSIsImV0YWciLCJzdGF0Iiwic3RhdHMiLCJvZmZzZXQiLCJjcmVhdGVXcml0ZVN0cmVhbSIsImZsYWdzIiwiZ2V0UGFydGlhbE9iamVjdCIsImRvd25sb2FkU3RyZWFtIiwicGlwZXNldHVwIiwiRXJyb3IiLCJnZXRPYmplY3QiLCJyYW5nZSIsImV4cGVjdGVkU3RhdHVzQ29kZXMiLCJzdHJpbmdpZnkiLCJmUHV0T2JqZWN0IiwibWV0YURhdGEiLCJjYWxsYmFjayIsImluc2VydENvbnRlbnRUeXBlIiwibHN0YXQiLCJwdXRPYmplY3QiLCJjcmVhdGVSZWFkU3RyZWFtIiwic3RyZWFtIiwicHJlcGVuZFhBTVpNZXRhIiwiQnVmZmVyIiwicmVhZGFibGVTdHJlYW0iLCJpc1JlYWRhYmxlU3RyZWFtIiwiY2h1bmtlciIsIkJsb2NrU3RyZWFtMiIsInplcm9QYWRkaW5nIiwidXBsb2FkZXIiLCJPYmplY3RVcGxvYWRlciIsImNvcHlPYmplY3RWMSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1Iiwic3JjT2JqZWN0IiwiY29uZGl0aW9ucyIsInVyaVJlc291cmNlRXNjYXBlIiwibW9kaWZpZWQiLCJ1bm1vZGlmaWVkIiwibWF0Y2hFVGFnIiwibWF0Y2hFdGFnRXhjZXB0IiwibWF0Y2hFVGFnRXhjZXB0IiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1lciIsImdldENvcHlPYmplY3RUcmFuc2Zvcm1lciIsImRhdGEiLCJjb3B5T2JqZWN0VjIiLCJzb3VyY2VDb25maWciLCJkZXN0Q29uZmlnIiwiQ29weVNvdXJjZU9wdGlvbnMiLCJDb3B5RGVzdGluYXRpb25PcHRpb25zIiwidmFsaWRhdGUiLCJhc3NpZ24iLCJnZXRIZWFkZXJzIiwiQnVja2V0IiwicmVzSGVhZGVycyIsImNvcHlPYmpSZXNwb25zZSIsIktleSIsIkxhc3RNb2RpZmllZCIsIk1ldGFEYXRhIiwiZXh0cmFjdE1ldGFkYXRhIiwiVmVyc2lvbklkIiwiZ2V0VmVyc2lvbklkIiwiU291cmNlVmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwiRXRhZyIsInNhbml0aXplRVRhZyIsIlNpemUiLCJjb3B5T2JqZWN0IiwiYWxsQXJncyIsImFyZ3VtZW50cyIsImxpc3RPYmplY3RzUXVlcnkiLCJtYXJrZXIiLCJsaXN0UXVlcnlPcHRzIiwiRGVsaW1pdGVyIiwiTWF4S2V5cyIsIkluY2x1ZGVWZXJzaW9uIiwicXVlcmllcyIsInVyaUVzY2FwZSIsInNvcnQiLCJqb2luIiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsImxpc3RPYmplY3RzIiwibGlzdE9wdHMiLCJvYmplY3RzIiwibmV4dE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsImxpc3RPYmplY3RzVjJRdWVyeSIsImNvbnRpbnVhdGlvblRva2VuIiwibWF4S2V5cyIsInN0YXJ0QWZ0ZXIiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJsaXN0T2JqZWN0c1YyIiwibmV4dENvbnRpbnVhdGlvblRva2VuIiwicmVtb3ZlT2JqZWN0cyIsIm9iamVjdHNMaXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibWF4RW50cmllcyIsImVudHJ5IiwibGlzdCIsImxpc3RPZkxpc3QiLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJiYXRjaFJlc3VsdHMiLCJiYXRjaENiIiwidmFsdWUiLCJuYW1lIiwidmVyc2lvbklkIiwiZGVsZXRlT2JqZWN0cyIsIkRlbGV0ZSIsIlF1aWV0IiwiYnVpbGRlciIsInhtbDJqcyIsIkJ1aWxkZXIiLCJoZWFkbGVzcyIsImJ1aWxkT2JqZWN0IiwiZnJvbSIsImVuY29kZSIsInRvTWQ1IiwicmVtb3ZlT2JqZWN0c1Jlc3VsdCIsInJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lciIsIl8iLCJmbGF0dGVuIiwiZ2V0QnVja2V0UG9saWN5IiwicG9saWN5IiwiZ2V0Q29uY2F0ZXIiLCJ0b1N0cmluZyIsInNldEJ1Y2tldFBvbGljeSIsIkludmFsaWRCdWNrZXRQb2xpY3lFcnJvciIsInByZXNpZ25lZFVybCIsImV4cGlyZXMiLCJyZXFQYXJhbXMiLCJyZXF1ZXN0RGF0ZSIsImFub255bW91cyIsIkFub255bW91c1JlcXVlc3RFcnJvciIsIkRhdGUiLCJpc1ZhbGlkRGF0ZSIsImdldEJ1Y2tldFJlZ2lvbiIsInVybCIsInJlcU9wdGlvbnMiLCJnZXRSZXF1ZXN0T3B0aW9ucyIsImNoZWNrQW5kUmVmcmVzaENyZWRzIiwicHJlc2lnblNpZ25hdHVyZVY0IiwiYWNjZXNzS2V5Iiwic2VjcmV0S2V5Iiwic2Vzc2lvblRva2VuIiwicGUiLCJwcmVzaWduZWRHZXRPYmplY3QiLCJyZXNwSGVhZGVycyIsInZhbGlkUmVzcEhlYWRlcnMiLCJoZWFkZXIiLCJwcmVzaWduZWRQdXRPYmplY3QiLCJuZXdQb3N0UG9saWN5IiwicHJlc2lnbmVkUG9zdFBvbGljeSIsInBvc3RQb2xpY3kiLCJmb3JtRGF0YSIsImRhdGUiLCJkYXRlU3RyIiwibWFrZURhdGVMb25nIiwiZXhwaXJhdGlvbiIsInNldFNlY29uZHMiLCJzZXRFeHBpcmVzIiwiZ2V0U2NvcGUiLCJwb2xpY3lCYXNlNjQiLCJKU09OIiwic2lnbmF0dXJlIiwicG9zdFByZXNpZ25TaWduYXR1cmVWNCIsIm9wdHMiLCJwb3J0U3RyIiwicG9ydCIsInVybFN0ciIsInByb3RvY29sIiwiaG9zdCIsInBvc3RVUkwiLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImV0YWdzIiwiZWxlbWVudCIsIlBhcnQiLCJQYXJ0TnVtYmVyIiwicGFydCIsIkVUYWciLCJDb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImdldENvbXBsZXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJlcnJDb2RlIiwiUzNFcnJvciIsImVyck1lc3NhZ2UiLCJjb21wbGV0ZU11bHRpcGFydFJlc3VsdCIsIm1heFVwbG9hZHMiLCJ1bnNoaWZ0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwibGF0ZXN0VXBsb2FkIiwibGlzdE5leHQiLCJpbml0aWF0ZWQiLCJnZXRUaW1lIiwic2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiY29uZmlnIiwicm9vdE5hbWUiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwicmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uIiwiTm90aWZpY2F0aW9uQ29uZmlnIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJidWNrZXROb3RpZmljYXRpb24iLCJsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24iLCJzdWZmaXgiLCJldmVudHMiLCJsaXN0ZW5lciIsIk5vdGlmaWNhdGlvblBvbGxlciIsInN0YXJ0IiwiZ2V0QnVja2V0VmVyc2lvbmluZyIsInZlcnNpb25Db25maWciLCJidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIiLCJzZXRCdWNrZXRWZXJzaW9uaW5nIiwic2V0VGFnZ2luZyIsInRhZ2dpbmdQYXJhbXMiLCJ0YWdzIiwicHV0T3B0cyIsInRhZ3NMaXN0IiwiZW50cmllcyIsIlZhbHVlIiwidGFnZ2luZ0NvbmZpZyIsIlRhZ2dpbmciLCJUYWdTZXQiLCJUYWciLCJyZXF1ZXN0T3B0aW9ucyIsInNldEJ1Y2tldFRhZ2dpbmciLCJzZXRPYmplY3RUYWdnaW5nIiwicmVtb3ZlVGFnZ2luZyIsInJlbW92ZU9wdHMiLCJyZW1vdmVCdWNrZXRUYWdnaW5nIiwicmVtb3ZlT2JqZWN0VGFnZ2luZyIsImdldEJ1Y2tldFRhZ2dpbmciLCJnZXRUYWdzVHJhbnNmb3JtZXIiLCJnZXRPYmplY3RUYWdnaW5nIiwiYXBwbHlCdWNrZXRMaWZlY3ljbGUiLCJwb2xpY3lDb25maWciLCJyZW1vdmVCdWNrZXRMaWZlY3ljbGUiLCJzZXRCdWNrZXRMaWZlY3ljbGUiLCJsaWZlQ3ljbGVDb25maWciLCJpc0VtcHR5IiwiZ2V0QnVja2V0TGlmZWN5Y2xlIiwibGlmZWN5Y2xlVHJhbnNmb3JtZXIiLCJsaWZlY3ljbGVDb25maWciLCJzZXRPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ09wdHMiLCJyZXRlbnRpb25Nb2RlcyIsIlJFVEVOVElPTl9NT0RFUyIsIkNPTVBMSUFOQ0UiLCJHT1ZFUk5BTkNFIiwidmFsaWRVbml0cyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkRBWVMiLCJZRUFSUyIsIm1vZGUiLCJpbmNsdWRlcyIsInVuaXQiLCJ2YWxpZGl0eSIsIk9iamVjdExvY2tFbmFibGVkIiwiY29uZmlnS2V5cyIsImRpZmZlcmVuY2UiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIk1vZGUiLCJEYXlzIiwiWWVhcnMiLCJnZXRPYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0TG9ja0NvbmZpZyIsIm9iamVjdExvY2tUcmFuc2Zvcm1lciIsInB1dE9iamVjdFJldGVudGlvbiIsInJldGVudGlvbk9wdHMiLCJnb3Zlcm5hbmNlQnlwYXNzIiwicmV0YWluVW50aWxEYXRlIiwicGFyYW1zIiwiUmV0YWluVW50aWxEYXRlIiwiZ2V0T2JqZWN0UmV0ZW50aW9uIiwicmV0ZW50aW9uQ29uZmlnIiwib2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIiLCJzZXRCdWNrZXRFbmNyeXB0aW9uIiwiZW5jcnlwdGlvbkNvbmZpZyIsImVuY3J5cHRpb25PYmoiLCJBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0IiwiU1NFQWxnb3JpdGhtIiwiZ2V0QnVja2V0RW5jcnlwdGlvbiIsImJ1Y2tldEVuY0NvbmZpZyIsImJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lciIsInJlbW92ZUJ1Y2tldEVuY3J5cHRpb24iLCJnZXRPYmplY3RMZWdhbEhvbGQiLCJsZWdhbEhvbGRDb25maWciLCJvYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lciIsInNldE9iamVjdExlZ2FsSG9sZCIsInNldE9wdHMiLCJkZWZhdWx0T3B0cyIsInN0YXR1cyIsIkxFR0FMX0hPTERfU1RBVFVTIiwiRU5BQkxFRCIsIkRJU0FCTEVEIiwiU3RhdHVzIiwidXBsb2FkUGFydENvcHkiLCJwYXJ0Q29uZmlnIiwidXBsb2FkSUQiLCJwYXJ0TnVtYmVyIiwicGFydENvcHlSZXN1bHQiLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0Q29weVJlcyIsImNvbXBvc2VPYmplY3QiLCJkZXN0T2JqQ29uZmlnIiwic291cmNlT2JqTGlzdCIsIm1lIiwic291cmNlRmlsZXNMZW5ndGgiLCJQQVJUX0NPTlNUUkFJTlRTIiwiTUFYX1BBUlRTX0NPVU5UIiwiaSIsImdldFN0YXRPcHRpb25zIiwic3JjQ29uZmlnIiwic3RhdE9wdHMiLCJWZXJzaW9uSUQiLCJzcmNPYmplY3RTaXplcyIsInRvdGFsU2l6ZSIsInRvdGFsUGFydHMiLCJzb3VyY2VPYmpTdGF0cyIsIm1hcCIsInNyY0l0ZW0iLCJQcm9taXNlIiwiYWxsIiwic3JjT2JqZWN0SW5mb3MiLCJ2YWxpZGF0ZWRTdGF0cyIsInJlc0l0ZW1TdGF0IiwiaW5kZXgiLCJzcmNDb3B5U2l6ZSIsIk1hdGNoUmFuZ2UiLCJzcmNTdGFydCIsIlN0YXJ0Iiwic3JjRW5kIiwiRW5kIiwiQUJTX01JTl9QQVJUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsInBhcnRzUmVxdWlyZWQiLCJNQVhfUEFSVF9TSVpFIiwiTWF0Y2hFVGFnIiwic3BsaXRQYXJ0U2l6ZUxpc3QiLCJpZHgiLCJjYWxTaXplIiwiY2FsY3VsYXRlRXZlblNwbGl0cyIsImdldFVwbG9hZFBhcnRDb25maWdMaXN0IiwidXBsb2FkUGFydENvbmZpZ0xpc3QiLCJzcGxpdFNpemUiLCJzcGxpdEluZGV4Iiwic3RhcnRJbmRleCIsInN0YXJ0SWR4IiwiZW5kSW5kZXgiLCJlbmRJZHgiLCJvYmpJbmZvIiwib2JqQ29uZmlnIiwicGFydEluZGV4IiwidG90YWxVcGxvYWRzIiwic3BsaXRTdGFydCIsInVwbGRDdHJJZHgiLCJzcGxpdEVuZCIsInNvdXJjZU9iaiIsInVwbG9hZFBhcnRDb25maWciLCJwZXJmb3JtVXBsb2FkUGFydHMiLCJ1cGxvYWRMaXN0IiwiYmluZCIsInJlcyIsImFib3J0TXVsdGlwYXJ0VXBsb2FkIiwicGFydHNEb25lIiwicGFydENvcHkiLCJuZXdVcGxvYWRIZWFkZXJzIiwiaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQiLCJjYXRjaCIsImVycm9yIiwic2VsZWN0T2JqZWN0Q29udGVudCIsInNlbGVjdE9wdHMiLCJleHByZXNzaW9uIiwiaW5wdXRTZXJpYWxpemF0aW9uIiwib3V0cHV0U2VyaWFsaXphdGlvbiIsIkV4cHJlc3Npb24iLCJFeHByZXNzaW9uVHlwZSIsImV4cHJlc3Npb25UeXBlIiwiSW5wdXRTZXJpYWxpemF0aW9uIiwiT3V0cHV0U2VyaWFsaXphdGlvbiIsInJlcXVlc3RQcm9ncmVzcyIsIlJlcXVlc3RQcm9ncmVzcyIsInNjYW5SYW5nZSIsIlNjYW5SYW5nZSIsInNlbGVjdFJlc3VsdCIsInNlbGVjdE9iamVjdENvbnRlbnRUcmFuc2Zvcm1lciIsInBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlIiwicHJvbWlzaWZ5IiwicmVtb3ZlT2JqZWN0IiwiY2FsbGJhY2tpZnkiLCJyZW1vdmVCdWNrZXQiLCJsaXN0QnVja2V0cyIsInJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uIiwic2V0QnVja2V0UmVwbGljYXRpb24iLCJnZXRCdWNrZXRSZXBsaWNhdGlvbiJdLCJzb3VyY2VzIjpbIm1pbmlvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IGFzeW5jIGZyb20gJ2FzeW5jJ1xuaW1wb3J0IEJsb2NrU3RyZWFtMiBmcm9tICdibG9jay1zdHJlYW0yJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHsgVGV4dEVuY29kZXIgfSBmcm9tICd3ZWItZW5jb2RpbmcnXG5pbXBvcnQgWG1sIGZyb20gJ3htbCdcbmltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBDb3B5RGVzdGluYXRpb25PcHRpb25zLCBDb3B5U291cmNlT3B0aW9ucywgREVGQVVMVF9SRUdJT04gfSBmcm9tICcuL2hlbHBlcnMudHMnXG5pbXBvcnQgeyBjYWxsYmFja2lmeSB9IGZyb20gJy4vaW50ZXJuYWwvY2FsbGJhY2tpZnkuanMnXG5pbXBvcnQgeyBUeXBlZENsaWVudCB9IGZyb20gJy4vaW50ZXJuYWwvY2xpZW50LnRzJ1xuaW1wb3J0IHsgQ29weUNvbmRpdGlvbnMgfSBmcm9tICcuL2ludGVybmFsL2NvcHktY29uZGl0aW9ucy50cydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUV2ZW5TcGxpdHMsXG4gIGV4dHJhY3RNZXRhZGF0YSxcbiAgZ2V0U2NvcGUsXG4gIGdldFNvdXJjZVZlcnNpb25JZCxcbiAgZ2V0VmVyc2lvbklkLFxuICBpbnNlcnRDb250ZW50VHlwZSxcbiAgaXNCb29sZWFuLFxuICBpc0Z1bmN0aW9uLFxuICBpc051bWJlcixcbiAgaXNPYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzU3RyaW5nLFxuICBpc1ZhbGlkQnVja2V0TmFtZSxcbiAgaXNWYWxpZERhdGUsXG4gIGlzVmFsaWRPYmplY3ROYW1lLFxuICBpc1ZhbGlkUHJlZml4LFxuICBtYWtlRGF0ZUxvbmcsXG4gIFBBUlRfQ09OU1RSQUlOVFMsXG4gIHBhcnRzUmVxdWlyZWQsXG4gIHBpcGVzZXR1cCxcbiAgcHJlcGVuZFhBTVpNZXRhLFxuICByZWFkYWJsZVN0cmVhbSxcbiAgc2FuaXRpemVFVGFnLFxuICB0b01kNSxcbiAgdXJpRXNjYXBlLFxuICB1cmlSZXNvdXJjZUVzY2FwZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgeyBQb3N0UG9saWN5IH0gZnJvbSAnLi9pbnRlcm5hbC9wb3N0LXBvbGljeS50cydcbmltcG9ydCB7IExFR0FMX0hPTERfU1RBVFVTLCBSRVRFTlRJT05fTU9ERVMsIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkNvbmZpZywgTm90aWZpY2F0aW9uUG9sbGVyIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uanMnXG5pbXBvcnQgeyBPYmplY3RVcGxvYWRlciB9IGZyb20gJy4vb2JqZWN0LXVwbG9hZGVyLmpzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnLi9wcm9taXNpZnkuanMnXG5pbXBvcnQgeyBwb3N0UHJlc2lnblNpZ25hdHVyZVY0LCBwcmVzaWduU2lnbmF0dXJlVjQgfSBmcm9tICcuL3NpZ25pbmcudHMnXG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1lcnMgZnJvbSAnLi90cmFuc2Zvcm1lcnMuanMnXG5pbXBvcnQgeyBwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZSB9IGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycy50cydcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLmpzJ1xuZXhwb3J0IHsgQ29weUNvbmRpdGlvbnMsIFBvc3RQb2xpY3kgfVxuXG5leHBvcnQgY2xhc3MgQ2xpZW50IGV4dGVuZHMgVHlwZWRDbGllbnQge1xuICAvLyBTZXQgYXBwbGljYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uXG4gIC8vXG4gIC8vIEdlbmVyYXRlcyBVc2VyLUFnZW50IGluIHRoZSBmb2xsb3dpbmcgc3R5bGUuXG4gIC8vXG4gIC8vICAgICAgIE1pbklPIChPUzsgQVJDSCkgTElCL1ZFUiBBUFAvVkVSXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYXBwTmFtZWAgX3N0cmluZ18gLSBBcHBsaWNhdGlvbiBuYW1lLlxuICAvLyAqIGBhcHBWZXJzaW9uYCBfc3RyaW5nXyAtIEFwcGxpY2F0aW9uIHZlcnNpb24uXG4gIHNldEFwcEluZm8oYXBwTmFtZSwgYXBwVmVyc2lvbikge1xuICAgIGlmICghaXNTdHJpbmcoYXBwTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXBwTmFtZTogJHthcHBOYW1lfWApXG4gICAgfVxuICAgIGlmIChhcHBOYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0lucHV0IGFwcE5hbWUgY2Fubm90IGJlIGVtcHR5LicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoYXBwVmVyc2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXBwVmVyc2lvbjogJHthcHBWZXJzaW9ufWApXG4gICAgfVxuICAgIGlmIChhcHBWZXJzaW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0lucHV0IGFwcFZlcnNpb24gY2Fubm90IGJlIGVtcHR5LicpXG4gICAgfVxuICAgIHRoaXMudXNlckFnZW50ID0gYCR7dGhpcy51c2VyQWdlbnR9ICR7YXBwTmFtZX0vJHthcHBWZXJzaW9ufWBcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBwYXJ0IHNpemUgZ2l2ZW4gdGhlIG9iamVjdCBzaXplLiBQYXJ0IHNpemUgd2lsbCBiZSBhdGxlYXN0IHRoaXMucGFydFNpemVcbiAgY2FsY3VsYXRlUGFydFNpemUoc2l6ZSkge1xuICAgIGlmICghaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmIChzaXplID4gdGhpcy5tYXhPYmplY3RTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBzaXplIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuICR7dGhpcy5tYXhPYmplY3RTaXplfWApXG4gICAgfVxuICAgIGlmICh0aGlzLm92ZXJSaWRlUGFydFNpemUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRTaXplXG4gICAgfVxuICAgIHZhciBwYXJ0U2l6ZSA9IHRoaXMucGFydFNpemVcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyB3aGlsZSh0cnVlKSB7Li4ufSB0aHJvd3MgbGludGluZyBlcnJvci5cbiAgICAgIC8vIElmIHBhcnRTaXplIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgb2JqZWN0IHNpemUsIHRoZW4gdXNlIGl0LlxuICAgICAgaWYgKHBhcnRTaXplICogMTAwMDAgPiBzaXplKSB7XG4gICAgICAgIHJldHVybiBwYXJ0U2l6ZVxuICAgICAgfVxuICAgICAgLy8gVHJ5IHBhcnQgc2l6ZXMgYXMgNjRNQiwgODBNQiwgOTZNQiBldGMuXG4gICAgICBwYXJ0U2l6ZSArPSAxNiAqIDEwMjQgKiAxMDI0XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlcyB0aGUgYnVja2V0IGBidWNrZXROYW1lYC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXyAtIE5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGByZWdpb25gIF9zdHJpbmdfIC0gcmVnaW9uIHZhbGlkIHZhbHVlcyBhcmUgX3VzLXdlc3QtMV8sIF91cy13ZXN0LTJfLCAgX2V1LXdlc3QtMV8sIF9ldS1jZW50cmFsLTFfLCBfYXAtc291dGhlYXN0LTFfLCBfYXAtbm9ydGhlYXN0LTFfLCBfYXAtc291dGhlYXN0LTJfLCBfc2EtZWFzdC0xXy5cbiAgLy8gKiBgbWFrZU9wdHNgIF9vYmplY3RfIC0gT3B0aW9ucyB0byBjcmVhdGUgYSBidWNrZXQuIGUuZyB7T2JqZWN0TG9ja2luZzp0cnVlfSAoT3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgYnVja2V0IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLlxuICBtYWtlQnVja2V0KGJ1Y2tldE5hbWUsIHJlZ2lvbiwgbWFrZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzT2JqZWN0KHJlZ2lvbikpIHtcbiAgICAgIGNiID0gbWFrZU9wdHNcbiAgICAgIG1ha2VPcHRzID0gcmVnaW9uXG4gICAgICByZWdpb24gPSAnJ1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihyZWdpb24pKSB7XG4gICAgICBjYiA9IHJlZ2lvblxuICAgICAgcmVnaW9uID0gJydcbiAgICAgIG1ha2VPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24obWFrZU9wdHMpKSB7XG4gICAgICBjYiA9IG1ha2VPcHRzXG4gICAgICBtYWtlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWFrZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWtlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcGF5bG9hZCA9ICcnXG5cbiAgICAvLyBSZWdpb24gYWxyZWFkeSBzZXQgaW4gY29uc3RydWN0b3IsIHZhbGlkYXRlIGlmXG4gICAgLy8gY2FsbGVyIHJlcXVlc3RlZCBidWNrZXQgbG9jYXRpb24gaXMgc2FtZS5cbiAgICBpZiAocmVnaW9uICYmIHRoaXMucmVnaW9uKSB7XG4gICAgICBpZiAocmVnaW9uICE9PSB0aGlzLnJlZ2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDb25maWd1cmVkIHJlZ2lvbiAke3RoaXMucmVnaW9ufSwgcmVxdWVzdGVkICR7cmVnaW9ufWApXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlbmRpbmcgbWFrZUJ1Y2tldCByZXF1ZXN0IHdpdGggWE1MIGNvbnRhaW5pbmcgJ3VzLWVhc3QtMScgZmFpbHMuIEZvclxuICAgIC8vIGRlZmF1bHQgcmVnaW9uIHNlcnZlciBleHBlY3RzIHRoZSByZXF1ZXN0IHdpdGhvdXQgYm9keVxuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSBERUZBVUxUX1JFR0lPTikge1xuICAgICAgdmFyIGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24gPSBbXVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgX2F0dHI6IHtcbiAgICAgICAgICB4bWxuczogJ2h0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgTG9jYXRpb25Db25zdHJhaW50OiByZWdpb24sXG4gICAgICB9KVxuICAgICAgdmFyIHBheWxvYWRPYmplY3QgPSB7XG4gICAgICAgIENyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb246IGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24sXG4gICAgICB9XG4gICAgICBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBoZWFkZXJzID0ge31cblxuICAgIGlmIChtYWtlT3B0cy5PYmplY3RMb2NraW5nKSB7XG4gICAgICBoZWFkZXJzWyd4LWFtei1idWNrZXQtb2JqZWN0LWxvY2stZW5hYmxlZCddID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghcmVnaW9uKSB7XG4gICAgICByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NXaXRoUmV0cnkgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyICYmIChyZWdpb24gPT09ICcnIHx8IHJlZ2lvbiA9PT0gREVGQVVMVF9SRUdJT04pKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnICYmIGVyci5yZWdpb24gIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmV0cnkgd2l0aCByZWdpb24gcmV0dXJuZWQgYXMgcGFydCBvZiBlcnJvclxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sIGVyci5yZWdpb24sIGZhbHNlLCBjYilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgIH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCByZWdpb24sIGZhbHNlLCBwcm9jZXNzV2l0aFJldHJ5KVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIG9iamVjdHMgdGhhdCBhcmUgcGFydGlhbGx5IHVwbG9hZGVkLlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgcHJlZml4YCBfc3RyaW5nXzogcHJlZml4IG9mIHRoZSBvYmplY3QgbmFtZXMgdGhhdCBhcmUgcGFydGlhbGx5IHVwbG9hZGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogZGlyZWN0b3J5IHN0eWxlIGxpc3Rpbmcgd2hlbiBmYWxzZSwgcmVjdXJzaXZlIGxpc3Rpbmcgd2hlbiB0cnVlIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV8gOiBlbWl0cyBvYmplY3RzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqZWN0LmtleWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iamVjdC51cGxvYWRJZGAgX3N0cmluZ186IHVwbG9hZCBJRCBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqZWN0LnNpemVgIF9JbnRlZ2VyXzogc2l6ZSBvZiB0aGUgcGFydGlhbGx5IHVwbG9hZGVkIG9iamVjdFxuICBsaXN0SW5jb21wbGV0ZVVwbG9hZHMoYnVja2V0LCBwcmVmaXgsIHJlY3Vyc2l2ZSkge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldClcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIHZhciBkZWxpbWl0ZXIgPSByZWN1cnNpdmUgPyAnJyA6ICcvJ1xuICAgIHZhciBrZXlNYXJrZXIgPSAnJ1xuICAgIHZhciB1cGxvYWRJZE1hcmtlciA9ICcnXG4gICAgdmFyIHVwbG9hZHMgPSBbXVxuICAgIHZhciBlbmRlZCA9IGZhbHNlXG4gICAgdmFyIHJlYWRTdHJlYW0gPSBTdHJlYW0uUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlIH0pXG4gICAgcmVhZFN0cmVhbS5fcmVhZCA9ICgpID0+IHtcbiAgICAgIC8vIHB1c2ggb25lIHVwbG9hZCBpbmZvIHBlciBfcmVhZCgpXG4gICAgICBpZiAodXBsb2Fkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaCh1cGxvYWRzLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaChudWxsKVxuICAgICAgfVxuICAgICAgdGhpcy5saXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXQsIHByZWZpeCwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgZGVsaW1pdGVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wcmVmaXhlcy5mb3JFYWNoKChwcmVmaXgpID0+IHVwbG9hZHMucHVzaChwcmVmaXgpKVxuICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoXG4gICAgICAgICAgICByZXN1bHQudXBsb2FkcyxcbiAgICAgICAgICAgICh1cGxvYWQsIGNiKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGZvciBlYWNoIGluY29tcGxldGUgdXBsb2FkIGFkZCB0aGUgc2l6ZXMgb2YgaXRzIHVwbG9hZGVkIHBhcnRzXG4gICAgICAgICAgICAgIHRoaXMubGlzdFBhcnRzKGJ1Y2tldCwgdXBsb2FkLmtleSwgdXBsb2FkLnVwbG9hZElkKS50aGVuKChwYXJ0cykgPT4ge1xuICAgICAgICAgICAgICAgIHVwbG9hZC5zaXplID0gcGFydHMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0uc2l6ZSwgMClcbiAgICAgICAgICAgICAgICB1cGxvYWRzLnB1c2godXBsb2FkKVxuICAgICAgICAgICAgICAgIGNiKClcbiAgICAgICAgICAgICAgfSwgY2IpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICAgICAga2V5TWFya2VyID0gcmVzdWx0Lm5leHRLZXlNYXJrZXJcbiAgICAgICAgICAgICAgICB1cGxvYWRJZE1hcmtlciA9IHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gVG8gY2hlY2sgaWYgYSBidWNrZXQgYWxyZWFkeSBleGlzdHMuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ18gOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXyA6IGBlcnJgIGlzIGBudWxsYCBpZiB0aGUgYnVja2V0IGV4aXN0c1xuICBidWNrZXRFeGlzdHMoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0hFQUQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwMF0sICcnLCBmYWxzZSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT0gJ05vU3VjaEJ1Y2tldCcgfHwgZXJyLmNvZGUgPT0gJ05vdEZvdW5kJykge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdHJ1ZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBwYXJ0aWFsbHkgdXBsb2FkZWQgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBub24gYG51bGxgIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3JcbiAgcmVtb3ZlSW5jb21wbGV0ZVVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSXNWYWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciByZW1vdmVVcGxvYWRJZFxuICAgIGFzeW5jLmR1cmluZyhcbiAgICAgIChjYikgPT4ge1xuICAgICAgICB0aGlzLmZpbmRVcGxvYWRJZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCAoZSwgdXBsb2FkSWQpID0+IHtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbW92ZVVwbG9hZElkID0gdXBsb2FkSWRcbiAgICAgICAgICBjYihudWxsLCB1cGxvYWRJZClcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICAoY2IpID0+IHtcbiAgICAgICAgdmFyIG1ldGhvZCA9ICdERUxFVEUnXG4gICAgICAgIHZhciBxdWVyeSA9IGB1cGxvYWRJZD0ke3JlbW92ZVVwbG9hZElkfWBcbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDRdLCAnJywgZmFsc2UsIChlKSA9PiBjYihlKSlcbiAgICAgIH0sXG4gICAgICBjYixcbiAgICApXG4gIH1cblxuICAvLyBDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyb3JgIGluIGNhc2Ugb2YgZXJyb3Igb3IgYG51bGxgIGluIGNhc2Ugb2Ygc3VjY2Vzc1xuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBmaWxlUGF0aGAgX3N0cmluZ186IHBhdGggdG8gd2hpY2ggdGhlIG9iamVjdCBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0b1xuICAvLyAqIGBnZXRPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJ31gLiBEZWZhdWx0IGlzIGB7fWAuIChvcHRpb25hbClcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci5cbiAgZkdldE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBmaWxlUGF0aCwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24uXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGVQYXRoIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICAvLyBJbnRlcm5hbCBkYXRhLlxuICAgIHZhciBwYXJ0RmlsZVxuICAgIHZhciBwYXJ0RmlsZVN0cmVhbVxuICAgIHZhciBvYmpTdGF0XG5cbiAgICAvLyBSZW5hbWUgd3JhcHBlci5cbiAgICB2YXIgcmVuYW1lID0gKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgZnMucmVuYW1lKHBhcnRGaWxlLCBmaWxlUGF0aCwgY2IpXG4gICAgfVxuXG4gICAgYXN5bmMud2F0ZXJmYWxsKFxuICAgICAgW1xuICAgICAgICAoY2IpID0+IHRoaXMuc3RhdE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzLCBjYiksXG4gICAgICAgIChyZXN1bHQsIGNiKSA9PiB7XG4gICAgICAgICAgb2JqU3RhdCA9IHJlc3VsdFxuICAgICAgICAgIC8vIENyZWF0ZSBhbnkgbWlzc2luZyB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMuXG4gICAgICAgICAgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSwgKGVycikgPT4gY2IoZXJyKSlcbiAgICAgICAgfSxcbiAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgcGFydEZpbGUgPSBgJHtmaWxlUGF0aH0uJHtvYmpTdGF0LmV0YWd9LnBhcnQubWluaW9gXG4gICAgICAgICAgZnMuc3RhdChwYXJ0RmlsZSwgKGUsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMFxuICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgcGFydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShwYXJ0RmlsZSwgeyBmbGFnczogJ3cnIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAob2JqU3RhdC5zaXplID09PSBzdGF0cy5zaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmFtZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb2Zmc2V0ID0gc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICBwYXJ0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBhcnRGaWxlLCB7IGZsYWdzOiAnYScgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBvZmZzZXQsIDAsIGdldE9wdHMsIGNiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIChkb3dubG9hZFN0cmVhbSwgY2IpID0+IHtcbiAgICAgICAgICBwaXBlc2V0dXAoZG93bmxvYWRTdHJlYW0sIHBhcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgICAgIC5vbignZmluaXNoJywgY2IpXG4gICAgICAgIH0sXG4gICAgICAgIChjYikgPT4gZnMuc3RhdChwYXJ0RmlsZSwgY2IpLFxuICAgICAgICAoc3RhdHMsIGNiKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXRzLnNpemUgPT09IG9ialN0YXQuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IobmV3IEVycm9yKCdTaXplIG1pc21hdGNoIGJldHdlZW4gZG93bmxvYWRlZCBmaWxlIGFuZCB0aGUgb2JqZWN0JykpXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmVuYW1lLFxuICAgIClcbiAgfVxuXG4gIC8vIENhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgb2JqZWN0IGNvbnRlbnQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGdldE9wdHNgIF9vYmplY3RfOiBWZXJzaW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIGZvcm0gYHt2ZXJzaW9uSWQ6J215LXV1aWQnfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHN0cmVhbSlgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGBlcnJgIGluIGNhc2Ugb2YgZXJyb3IuIGBzdHJlYW1gIGlzIHRoZSBvYmplY3QgY29udGVudCBzdHJlYW1cbiAgZ2V0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdGhpcy5nZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIDAsIDAsIGdldE9wdHMsIGNiKVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggcmVhZGFibGUgc3RyZWFtIG9mIHRoZSBwYXJ0aWFsIG9iamVjdCBjb250ZW50LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBvZmZzZXRgIF9udW1iZXJfOiBvZmZzZXQgb2YgdGhlIG9iamVjdCBmcm9tIHdoZXJlIHRoZSBzdHJlYW0gd2lsbCBzdGFydFxuICAvLyAqIGBsZW5ndGhgIF9udW1iZXJfOiBsZW5ndGggb2YgdGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVhZCBpbiB0aGUgc3RyZWFtIChvcHRpb25hbCwgaWYgbm90IHNwZWNpZmllZCB3ZSByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlIGZyb20gdGhlIG9mZnNldClcbiAgLy8gKiBgZ2V0T3B0c2AgX29iamVjdF86IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgc3RyZWFtKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci4gYHN0cmVhbWAgaXMgdGhlIG9iamVjdCBjb250ZW50IHN0cmVhbVxuICBnZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG9mZnNldCwgbGVuZ3RoLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24obGVuZ3RoKSkge1xuICAgICAgY2IgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IDBcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihvZmZzZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvZmZzZXQgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGVuZ3RoIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSAnJ1xuICAgIGlmIChvZmZzZXQgfHwgbGVuZ3RoKSB7XG4gICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgIHJhbmdlID0gYGJ5dGVzPSR7K29mZnNldH0tYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmFuZ2UgPSAnYnl0ZXM9MC0nXG4gICAgICAgIG9mZnNldCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgcmFuZ2UgKz0gYCR7K2xlbmd0aCArIG9mZnNldCAtIDF9YFxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoZWFkZXJzID0ge31cbiAgICBpZiAocmFuZ2UgIT09ICcnKSB7XG4gICAgICBoZWFkZXJzLnJhbmdlID0gcmFuZ2VcbiAgICB9XG5cbiAgICB2YXIgZXhwZWN0ZWRTdGF0dXNDb2RlcyA9IFsyMDBdXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBleHBlY3RlZFN0YXR1c0NvZGVzLnB1c2goMjA2KVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcblxuICAgIHZhciBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShnZXRPcHRzKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMsIHF1ZXJ5IH0sICcnLCBleHBlY3RlZFN0YXR1c0NvZGVzLCAnJywgdHJ1ZSwgY2IpXG4gIH1cblxuICAvLyBVcGxvYWRzIHRoZSBvYmplY3QgdXNpbmcgY29udGVudHMgZnJvbSBhIGZpbGVcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZmlsZVBhdGhgIF9zdHJpbmdfOiBmaWxlIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWRcbiAgLy8gKiBgbWV0YURhdGFgIF9KYXZhc2NyaXB0IE9iamVjdF86IG1ldGFEYXRhIGFzc29zY2lhdGVkIHdpdGggdGhlIG9iamVjdFxuICAvLyAqIGBjYWxsYmFjayhlcnIsIG9iakluZm8pYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBvYmpJbmZvYCBfb2JqZWN0XyB3aGljaCBjb250YWlucyB2ZXJzaW9uSWQgYW5kIGV0YWcuXG4gIGZQdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZmlsZVBhdGgsIG1ldGFEYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGVQYXRoIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihtZXRhRGF0YSkpIHtcbiAgICAgIGNhbGxiYWNrID0gbWV0YURhdGFcbiAgICAgIG1ldGFEYXRhID0ge30gLy8gU2V0IG1ldGFEYXRhIGVtcHR5IGlmIG5vIG1ldGFEYXRhIHByb3ZpZGVkLlxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KG1ldGFEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWV0YURhdGEgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0cyBjb3JyZWN0IGBjb250ZW50LXR5cGVgIGF0dHJpYnV0ZSBiYXNlZCBvbiBtZXRhRGF0YSBhbmQgZmlsZVBhdGhcbiAgICBtZXRhRGF0YSA9IGluc2VydENvbnRlbnRUeXBlKG1ldGFEYXRhLCBmaWxlUGF0aClcblxuICAgIGZzLmxzdGF0KGZpbGVQYXRoLCAoZXJyLCBzdGF0KSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCksIHN0YXQuc2l6ZSwgbWV0YURhdGEsIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvLyBVcGxvYWRzIHRoZSBvYmplY3QuXG4gIC8vXG4gIC8vIFVwbG9hZGluZyBhIHN0cmVhbVxuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBzdHJlYW1gIF9TdHJlYW1fOiBSZWFkYWJsZSBzdHJlYW1cbiAgLy8gKiBgc2l6ZWAgX251bWJlcl86IHNpemUgb2YgdGhlIG9iamVjdCAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgZXRhZylgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYGV0YWdgIF9zdHJpbmdfIGlzIHRoZSBldGFnIG9mIHRoZSBvYmplY3QgdXBsb2FkZWQuXG4gIC8vXG4gIC8vIFVwbG9hZGluZyBcIkJ1ZmZlclwiIG9yIFwic3RyaW5nXCJcbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RyaW5nIG9yIEJ1ZmZlcmAgX3N0cmluZ18gb3IgX0J1ZmZlcl86IHN0cmluZyBvciBidWZmZXJcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBvYmpJbmZvKWAgX2Z1bmN0aW9uXzogYGVycmAgaXMgYG51bGxgIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYGluZm9gIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIG9iamVjdCBkZXRhaWxzOlxuICAvLyAgICogYGV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGB2ZXJzaW9uSWRgIF9zdHJpbmdfOiB2ZXJzaW9uSWQgb2YgdGhlIG9iamVjdFxuICBwdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgc3RyZWFtLCBzaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cblxuICAgIC8vIFdlJ2xsIG5lZWQgdG8gc2hpZnQgYXJndW1lbnRzIHRvIHRoZSBsZWZ0IGJlY2F1c2Ugb2Ygc2l6ZSBhbmQgbWV0YURhdGEuXG4gICAgaWYgKGlzRnVuY3Rpb24oc2l6ZSkpIHtcbiAgICAgIGNhbGxiYWNrID0gc2l6ZVxuICAgICAgbWV0YURhdGEgPSB7fVxuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihtZXRhRGF0YSkpIHtcbiAgICAgIGNhbGxiYWNrID0gbWV0YURhdGFcbiAgICAgIG1ldGFEYXRhID0ge31cbiAgICB9XG5cbiAgICAvLyBXZSdsbCBuZWVkIHRvIHNoaWZ0IGFyZ3VtZW50cyB0byB0aGUgbGVmdCBiZWNhdXNlIG9mIG1ldGFEYXRhXG4gICAgLy8gYW5kIHNpemUgYmVpbmcgb3B0aW9uYWwuXG4gICAgaWYgKGlzT2JqZWN0KHNpemUpKSB7XG4gICAgICBtZXRhRGF0YSA9IHNpemVcbiAgICB9XG5cbiAgICAvLyBFbnN1cmVzIE1ldGFkYXRhIGhhcyBhcHByb3ByaWF0ZSBwcmVmaXggZm9yIEEzIEFQSVxuICAgIG1ldGFEYXRhID0gcHJlcGVuZFhBTVpNZXRhKG1ldGFEYXRhKVxuICAgIGlmICh0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyB8fCBzdHJlYW0gaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIC8vIEFkYXB0cyB0aGUgbm9uLXN0cmVhbSBpbnRlcmZhY2UgaW50byBhIHN0cmVhbS5cbiAgICAgIHNpemUgPSBzdHJlYW0ubGVuZ3RoXG4gICAgICBzdHJlYW0gPSByZWFkYWJsZVN0cmVhbShzdHJlYW0pXG4gICAgfSBlbHNlIGlmICghaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlyZCBhcmd1bWVudCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmVhbS5SZWFkYWJsZVwiIG9yIFwiQnVmZmVyXCIgb3IgXCJzdHJpbmdcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIoc2l6ZSkgJiYgc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYHNpemUgY2Fubm90IGJlIG5lZ2F0aXZlLCBnaXZlbiBzaXplOiAke3NpemV9YClcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBhcnQgc2l6ZSBhbmQgZm9yd2FyZCB0aGF0IHRvIHRoZSBCbG9ja1N0cmVhbS4gRGVmYXVsdCB0byB0aGVcbiAgICAvLyBsYXJnZXN0IGJsb2NrIHNpemUgcG9zc2libGUgaWYgbmVjZXNzYXJ5LlxuICAgIGlmICghaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHNpemUgPSB0aGlzLm1heE9iamVjdFNpemVcbiAgICB9XG5cbiAgICBzaXplID0gdGhpcy5jYWxjdWxhdGVQYXJ0U2l6ZShzaXplKVxuXG4gICAgLy8gczMgcmVxdWlyZXMgdGhhdCBhbGwgbm9uLWVuZCBjaHVua3MgYmUgYXQgbGVhc3QgYHRoaXMucGFydFNpemVgLFxuICAgIC8vIHNvIHdlIGNodW5rIHRoZSBzdHJlYW0gdW50aWwgd2UgaGl0IGVpdGhlciB0aGF0IHNpemUgb3IgdGhlIGVuZCBiZWZvcmVcbiAgICAvLyB3ZSBmbHVzaCBpdCB0byBzMy5cbiAgICBsZXQgY2h1bmtlciA9IG5ldyBCbG9ja1N0cmVhbTIoeyBzaXplLCB6ZXJvUGFkZGluZzogZmFsc2UgfSlcblxuICAgIC8vIFRoaXMgaXMgYSBXcml0YWJsZSBzdHJlYW0gdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiBvcmRlciB0byB1cGxvYWRcbiAgICAvLyB0byB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBhbmQgb2JqZWN0IGF1dG9tYXRpY2FsbHkuXG4gICAgbGV0IHVwbG9hZGVyID0gbmV3IE9iamVjdFVwbG9hZGVyKHRoaXMsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNpemUsIG1ldGFEYXRhLCBjYWxsYmFjaylcbiAgICAvLyBzdHJlYW0gPT4gY2h1bmtlciA9PiB1cGxvYWRlclxuICAgIHBpcGVzZXR1cChzdHJlYW0sIGNodW5rZXIsIHVwbG9hZGVyKVxuICB9XG5cbiAgLy8gQ29weSB0aGUgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBzcmNPYmplY3RgIF9zdHJpbmdfOiBwYXRoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJlIGNvcGllZFxuICAvLyAqIGBjb25kaXRpb25zYCBfQ29weUNvbmRpdGlvbnNfOiBjb3B5IGNvbmRpdGlvbnMgdGhhdCBuZWVkcyB0byBiZSBzYXRpc2ZpZWQgKG9wdGlvbmFsLCBkZWZhdWx0IGBudWxsYClcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCB7ZXRhZywgbGFzdE1vZGlmaWVkfSlgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYGV0YWdgIF9zdHJpbmdfIGFuZCBgbGlzdE1vZGlmZWRgIF9EYXRlXyBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBldGFnIGFuZCB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBuZXdseSBjb3BpZWQgb2JqZWN0XG4gIGNvcHlPYmplY3RWMShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7XG4gICAgdmFyIGJ1Y2tldE5hbWUgPSBhcmcxXG4gICAgdmFyIG9iamVjdE5hbWUgPSBhcmcyXG4gICAgdmFyIHNyY09iamVjdCA9IGFyZzNcbiAgICB2YXIgY29uZGl0aW9ucywgY2JcbiAgICBpZiAodHlwZW9mIGFyZzQgPT0gJ2Z1bmN0aW9uJyAmJiBhcmc1ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmRpdGlvbnMgPSBudWxsXG4gICAgICBjYiA9IGFyZzRcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucyA9IGFyZzRcbiAgICAgIGNiID0gYXJnNVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHNyY09iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NyY09iamVjdCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKHNyY09iamVjdCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBFbXB0eSBzb3VyY2UgcHJlZml4YClcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9ucyAhPT0gbnVsbCAmJiAhKGNvbmRpdGlvbnMgaW5zdGFuY2VvZiBDb3B5Q29uZGl0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbmRpdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJDb3B5Q29uZGl0aW9uc1wiJylcbiAgICB9XG5cbiAgICB2YXIgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UnXSA9IHVyaVJlc291cmNlRXNjYXBlKHNyY09iamVjdClcblxuICAgIGlmIChjb25kaXRpb25zICE9PSBudWxsKSB7XG4gICAgICBpZiAoY29uZGl0aW9ucy5tb2RpZmllZCAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbW9kaWZpZWQtc2luY2UnXSA9IGNvbmRpdGlvbnMubW9kaWZpZWRcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLnVubW9kaWZpZWQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLXVubW9kaWZpZWQtc2luY2UnXSA9IGNvbmRpdGlvbnMudW5tb2RpZmllZFxuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbnMubWF0Y2hFVGFnICE9PSAnJykge1xuICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1pZi1tYXRjaCddID0gY29uZGl0aW9ucy5tYXRjaEVUYWdcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLm1hdGNoRXRhZ0V4Y2VwdCAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbm9uZS1tYXRjaCddID0gY29uZGl0aW9ucy5tYXRjaEVUYWdFeGNlcHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBoZWFkZXJzIH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKClcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiBjYihudWxsLCBkYXRhKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIE1ldGhvZCB0byBwZXJmb3JtIGNvcHkgb2YgYW4gb2JqZWN0LlxuICAgKiBAcGFyYW0gc291cmNlQ29uZmlnIF9fb2JqZWN0X18gICBpbnN0YW5jZSBvZiBDb3B5U291cmNlT3B0aW9ucyBAbGluayAuL2hlbHBlcnMvQ29weVNvdXJjZU9wdGlvbnNcbiAgICogQHBhcmFtIGRlc3RDb25maWcgIF9fb2JqZWN0X18gICBpbnN0YW5jZSBvZiBDb3B5RGVzdGluYXRpb25PcHRpb25zIEBsaW5rIC4vaGVscGVycy9Db3B5RGVzdGluYXRpb25PcHRpb25zXG4gICAqIEBwYXJhbSBjYiBfX2Z1bmN0aW9uX18gY2FsbGVkIHdpdGggbnVsbCBpZiB0aGVyZSBpcyBhbiBlcnJvclxuICAgKiBAcmV0dXJucyBQcm9taXNlIGlmIG5vIGNhbGxhY2sgaXMgcGFzc2VkLlxuICAgKi9cbiAgY29weU9iamVjdFYyKHNvdXJjZUNvbmZpZywgZGVzdENvbmZpZywgY2IpIHtcbiAgICBpZiAoIShzb3VyY2VDb25maWcgaW5zdGFuY2VvZiBDb3B5U291cmNlT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NvdXJjZUNvbmZpZyBzaG91bGQgb2YgdHlwZSBDb3B5U291cmNlT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIShkZXN0Q29uZmlnIGluc3RhbmNlb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Rlc3RDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weURlc3RpbmF0aW9uT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIWRlc3RDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghZGVzdENvbmZpZy52YWxpZGF0ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlQ29uZmlnLmdldEhlYWRlcnMoKSwgZGVzdENvbmZpZy5nZXRIZWFkZXJzKCkpXG5cbiAgICBjb25zdCBidWNrZXROYW1lID0gZGVzdENvbmZpZy5CdWNrZXRcbiAgICBjb25zdCBvYmplY3ROYW1lID0gZGVzdENvbmZpZy5PYmplY3RcblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKClcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzSGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgICAgIGNvbnN0IGNvcHlPYmpSZXNwb25zZSA9IHtcbiAgICAgICAgICAgIEJ1Y2tldDogZGVzdENvbmZpZy5CdWNrZXQsXG4gICAgICAgICAgICBLZXk6IGRlc3RDb25maWcuT2JqZWN0LFxuICAgICAgICAgICAgTGFzdE1vZGlmaWVkOiBkYXRhLkxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIE1ldGFEYXRhOiBleHRyYWN0TWV0YWRhdGEocmVzSGVhZGVycyksXG4gICAgICAgICAgICBWZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNIZWFkZXJzKSxcbiAgICAgICAgICAgIFNvdXJjZVZlcnNpb25JZDogZ2V0U291cmNlVmVyc2lvbklkKHJlc0hlYWRlcnMpLFxuICAgICAgICAgICAgRXRhZzogc2FuaXRpemVFVGFnKHJlc0hlYWRlcnMuZXRhZyksXG4gICAgICAgICAgICBTaXplOiArcmVzSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2IobnVsbCwgY29weU9ialJlc3BvbnNlKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBDb3B5IE9iamVjdCBBUEkuXG4gIGNvcHlPYmplY3QoLi4uYWxsQXJncykge1xuICAgIGlmIChhbGxBcmdzWzBdIGluc3RhbmNlb2YgQ29weVNvdXJjZU9wdGlvbnMgJiYgYWxsQXJnc1sxXSBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3RWMiguLi5hcmd1bWVudHMpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3RWMSguLi5hcmd1bWVudHMpXG4gIH1cblxuICAvLyBsaXN0IGEgYmF0Y2ggb2Ygb2JqZWN0c1xuICBsaXN0T2JqZWN0c1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgbWFya2VyLCBsaXN0UXVlcnlPcHRzID0ge30pIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhtYXJrZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXJrZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGxldCB7IERlbGltaXRlciwgTWF4S2V5cywgSW5jbHVkZVZlcnNpb24gfSA9IGxpc3RRdWVyeU9wdHNcblxuICAgIGlmICghaXNPYmplY3QobGlzdFF1ZXJ5T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3RRdWVyeU9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhEZWxpbWl0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWxpbWl0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIoTWF4S2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01heEtleXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcmllcyA9IFtdXG4gICAgLy8gZXNjYXBlIGV2ZXJ5IHZhbHVlIGluIHF1ZXJ5IHN0cmluZywgZXhjZXB0IG1heEtleXNcbiAgICBxdWVyaWVzLnB1c2goYHByZWZpeD0ke3VyaUVzY2FwZShwcmVmaXgpfWApXG4gICAgcXVlcmllcy5wdXNoKGBkZWxpbWl0ZXI9JHt1cmlFc2NhcGUoRGVsaW1pdGVyKX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuXG4gICAgaWYgKEluY2x1ZGVWZXJzaW9uKSB7XG4gICAgICBxdWVyaWVzLnB1c2goYHZlcnNpb25zYClcbiAgICB9XG5cbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBtYXJrZXIgPSB1cmlFc2NhcGUobWFya2VyKVxuICAgICAgaWYgKEluY2x1ZGVWZXJzaW9uKSB7XG4gICAgICAgIHF1ZXJpZXMucHVzaChga2V5LW1hcmtlcj0ke21hcmtlcn1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcmllcy5wdXNoKGBtYXJrZXI9JHttYXJrZXJ9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBuZWVkIHRvIGVzY2FwZSBtYXhLZXlzXG4gICAgaWYgKE1heEtleXMpIHtcbiAgICAgIGlmIChNYXhLZXlzID49IDEwMDApIHtcbiAgICAgICAgTWF4S2V5cyA9IDEwMDBcbiAgICAgIH1cbiAgICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9JHtNYXhLZXlzfWApXG4gICAgfVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgdmFyIHF1ZXJ5ID0gJydcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJpZXMuam9pbignJicpfWBcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lcigpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG5cbiAgLy8gTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgcHJlZml4YCBfc3RyaW5nXzogdGhlIHByZWZpeCBvZiB0aGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsaXN0ZWQgKG9wdGlvbmFsLCBkZWZhdWx0IGAnJ2ApXG4gIC8vICogYHJlY3Vyc2l2ZWAgX2Jvb2xfOiBgdHJ1ZWAgaW5kaWNhdGVzIHJlY3Vyc2l2ZSBzdHlsZSBsaXN0aW5nIGFuZCBgZmFsc2VgIGluZGljYXRlcyBkaXJlY3Rvcnkgc3R5bGUgbGlzdGluZyBkZWxpbWl0ZWQgYnkgJy8nLiAob3B0aW9uYWwsIGRlZmF1bHQgYGZhbHNlYClcbiAgLy8gKiBgbGlzdE9wdHMgX29iamVjdF86IHF1ZXJ5IHBhcmFtcyB0byBsaXN0IG9iamVjdCB3aXRoIGJlbG93IGtleXNcbiAgLy8gKiAgICBsaXN0T3B0cy5NYXhLZXlzIF9pbnRfIG1heGltdW0gbnVtYmVyIG9mIGtleXMgdG8gcmV0dXJuXG4gIC8vICogICAgbGlzdE9wdHMuSW5jbHVkZVZlcnNpb24gIF9ib29sXyB0cnVlfGZhbHNlIHRvIGluY2x1ZGUgdmVyc2lvbnMuXG4gIC8vIF9fUmV0dXJuIFZhbHVlX19cbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogc3RyZWFtIGVtaXR0aW5nIHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQsIHRoZSBvYmplY3QgaXMgb2YgdGhlIGZvcm1hdDpcbiAgLy8gKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLnByZWZpeGAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdCBwcmVmaXhcbiAgLy8gKiBgb2JqLnNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLmxhc3RNb2RpZmllZGAgX0RhdGVfOiBtb2RpZmllZCB0aW1lIHN0YW1wXG4gIC8vICogYG9iai5pc0RlbGV0ZU1hcmtlcmAgX2Jvb2xlYW5fOiB0cnVlIGlmIGl0IGlzIGEgZGVsZXRlIG1hcmtlclxuICAvLyAqIGBvYmoudmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbklkIG9mIHRoZSBvYmplY3RcbiAgbGlzdE9iamVjdHMoYnVja2V0TmFtZSwgcHJlZml4LCByZWN1cnNpdmUsIGxpc3RPcHRzID0ge30pIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZWZpeCA9ICcnXG4gICAgfVxuICAgIGlmIChyZWN1cnNpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVjdXJzaXZlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGxpc3RPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdE9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIHZhciBtYXJrZXIgPSAnJ1xuICAgIGNvbnN0IGxpc3RRdWVyeU9wdHMgPSB7XG4gICAgICBEZWxpbWl0ZXI6IHJlY3Vyc2l2ZSA/ICcnIDogJy8nLCAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICAgIE1heEtleXM6IDEwMDAsXG4gICAgICBJbmNsdWRlVmVyc2lvbjogbGlzdE9wdHMuSW5jbHVkZVZlcnNpb24sXG4gICAgfVxuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzUXVlcnkoYnVja2V0TmFtZSwgcHJlZml4LCBtYXJrZXIsIGxpc3RRdWVyeU9wdHMpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgbWFya2VyID0gcmVzdWx0Lm5leHRNYXJrZXIgfHwgcmVzdWx0LnZlcnNpb25JZE1hcmtlclxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0cyA9IHJlc3VsdC5vYmplY3RzXG4gICAgICAgICAgcmVhZFN0cmVhbS5fcmVhZCgpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZWFkU3RyZWFtXG4gIH1cblxuICAvLyBsaXN0T2JqZWN0c1YyUXVlcnkgLSAoTGlzdCBPYmplY3RzIFYyKSAtIExpc3Qgc29tZSBvciBhbGwgKHVwIHRvIDEwMDApIG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvL1xuICAvLyBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFzIHNlbGVjdGlvbiBjcml0ZXJpYSB0byByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIG9iamVjdHMgaW4gYSBidWNrZXQuXG4gIC8vIHJlcXVlc3QgcGFyYW1ldGVycyA6LVxuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IExpbWl0cyB0aGUgcmVzcG9uc2UgdG8ga2V5cyB0aGF0IGJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gIC8vICogYGNvbnRpbnVhdGlvbi10b2tlbmAgX3N0cmluZ186IFVzZWQgdG8gY29udGludWUgaXRlcmF0aW5nIG92ZXIgYSBzZXQgb2Ygb2JqZWN0cy5cbiAgLy8gKiBgZGVsaW1pdGVyYCBfc3RyaW5nXzogQSBkZWxpbWl0ZXIgaXMgYSBjaGFyYWN0ZXIgeW91IHVzZSB0byBncm91cCBrZXlzLlxuICAvLyAqIGBtYXgta2V5c2AgX251bWJlcl86IFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGtleXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gIC8vICogYHN0YXJ0LWFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuXG4gIGxpc3RPYmplY3RzVjJRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIG1heEtleXMsIHN0YXJ0QWZ0ZXIpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhjb250aW51YXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRpbnVhdGlvblRva2VuIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihtYXhLZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4S2V5cyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdGFydEFmdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhcnRBZnRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuXG4gICAgLy8gZXNjYXBlIGV2ZXJ5IHZhbHVlIGluIHF1ZXJ5IHN0cmluZywgZXhjZXB0IG1heEtleXNcbiAgICBxdWVyaWVzLnB1c2goYHByZWZpeD0ke3VyaUVzY2FwZShwcmVmaXgpfWApXG4gICAgcXVlcmllcy5wdXNoKGBkZWxpbWl0ZXI9JHt1cmlFc2NhcGUoZGVsaW1pdGVyKX1gKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIC8vIG5vIG5lZWQgdG8gZXNjYXBlIG1heEtleXNcbiAgICBpZiAobWF4S2V5cykge1xuICAgICAgaWYgKG1heEtleXMgPj0gMTAwMCkge1xuICAgICAgICBtYXhLZXlzID0gMTAwMFxuICAgICAgfVxuICAgICAgcXVlcmllcy5wdXNoKGBtYXgta2V5cz0ke21heEtleXN9YClcbiAgICB9XG4gICAgcXVlcmllcy5zb3J0KClcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyKClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5lbWl0KCdlcnJvcicsIGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgIH0pXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyXG4gIH1cblxuICAvLyBMaXN0IHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQgdXNpbmcgUzMgTGlzdE9iamVjdHMgVjJcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gIC8vICogYHN0YXJ0QWZ0ZXJgIF9zdHJpbmdfOiBTcGVjaWZpZXMgdGhlIGtleSB0byBzdGFydCBhZnRlciB3aGVuIGxpc3Rpbmcgb2JqZWN0cyBpbiBhIGJ1Y2tldC4gKG9wdGlvbmFsLCBkZWZhdWx0IGAnJ2ApXG4gIC8vXG4gIC8vIF9fUmV0dXJuIFZhbHVlX19cbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogc3RyZWFtIGVtaXR0aW5nIHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQsIHRoZSBvYmplY3QgaXMgb2YgdGhlIGZvcm1hdDpcbiAgLy8gICAqIGBvYmoubmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iai5wcmVmaXhgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3QgcHJlZml4XG4gIC8vICAgKiBgb2JqLnNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmouZXRhZ2AgX3N0cmluZ186IGV0YWcgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iai5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICBsaXN0T2JqZWN0c1YyKGJ1Y2tldE5hbWUsIHByZWZpeCwgcmVjdXJzaXZlLCBzdGFydEFmdGVyKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGFydEFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSAnJ1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkUHJlZml4RXJyb3IoYEludmFsaWQgcHJlZml4IDogJHtwcmVmaXh9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIC8vIGlmIHJlY3Vyc2l2ZSBpcyBmYWxzZSBzZXQgZGVsaW1pdGVyIHRvICcvJ1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZWN1cnNpdmUgPyAnJyA6ICcvJ1xuICAgIHZhciBjb250aW51YXRpb25Ub2tlbiA9ICcnXG4gICAgdmFyIG9iamVjdHMgPSBbXVxuICAgIHZhciBlbmRlZCA9IGZhbHNlXG4gICAgdmFyIHJlYWRTdHJlYW0gPSBTdHJlYW0uUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlIH0pXG4gICAgcmVhZFN0cmVhbS5fcmVhZCA9ICgpID0+IHtcbiAgICAgIC8vIHB1c2ggb25lIG9iamVjdCBwZXIgX3JlYWQoKVxuICAgICAgaWYgKG9iamVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHJlYWRTdHJlYW0ucHVzaChvYmplY3RzLnNoaWZ0KCkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBvYmplY3RzIHRvIHB1c2ggZG8gcXVlcnkgZm9yIHRoZSBuZXh0IGJhdGNoIG9mIG9iamVjdHNcbiAgICAgIHRoaXMubGlzdE9iamVjdHNWMlF1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgY29udGludWF0aW9uVG9rZW4sIGRlbGltaXRlciwgMTAwMCwgc3RhcnRBZnRlcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3VsdC5uZXh0Q29udGludWF0aW9uVG9rZW5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdHMgPSByZXN1bHQub2JqZWN0c1xuICAgICAgICAgIHJlYWRTdHJlYW0uX3JlYWQoKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCB0aGUgb2JqZWN0cyByZXNpZGluZyBpbiB0aGUgb2JqZWN0c0xpc3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3RzTGlzdGAgX2FycmF5XzogYXJyYXkgb2Ygb2JqZWN0cyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWVzIGFzIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG9iamVjdCBrZXlzOiAgWydvYmplY3RuYW1lMScsJ29iamVjdG5hbWUyJ11cbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWUgYW5kIHZlcnNpb25JZCBhcyBhbiBvYmplY3Q6ICBbe25hbWU6XCJvYmplY3RuYW1lXCIsdmVyc2lvbklkOlwibXktdmVyc2lvbi1pZFwifV1cblxuICByZW1vdmVPYmplY3RzKGJ1Y2tldE5hbWUsIG9iamVjdHNMaXN0LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3RzTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29iamVjdHNMaXN0IHNob3VsZCBiZSBhIGxpc3QnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEVudHJpZXMgPSAxMDAwXG4gICAgY29uc3QgcXVlcnkgPSAnZGVsZXRlJ1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQT1NUJ1xuXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdHNMaXN0LnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICAgIHJlc3VsdC5saXN0LnB1c2goZW50cnkpXG4gICAgICAgIGlmIChyZXN1bHQubGlzdC5sZW5ndGggPT09IG1heEVudHJpZXMpIHtcbiAgICAgICAgICByZXN1bHQubGlzdE9mTGlzdC5wdXNoKHJlc3VsdC5saXN0KVxuICAgICAgICAgIHJlc3VsdC5saXN0ID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9LFxuICAgICAgeyBsaXN0T2ZMaXN0OiBbXSwgbGlzdDogW10gfSxcbiAgICApXG5cbiAgICBpZiAocmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0Lmxpc3RPZkxpc3QucHVzaChyZXN1bHQubGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcbiAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBbXVxuXG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIHJlc3VsdC5saXN0T2ZMaXN0LFxuICAgICAgKGxpc3QsIGJhdGNoQ2IpID0+IHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXVxuICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgb2JqZWN0cy5wdXNoKHsgS2V5OiB2YWx1ZS5uYW1lLCBWZXJzaW9uSWQ6IHZhbHVlLnZlcnNpb25JZCB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmplY3RzLnB1c2goeyBLZXk6IHZhbHVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsZXQgZGVsZXRlT2JqZWN0cyA9IHsgRGVsZXRlOiB7IFF1aWV0OiB0cnVlLCBPYmplY3Q6IG9iamVjdHMgfSB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSB9KVxuICAgICAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZGVsZXRlT2JqZWN0cylcbiAgICAgICAgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGVuY29kZXIuZW5jb2RlKHBheWxvYWQpKVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgICAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgICAgICBsZXQgcmVtb3ZlT2JqZWN0c1Jlc3VsdFxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hDYihlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5yZW1vdmVPYmplY3RzVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIHJlbW92ZU9iamVjdHNSZXN1bHQgPSBkYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaENiKGUsIG51bGwpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5wdXNoKHJlbW92ZU9iamVjdHNSZXN1bHQpXG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaENiKG51bGwsIHJlbW92ZU9iamVjdHNSZXN1bHQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2IobnVsbCwgXy5mbGF0dGVuKGJhdGNoUmVzdWx0cykpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIC8vIEdldCB0aGUgcG9saWN5IG9uIGEgYnVja2V0IG9yIGFuIG9iamVjdCBwcmVmaXguXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHBvbGljeSlgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uXG4gIGdldEJ1Y2tldFBvbGljeShidWNrZXROYW1lLCBjYikge1xuICAgIC8vIFZhbGlkYXRlIGFyZ3VtZW50cy5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGxldCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICdwb2xpY3knXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHBvbGljeSA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuZ2V0Q29uY2F0ZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IChwb2xpY3kgPSBkYXRhKSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBwb2xpY3kudG9TdHJpbmcoKSlcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gU2V0IHRoZSBwb2xpY3kgb24gYSBidWNrZXQgb3IgYW4gb2JqZWN0IHByZWZpeC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGJ1Y2tldFBvbGljeWAgX3N0cmluZ186IGJ1Y2tldCBwb2xpY3kgKEpTT04gc3RyaW5naWZ5J2VkKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvblxuICBzZXRCdWNrZXRQb2xpY3koYnVja2V0TmFtZSwgcG9saWN5LCBjYikge1xuICAgIC8vIFZhbGlkYXRlIGFyZ3VtZW50cy5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHBvbGljeSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBwb2xpY3k6ICR7cG9saWN5fSAtIG11c3QgYmUgXCJzdHJpbmdcImApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgbGV0IHF1ZXJ5ID0gJ3BvbGljeSdcblxuICAgIGlmIChwb2xpY3kpIHtcbiAgICAgIG1ldGhvZCA9ICdQVVQnXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgcG9saWN5LCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGEgZ2VuZXJpYyBwcmVzaWduZWQgVVJMIHdoaWNoIGNhbiBiZVxuICAvLyB1c2VkIGZvciBIVFRQIG1ldGhvZHMgR0VULCBQVVQsIEhFQUQgYW5kIERFTEVURVxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYG1ldGhvZGAgX3N0cmluZ186IG5hbWUgb2YgdGhlIEhUVFAgbWV0aG9kXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICAvLyAqIGByZXFQYXJhbXNgIF9vYmplY3RfOiByZXF1ZXN0IHBhcmFtZXRlcnMgKG9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIjEwZmE5OTQ2LTNmNjQtNDEzNy1hNThmLTg4ODA2NWMwNzMyZVwifVxuICAvLyAqIGByZXF1ZXN0RGF0ZWAgX0RhdGVfOiBBIGRhdGUgb2JqZWN0LCB0aGUgdXJsIHdpbGwgYmUgaXNzdWVkIGF0IChvcHRpb25hbClcbiAgcHJlc2lnbmVkVXJsKG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgcmVxUGFyYW1zLCByZXF1ZXN0RGF0ZSwgY2IpIHtcbiAgICBpZiAodGhpcy5hbm9ueW1vdXMpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuQW5vbnltb3VzUmVxdWVzdEVycm9yKCdQcmVzaWduZWQgJyArIG1ldGhvZCArICcgdXJsIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIGFub255bW91cyByZXF1ZXN0cycpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlcXVlc3REYXRlKSkge1xuICAgICAgY2IgPSByZXF1ZXN0RGF0ZVxuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlcVBhcmFtcykpIHtcbiAgICAgIGNiID0gcmVxUGFyYW1zXG4gICAgICByZXFQYXJhbXMgPSB7fVxuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKGV4cGlyZXMpKSB7XG4gICAgICBjYiA9IGV4cGlyZXNcbiAgICAgIHJlcVBhcmFtcyA9IHt9XG4gICAgICBleHBpcmVzID0gMjQgKiA2MCAqIDYwICogNyAvLyA3IGRheXMgaW4gc2Vjb25kc1xuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGlyZXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVxUGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxUGFyYW1zIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWREYXRlKHJlcXVlc3REYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxdWVzdERhdGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJEYXRlXCIgYW5kIHZhbGlkJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHJlcVBhcmFtcylcbiAgICB0aGlzLmdldEJ1Y2tldFJlZ2lvbihidWNrZXROYW1lLCAoZSwgcmVnaW9uKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGlzIGFkZGVkIHRvIGVuc3VyZSB0aGF0IHdlIHNlbmQgZXJyb3IgdGhyb3VnaFxuICAgICAgLy8gY2FsbGJhY2sgb24gcHJlc2lnbiBmYWlsdXJlLlxuICAgICAgdmFyIHVybFxuICAgICAgdmFyIHJlcU9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKHsgbWV0aG9kLCByZWdpb24sIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG5cbiAgICAgIHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdXJsID0gcHJlc2lnblNpZ25hdHVyZVY0KFxuICAgICAgICAgIHJlcU9wdGlvbnMsXG4gICAgICAgICAgdGhpcy5hY2Nlc3NLZXksXG4gICAgICAgICAgdGhpcy5zZWNyZXRLZXksXG4gICAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4sXG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIHJlcXVlc3REYXRlLFxuICAgICAgICAgIGV4cGlyZXMsXG4gICAgICAgIClcbiAgICAgIH0gY2F0Y2ggKHBlKSB7XG4gICAgICAgIHJldHVybiBjYihwZSlcbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIHVybClcbiAgICB9KVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBwcmVzaWduZWQgVVJMIGZvciBHRVRcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZXhwaXJ5YCBfbnVtYmVyXzogZXhwaXJ5IGluIHNlY29uZHMgKG9wdGlvbmFsLCBkZWZhdWx0IDcgZGF5cylcbiAgLy8gKiBgcmVzcEhlYWRlcnNgIF9vYmplY3RfOiByZXNwb25zZSBoZWFkZXJzIHRvIG92ZXJyaWRlIG9yIHJlcXVlc3QgcGFyYW1zIGZvciBxdWVyeSAob3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwiMTBmYTk5NDYtM2Y2NC00MTM3LWE1OGYtODg4MDY1YzA3MzJlXCJ9XG4gIC8vICogYHJlcXVlc3REYXRlYCBfRGF0ZV86IEEgZGF0ZSBvYmplY3QsIHRoZSB1cmwgd2lsbCBiZSBpc3N1ZWQgYXQgKG9wdGlvbmFsKVxuICBwcmVzaWduZWRHZXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgcmVzcEhlYWRlcnMsIHJlcXVlc3REYXRlLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ocmVzcEhlYWRlcnMpKSB7XG4gICAgICBjYiA9IHJlc3BIZWFkZXJzXG4gICAgICByZXNwSGVhZGVycyA9IHt9XG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG5cbiAgICB2YXIgdmFsaWRSZXNwSGVhZGVycyA9IFtcbiAgICAgICdyZXNwb25zZS1jb250ZW50LXR5cGUnLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UnLFxuICAgICAgJ3Jlc3BvbnNlLWV4cGlyZXMnLFxuICAgICAgJ3Jlc3BvbnNlLWNhY2hlLWNvbnRyb2wnLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24nLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmcnLFxuICAgIF1cbiAgICB2YWxpZFJlc3BIZWFkZXJzLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgaWYgKHJlc3BIZWFkZXJzICE9PSB1bmRlZmluZWQgJiYgcmVzcEhlYWRlcnNbaGVhZGVyXSAhPT0gdW5kZWZpbmVkICYmICFpc1N0cmluZyhyZXNwSGVhZGVyc1toZWFkZXJdKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByZXNwb25zZSBoZWFkZXIgJHtoZWFkZXJ9IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCJgKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMucHJlc2lnbmVkVXJsKCdHRVQnLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXNwSGVhZGVycywgcmVxdWVzdERhdGUsIGNiKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBwcmVzaWduZWQgVVJMIGZvciBQVVQuIFVzaW5nIHRoaXMgVVJMLCB0aGUgYnJvd3NlciBjYW4gdXBsb2FkIHRvIFMzIG9ubHkgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBuYW1lLlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICBwcmVzaWduZWRQdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVzaWduZWRVcmwoJ1BVVCcsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGV4cGlyZXMsIGNiKVxuICB9XG5cbiAgLy8gcmV0dXJuIFBvc3RQb2xpY3kgb2JqZWN0XG4gIG5ld1Bvc3RQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBQb3N0UG9saWN5KClcbiAgfVxuXG4gIC8vIHByZXNpZ25lZFBvc3RQb2xpY3kgY2FuIGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSB3YW50IG1vcmUgY29udHJvbCBvbiB0aGUgdXBsb2FkIHRoYW4gd2hhdFxuICAvLyBwcmVzaWduZWRQdXRPYmplY3QoKSBwcm92aWRlcy4gaS5lIFVzaW5nIHByZXNpZ25lZFBvc3RQb2xpY3kgd2Ugd2lsbCBiZSBhYmxlIHRvIHB1dCBwb2xpY3kgcmVzdHJpY3Rpb25zXG4gIC8vIG9uIHRoZSBvYmplY3QncyBgbmFtZWAgYGJ1Y2tldGAgYGV4cGlyeWAgYENvbnRlbnQtVHlwZWAgYENvbnRlbnQtRGlzcG9zaXRpb25gIGBtZXRhRGF0YWBcbiAgcHJlc2lnbmVkUG9zdFBvbGljeShwb3N0UG9saWN5LCBjYikge1xuICAgIGlmICh0aGlzLmFub255bW91cykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Bbm9ueW1vdXNSZXF1ZXN0RXJyb3IoJ1ByZXNpZ25lZCBQT1NUIHBvbGljeSBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZvciBhbm9ueW1vdXMgcmVxdWVzdHMnKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHBvc3RQb2xpY3kpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwb3N0UG9saWN5IHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYiBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB0aGlzLmdldEJ1Y2tldFJlZ2lvbihwb3N0UG9saWN5LmZvcm1EYXRhLmJ1Y2tldCwgKGUsIHJlZ2lvbikgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgIHZhciBkYXRlU3RyID0gbWFrZURhdGVMb25nKGRhdGUpXG5cbiAgICAgIHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuXG4gICAgICBpZiAoIXBvc3RQb2xpY3kucG9saWN5LmV4cGlyYXRpb24pIHtcbiAgICAgICAgLy8gJ2V4cGlyYXRpb24nIGlzIG1hbmRhdG9yeSBmaWVsZCBmb3IgUzMuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGV4cGlyYXRpb24gZGF0ZSBvZiA3IGRheXMuXG4gICAgICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKVxuICAgICAgICBleHBpcmVzLnNldFNlY29uZHMoMjQgKiA2MCAqIDYwICogNylcbiAgICAgICAgcG9zdFBvbGljeS5zZXRFeHBpcmVzKGV4cGlyZXMpXG4gICAgICB9XG5cbiAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1kYXRlJywgZGF0ZVN0cl0pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1kYXRlJ10gPSBkYXRlU3RyXG5cbiAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1hbGdvcml0aG0nLCAnQVdTNC1ITUFDLVNIQTI1NiddKVxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotYWxnb3JpdGhtJ10gPSAnQVdTNC1ITUFDLVNIQTI1NidcblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWNyZWRlbnRpYWwnLCB0aGlzLmFjY2Vzc0tleSArICcvJyArIGdldFNjb3BlKHJlZ2lvbiwgZGF0ZSldKVxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotY3JlZGVudGlhbCddID0gdGhpcy5hY2Nlc3NLZXkgKyAnLycgKyBnZXRTY29wZShyZWdpb24sIGRhdGUpXG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25Ub2tlbikge1xuICAgICAgICBwb3N0UG9saWN5LnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckeC1hbXotc2VjdXJpdHktdG9rZW4nLCB0aGlzLnNlc3Npb25Ub2tlbl0pXG4gICAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LXNlY3VyaXR5LXRva2VuJ10gPSB0aGlzLnNlc3Npb25Ub2tlblxuICAgICAgfVxuXG4gICAgICB2YXIgcG9saWN5QmFzZTY0ID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocG9zdFBvbGljeS5wb2xpY3kpKS50b1N0cmluZygnYmFzZTY0JylcblxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YS5wb2xpY3kgPSBwb2xpY3lCYXNlNjRcblxuICAgICAgdmFyIHNpZ25hdHVyZSA9IHBvc3RQcmVzaWduU2lnbmF0dXJlVjQocmVnaW9uLCBkYXRlLCB0aGlzLnNlY3JldEtleSwgcG9saWN5QmFzZTY0KVxuXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1zaWduYXR1cmUnXSA9IHNpZ25hdHVyZVxuICAgICAgdmFyIG9wdHMgPSB7fVxuICAgICAgb3B0cy5yZWdpb24gPSByZWdpb25cbiAgICAgIG9wdHMuYnVja2V0TmFtZSA9IHBvc3RQb2xpY3kuZm9ybURhdGEuYnVja2V0XG4gICAgICB2YXIgcmVxT3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMob3B0cylcbiAgICAgIHZhciBwb3J0U3RyID0gdGhpcy5wb3J0ID09IDgwIHx8IHRoaXMucG9ydCA9PT0gNDQzID8gJycgOiBgOiR7dGhpcy5wb3J0LnRvU3RyaW5nKCl9YFxuICAgICAgdmFyIHVybFN0ciA9IGAke3JlcU9wdGlvbnMucHJvdG9jb2x9Ly8ke3JlcU9wdGlvbnMuaG9zdH0ke3BvcnRTdHJ9JHtyZXFPcHRpb25zLnBhdGh9YFxuICAgICAgY2IobnVsbCwgeyBwb3N0VVJMOiB1cmxTdHIsIGZvcm1EYXRhOiBwb3N0UG9saWN5LmZvcm1EYXRhIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIENvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLiBBZnRlciBhbGwgdGhlIHBhcnRzIGFyZSB1cGxvYWRlZCBpc3N1aW5nXG4gIC8vIHRoaXMgY2FsbCB3aWxsIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgb24gdGhlIHNlcnZlciBpbnRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIGV0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChldGFncykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwiQXJyYXlcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXJpRXNjYXBlKHVwbG9hZElkKX1gXG5cbiAgICB2YXIgcGFydHMgPSBbXVxuXG4gICAgZXRhZ3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIFBhcnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBQYXJ0TnVtYmVyOiBlbGVtZW50LnBhcnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFVGFnOiBlbGVtZW50LmV0YWcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHZhciBwYXlsb2FkT2JqZWN0ID0geyBDb21wbGV0ZU11bHRpcGFydFVwbG9hZDogcGFydHMgfVxuICAgIHZhciBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJDb2RlKSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBhcnQgQ29tcGxldGUgQVBJIHJldHVybnMgYW4gZXJyb3IgWE1MIGFmdGVyIGEgMjAwIGh0dHAgc3RhdHVzXG4gICAgICAgICAgICBjYihuZXcgZXJyb3JzLlMzRXJyb3IocmVzdWx0LmVyck1lc3NhZ2UpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZU11bHRpcGFydFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IobnVsbCwgY29tcGxldGVNdWx0aXBhcnRSZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBDYWxsZWQgYnkgbGlzdEluY29tcGxldGVVcGxvYWRzIHRvIGZldGNoIGEgYmF0Y2ggb2YgaW5jb21wbGV0ZSB1cGxvYWRzLlxuICBsaXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIsIGRlbGltaXRlcikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGtleU1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2tleU1hcmtlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyh1cGxvYWRJZE1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkTWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuICAgIHF1ZXJpZXMucHVzaChgcHJlZml4PSR7dXJpRXNjYXBlKHByZWZpeCl9YClcbiAgICBxdWVyaWVzLnB1c2goYGRlbGltaXRlcj0ke3VyaUVzY2FwZShkZWxpbWl0ZXIpfWApXG5cbiAgICBpZiAoa2V5TWFya2VyKSB7XG4gICAgICBrZXlNYXJrZXIgPSB1cmlFc2NhcGUoa2V5TWFya2VyKVxuICAgICAgcXVlcmllcy5wdXNoKGBrZXktbWFya2VyPSR7a2V5TWFya2VyfWApXG4gICAgfVxuICAgIGlmICh1cGxvYWRJZE1hcmtlcikge1xuICAgICAgcXVlcmllcy5wdXNoKGB1cGxvYWQtaWQtbWFya2VyPSR7dXBsb2FkSWRNYXJrZXJ9YClcbiAgICB9XG5cbiAgICB2YXIgbWF4VXBsb2FkcyA9IDEwMDBcbiAgICBxdWVyaWVzLnB1c2goYG1heC11cGxvYWRzPSR7bWF4VXBsb2Fkc31gKVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgcXVlcmllcy51bnNoaWZ0KCd1cGxvYWRzJylcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyKClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5lbWl0KCdlcnJvcicsIGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgIH0pXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyXG4gIH1cblxuICAvLyBGaW5kIHVwbG9hZElkIG9mIGFuIGluY29tcGxldGUgdXBsb2FkLlxuICBmaW5kVXBsb2FkSWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYiBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbGF0ZXN0VXBsb2FkXG4gICAgdmFyIGxpc3ROZXh0ID0gKGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIpID0+IHtcbiAgICAgIHRoaXMubGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgJycpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXN1bHQudXBsb2Fkcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1cGxvYWQua2V5ID09PSBvYmplY3ROYW1lKSB7XG4gICAgICAgICAgICAgIGlmICghbGF0ZXN0VXBsb2FkIHx8IHVwbG9hZC5pbml0aWF0ZWQuZ2V0VGltZSgpID4gbGF0ZXN0VXBsb2FkLmluaXRpYXRlZC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICBsYXRlc3RVcGxvYWQgPSB1cGxvYWRcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgbGlzdE5leHQocmVzdWx0Lm5leHRLZXlNYXJrZXIsIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxhdGVzdFVwbG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGxhdGVzdFVwbG9hZC51cGxvYWRJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IobnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBsaXN0TmV4dCgnJywgJycpXG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHRoZSBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbnMgaW4gdGhlIFMzIHByb3ZpZGVyXG4gIHNldEJ1Y2tldE5vdGlmaWNhdGlvbihidWNrZXROYW1lLCBjb25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChjb25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZmljYXRpb24gY29uZmlnIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICB2YXIgcXVlcnkgPSAnbm90aWZpY2F0aW9uJ1xuICAgIHZhciBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgdmFyIHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KGNvbmZpZylcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIHJlbW92ZUFsbEJ1Y2tldE5vdGlmaWNhdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIHRoaXMuc2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIG5ldyBOb3RpZmljYXRpb25Db25maWcoKSwgY2IpXG4gIH1cblxuICAvLyBSZXR1cm4gdGhlIGxpc3Qgb2Ygbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb25zIHN0b3JlZFxuICAvLyBpbiB0aGUgUzMgcHJvdmlkZXJcbiAgZ2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ25vdGlmaWNhdGlvbidcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEJ1Y2tldE5vdGlmaWNhdGlvblRyYW5zZm9ybWVyKClcbiAgICAgIHZhciBidWNrZXROb3RpZmljYXRpb25cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IChidWNrZXROb3RpZmljYXRpb24gPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIGJ1Y2tldE5vdGlmaWNhdGlvbikpXG4gICAgfSlcbiAgfVxuXG4gIC8vIExpc3RlbnMgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25zLiBSZXR1cm5zIGFuIEV2ZW50RW1pdHRlci5cbiAgbGlzdGVuQnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIHByZWZpeCwgc3VmZml4LCBldmVudHMpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdWZmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdWZmaXggbXVzdCBiZSBvZiB0eXBlIHN0cmluZycpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShldmVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdldmVudHMgbXVzdCBiZSBvZiB0eXBlIEFycmF5JylcbiAgICB9XG4gICAgbGV0IGxpc3RlbmVyID0gbmV3IE5vdGlmaWNhdGlvblBvbGxlcih0aGlzLCBidWNrZXROYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZXZlbnRzKVxuICAgIGxpc3RlbmVyLnN0YXJ0KClcblxuICAgIHJldHVybiBsaXN0ZW5lclxuICB9XG5cbiAgZ2V0QnVja2V0VmVyc2lvbmluZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuICAgIHZhciBxdWVyeSA9ICd2ZXJzaW9uaW5nJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHZlcnNpb25Db25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLmJ1Y2tldFZlcnNpb25pbmdUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHZlcnNpb25Db25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgdmVyc2lvbkNvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0QnVja2V0VmVyc2lvbmluZyhidWNrZXROYW1lLCB2ZXJzaW9uQ29uZmlnLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghT2JqZWN0LmtleXModmVyc2lvbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd2ZXJzaW9uQ29uZmlnIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBxdWVyeSA9ICd2ZXJzaW9uaW5nJ1xuICAgIHZhciBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24nLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgICBoZWFkbGVzczogdHJ1ZSxcbiAgICB9KVxuICAgIHZhciBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdCh2ZXJzaW9uQ29uZmlnKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogVG8gc2V0IFRhZ3Mgb24gYSBidWNrZXQgb3Igb2JqZWN0IGJhc2VkIG9uIHRoZSBwYXJhbXNcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogdGFnZ2luZ1BhcmFtcyBfb2JqZWN0XyBXaGljaCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXNcbiAgICogIGJ1Y2tldE5hbWUgX3N0cmluZ18sXG4gICAqICBvYmplY3ROYW1lIF9zdHJpbmdfIChPcHRpb25hbCksXG4gICAqICB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogIHB1dE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9LFxuICAgKiAgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0VGFnZ2luZyh0YWdnaW5nUGFyYW1zKSB7XG4gICAgY29uc3QgeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzID0ge30sIGNiIH0gPSB0YWdnaW5nUGFyYW1zXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAndGFnZ2luZydcblxuICAgIGlmIChwdXRPcHRzICYmIHB1dE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJ5fSZ2ZXJzaW9uSWQ9JHtwdXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuICAgIGNvbnN0IHRhZ3NMaXN0ID0gW11cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgdGFnc0xpc3QucHVzaCh7IEtleToga2V5LCBWYWx1ZTogdmFsdWUgfSlcbiAgICB9XG4gICAgY29uc3QgdGFnZ2luZ0NvbmZpZyA9IHtcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiB7XG4gICAgICAgICAgVGFnOiB0YWdzTGlzdCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSwgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0gfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QodGFnZ2luZ0NvbmZpZylcbiAgICBwYXlsb2FkID0gQnVmZmVyLmZyb20oZW5jb2Rlci5lbmNvZGUocGF5bG9hZCkpXG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogU2V0IFRhZ3Mgb24gYSBCdWNrZXRcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0QnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCB0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodGFncykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3RhZ3Mgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignbWF4aW11bSB0YWdzIGFsbG93ZWQgaXMgMTBcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0VGFnZ2luZyh7IGJ1Y2tldE5hbWUsIHRhZ3MsIGNiIH0pXG4gIH1cblxuICAvKiogU2V0IFRhZ3Mgb24gYW4gT2JqZWN0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfXG4gICAqICAqIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiAgcHV0T3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgb2JqZWN0IG5hbWU6ICcgKyBvYmplY3ROYW1lKVxuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKHB1dE9wdHMpKSB7XG4gICAgICBjYiA9IHB1dE9wdHNcbiAgICAgIHB1dE9wdHMgPSB7fVxuICAgIH1cblxuICAgIGlmICghaXNPYmplY3QodGFncykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3RhZ3Mgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWF4aW11bSB0YWdzIGFsbG93ZWQgaXMgMTBcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0VGFnZ2luZyh7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMsIGNiIH0pXG4gIH1cblxuICAvKiogUmVtb3ZlIFRhZ3Mgb24gYW4gQnVja2V0L09iamVjdCBiYXNlZCBvbiBwYXJhbXNcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ18gKG9wdGlvbmFsKVxuICAgKiByZW1vdmVPcHRzIF9vYmplY3RfIChPcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifSxcbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZVRhZ2dpbmcoeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCByZW1vdmVPcHRzLCBjYiB9KSB7XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBsZXQgcXVlcnkgPSAndGFnZ2luZydcblxuICAgIGlmIChyZW1vdmVPcHRzICYmIE9iamVjdC5rZXlzKHJlbW92ZU9wdHMpLmxlbmd0aCAmJiByZW1vdmVPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyeX0mdmVyc2lvbklkPSR7cmVtb3ZlT3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9XG5cbiAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnNbJ29iamVjdE5hbWUnXSA9IG9iamVjdE5hbWVcbiAgICB9XG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDAsIDIwNF0sICcnLCB0cnVlLCBjYilcbiAgfVxuXG4gIC8qKiBSZW1vdmUgVGFncyBhc3NvY2lhdGVkIHdpdGggYSBidWNrZXRcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcmVtb3ZlQnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbW92ZVRhZ2dpbmcoeyBidWNrZXROYW1lLCBjYiB9KVxuICB9XG5cbiAgLyoqIFJlbW92ZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3RcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ19cbiAgICogcmVtb3ZlT3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZy4ge1ZlcnNpb25JRDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9XG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlT3B0cykpIHtcbiAgICAgIGNiID0gcmVtb3ZlT3B0c1xuICAgICAgcmVtb3ZlT3B0cyA9IHt9XG4gICAgfVxuICAgIGlmIChyZW1vdmVPcHRzICYmIE9iamVjdC5rZXlzKHJlbW92ZU9wdHMpLmxlbmd0aCAmJiAhaXNPYmplY3QocmVtb3ZlT3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlbW92ZU9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmVtb3ZlT3B0cywgY2IgfSlcbiAgfVxuXG4gIC8qKiBHZXQgVGFncyBhc3NvY2lhdGVkIHdpdGggYSBCdWNrZXRcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoZXJyb3IsIHRhZ3MpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgZ2V0QnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICd0YWdnaW5nJ1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldFRhZ3NUcmFuc2Zvcm1lcigpXG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGxldCB0YWdzTGlzdFxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4gKHRhZ3NMaXN0ID0gcmVzdWx0KSlcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiBjYihudWxsLCB0YWdzTGlzdCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYnVja2V0IE9SIGFuIG9iamVjdFxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ18gKE9wdGlvbmFsKVxuICAgKiBnZXRPcHRzIF9vYmplY3RfIChPcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifVxuICAgKiBgY2IoZXJyb3IsIHRhZ3MpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgZ2V0T2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzID0ge30sIGNiID0gKCkgPT4gZmFsc2UpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICd0YWdnaW5nJ1xuXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QoZ2V0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2dldE9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKGdldE9wdHMgJiYgZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke2dldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICByZXF1ZXN0T3B0aW9uc1snb2JqZWN0TmFtZSddID0gb2JqZWN0TmFtZVxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0VGFnc1RyYW5zZm9ybWVyKClcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgbGV0IHRhZ3NMaXN0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAodGFnc0xpc3QgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRhZ3NMaXN0KSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9uIGEgYnVja2V0LlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIHBvbGljeUNvbmZpZyBfb2JqZWN0XyBhIHZhbGlkIHBvbGljeSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIGFwcGx5QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIHBvbGljeUNvbmZpZywgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2xpZmVjeWNsZSdcblxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdMaWZlY3ljbGVDb25maWd1cmF0aW9uJyxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QocG9saWN5Q29uZmlnKVxuICAgIHBheWxvYWQgPSBCdWZmZXIuZnJvbShlbmNvZGVyLmVuY29kZShwYXlsb2FkKSlcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBSZW1vdmUgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb2YgYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBTZXQvT3ZlcnJpZGUgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGVtcHR5LCBpdCByZW1vdmVzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIGxpZmVDeWNsZUNvbmZpZyBfb2JqZWN0XyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IChudWxsIG9yICcnKSB0byByZW1vdmUgdGhlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLiBvciBhIHZhbGlkIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgbGlmZUN5Y2xlQ29uZmlnID0gbnVsbCwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGxpZmVDeWNsZUNvbmZpZykpIHtcbiAgICAgIHRoaXMucmVtb3ZlQnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGNiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGxpZmVDeWNsZUNvbmZpZywgY2IpXG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBsaWZlY3ljbGUgY29uZmlndXJhdGlvbiBvbiBhIGJ1Y2tldC5cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoY29uZmlnKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gYXMgdGhlIGVycm9yIGFyZ3VtZW50LlxuICAgKi9cbiAgZ2V0QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdsaWZlY3ljbGUnXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5saWZlY3ljbGVUcmFuc2Zvcm1lcigpXG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGxldCBsaWZlY3ljbGVDb25maWdcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IChsaWZlY3ljbGVDb25maWcgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIGxpZmVjeWNsZUNvbmZpZykpXG4gICAgfSlcbiAgfVxuXG4gIHNldE9iamVjdExvY2tDb25maWcoYnVja2V0TmFtZSwgbG9ja0NvbmZpZ09wdHMgPSB7fSwgY2IpIHtcbiAgICBjb25zdCByZXRlbnRpb25Nb2RlcyA9IFtSRVRFTlRJT05fTU9ERVMuQ09NUExJQU5DRSwgUkVURU5USU9OX01PREVTLkdPVkVSTkFOQ0VdXG4gICAgY29uc3QgdmFsaWRVbml0cyA9IFtSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuREFZUywgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLllFQVJTXVxuXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMubW9kZSAmJiAhcmV0ZW50aW9uTW9kZXMuaW5jbHVkZXMobG9ja0NvbmZpZ09wdHMubW9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGxvY2tDb25maWdPcHRzLm1vZGUgc2hvdWxkIGJlIG9uZSBvZiAke3JldGVudGlvbk1vZGVzfWApXG4gICAgfVxuICAgIGlmIChsb2NrQ29uZmlnT3B0cy51bml0ICYmICF2YWxpZFVuaXRzLmluY2x1ZGVzKGxvY2tDb25maWdPcHRzLnVuaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy51bml0IHNob3VsZCBiZSBvbmUgb2YgJHt2YWxpZFVuaXRzfWApXG4gICAgfVxuICAgIGlmIChsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSAmJiAhaXNOdW1iZXIobG9ja0NvbmZpZ09wdHMudmFsaWRpdHkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSBzaG91bGQgYmUgYSBudW1iZXJgKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAnb2JqZWN0LWxvY2snXG5cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgT2JqZWN0TG9ja0VuYWJsZWQ6ICdFbmFibGVkJyxcbiAgICB9XG4gICAgY29uc3QgY29uZmlnS2V5cyA9IE9iamVjdC5rZXlzKGxvY2tDb25maWdPcHRzKVxuICAgIC8vIENoZWNrIGlmIGtleXMgYXJlIHByZXNlbnQgYW5kIGFsbCBrZXlzIGFyZSBwcmVzZW50LlxuICAgIGlmIChjb25maWdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChfLmRpZmZlcmVuY2UoY29uZmlnS2V5cywgWyd1bml0JywgJ21vZGUnLCAndmFsaWRpdHknXSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYGxvY2tDb25maWdPcHRzLm1vZGUsbG9ja0NvbmZpZ09wdHMudW5pdCxsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSBhbGwgdGhlIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNwZWNpZmllZC5gLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWcuUnVsZSA9IHtcbiAgICAgICAgICBEZWZhdWx0UmV0ZW50aW9uOiB7fSxcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9ja0NvbmZpZ09wdHMubW9kZSkge1xuICAgICAgICAgIGNvbmZpZy5SdWxlLkRlZmF1bHRSZXRlbnRpb24uTW9kZSA9IGxvY2tDb25maWdPcHRzLm1vZGVcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9ja0NvbmZpZ09wdHMudW5pdCA9PT0gUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLkRBWVMpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLkRheXMgPSBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eVxuICAgICAgICB9IGVsc2UgaWYgKGxvY2tDb25maWdPcHRzLnVuaXQgPT09IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSUykge1xuICAgICAgICAgIGNvbmZpZy5SdWxlLkRlZmF1bHRSZXRlbnRpb24uWWVhcnMgPSBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ09iamVjdExvY2tDb25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgZ2V0T2JqZWN0TG9ja0NvbmZpZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnb2JqZWN0LWxvY2snXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgb2JqZWN0TG9ja0NvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMub2JqZWN0TG9ja1RyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgb2JqZWN0TG9ja0NvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBvYmplY3RMb2NrQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwdXRPYmplY3RSZXRlbnRpb24oYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmV0ZW50aW9uT3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmV0ZW50aW9uT3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JldGVudGlvbk9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MgJiYgIWlzQm9vbGVhbihyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIGdvdmVybmFuY2VCeXBhc3MnLCByZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJldGVudGlvbk9wdHMubW9kZSAmJlxuICAgICAgICAhW1JFVEVOVElPTl9NT0RFUy5DT01QTElBTkNFLCBSRVRFTlRJT05fTU9ERVMuR09WRVJOQU5DRV0uaW5jbHVkZXMocmV0ZW50aW9uT3B0cy5tb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgb2JqZWN0IHJldGVudGlvbiBtb2RlICcsIHJldGVudGlvbk9wdHMubW9kZSlcbiAgICAgIH1cbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSAmJiAhaXNTdHJpbmcocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJldGFpblVudGlsRGF0ZScsIHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlKVxuICAgICAgfVxuICAgICAgaWYgKHJldGVudGlvbk9wdHMudmVyc2lvbklkICYmICFpc1N0cmluZyhyZXRlbnRpb25PcHRzLnZlcnNpb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgdmVyc2lvbklkJywgcmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAncmV0ZW50aW9uJ1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaWYgKHJldGVudGlvbk9wdHMuZ292ZXJuYW5jZUJ5cGFzcykge1xuICAgICAgaGVhZGVyc1snWC1BbXotQnlwYXNzLUdvdmVybmFuY2UtUmV0ZW50aW9uJ10gPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJvb3ROYW1lOiAnUmV0ZW50aW9uJywgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sIGhlYWRsZXNzOiB0cnVlIH0pXG4gICAgY29uc3QgcGFyYW1zID0ge31cblxuICAgIGlmIChyZXRlbnRpb25PcHRzLm1vZGUpIHtcbiAgICAgIHBhcmFtcy5Nb2RlID0gcmV0ZW50aW9uT3B0cy5tb2RlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSkge1xuICAgICAgcGFyYW1zLlJldGFpblVudGlsRGF0ZSA9IHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25PcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtyZXRlbnRpb25PcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgbGV0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHBhcmFtcylcblxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDAsIDIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRPYmplY3RSZXRlbnRpb24oYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGdldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2UgaWYgKGdldE9wdHMudmVyc2lvbklkICYmICFpc1N0cmluZyhnZXRPcHRzLnZlcnNpb25JZCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1ZlcnNpb25JRCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKGNiICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBsZXQgcXVlcnkgPSAncmV0ZW50aW9uJ1xuICAgIGlmIChnZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtnZXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHJldGVudGlvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMub2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICByZXRlbnRpb25Db25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgcmV0ZW50aW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzZXRCdWNrZXRFbmNyeXB0aW9uKGJ1Y2tldE5hbWUsIGVuY3J5cHRpb25Db25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihlbmNyeXB0aW9uQ29uZmlnKSkge1xuICAgICAgY2IgPSBlbmNyeXB0aW9uQ29uZmlnXG4gICAgICBlbmNyeXB0aW9uQ29uZmlnID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KGVuY3J5cHRpb25Db25maWcpICYmIGVuY3J5cHRpb25Db25maWcuUnVsZS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIFJ1bGUgbGVuZ3RoLiBPbmx5IG9uZSBydWxlIGlzIGFsbG93ZWQuOiAnICsgZW5jcnlwdGlvbkNvbmZpZy5SdWxlKVxuICAgIH1cbiAgICBpZiAoY2IgJiYgIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGxldCBlbmNyeXB0aW9uT2JqID0gZW5jcnlwdGlvbkNvbmZpZ1xuICAgIGlmIChfLmlzRW1wdHkoZW5jcnlwdGlvbkNvbmZpZykpIHtcbiAgICAgIGVuY3J5cHRpb25PYmogPSB7XG4gICAgICAgIC8vIERlZmF1bHQgTWluSU8gU2VydmVyIFN1cHBvcnRlZCBSdWxlXG4gICAgICAgIFJ1bGU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ0FFUzI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24nLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgICBoZWFkbGVzczogdHJ1ZSxcbiAgICB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChlbmNyeXB0aW9uT2JqKVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldEJ1Y2tldEVuY3J5cHRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgYnVja2V0RW5jQ29uZmlnID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5idWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBidWNrZXRFbmNDb25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgYnVja2V0RW5jQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cbiAgcmVtb3ZlQnVja2V0RW5jcnlwdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAnZW5jcnlwdGlvbidcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldE9iamVjdExlZ2FsSG9sZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KGdldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXMoZ2V0T3B0cykubGVuZ3RoID4gMCAmJiBnZXRPcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcoZ2V0T3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uSWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nLjonLCBnZXRPcHRzLnZlcnNpb25JZClcbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ2xlZ2FsLWhvbGQnXG5cbiAgICBpZiAoZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBsZWdhbEhvbGRDb25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgbGVnYWxIb2xkQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIGxlZ2FsSG9sZENvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0T2JqZWN0TGVnYWxIb2xkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgc3RhdHVzOiBMRUdBTF9IT0xEX1NUQVRVUy5FTkFCTEVELFxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihzZXRPcHRzKSkge1xuICAgICAgY2IgPSBzZXRPcHRzXG4gICAgICBzZXRPcHRzID0gZGVmYXVsdE9wdHNcbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KHNldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzZXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIVtMRUdBTF9IT0xEX1NUQVRVUy5FTkFCTEVELCBMRUdBTF9IT0xEX1NUQVRVUy5ESVNBQkxFRF0uaW5jbHVkZXMoc2V0T3B0cy5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzOiAnICsgc2V0T3B0cy5zdGF0dXMpXG4gICAgICB9XG4gICAgICBpZiAoc2V0T3B0cy52ZXJzaW9uSWQgJiYgIXNldE9wdHMudmVyc2lvbklkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uSWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nLjonICsgc2V0T3B0cy52ZXJzaW9uSWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHNldE9wdHMpKSB7XG4gICAgICBzZXRPcHRzID0ge1xuICAgICAgICBkZWZhdWx0T3B0cyxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICdsZWdhbC1ob2xkJ1xuXG4gICAgaWYgKHNldE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSArPSBgJnZlcnNpb25JZD0ke3NldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG5cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgU3RhdHVzOiBzZXRPcHRzLnN0YXR1cyxcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHsgcm9vdE5hbWU6ICdMZWdhbEhvbGQnLCByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSwgaGVhZGxlc3M6IHRydWUgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdXBsb2FkIGEgcGFydCBkdXJpbmcgY29tcG9zZSBvYmplY3QuXG4gICAqIEBwYXJhbSBwYXJ0Q29uZmlnIF9fb2JqZWN0X18gY29udGFpbnMgdGhlIGZvbGxvd2luZy5cbiAgICogICAgYnVja2V0TmFtZSBfX3N0cmluZ19fXG4gICAqICAgIG9iamVjdE5hbWUgX19zdHJpbmdfX1xuICAgKiAgICB1cGxvYWRJRCBfX3N0cmluZ19fXG4gICAqICAgIHBhcnROdW1iZXIgX19udW1iZXJfX1xuICAgKiAgICBoZWFkZXJzIF9fb2JqZWN0X19cbiAgICogQHBhcmFtIGNiIGNhbGxlZCB3aXRoIG51bGwgaW5jYXNlIG9mIGVycm9yLlxuICAgKi9cbiAgdXBsb2FkUGFydENvcHkocGFydENvbmZpZywgY2IpIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHVwbG9hZElELCBwYXJ0TnVtYmVyLCBoZWFkZXJzIH0gPSBwYXJ0Q29uZmlnXG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9IGB1cGxvYWRJZD0ke3VwbG9hZElEfSZwYXJ0TnVtYmVyPSR7cGFydE51bWJlcn1gXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZTogb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGxldCBwYXJ0Q29weVJlc3VsdCA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy51cGxvYWRQYXJ0VHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBwYXJ0Q29weVJlc3VsdCA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBsZXQgdXBsb2FkUGFydENvcHlSZXMgPSB7XG4gICAgICAgICAgICBldGFnOiBzYW5pdGl6ZUVUYWcocGFydENvcHlSZXN1bHQuRVRhZyksXG4gICAgICAgICAgICBrZXk6IG9iamVjdE5hbWUsXG4gICAgICAgICAgICBwYXJ0OiBwYXJ0TnVtYmVyLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKG51bGwsIHVwbG9hZFBhcnRDb3B5UmVzKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBjb21wb3NlT2JqZWN0KGRlc3RPYmpDb25maWcgPSB7fSwgc291cmNlT2JqTGlzdCA9IFtdLCBjYikge1xuICAgIGNvbnN0IG1lID0gdGhpcyAvLyBtYW55IGFzeW5jIGZsb3dzLiBzbyBzdG9yZSB0aGUgcmVmLlxuICAgIGNvbnN0IHNvdXJjZUZpbGVzTGVuZ3RoID0gc291cmNlT2JqTGlzdC5sZW5ndGhcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzb3VyY2VPYmpMaXN0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignc291cmNlQ29uZmlnIHNob3VsZCBhbiBhcnJheSBvZiBDb3B5U291cmNlT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIShkZXN0T2JqQ29uZmlnIGluc3RhbmNlb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Rlc3RDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weURlc3RpbmF0aW9uT3B0aW9ucyAnKVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VGaWxlc0xlbmd0aCA8IDEgfHwgc291cmNlRmlsZXNMZW5ndGggPiBQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFwiVGhlcmUgbXVzdCBiZSBhcyBsZWFzdCBvbmUgYW5kIHVwIHRvICR7UEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlR9IHNvdXJjZSBvYmplY3RzLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc291cmNlT2JqTGlzdFtpXS52YWxpZGF0ZSgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVzdE9iakNvbmZpZy52YWxpZGF0ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTdGF0T3B0aW9ucyA9IChzcmNDb25maWcpID0+IHtcbiAgICAgIGxldCBzdGF0T3B0cyA9IHt9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzcmNDb25maWcuVmVyc2lvbklEKSkge1xuICAgICAgICBzdGF0T3B0cyA9IHtcbiAgICAgICAgICB2ZXJzaW9uSWQ6IHNyY0NvbmZpZy5WZXJzaW9uSUQsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0T3B0c1xuICAgIH1cbiAgICBjb25zdCBzcmNPYmplY3RTaXplcyA9IFtdXG4gICAgbGV0IHRvdGFsU2l6ZSA9IDBcbiAgICBsZXQgdG90YWxQYXJ0cyA9IDBcblxuICAgIGNvbnN0IHNvdXJjZU9ialN0YXRzID0gc291cmNlT2JqTGlzdC5tYXAoKHNyY0l0ZW0pID0+XG4gICAgICBtZS5zdGF0T2JqZWN0KHNyY0l0ZW0uQnVja2V0LCBzcmNJdGVtLk9iamVjdCwgZ2V0U3RhdE9wdGlvbnMoc3JjSXRlbSkpLFxuICAgIClcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChzb3VyY2VPYmpTdGF0cylcbiAgICAgIC50aGVuKChzcmNPYmplY3RJbmZvcykgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRTdGF0cyA9IHNyY09iamVjdEluZm9zLm1hcCgocmVzSXRlbVN0YXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjQ29uZmlnID0gc291cmNlT2JqTGlzdFtpbmRleF1cblxuICAgICAgICAgIGxldCBzcmNDb3B5U2l6ZSA9IHJlc0l0ZW1TdGF0LnNpemVcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNlZ21lbnQgaXMgc3BlY2lmaWVkLCBhbmQgaWYgc28sIGlzIHRoZVxuICAgICAgICAgIC8vIHNlZ21lbnQgd2l0aGluIG9iamVjdCBib3VuZHM/XG4gICAgICAgICAgaWYgKHNyY0NvbmZpZy5NYXRjaFJhbmdlKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSByYW5nZSBpcyBzcGVjaWZpZWQsXG4gICAgICAgICAgICAvLyAgICAwIDw9IHNyYy5zcmNTdGFydCA8PSBzcmMuc3JjRW5kXG4gICAgICAgICAgICAvLyBzbyBvbmx5IGludmFsaWQgY2FzZSB0byBjaGVjayBpczpcbiAgICAgICAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gc3JjQ29uZmlnLlN0YXJ0XG4gICAgICAgICAgICBjb25zdCBzcmNFbmQgPSBzcmNDb25maWcuRW5kXG4gICAgICAgICAgICBpZiAoc3JjRW5kID49IHNyY0NvcHlTaXplIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3B5U3JjT3B0aW9ucyAke2luZGV4fSBoYXMgaW52YWxpZCBzZWdtZW50LXRvLWNvcHkgWyR7c3JjU3RhcnR9LCAke3NyY0VuZH1dIChzaXplIGlzICR7c3JjQ29weVNpemV9KWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNyY0NvcHlTaXplID0gc3JjRW5kIC0gc3JjU3RhcnQgKyAxXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSB0aGUgbGFzdCBzb3VyY2UgbWF5IGJlIGxlc3MgdGhhbiBgYWJzTWluUGFydFNpemVgXG4gICAgICAgICAgaWYgKHNyY0NvcHlTaXplIDwgUEFSVF9DT05TVFJBSU5UUy5BQlNfTUlOX1BBUlRfU0laRSAmJiBpbmRleCA8IHNvdXJjZUZpbGVzTGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICAgICAgYENvcHlTcmNPcHRpb25zICR7aW5kZXh9IGlzIHRvbyBzbWFsbCAoJHtzcmNDb3B5U2l6ZX0pIGFuZCBpdCBpcyBub3QgdGhlIGxhc3QgcGFydC5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElzIGRhdGEgdG8gY29weSB0b28gbGFyZ2U/XG4gICAgICAgICAgdG90YWxTaXplICs9IHNyY0NvcHlTaXplXG4gICAgICAgICAgaWYgKHRvdGFsU2l6ZSA+IFBBUlRfQ09OU1RSQUlOVFMuTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYENhbm5vdCBjb21wb3NlIGFuIG9iamVjdCBvZiBzaXplICR7dG90YWxTaXplfSAoPiA1VGlCKWApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcmVjb3JkIHNvdXJjZSBzaXplXG4gICAgICAgICAgc3JjT2JqZWN0U2l6ZXNbaW5kZXhdID0gc3JjQ29weVNpemVcblxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSBwYXJ0cyBuZWVkZWQgZm9yIGN1cnJlbnQgc291cmNlXG4gICAgICAgICAgdG90YWxQYXJ0cyArPSBwYXJ0c1JlcXVpcmVkKHNyY0NvcHlTaXplKVxuICAgICAgICAgIC8vIERvIHdlIG5lZWQgbW9yZSBwYXJ0cyB0aGFuIHdlIGFyZSBhbGxvd2VkP1xuICAgICAgICAgIGlmICh0b3RhbFBhcnRzID4gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIHByb3Bvc2VkIGNvbXBvc2Ugb2JqZWN0IHJlcXVpcmVzIG1vcmUgdGhhbiAke1BBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UfSBwYXJ0c2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc0l0ZW1TdGF0XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCh0b3RhbFBhcnRzID09PSAxICYmIHRvdGFsU2l6ZSA8PSBQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUX1NJWkUpIHx8IHRvdGFsU2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3Qoc291cmNlT2JqTGlzdFswXSwgZGVzdE9iakNvbmZpZywgY2IpIC8vIHVzZSBjb3B5T2JqZWN0VjJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXNlcnZlIGV0YWcgdG8gYXZvaWQgbW9kaWZpY2F0aW9uIG9mIG9iamVjdCB3aGlsZSBjb3B5aW5nLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBzb3VyY2VPYmpMaXN0W2ldLk1hdGNoRVRhZyA9IHZhbGlkYXRlZFN0YXRzW2ldLmV0YWdcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0UGFydFNpemVMaXN0ID0gdmFsaWRhdGVkU3RhdHMubWFwKChyZXNJdGVtU3RhdCwgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FsU2l6ZSA9IGNhbGN1bGF0ZUV2ZW5TcGxpdHMoc3JjT2JqZWN0U2l6ZXNbaWR4XSwgc291cmNlT2JqTGlzdFtpZHhdKVxuICAgICAgICAgIHJldHVybiBjYWxTaXplXG4gICAgICAgIH0pXG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VXBsb2FkUGFydENvbmZpZ0xpc3QodXBsb2FkSWQpIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRQYXJ0Q29uZmlnTGlzdCA9IFtdXG5cbiAgICAgICAgICBzcGxpdFBhcnRTaXplTGlzdC5mb3JFYWNoKChzcGxpdFNpemUsIHNwbGl0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleDogc3RhcnRJZHgsIGVuZEluZGV4OiBlbmRJZHgsIG9iakluZm86IG9iakNvbmZpZyB9ID0gc3BsaXRTaXplXG5cbiAgICAgICAgICAgIGxldCBwYXJ0SW5kZXggPSBzcGxpdEluZGV4ICsgMSAvLyBwYXJ0IGluZGV4IHN0YXJ0cyBmcm9tIDEuXG4gICAgICAgICAgICBjb25zdCB0b3RhbFVwbG9hZHMgPSBBcnJheS5mcm9tKHN0YXJ0SWR4KVxuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gc291cmNlT2JqTGlzdFtzcGxpdEluZGV4XS5nZXRIZWFkZXJzKClcblxuICAgICAgICAgICAgdG90YWxVcGxvYWRzLmZvckVhY2goKHNwbGl0U3RhcnQsIHVwbGRDdHJJZHgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHNwbGl0RW5kID0gZW5kSWR4W3VwbGRDdHJJZHhdXG5cbiAgICAgICAgICAgICAgY29uc3Qgc291cmNlT2JqID0gYCR7b2JqQ29uZmlnLkJ1Y2tldH0vJHtvYmpDb25maWcuT2JqZWN0fWBcbiAgICAgICAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UnXSA9IGAke3NvdXJjZU9ian1gXG4gICAgICAgICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLXJhbmdlJ10gPSBgYnl0ZXM9JHtzcGxpdFN0YXJ0fS0ke3NwbGl0RW5kfWBcblxuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRQYXJ0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IGRlc3RPYmpDb25maWcuQnVja2V0LFxuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6IGRlc3RPYmpDb25maWcuT2JqZWN0LFxuICAgICAgICAgICAgICAgIHVwbG9hZElEOiB1cGxvYWRJZCxcbiAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyOiBwYXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBzb3VyY2VPYmo6IHNvdXJjZU9iaixcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVwbG9hZFBhcnRDb25maWdMaXN0LnB1c2godXBsb2FkUGFydENvbmZpZylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiB1cGxvYWRQYXJ0Q29uZmlnTGlzdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGVyZm9ybVVwbG9hZFBhcnRzID0gKHVwbG9hZElkKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkTGlzdCA9IGdldFVwbG9hZFBhcnRDb25maWdMaXN0KHVwbG9hZElkKVxuXG4gICAgICAgICAgYXN5bmMubWFwKHVwbG9hZExpc3QsIG1lLnVwbG9hZFBhcnRDb3B5LmJpbmQobWUpLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgdGhpcy5hYm9ydE11bHRpcGFydFVwbG9hZChkZXN0T2JqQ29uZmlnLkJ1Y2tldCwgZGVzdE9iakNvbmZpZy5PYmplY3QsIHVwbG9hZElkKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IGNiKCksXG4gICAgICAgICAgICAgICAgKGVycikgPT4gY2IoZXJyKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnRzRG9uZSA9IHJlcy5tYXAoKHBhcnRDb3B5KSA9PiAoeyBldGFnOiBwYXJ0Q29weS5ldGFnLCBwYXJ0OiBwYXJ0Q29weS5wYXJ0IH0pKVxuICAgICAgICAgICAgcmV0dXJuIG1lLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgdXBsb2FkSWQsIHBhcnRzRG9uZSwgY2IpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1VwbG9hZEhlYWRlcnMgPSBkZXN0T2JqQ29uZmlnLmdldEhlYWRlcnMoKVxuXG4gICAgICAgIG1lLmluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgbmV3VXBsb2FkSGVhZGVycykudGhlbihcbiAgICAgICAgICAodXBsb2FkSWQpID0+IHtcbiAgICAgICAgICAgIHBlcmZvcm1VcGxvYWRQYXJ0cyh1cGxvYWRJZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNiKGVyciwgbnVsbClcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjYihlcnJvciwgbnVsbClcbiAgICAgIH0pXG4gIH1cbiAgc2VsZWN0T2JqZWN0Q29udGVudChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzZWxlY3RPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBuYW1lOiAke2J1Y2tldE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cykpIHtcbiAgICAgIGlmICghaXNTdHJpbmcoc2VsZWN0T3B0cy5leHByZXNzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzcWxFeHByZXNzaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5wdXRTZXJpYWxpemF0aW9uIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnB1dFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQnKVxuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uKSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHNlbGVjdE9wdHMub3V0cHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvdXRwdXRTZXJpYWxpemF0aW9uIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvdXRwdXRTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkJylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsaWQgc2VsZWN0IGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BPU1QnXG4gICAgbGV0IHF1ZXJ5ID0gYHNlbGVjdGBcbiAgICBxdWVyeSArPSAnJnNlbGVjdC10eXBlPTInXG5cbiAgICBjb25zdCBjb25maWcgPSBbXG4gICAgICB7XG4gICAgICAgIEV4cHJlc3Npb246IHNlbGVjdE9wdHMuZXhwcmVzc2lvbixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEV4cHJlc3Npb25UeXBlOiBzZWxlY3RPcHRzLmV4cHJlc3Npb25UeXBlIHx8ICdTUUwnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgSW5wdXRTZXJpYWxpemF0aW9uOiBbc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb25dLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgT3V0cHV0U2VyaWFsaXphdGlvbjogW3NlbGVjdE9wdHMub3V0cHV0U2VyaWFsaXphdGlvbl0sXG4gICAgICB9LFxuICAgIF1cblxuICAgIC8vIE9wdGlvbmFsXG4gICAgaWYgKHNlbGVjdE9wdHMucmVxdWVzdFByb2dyZXNzKSB7XG4gICAgICBjb25maWcucHVzaCh7IFJlcXVlc3RQcm9ncmVzczogc2VsZWN0T3B0cy5yZXF1ZXN0UHJvZ3Jlc3MgfSlcbiAgICB9XG4gICAgLy8gT3B0aW9uYWxcbiAgICBpZiAoc2VsZWN0T3B0cy5zY2FuUmFuZ2UpIHtcbiAgICAgIGNvbmZpZy5wdXNoKHsgU2NhblJhbmdlOiBzZWxlY3RPcHRzLnNjYW5SYW5nZSB9KVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdTZWxlY3RPYmplY3RDb250ZW50UmVxdWVzdCcsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgc2VsZWN0UmVzdWx0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5zZWxlY3RPYmplY3RDb250ZW50VHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBzZWxlY3RSZXN1bHQgPSBwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHNlbGVjdFJlc3VsdClcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8vIFByb21pc2lmeSB2YXJpb3VzIHB1YmxpYy1mYWNpbmcgQVBJcyBvbiB0aGUgQ2xpZW50IG1vZHVsZS5cbkNsaWVudC5wcm90b3R5cGUubWFrZUJ1Y2tldCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLm1ha2VCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cylcblxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmdldFBhcnRpYWxPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRQYXJ0aWFsT2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5mR2V0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZkdldE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucHV0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHV0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5mUHV0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZlB1dE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuY29weU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmNvcHlPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdHMgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3RzKVxuXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFVybCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFVybClcbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkR2V0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkR2V0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQdXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFBvc3RQb2xpY3kgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQb3N0UG9saWN5KVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXROb3RpZmljYXRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXROb3RpZmljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldE5vdGlmaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldE5vdGlmaWNhdGlvbilcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRQb2xpY3kgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRQb2xpY3kpXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFBvbGljeSlcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlSW5jb21wbGV0ZVVwbG9hZCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUluY29tcGxldGVVcGxvYWQpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFZlcnNpb25pbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRWZXJzaW9uaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRWZXJzaW9uaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VmVyc2lvbmluZylcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldE9iamVjdFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3RUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0TGlmZWN5Y2xlID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0TGlmZWN5Y2xlKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRMaWZlY3ljbGUgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRMaWZlY3ljbGUpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldExpZmVjeWNsZSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldExpZmVjeWNsZSlcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TG9ja0NvbmZpZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldE9iamVjdExvY2tDb25maWcpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdExvY2tDb25maWcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMb2NrQ29uZmlnKVxuQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3RSZXRlbnRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3RSZXRlbnRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdFJldGVudGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdFJldGVudGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0RW5jcnlwdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldEVuY3J5cHRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldEVuY3J5cHRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRFbmNyeXB0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRFbmNyeXB0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0RW5jcnlwdGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TGVnYWxIb2xkID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TGVnYWxIb2xkKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMZWdhbEhvbGQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMZWdhbEhvbGQpXG5DbGllbnQucHJvdG90eXBlLmNvbXBvc2VPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5jb21wb3NlT2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5zZWxlY3RPYmplY3RDb250ZW50ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2VsZWN0T2JqZWN0Q29udGVudClcblxuLy8gcmVmYWN0b3JlZCBBUEkgdXNlIHByb21pc2UgaW50ZXJuYWxseVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3QgPSBjYWxsYmFja2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdCA9IGNhbGxiYWNraWZ5KENsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0ID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmxpc3RCdWNrZXRzID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5saXN0QnVja2V0cylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0UmVwbGljYXRpb24gPSBjYWxsYmFja2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRSZXBsaWNhdGlvbiA9IGNhbGxiYWNraWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UmVwbGljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFJlcGxpY2F0aW9uID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRSZXBsaWNhdGlvbilcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQWdCQSxJQUFBQSxFQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxJQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFILHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFQLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxJQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFULE9BQUE7QUFFQSxJQUFBVSxNQUFBLEdBQUFYLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxRQUFBLEdBQUFYLE9BQUE7QUF5Q0FZLE1BQUEsQ0FBQUMsSUFBQSxDQUFBRixRQUFBLEVBQUFHLE9BQUEsV0FBQUMsR0FBQTtFQUFBLElBQUFBLEdBQUEsa0JBQUFBLEdBQUE7RUFBQSxJQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFDLFlBQUEsRUFBQUosR0FBQTtFQUFBLElBQUFBLEdBQUEsSUFBQUssT0FBQSxJQUFBQSxPQUFBLENBQUFMLEdBQUEsTUFBQUosUUFBQSxDQUFBSSxHQUFBO0VBQUFLLE9BQUEsQ0FBQUwsR0FBQSxJQUFBSixRQUFBLENBQUFJLEdBQUE7QUFBQTtBQXhDQSxJQUFBTSxZQUFBLEdBQUFyQixPQUFBO0FBQ0EsSUFBQXNCLE9BQUEsR0FBQXRCLE9B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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInBhdGgiLCJTdHJlYW0iLCJfYXN5bmMiLCJfYmxvY2tTdHJlYW0iLCJfbG9kYXNoIiwicXVlcnlzdHJpbmciLCJfd2ViRW5jb2RpbmciLCJfeG1sIiwiX3htbDJqcyIsImVycm9ycyIsIl9leHRlbnNpb25zIiwiX2hlbHBlcnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIl9leHBvcnROYW1lcyIsImV4cG9ydHMiLCJfY2xpZW50IiwiX2NvcHlDb25kaXRpb25zIiwiQ29weUNvbmRpdGlvbnMiLCJfaGVscGVyIiwiX3Bvc3RQb2xpY3kiLCJQb3N0UG9saWN5IiwiX3R5cGUiLCJfbm90aWZpY2F0aW9uIiwiX29iamVjdFVwbG9hZGVyIiwiX3Byb21pc2lmeSIsIl9zaWduaW5nIiwidHJhbnNmb3JtZXJzIiwiX3htbFBhcnNlcnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZXNjIiwic2V0IiwiQ2xpZW50IiwiVHlwZWRDbGllbnQiLCJzZXRBcHBJbmZvIiwiYXBwTmFtZSIsImFwcFZlcnNpb24iLCJpc1N0cmluZyIsIlR5cGVFcnJvciIsInRyaW0iLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInVzZXJBZ2VudCIsImNhbGN1bGF0ZVBhcnRTaXplIiwic2l6ZSIsImlzTnVtYmVyIiwibWF4T2JqZWN0U2l6ZSIsIm92ZXJSaWRlUGFydFNpemUiLCJwYXJ0U2l6ZSIsImxvZ0hUVFAiLCJyZXFPcHRpb25zIiwicmVzcG9uc2UiLCJlcnIiLCJsb2dTdHJlYW0iLCJpc09iamVjdCIsImlzUmVhZGFibGVTdHJlYW0iLCJFcnJvciIsImxvZ0hlYWRlcnMiLCJoZWFkZXJzIiwiXyIsInYiLCJrIiwicmVkYWN0ZXIiLCJSZWdFeHAiLCJyZXBsYWNlIiwid3JpdGUiLCJtZXRob2QiLCJzdGF0dXNDb2RlIiwiZXJySlNPTiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZU9uIiwic3RyZWFtIiwicHJvY2VzcyIsInN0ZG91dCIsInRyYWNlT2ZmIiwibWFrZVJlcXVlc3QiLCJvcHRpb25zIiwicGF5bG9hZCIsInN0YXR1c0NvZGVzIiwicmVnaW9uIiwicmV0dXJuUmVzcG9uc2UiLCJjYiIsImlzQm9vbGVhbiIsImlzRnVuY3Rpb24iLCJsZW5ndGgiLCJzaGEyNTZzdW0iLCJlbmFibGVTSEEyNTYiLCJ0b1NoYTI1NiIsInJlYWRhYmxlU3RyZWFtIiwibWFrZVJlcXVlc3RTdHJlYW0iLCJfbWFrZVJlcXVlc3QiLCJlIiwiZ2V0UmVxdWVzdE9wdGlvbnMiLCJhbm9ueW1vdXMiLCJkYXRlIiwiRGF0ZSIsIm1ha2VEYXRlTG9uZyIsInNlc3Npb25Ub2tlbiIsImNoZWNrQW5kUmVmcmVzaENyZWRzIiwiYXV0aG9yaXphdGlvbiIsInNpZ25WNCIsImFjY2Vzc0tleSIsInNlY3JldEtleSIsInJlcSIsInRyYW5zcG9ydCIsInJlcXVlc3QiLCJpbmNsdWRlcyIsInJlZ2lvbk1hcCIsImJ1Y2tldE5hbWUiLCJlcnJvclRyYW5zZm9ybWVyIiwiZ2V0RXJyb3JUcmFuc2Zvcm1lciIsInBpcGVzZXR1cCIsIm9uIiwicGlwZSIsImdldEJ1Y2tldFJlZ2lvbiIsImlzVmFsaWRCdWNrZXROYW1lIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsImV4dHJhY3RSZWdpb24iLCJ0cmFuc2Zvcm1lciIsImdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyIiwiREVGQVVMVF9SRUdJT04iLCJkYXRhIiwicXVlcnkiLCJwYXRoU3R5bGUiLCJ3aW5kb3ciLCJuYW1lIiwiUmVnaW9uIiwibWFrZUJ1Y2tldCIsIm1ha2VPcHRzIiwiY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiIsInB1c2giLCJfYXR0ciIsInhtbG5zIiwiTG9jYXRpb25Db25zdHJhaW50IiwicGF5bG9hZE9iamVjdCIsIkNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24iLCJYbWwiLCJPYmplY3RMb2NraW5nIiwicHJvY2Vzc1dpdGhSZXRyeSIsImNvZGUiLCJsaXN0QnVja2V0cyIsImdldExpc3RCdWNrZXRUcmFuc2Zvcm1lciIsImJ1Y2tldHMiLCJyZXN1bHQiLCJsaXN0SW5jb21wbGV0ZVVwbG9hZHMiLCJidWNrZXQiLCJwcmVmaXgiLCJyZWN1cnNpdmUiLCJ1bmRlZmluZWQiLCJpc1ZhbGlkUHJlZml4IiwiSW52YWxpZFByZWZpeEVycm9yIiwiZGVsaW1pdGVyIiwia2V5TWFya2VyIiwidXBsb2FkSWRNYXJrZXIiLCJ1cGxvYWRzIiwiZW5kZWQiLCJyZWFkU3RyZWFtIiwiUmVhZGFibGUiLCJvYmplY3RNb2RlIiwiX3JlYWQiLCJzaGlmdCIsImxpc3RJbmNvbXBsZXRlVXBsb2Fkc1F1ZXJ5IiwiZW1pdCIsInByZWZpeGVzIiwiYXN5bmMiLCJlYWNoU2VyaWVzIiwidXBsb2FkIiwibGlzdFBhcnRzIiwidXBsb2FkSWQiLCJwYXJ0cyIsInJlZHVjZSIsImFjYyIsIml0ZW0iLCJpc1RydW5jYXRlZCIsIm5leHRLZXlNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJidWNrZXRFeGlzdHMiLCJyZW1vdmVCdWNrZXQiLCJyZW1vdmVJbmNvbXBsZXRlVXBsb2FkIiwib2JqZWN0TmFtZSIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJyZW1vdmVVcGxvYWRJZCIsImR1cmluZyIsImZpbmRVcGxvYWRJZCIsImZHZXRPYmplY3QiLCJmaWxlUGF0aCIsImdldE9wdHMiLCJwYXJ0RmlsZSIsInBhcnRGaWxlU3RyZWFtIiwib2JqU3RhdCIsInJlbmFtZSIsIndhdGVyZmFsbCIsInN0YXRPYmplY3QiLCJta2RpciIsImRpcm5hbWUiLCJldGFnIiwic3RhdCIsInN0YXRzIiwib2Zmc2V0IiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmbGFncyIsImdldFBhcnRpYWxPYmplY3QiLCJkb3dubG9hZFN0cmVhbSIsImdldE9iamVjdCIsInJhbmdlIiwiZXhwZWN0ZWRTdGF0dXNDb2RlcyIsImZQdXRPYmplY3QiLCJtZXRhRGF0YSIsImNhbGxiYWNrIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJwcmVwZW5kWEFNWk1ldGEiLCJjYlRyaWdnZXJlZCIsIm9yaWdDYiIsImRlc3Ryb3kiLCJhcHBseSIsImFyZ3VtZW50cyIsIm11bHRpcGFydCIsInVwbG9hZGVyIiwiZ2V0VXBsb2FkZXIiLCJoYXNoIiwiZ2V0SGFzaFN1bW1lciIsInN0YXJ0IiwiZW5kIiwiYXV0b0Nsb3NlIiwiY3JlYXRlUmVhZFN0cmVhbSIsIm1kNXN1bSIsIm9iakluZm8iLCJldGFncyIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwicGFydCIsInBhcnRzRG9uZSIsInBhcnROdW1iZXIiLCJ1cGxvYWRlZFNpemUiLCJ3aGlsc3QiLCJtZDVzdW1IZXgiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsInJlc3QiLCJwdXRPYmplY3QiLCJjaHVua2VyIiwiQmxvY2tTdHJlYW0yIiwiemVyb1BhZGRpbmciLCJPYmplY3RVcGxvYWRlciIsImNvcHlPYmplY3RWMSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1Iiwic3JjT2JqZWN0IiwiY29uZGl0aW9ucyIsInVyaVJlc291cmNlRXNjYXBlIiwibW9kaWZpZWQiLCJ1bm1vZGlmaWVkIiwibWF0Y2hFVGFnIiwibWF0Y2hFdGFnRXhjZXB0IiwibWF0Y2hFVGFnRXhjZXB0IiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwiY29weU9iamVjdFYyIiwic291cmNlQ29uZmlnIiwiZGVzdENvbmZpZyIsIkNvcHlTb3VyY2VPcHRpb25zIiwiQ29weURlc3RpbmF0aW9uT3B0aW9ucyIsInZhbGlkYXRlIiwiYXNzaWduIiwiZ2V0SGVhZGVycyIsIkJ1Y2tldCIsInJlc0hlYWRlcnMiLCJjb3B5T2JqUmVzcG9uc2UiLCJLZXkiLCJMYXN0TW9kaWZpZWQiLCJNZXRhRGF0YSIsImV4dHJhY3RNZXRhZGF0YSIsIlZlcnNpb25JZCIsImdldFZlcnNpb25JZCIsIlNvdXJjZVZlcnNpb25JZCIsImdldFNvdXJjZVZlcnNpb25JZCIsIkV0YWciLCJzYW5pdGl6ZUVUYWciLCJTaXplIiwiY29weU9iamVjdCIsImFsbEFyZ3MiLCJsaXN0T2JqZWN0c1F1ZXJ5IiwibWFya2VyIiwibGlzdFF1ZXJ5T3B0cyIsIkRlbGltaXRlciIsIk1heEtleXMiLCJJbmNsdWRlVmVyc2lvbiIsInF1ZXJpZXMiLCJ1cmlFc2NhcGUiLCJzb3J0Iiwiam9pbiIsImdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIiLCJsaXN0T2JqZWN0cyIsImxpc3RPcHRzIiwib2JqZWN0cyIsIm5leHRNYXJrZXIiLCJ2ZXJzaW9uSWRNYXJrZXIiLCJsaXN0T2JqZWN0c1YyUXVlcnkiLCJjb250aW51YXRpb25Ub2tlbiIsIm1heEtleXMiLCJzdGFydEFmdGVyIiwiZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyIiwibGlzdE9iamVjdHNWMiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInN0YXRPcHRzIiwibGFzdE1vZGlmaWVkIiwidmVyc2lvbklkIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlT3B0cyIsInF1ZXJ5UGFyYW1zIiwiZ292ZXJuYW5jZUJ5cGFzcyIsImZvcmNlRGVsZXRlIiwicmVxdWVzdE9wdGlvbnMiLCJyZW1vdmVPYmplY3RzIiwib2JqZWN0c0xpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJtYXhFbnRyaWVzIiwiZW50cnkiLCJsaXN0IiwibGlzdE9mTGlzdCIsImVuY29kZXIiLCJUZXh0RW5jb2RlciIsImJhdGNoUmVzdWx0cyIsImJhdGNoQ2IiLCJ2YWx1ZSIsImRlbGV0ZU9iamVjdHMiLCJEZWxldGUiLCJRdWlldCIsImJ1aWxkZXIiLCJ4bWwyanMiLCJCdWlsZGVyIiwiaGVhZGxlc3MiLCJidWlsZE9iamVjdCIsImVuY29kZSIsInRvTWQ1IiwicmVtb3ZlT2JqZWN0c1Jlc3VsdCIsInJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lciIsImZsYXR0ZW4iLCJnZXRCdWNrZXRQb2xpY3kiLCJwb2xpY3kiLCJnZXRDb25jYXRlciIsInNldEJ1Y2tldFBvbGljeSIsIkludmFsaWRCdWNrZXRQb2xpY3lFcnJvciIsInByZXNpZ25lZFVybCIsImV4cGlyZXMiLCJyZXFQYXJhbXMiLCJyZXF1ZXN0RGF0ZSIsIkFub255bW91c1JlcXVlc3RFcnJvciIsImlzVmFsaWREYXRlIiwidXJsIiwicHJlc2lnblNpZ25hdHVyZVY0IiwicGUiLCJwcmVzaWduZWRHZXRPYmplY3QiLCJyZXNwSGVhZGVycyIsInZhbGlkUmVzcEhlYWRlcnMiLCJoZWFkZXIiLCJwcmVzaWduZWRQdXRPYmplY3QiLCJuZXdQb3N0UG9saWN5IiwicHJlc2lnbmVkUG9zdFBvbGljeSIsInBvc3RQb2xpY3kiLCJmb3JtRGF0YSIsImRhdGVTdHIiLCJleHBpcmF0aW9uIiwic2V0U2Vjb25kcyIsInNldEV4cGlyZXMiLCJnZXRTY29wZSIsInBvbGljeUJhc2U2NCIsInNpZ25hdHVyZSIsInBvc3RQcmVzaWduU2lnbmF0dXJlVjQiLCJvcHRzIiwicG9ydFN0ciIsInBvcnQiLCJ1cmxTdHIiLCJwcm90b2NvbCIsImhvc3QiLCJwb3N0VVJMIiwiZ2V0SW5pdGlhdGVNdWx0aXBhcnRUcmFuc2Zvcm1lciIsImVsZW1lbnQiLCJQYXJ0IiwiUGFydE51bWJlciIsIkVUYWciLCJDb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImdldENvbXBsZXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJlcnJDb2RlIiwiUzNFcnJvciIsImVyck1lc3NhZ2UiLCJjb21wbGV0ZU11bHRpcGFydFJlc3VsdCIsImxpc3ROZXh0IiwibGlzdFBhcnRzUXVlcnkiLCJjb25jYXQiLCJnZXRMaXN0UGFydHNUcmFuc2Zvcm1lciIsIm1heFVwbG9hZHMiLCJ1bnNoaWZ0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwibGF0ZXN0VXBsb2FkIiwiaW5pdGlhdGVkIiwiZ2V0VGltZSIsInNpbXBsZVVwbG9hZGVyIiwiYXJncyIsIm11bHRpcGFydFVwbG9hZGVyIiwic2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiY29uZmlnIiwicm9vdE5hbWUiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwicmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uIiwiTm90aWZpY2F0aW9uQ29uZmlnIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJidWNrZXROb3RpZmljYXRpb24iLCJsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24iLCJzdWZmaXgiLCJldmVudHMiLCJsaXN0ZW5lciIsIk5vdGlmaWNhdGlvblBvbGxlciIsImdldEJ1Y2tldFZlcnNpb25pbmciLCJ2ZXJzaW9uQ29uZmlnIiwiYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyIiwic2V0QnVja2V0VmVyc2lvbmluZyIsInNldFRhZ2dpbmciLCJ0YWdnaW5nUGFyYW1zIiwidGFncyIsInB1dE9wdHMiLCJ0YWdzTGlzdCIsImVudHJpZXMiLCJWYWx1ZSIsInRhZ2dpbmdDb25maWciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwic2V0QnVja2V0VGFnZ2luZyIsInNldE9iamVjdFRhZ2dpbmciLCJyZW1vdmVUYWdnaW5nIiwicmVtb3ZlQnVja2V0VGFnZ2luZyIsInJlbW92ZU9iamVjdFRhZ2dpbmciLCJnZXRCdWNrZXRUYWdnaW5nIiwiZ2V0VGFnc1RyYW5zZm9ybWVyIiwiZ2V0T2JqZWN0VGFnZ2luZyIsImFwcGx5QnVja2V0TGlmZWN5Y2xlIiwicG9saWN5Q29uZmlnIiwicmVtb3ZlQnVja2V0TGlmZWN5Y2xlIiwic2V0QnVja2V0TGlmZWN5Y2xlIiwibGlmZUN5Y2xlQ29uZmlnIiwiaXNFbXB0eSIsImdldEJ1Y2tldExpZmVjeWNsZSIsImxpZmVjeWNsZVRyYW5zZm9ybWVyIiwibGlmZWN5Y2xlQ29uZmlnIiwic2V0T2JqZWN0TG9ja0NvbmZpZyIsImxvY2tDb25maWdPcHRzIiwicmV0ZW50aW9uTW9kZXMiLCJSRVRFTlRJT05fTU9ERVMiLCJDT01QTElBTkNFIiwiR09WRVJOQU5DRSIsInZhbGlkVW5pdHMiLCJSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMiLCJEQVlTIiwiWUVBUlMiLCJtb2RlIiwidW5pdCIsInZhbGlkaXR5IiwiT2JqZWN0TG9ja0VuYWJsZWQiLCJjb25maWdLZXlzIiwiZGlmZmVyZW5jZSIsIlJ1bGUiLCJEZWZhdWx0UmV0ZW50aW9uIiwiTW9kZSIsIkRheXMiLCJZZWFycyIsImdldE9iamVjdExvY2tDb25maWciLCJvYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0TG9ja1RyYW5zZm9ybWVyIiwicHV0T2JqZWN0UmV0ZW50aW9uIiwicmV0ZW50aW9uT3B0cyIsInJldGFpblVudGlsRGF0ZSIsInBhcmFtcyIsIlJldGFpblVudGlsRGF0ZSIsImdldE9iamVjdFJldGVudGlvbiIsInJldGVudGlvbkNvbmZpZyIsIm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyIiwic2V0QnVja2V0RW5jcnlwdGlvbiIsImVuY3J5cHRpb25Db25maWciLCJlbmNyeXB0aW9uT2JqIiwiQXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdCIsIlNTRUFsZ29yaXRobSIsImdldEJ1Y2tldEVuY3J5cHRpb24iLCJidWNrZXRFbmNDb25maWciLCJidWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIiLCJyZW1vdmVCdWNrZXRFbmNyeXB0aW9uIiwic2V0QnVja2V0UmVwbGljYXRpb24iLCJyZXBsaWNhdGlvbkNvbmZpZyIsInJvbGUiLCJydWxlcyIsInJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnIiwiUmVwbGljYXRpb25Db25maWd1cmF0aW9uIiwiUm9sZSIsImdldEJ1Y2tldFJlcGxpY2F0aW9uIiwicmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lciIsInJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uIiwiZ2V0T2JqZWN0TGVnYWxIb2xkIiwibGVnYWxIb2xkQ29uZmlnIiwib2JqZWN0TGVnYWxIb2xkVHJhbnNmb3JtZXIiLCJzZXRPYmplY3RMZWdhbEhvbGQiLCJzZXRPcHRzIiwiZGVmYXVsdE9wdHMiLCJzdGF0dXMiLCJMRUdBTF9IT0xEX1NUQVRVUyIsIkVOQUJMRUQiLCJESVNBQkxFRCIsIlN0YXR1cyIsImFib3J0TXVsdGlwYXJ0VXBsb2FkIiwidXBsb2FkUGFydENvcHkiLCJwYXJ0Q29uZmlnIiwidXBsb2FkSUQiLCJwYXJ0Q29weVJlc3VsdCIsInVwbG9hZFBhcnRUcmFuc2Zvcm1lciIsInVwbG9hZFBhcnRDb3B5UmVzIiwiY29tcG9zZU9iamVjdCIsImRlc3RPYmpDb25maWciLCJzb3VyY2VPYmpMaXN0IiwibWUiLCJzb3VyY2VGaWxlc0xlbmd0aCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJNQVhfUEFSVFNfQ09VTlQiLCJpIiwiZ2V0U3RhdE9wdGlvbnMiLCJzcmNDb25maWciLCJWZXJzaW9uSUQiLCJzcmNPYmplY3RTaXplcyIsInRvdGFsU2l6ZSIsInRvdGFsUGFydHMiLCJzb3VyY2VPYmpTdGF0cyIsIm1hcCIsInNyY0l0ZW0iLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsInNyY09iamVjdEluZm9zIiwidmFsaWRhdGVkU3RhdHMiLCJyZXNJdGVtU3RhdCIsImluZGV4Iiwic3JjQ29weVNpemUiLCJNYXRjaFJhbmdlIiwic3JjU3RhcnQiLCJTdGFydCIsInNyY0VuZCIsIkVuZCIsIkFCU19NSU5fUEFSVF9TSVpFIiwiTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUiLCJwYXJ0c1JlcXVpcmVkIiwiTUFYX1BBUlRfU0laRSIsIk1hdGNoRVRhZyIsInNwbGl0UGFydFNpemVMaXN0IiwiaWR4IiwiY2FsU2l6ZSIsImNhbGN1bGF0ZUV2ZW5TcGxpdHMiLCJnZXRVcGxvYWRQYXJ0Q29uZmlnTGlzdCIsInVwbG9hZFBhcnRDb25maWdMaXN0Iiwic3BsaXRTaXplIiwic3BsaXRJbmRleCIsInN0YXJ0SW5kZXgiLCJzdGFydElkeCIsImVuZEluZGV4IiwiZW5kSWR4Iiwib2JqQ29uZmlnIiwicGFydEluZGV4IiwidG90YWxVcGxvYWRzIiwic3BsaXRTdGFydCIsInVwbGRDdHJJZHgiLCJzcGxpdEVuZCIsInNvdXJjZU9iaiIsInVwbG9hZFBhcnRDb25maWciLCJwZXJmb3JtVXBsb2FkUGFydHMiLCJ1cGxvYWRMaXN0IiwiYmluZCIsInJlcyIsInBhcnRDb3B5IiwibmV3VXBsb2FkSGVhZGVycyIsImNhdGNoIiwiZXJyb3IiLCJzZWxlY3RPYmplY3RDb250ZW50Iiwic2VsZWN0T3B0cyIsImV4cHJlc3Npb24iLCJpbnB1dFNlcmlhbGl6YXRpb24iLCJvdXRwdXRTZXJpYWxpemF0aW9uIiwiRXhwcmVzc2lvbiIsIkV4cHJlc3Npb25UeXBlIiwiZXhwcmVzc2lvblR5cGUiLCJJbnB1dFNlcmlhbGl6YXRpb24iLCJPdXRwdXRTZXJpYWxpemF0aW9uIiwicmVxdWVzdFByb2dyZXNzIiwiUmVxdWVzdFByb2dyZXNzIiwic2NhblJhbmdlIiwiU2NhblJhbmdlIiwic2VsZWN0UmVzdWx0Iiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UiLCJleHRlbnNpb25zIiwiY2xpZW50RXh0ZW5zaW9ucyIsInByb21pc2lmeSJdLCJzb3VyY2VzIjpbIm1pbmlvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IGFzeW5jIGZyb20gJ2FzeW5jJ1xuaW1wb3J0IEJsb2NrU3RyZWFtMiBmcm9tICdibG9jay1zdHJlYW0yJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHsgVGV4dEVuY29kZXIgfSBmcm9tICd3ZWItZW5jb2RpbmcnXG5pbXBvcnQgWG1sIGZyb20gJ3htbCdcbmltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi9leHRlbnNpb25zLmpzJ1xuaW1wb3J0IHsgQ29weURlc3RpbmF0aW9uT3B0aW9ucywgQ29weVNvdXJjZU9wdGlvbnMsIERFRkFVTFRfUkVHSU9OIH0gZnJvbSAnLi9oZWxwZXJzLnRzJ1xuaW1wb3J0IHsgVHlwZWRDbGllbnQgfSBmcm9tICcuL2ludGVybmFsL2NsaWVudC50cydcbmltcG9ydCB7IENvcHlDb25kaXRpb25zIH0gZnJvbSAnLi9pbnRlcm5hbC9jb3B5LWNvbmRpdGlvbnMudHMnXG5pbXBvcnQge1xuICBjYWxjdWxhdGVFdmVuU3BsaXRzLFxuICBleHRyYWN0TWV0YWRhdGEsXG4gIGdldFNjb3BlLFxuICBnZXRTb3VyY2VWZXJzaW9uSWQsXG4gIGdldFZlcnNpb25JZCxcbiAgaW5zZXJ0Q29udGVudFR5cGUsXG4gIGlzQm9vbGVhbixcbiAgaXNGdW5jdGlvbixcbiAgaXNOdW1iZXIsXG4gIGlzT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1N0cmluZyxcbiAgaXNWYWxpZEJ1Y2tldE5hbWUsXG4gIGlzVmFsaWREYXRlLFxuICBpc1ZhbGlkT2JqZWN0TmFtZSxcbiAgaXNWYWxpZFByZWZpeCxcbiAgbWFrZURhdGVMb25nLFxuICBQQVJUX0NPTlNUUkFJTlRTLFxuICBwYXJ0c1JlcXVpcmVkLFxuICBwaXBlc2V0dXAsXG4gIHByZXBlbmRYQU1aTWV0YSxcbiAgcmVhZGFibGVTdHJlYW0sXG4gIHNhbml0aXplRVRhZyxcbiAgdG9NZDUsXG4gIHRvU2hhMjU2LFxuICB1cmlFc2NhcGUsXG4gIHVyaVJlc291cmNlRXNjYXBlLFxufSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcbmltcG9ydCB7IFBvc3RQb2xpY3kgfSBmcm9tICcuL2ludGVybmFsL3Bvc3QtcG9saWN5LnRzJ1xuaW1wb3J0IHsgTEVHQUxfSE9MRF9TVEFUVVMsIFJFVEVOVElPTl9NT0RFUywgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlLnRzJ1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uQ29uZmlnLCBOb3RpZmljYXRpb25Qb2xsZXIgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5qcydcbmltcG9ydCB7IE9iamVjdFVwbG9hZGVyIH0gZnJvbSAnLi9vYmplY3QtdXBsb2FkZXIuanMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICcuL3Byb21pc2lmeS5qcydcbmltcG9ydCB7IHBvc3RQcmVzaWduU2lnbmF0dXJlVjQsIHByZXNpZ25TaWduYXR1cmVWNCwgc2lnblY0IH0gZnJvbSAnLi9zaWduaW5nLnRzJ1xuaW1wb3J0ICogYXMgdHJhbnNmb3JtZXJzIGZyb20gJy4vdHJhbnNmb3JtZXJzLmpzJ1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UgfSBmcm9tICcuL3htbC1wYXJzZXJzLmpzJ1xuXG5leHBvcnQgKiBmcm9tICcuL2hlbHBlcnMudHMnXG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbi5qcydcbmV4cG9ydCB7IENvcHlDb25kaXRpb25zLCBQb3N0UG9saWN5IH1cblxuZXhwb3J0IGNsYXNzIENsaWVudCBleHRlbmRzIFR5cGVkQ2xpZW50IHtcbiAgLy8gU2V0IGFwcGxpY2F0aW9uIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICAvL1xuICAvLyBHZW5lcmF0ZXMgVXNlci1BZ2VudCBpbiB0aGUgZm9sbG93aW5nIHN0eWxlLlxuICAvL1xuICAvLyAgICAgICBNaW5JTyAoT1M7IEFSQ0gpIExJQi9WRVIgQVBQL1ZFUlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGFwcE5hbWVgIF9zdHJpbmdfIC0gQXBwbGljYXRpb24gbmFtZS5cbiAgLy8gKiBgYXBwVmVyc2lvbmAgX3N0cmluZ18gLSBBcHBsaWNhdGlvbiB2ZXJzaW9uLlxuICBzZXRBcHBJbmZvKGFwcE5hbWUsIGFwcFZlcnNpb24pIHtcbiAgICBpZiAoIWlzU3RyaW5nKGFwcE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGFwcE5hbWU6ICR7YXBwTmFtZX1gKVxuICAgIH1cbiAgICBpZiAoYXBwTmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnB1dCBhcHBOYW1lIGNhbm5vdCBiZSBlbXB0eS4nKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGFwcFZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGFwcFZlcnNpb246ICR7YXBwVmVyc2lvbn1gKVxuICAgIH1cbiAgICBpZiAoYXBwVmVyc2lvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnB1dCBhcHBWZXJzaW9uIGNhbm5vdCBiZSBlbXB0eS4nKVxuICAgIH1cbiAgICB0aGlzLnVzZXJBZ2VudCA9IGAke3RoaXMudXNlckFnZW50fSAke2FwcE5hbWV9LyR7YXBwVmVyc2lvbn1gXG4gIH1cblxuICAvLyBDYWxjdWxhdGUgcGFydCBzaXplIGdpdmVuIHRoZSBvYmplY3Qgc2l6ZS4gUGFydCBzaXplIHdpbGwgYmUgYXRsZWFzdCB0aGlzLnBhcnRTaXplXG4gIGNhbGN1bGF0ZVBhcnRTaXplKHNpemUpIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA+IHRoaXMubWF4T2JqZWN0U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgc2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAke3RoaXMubWF4T2JqZWN0U2l6ZX1gKVxuICAgIH1cbiAgICBpZiAodGhpcy5vdmVyUmlkZVBhcnRTaXplKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJ0U2l6ZVxuICAgIH1cbiAgICB2YXIgcGFydFNpemUgPSB0aGlzLnBhcnRTaXplXG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gd2hpbGUodHJ1ZSkgey4uLn0gdGhyb3dzIGxpbnRpbmcgZXJyb3IuXG4gICAgICAvLyBJZiBwYXJ0U2l6ZSBpcyBiaWcgZW5vdWdoIHRvIGFjY29tb2RhdGUgdGhlIG9iamVjdCBzaXplLCB0aGVuIHVzZSBpdC5cbiAgICAgIGlmIChwYXJ0U2l6ZSAqIDEwMDAwID4gc2l6ZSkge1xuICAgICAgICByZXR1cm4gcGFydFNpemVcbiAgICAgIH1cbiAgICAgIC8vIFRyeSBwYXJ0IHNpemVzIGFzIDY0TUIsIDgwTUIsIDk2TUIgZXRjLlxuICAgICAgcGFydFNpemUgKz0gMTYgKiAxMDI0ICogMTAyNFxuICAgIH1cbiAgfVxuXG4gIC8vIGxvZyB0aGUgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yXG4gIGxvZ0hUVFAocmVxT3B0aW9ucywgcmVzcG9uc2UsIGVycikge1xuICAgIC8vIGlmIG5vIGxvZ3N0cmVhbWVyIGF2YWlsYWJsZSByZXR1cm4uXG4gICAgaWYgKCF0aGlzLmxvZ1N0cmVhbSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVxT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcU9wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChyZXNwb25zZSAmJiAhaXNSZWFkYWJsZVN0cmVhbShyZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jlc3BvbnNlIHNob3VsZCBiZSBvZiB0eXBlIFwiU3RyZWFtXCInKVxuICAgIH1cbiAgICBpZiAoZXJyICYmICEoZXJyIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlcnIgc2hvdWxkIGJlIG9mIHR5cGUgXCJFcnJvclwiJylcbiAgICB9XG4gICAgdmFyIGxvZ0hlYWRlcnMgPSAoaGVhZGVycykgPT4ge1xuICAgICAgXy5mb3JFYWNoKGhlYWRlcnMsICh2LCBrKSA9PiB7XG4gICAgICAgIGlmIChrID09ICdhdXRob3JpemF0aW9uJykge1xuICAgICAgICAgIHZhciByZWRhY3RlciA9IG5ldyBSZWdFeHAoJ1NpZ25hdHVyZT0oWzAtOWEtZl0rKScpXG4gICAgICAgICAgdiA9IHYucmVwbGFjZShyZWRhY3RlciwgJ1NpZ25hdHVyZT0qKlJFREFDVEVEKionKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nU3RyZWFtLndyaXRlKGAke2t9OiAke3Z9XFxuYClcbiAgICAgIH0pXG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZSgnXFxuJylcbiAgICB9XG4gICAgdGhpcy5sb2dTdHJlYW0ud3JpdGUoYFJFUVVFU1Q6ICR7cmVxT3B0aW9ucy5tZXRob2R9ICR7cmVxT3B0aW9ucy5wYXRofVxcbmApXG4gICAgbG9nSGVhZGVycyhyZXFPcHRpb25zLmhlYWRlcnMpXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZShgUkVTUE9OU0U6ICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1cXG5gKVxuICAgICAgbG9nSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKVxuICAgIH1cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZSgnRVJST1IgQk9EWTpcXG4nKVxuICAgICAgdmFyIGVyckpTT04gPSBKU09OLnN0cmluZ2lmeShlcnIsIG51bGwsICdcXHQnKVxuICAgICAgdGhpcy5sb2dTdHJlYW0ud3JpdGUoYCR7ZXJySlNPTn1cXG5gKVxuICAgIH1cbiAgfVxuXG4gIC8vIEVuYWJsZSB0cmFjaW5nXG4gIHRyYWNlT24oc3RyZWFtKSB7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHN0cmVhbSA9IHByb2Nlc3Muc3Rkb3V0XG4gICAgfVxuICAgIHRoaXMubG9nU3RyZWFtID0gc3RyZWFtXG4gIH1cblxuICAvLyBEaXNhYmxlIHRyYWNpbmdcbiAgdHJhY2VPZmYoKSB7XG4gICAgdGhpcy5sb2dTdHJlYW0gPSBudWxsXG4gIH1cblxuICAvLyBtYWtlUmVxdWVzdCBpcyB0aGUgcHJpbWl0aXZlIHVzZWQgYnkgdGhlIGFwaXMgZm9yIG1ha2luZyBTMyByZXF1ZXN0cy5cbiAgLy8gcGF5bG9hZCBjYW4gYmUgZW1wdHkgc3RyaW5nIGluIGNhc2Ugb2Ygbm8gcGF5bG9hZC5cbiAgLy8gc3RhdHVzQ29kZSBpcyB0aGUgZXhwZWN0ZWQgc3RhdHVzQ29kZS4gSWYgcmVzcG9uc2Uuc3RhdHVzQ29kZSBkb2VzIG5vdCBtYXRjaFxuICAvLyB3ZSBwYXJzZSB0aGUgWE1MIGVycm9yIGFuZCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLlxuICAvLyBBIHZhbGlkIHJlZ2lvbiBpcyBwYXNzZWQgYnkgdGhlIGNhbGxzIC0gbGlzdEJ1Y2tldHMsIG1ha2VCdWNrZXQgYW5kXG4gIC8vIGdldEJ1Y2tldFJlZ2lvbi5cbiAgbWFrZVJlcXVlc3Qob3B0aW9ucywgcGF5bG9hZCwgc3RhdHVzQ29kZXMsIHJlZ2lvbiwgcmV0dXJuUmVzcG9uc2UsIGNiKSB7XG4gICAgaWYgKCFpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwYXlsb2FkKSAmJiAhaXNPYmplY3QocGF5bG9hZCkpIHtcbiAgICAgIC8vIEJ1ZmZlciBpcyBvZiB0eXBlICdvYmplY3QnXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXlsb2FkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCIgb3IgXCJCdWZmZXJcIicpXG4gICAgfVxuICAgIHN0YXR1c0NvZGVzLmZvckVhY2goKHN0YXR1c0NvZGUpID0+IHtcbiAgICAgIGlmICghaXNOdW1iZXIoc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhdHVzQ29kZSBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICghaXNTdHJpbmcocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVnaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZXR1cm5SZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JldHVyblJlc3BvbnNlIHNob3VsZCBiZSBvZiB0eXBlIFwiYm9vbGVhblwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHt9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ1BPU1QnIHx8IG9wdGlvbnMubWV0aG9kID09PSAnUFVUJyB8fCBvcHRpb25zLm1ldGhvZCA9PT0gJ0RFTEVURScpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IHBheWxvYWQubGVuZ3RoXG4gICAgfVxuICAgIHZhciBzaGEyNTZzdW0gPSAnJ1xuICAgIGlmICh0aGlzLmVuYWJsZVNIQTI1Nikge1xuICAgICAgc2hhMjU2c3VtID0gdG9TaGEyNTYocGF5bG9hZClcbiAgICB9XG4gICAgdmFyIHN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheWxvYWQpXG4gICAgdGhpcy5tYWtlUmVxdWVzdFN0cmVhbShvcHRpb25zLCBzdHJlYW0sIHNoYTI1NnN1bSwgc3RhdHVzQ29kZXMsIHJlZ2lvbiwgcmV0dXJuUmVzcG9uc2UsIGNiKVxuICB9XG5cbiAgLy8gbWFrZVJlcXVlc3RTdHJlYW0gd2lsbCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFrZVJlcXVlc3QgaW4gY2FzZSB0aGUgcGF5bG9hZFxuICAvLyBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0uIGZvciBleC4gcHV0T2JqZWN0XG4gIG1ha2VSZXF1ZXN0U3RyZWFtKG9wdGlvbnMsIHN0cmVhbSwgc2hhMjU2c3VtLCBzdGF0dXNDb2RlcywgcmVnaW9uLCByZXR1cm5SZXNwb25zZSwgY2IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignc3RyZWFtIHNob3VsZCBiZSBhIHJlYWRhYmxlIFN0cmVhbScpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc2hhMjU2c3VtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBzdGF0dXNDb2Rlcy5mb3JFYWNoKChzdGF0dXNDb2RlKSA9PiB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHN0YXR1c0NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXR1c0NvZGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoIWlzU3RyaW5nKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lvbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4ocmV0dXJuUmVzcG9uc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXR1cm5SZXNwb25zZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgLy8gc2hhMjU2c3VtIHdpbGwgYmUgZW1wdHkgZm9yIGFub255bW91cyBvciBodHRwcyByZXF1ZXN0c1xuICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYgJiYgc2hhMjU2c3VtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgc2hhMjU2c3VtIGV4cGVjdGVkIHRvIGJlIGVtcHR5IGZvciBhbm9ueW1vdXMgb3IgaHR0cHMgcmVxdWVzdHNgKVxuICAgIH1cbiAgICAvLyBzaGEyNTZzdW0gc2hvdWxkIGJlIHZhbGlkIGZvciBub24tYW5vbnltb3VzIGh0dHAgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU0hBMjU2ICYmIHNoYTI1NnN1bS5sZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHNoYTI1NnN1bSA6ICR7c2hhMjU2c3VtfWApXG4gICAgfVxuXG4gICAgdmFyIF9tYWtlUmVxdWVzdCA9IChlLCByZWdpb24pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgb3B0aW9ucy5yZWdpb24gPSByZWdpb25cbiAgICAgIHZhciByZXFPcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zKVxuICAgICAgaWYgKCF0aGlzLmFub255bW91cykge1xuICAgICAgICAvLyBGb3Igbm9uLWFub255bW91cyBodHRwcyByZXF1ZXN0cyBzaGEyNTZzdW0gaXMgJ1VOU0lHTkVELVBBWUxPQUQnIGZvciBzaWduYXR1cmUgY2FsY3VsYXRpb24uXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYpIHtcbiAgICAgICAgICBzaGEyNTZzdW0gPSAnVU5TSUdORUQtUEFZTE9BRCdcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKVxuXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sneC1hbXotZGF0ZSddID0gbWFrZURhdGVMb25nKGRhdGUpXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sneC1hbXotY29udGVudC1zaGEyNTYnXSA9IHNoYTI1NnN1bVxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3gtYW16LXNlY3VyaXR5LXRva2VuJ10gPSB0aGlzLnNlc3Npb25Ub2tlblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG4gICAgICAgIHZhciBhdXRob3JpemF0aW9uID0gc2lnblY0KHJlcU9wdGlvbnMsIHRoaXMuYWNjZXNzS2V5LCB0aGlzLnNlY3JldEtleSwgcmVnaW9uLCBkYXRlLCBzaGEyNTZzdW0pXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID0gYXV0aG9yaXphdGlvblxuICAgICAgfVxuICAgICAgdmFyIHJlcSA9IHRoaXMudHJhbnNwb3J0LnJlcXVlc3QocmVxT3B0aW9ucywgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghc3RhdHVzQ29kZXMuaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAvLyBGb3IgYW4gaW5jb3JyZWN0IHJlZ2lvbiwgUzMgc2VydmVyIGFsd2F5cyBzZW5kcyBiYWNrIDQwMC5cbiAgICAgICAgICAvLyBCdXQgd2Ugd2lsbCBkbyBjYWNoZSBpbnZhbGlkYXRpb24gZm9yIGFsbCBlcnJvcnMgc28gdGhhdCxcbiAgICAgICAgICAvLyBpbiBmdXR1cmUsIGlmIEFXUyBTMyBkZWNpZGVzIHRvIHNlbmQgYSBkaWZmZXJlbnQgc3RhdHVzIGNvZGUgb3JcbiAgICAgICAgICAvLyBYTUwgZXJyb3IgY29kZSB3ZSB3aWxsIHN0aWxsIHdvcmsgZmluZS5cbiAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpb25NYXBbb3B0aW9ucy5idWNrZXROYW1lXVxuICAgICAgICAgIHZhciBlcnJvclRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEVycm9yVHJhbnNmb3JtZXIocmVzcG9uc2UpXG4gICAgICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCBlcnJvclRyYW5zZm9ybWVyKS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dIVFRQKHJlcU9wdGlvbnMsIHJlc3BvbnNlLCBlKVxuICAgICAgICAgICAgY2IoZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nSFRUUChyZXFPcHRpb25zLCByZXNwb25zZSlcbiAgICAgICAgaWYgKHJldHVyblJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRyYWluIHRoZSBzb2NrZXQgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZC4gTm90ZSB0aGF0IHRoaXNcbiAgICAgICAgLy8gaXMgbm90IGV4cGVuc2l2ZSBhcyB0aGUgc29ja2V0IHdpbGwgbm90IGhhdmUgYW55IGRhdGEuXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG4gICAgICAgIGNiKG51bGwpXG4gICAgICB9KVxuICAgICAgbGV0IHBpcGUgPSBwaXBlc2V0dXAoc3RyZWFtLCByZXEpXG4gICAgICBwaXBlLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nSFRUUChyZXFPcHRpb25zLCBudWxsLCBlKVxuICAgICAgICBjYihlKVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHJlZ2lvbikge1xuICAgICAgcmV0dXJuIF9tYWtlUmVxdWVzdChudWxsLCByZWdpb24pXG4gICAgfVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKG9wdGlvbnMuYnVja2V0TmFtZSwgX21ha2VSZXF1ZXN0KVxuICB9XG5cbiAgLy8gZ2V0cyB0aGUgcmVnaW9uIG9mIHRoZSBidWNrZXRcbiAgZ2V0QnVja2V0UmVnaW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBuYW1lIDogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgLy8gUmVnaW9uIGlzIHNldCB3aXRoIGNvbnN0cnVjdG9yLCByZXR1cm4gdGhlIHJlZ2lvbiByaWdodCBoZXJlLlxuICAgIGlmICh0aGlzLnJlZ2lvbikge1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHRoaXMucmVnaW9uKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSkge1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdKVxuICAgIH1cbiAgICB2YXIgZXh0cmFjdFJlZ2lvbiA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyKClcbiAgICAgIHZhciByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICByZWdpb24gPSBkYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSA9IHJlZ2lvblxuICAgICAgICAgIGNiKG51bGwsIHJlZ2lvbilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgcXVlcnkgPSAnbG9jYXRpb24nXG5cbiAgICAvLyBgZ2V0QnVja2V0TG9jYXRpb25gIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gZm9sbG93aW5nIHdheXMgZm9yXG4gICAgLy8gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbiAgICAvL1xuICAgIC8vIC0gRm9yIG5vZGVqcyBlbnYgd2UgZGVmYXVsdCB0byBwYXRoIHN0eWxlIHJlcXVlc3RzLlxuICAgIC8vIC0gRm9yIGJyb3dzZXIgZW52IHBhdGggc3R5bGUgcmVxdWVzdHMgb24gYnVja2V0cyB5aWVsZHMgQ09SU1xuICAgIC8vICAgZXJyb3IuIFRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtIHdlIG1ha2UgYSB2aXJ0dWFsIGhvc3RcbiAgICAvLyAgIHN0eWxlIHJlcXVlc3Qgc2lnbmVkIHdpdGggJ3VzLWVhc3QtMScuIFRoaXMgcmVxdWVzdCBmYWlsc1xuICAgIC8vICAgd2l0aCBhbiBlcnJvciAnQXV0aG9yaXphdGlvbkhlYWRlck1hbGZvcm1lZCcsIGFkZGl0aW9uYWxseVxuICAgIC8vICAgdGhlIGVycm9yIFhNTCBhbHNvIHByb3ZpZGVzIFJlZ2lvbiBvZiB0aGUgYnVja2V0LiBUbyB2YWxpZGF0ZVxuICAgIC8vICAgdGhpcyByZWdpb24gaXMgcHJvcGVyIHdlIHJldHJ5IHRoZSBzYW1lIHJlcXVlc3Qgd2l0aCB0aGUgbmV3bHlcbiAgICAvLyAgIG9idGFpbmVkIHJlZ2lvbi5cbiAgICB2YXIgcGF0aFN0eWxlID0gdGhpcy5wYXRoU3R5bGUgJiYgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCdcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBwYXRoU3R5bGUgfSwgJycsIFsyMDBdLCBERUZBVUxUX1JFR0lPTiwgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBpZiAoZS5uYW1lID09PSAnQXV0aG9yaXphdGlvbkhlYWRlck1hbGZvcm1lZCcpIHtcbiAgICAgICAgICB2YXIgcmVnaW9uID0gZS5SZWdpb25cbiAgICAgICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgcmVnaW9uLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYihlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXh0cmFjdFJlZ2lvbihyZXNwb25zZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgZXh0cmFjdFJlZ2lvbihyZXNwb25zZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQ3JlYXRlcyB0aGUgYnVja2V0IGBidWNrZXROYW1lYC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXyAtIE5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGByZWdpb25gIF9zdHJpbmdfIC0gcmVnaW9uIHZhbGlkIHZhbHVlcyBhcmUgX3VzLXdlc3QtMV8sIF91cy13ZXN0LTJfLCAgX2V1LXdlc3QtMV8sIF9ldS1jZW50cmFsLTFfLCBfYXAtc291dGhlYXN0LTFfLCBfYXAtbm9ydGhlYXN0LTFfLCBfYXAtc291dGhlYXN0LTJfLCBfc2EtZWFzdC0xXy5cbiAgLy8gKiBgbWFrZU9wdHNgIF9vYmplY3RfIC0gT3B0aW9ucyB0byBjcmVhdGUgYSBidWNrZXQuIGUuZyB7T2JqZWN0TG9ja2luZzp0cnVlfSAoT3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgYnVja2V0IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLlxuICBtYWtlQnVja2V0KGJ1Y2tldE5hbWUsIHJlZ2lvbiwgbWFrZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzT2JqZWN0KHJlZ2lvbikpIHtcbiAgICAgIGNiID0gbWFrZU9wdHNcbiAgICAgIG1ha2VPcHRzID0gcmVnaW9uXG4gICAgICByZWdpb24gPSAnJ1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihyZWdpb24pKSB7XG4gICAgICBjYiA9IHJlZ2lvblxuICAgICAgcmVnaW9uID0gJydcbiAgICAgIG1ha2VPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24obWFrZU9wdHMpKSB7XG4gICAgICBjYiA9IG1ha2VPcHRzXG4gICAgICBtYWtlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWFrZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWtlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcGF5bG9hZCA9ICcnXG5cbiAgICAvLyBSZWdpb24gYWxyZWFkeSBzZXQgaW4gY29uc3RydWN0b3IsIHZhbGlkYXRlIGlmXG4gICAgLy8gY2FsbGVyIHJlcXVlc3RlZCBidWNrZXQgbG9jYXRpb24gaXMgc2FtZS5cbiAgICBpZiAocmVnaW9uICYmIHRoaXMucmVnaW9uKSB7XG4gICAgICBpZiAocmVnaW9uICE9PSB0aGlzLnJlZ2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDb25maWd1cmVkIHJlZ2lvbiAke3RoaXMucmVnaW9ufSwgcmVxdWVzdGVkICR7cmVnaW9ufWApXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlbmRpbmcgbWFrZUJ1Y2tldCByZXF1ZXN0IHdpdGggWE1MIGNvbnRhaW5pbmcgJ3VzLWVhc3QtMScgZmFpbHMuIEZvclxuICAgIC8vIGRlZmF1bHQgcmVnaW9uIHNlcnZlciBleHBlY3RzIHRoZSByZXF1ZXN0IHdpdGhvdXQgYm9keVxuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSBERUZBVUxUX1JFR0lPTikge1xuICAgICAgdmFyIGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24gPSBbXVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgX2F0dHI6IHtcbiAgICAgICAgICB4bWxuczogJ2h0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgTG9jYXRpb25Db25zdHJhaW50OiByZWdpb24sXG4gICAgICB9KVxuICAgICAgdmFyIHBheWxvYWRPYmplY3QgPSB7XG4gICAgICAgIENyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb246IGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24sXG4gICAgICB9XG4gICAgICBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBoZWFkZXJzID0ge31cblxuICAgIGlmIChtYWtlT3B0cy5PYmplY3RMb2NraW5nKSB7XG4gICAgICBoZWFkZXJzWyd4LWFtei1idWNrZXQtb2JqZWN0LWxvY2stZW5hYmxlZCddID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghcmVnaW9uKSB7XG4gICAgICByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NXaXRoUmV0cnkgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyICYmIChyZWdpb24gPT09ICcnIHx8IHJlZ2lvbiA9PT0gREVGQVVMVF9SRUdJT04pKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnICYmIGVyci5yZWdpb24gIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmV0cnkgd2l0aCByZWdpb24gcmV0dXJuZWQgYXMgcGFydCBvZiBlcnJvclxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sIGVyci5yZWdpb24sIGZhbHNlLCBjYilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgIH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCByZWdpb24sIGZhbHNlLCBwcm9jZXNzV2l0aFJldHJ5KVxuICB9XG5cbiAgLy8gTGlzdCBvZiBidWNrZXRzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBidWNrZXRzKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXJyb3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBgYnVja2V0c2AgaXMgYW4gYXJyYXkgb2YgYnVja2V0IGluZm9ybWF0aW9uXG4gIC8vXG4gIC8vIGBidWNrZXRzYCBhcnJheSBlbGVtZW50OlxuICAvLyAqIGBidWNrZXQubmFtZWAgX3N0cmluZ18gOiBidWNrZXQgbmFtZVxuICAvLyAqIGBidWNrZXQuY3JlYXRpb25EYXRlYCBfRGF0ZV86IGRhdGUgd2hlbiBidWNrZXQgd2FzIGNyZWF0ZWRcbiAgbGlzdEJ1Y2tldHMoY2IpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kIH0sICcnLCBbMjAwXSwgREVGQVVMVF9SRUdJT04sIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyKClcbiAgICAgIHZhciBidWNrZXRzXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAoYnVja2V0cyA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgYnVja2V0cykpXG4gICAgfSlcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyBvYmplY3RzIHRoYXQgYXJlIHBhcnRpYWxseSB1cGxvYWRlZC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHByZWZpeCBvZiB0aGUgb2JqZWN0IG5hbWVzIHRoYXQgYXJlIHBhcnRpYWxseSB1cGxvYWRlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIHdoZW4gZmFsc2UsIHJlY3Vyc2l2ZSBsaXN0aW5nIHdoZW4gdHJ1ZSAob3B0aW9uYWwsIGRlZmF1bHQgYGZhbHNlYClcbiAgLy9cbiAgLy8gX19SZXR1cm4gVmFsdWVfX1xuICAvLyAqIGBzdHJlYW1gIF9TdHJlYW1fIDogZW1pdHMgb2JqZWN0cyBvZiB0aGUgZm9ybWF0OlxuICAvLyAgICogYG9iamVjdC5rZXlgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmplY3QudXBsb2FkSWRgIF9zdHJpbmdfOiB1cGxvYWQgSUQgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iamVjdC5zaXplYCBfSW50ZWdlcl86IHNpemUgb2YgdGhlIHBhcnRpYWxseSB1cGxvYWRlZCBvYmplY3RcbiAgbGlzdEluY29tcGxldGVVcGxvYWRzKGJ1Y2tldCwgcHJlZml4LCByZWN1cnNpdmUpIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZWZpeCA9ICcnXG4gICAgfVxuICAgIGlmIChyZWN1cnNpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVjdXJzaXZlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXQpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFByZWZpeChwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgSW52YWxpZCBwcmVmaXggOiAke3ByZWZpeH1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIga2V5TWFya2VyID0gJydcbiAgICB2YXIgdXBsb2FkSWRNYXJrZXIgPSAnJ1xuICAgIHZhciB1cGxvYWRzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSB1cGxvYWQgaW5mbyBwZXIgX3JlYWQoKVxuICAgICAgaWYgKHVwbG9hZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2godXBsb2Fkcy5zaGlmdCgpKVxuICAgICAgfVxuICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkoYnVja2V0LCBwcmVmaXgsIGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIsIGRlbGltaXRlcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXN1bHQucHJlZml4ZXMuZm9yRWFjaCgocHJlZml4KSA9PiB1cGxvYWRzLnB1c2gocHJlZml4KSlcbiAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKFxuICAgICAgICAgICAgcmVzdWx0LnVwbG9hZHMsXG4gICAgICAgICAgICAodXBsb2FkLCBjYikgPT4ge1xuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBpbmNvbXBsZXRlIHVwbG9hZCBhZGQgdGhlIHNpemVzIG9mIGl0cyB1cGxvYWRlZCBwYXJ0c1xuICAgICAgICAgICAgICB0aGlzLmxpc3RQYXJ0cyhidWNrZXQsIHVwbG9hZC5rZXksIHVwbG9hZC51cGxvYWRJZCwgKGVyciwgcGFydHMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGxvYWQuc2l6ZSA9IHBhcnRzLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgKyBpdGVtLnNpemUsIDApXG4gICAgICAgICAgICAgICAgdXBsb2Fkcy5wdXNoKHVwbG9hZClcbiAgICAgICAgICAgICAgICBjYigpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICAgICAga2V5TWFya2VyID0gcmVzdWx0Lm5leHRLZXlNYXJrZXJcbiAgICAgICAgICAgICAgICB1cGxvYWRJZE1hcmtlciA9IHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gVG8gY2hlY2sgaWYgYSBidWNrZXQgYWxyZWFkeSBleGlzdHMuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ18gOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXyA6IGBlcnJgIGlzIGBudWxsYCBpZiB0aGUgYnVja2V0IGV4aXN0c1xuICBidWNrZXRFeGlzdHMoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0hFQUQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwMF0sICcnLCBmYWxzZSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT0gJ05vU3VjaEJ1Y2tldCcgfHwgZXJyLmNvZGUgPT0gJ05vdEZvdW5kJykge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdHJ1ZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIGEgYnVja2V0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfIDogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gOiBgZXJyYCBpcyBgbnVsbGAgaWYgdGhlIGJ1Y2tldCBpcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS5cbiAgcmVtb3ZlQnVja2V0KGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdERUxFVEUnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgKGUpID0+IHtcbiAgICAgIC8vIElmIHRoZSBidWNrZXQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCByZW1vdmUgdGhlIHJlZ2lvbiBtYXAgZW50cnkuXG4gICAgICBpZiAoIWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdXG4gICAgICB9XG4gICAgICBjYihlKVxuICAgIH0pXG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHBhcnRpYWxseSB1cGxvYWRlZCBvYmplY3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG5vbiBgbnVsbGAgdmFsdWUgaW4gY2FzZSBvZiBlcnJvclxuICByZW1vdmVJbmNvbXBsZXRlVXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Jc1ZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIHJlbW92ZVVwbG9hZElkXG4gICAgYXN5bmMuZHVyaW5nKFxuICAgICAgKGNiKSA9PiB7XG4gICAgICAgIHRoaXMuZmluZFVwbG9hZElkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIChlLCB1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVtb3ZlVXBsb2FkSWQgPSB1cGxvYWRJZFxuICAgICAgICAgIGNiKG51bGwsIHVwbG9hZElkKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIChjYikgPT4ge1xuICAgICAgICB2YXIgbWV0aG9kID0gJ0RFTEVURSdcbiAgICAgICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7cmVtb3ZlVXBsb2FkSWR9YFxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgKGUpID0+IGNiKGUpKVxuICAgICAgfSxcbiAgICAgIGNiLFxuICAgIClcbiAgfVxuXG4gIC8vIENhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGBlcnJvcmAgaW4gY2FzZSBvZiBlcnJvciBvciBgbnVsbGAgaW4gY2FzZSBvZiBzdWNjZXNzXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGZpbGVQYXRoYCBfc3RyaW5nXzogcGF0aCB0byB3aGljaCB0aGUgb2JqZWN0IGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvXG4gIC8vICogYGdldE9wdHNgIF9vYmplY3RfOiBWZXJzaW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIGZvcm0gYHt2ZXJzaW9uSWQ6J215LXV1aWQnfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyYCBpbiBjYXNlIG9mIGVycm9yLlxuICBmR2V0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGZpbGVQYXRoLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbi5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVBhdGggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIC8vIEludGVybmFsIGRhdGEuXG4gICAgdmFyIHBhcnRGaWxlXG4gICAgdmFyIHBhcnRGaWxlU3RyZWFtXG4gICAgdmFyIG9ialN0YXRcblxuICAgIC8vIFJlbmFtZSB3cmFwcGVyLlxuICAgIHZhciByZW5hbWUgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICB9XG4gICAgICBmcy5yZW5hbWUocGFydEZpbGUsIGZpbGVQYXRoLCBjYilcbiAgICB9XG5cbiAgICBhc3luYy53YXRlcmZhbGwoXG4gICAgICBbXG4gICAgICAgIChjYikgPT4gdGhpcy5zdGF0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMsIGNiKSxcbiAgICAgICAgKHJlc3VsdCwgY2IpID0+IHtcbiAgICAgICAgICBvYmpTdGF0ID0gcmVzdWx0XG4gICAgICAgICAgLy8gQ3JlYXRlIGFueSBtaXNzaW5nIHRvcCBsZXZlbCBkaXJlY3Rvcmllcy5cbiAgICAgICAgICBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9LCAoZXJyKSA9PiBjYihlcnIpKVxuICAgICAgICB9LFxuICAgICAgICAoY2IpID0+IHtcbiAgICAgICAgICBwYXJ0RmlsZSA9IGAke2ZpbGVQYXRofS4ke29ialN0YXQuZXRhZ30ucGFydC5taW5pb2BcbiAgICAgICAgICBmcy5zdGF0KHBhcnRGaWxlLCAoZSwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwXG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICBwYXJ0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBhcnRGaWxlLCB7IGZsYWdzOiAndycgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChvYmpTdGF0LnNpemUgPT09IHN0YXRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuYW1lKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvZmZzZXQgPSBzdGF0cy5zaXplXG4gICAgICAgICAgICAgIHBhcnRGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ocGFydEZpbGUsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG9mZnNldCwgMCwgZ2V0T3B0cywgY2IpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgKGRvd25sb2FkU3RyZWFtLCBjYikgPT4ge1xuICAgICAgICAgIHBpcGVzZXR1cChkb3dubG9hZFN0cmVhbSwgcGFydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAgICAgLm9uKCdmaW5pc2gnLCBjYilcbiAgICAgICAgfSxcbiAgICAgICAgKGNiKSA9PiBmcy5zdGF0KHBhcnRGaWxlLCBjYiksXG4gICAgICAgIChzdGF0cywgY2IpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA9PT0gb2JqU3RhdC5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1NpemUgbWlzbWF0Y2ggYmV0d2VlbiBkb3dubG9hZGVkIGZpbGUgYW5kIHRoZSBvYmplY3QnKSlcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZW5hbWUsXG4gICAgKVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggcmVhZGFibGUgc3RyZWFtIG9mIHRoZSBvYmplY3QgY29udGVudC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZ2V0T3B0c2AgX29iamVjdF86IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgc3RyZWFtKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci4gYHN0cmVhbWAgaXMgdGhlIG9iamVjdCBjb250ZW50IHN0cmVhbVxuICBnZXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB0aGlzLmdldFBhcnRpYWxPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgMCwgMCwgZ2V0T3B0cywgY2IpXG4gIH1cblxuICAvLyBDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCByZWFkYWJsZSBzdHJlYW0gb2YgdGhlIHBhcnRpYWwgb2JqZWN0IGNvbnRlbnQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9mZnNldGAgX251bWJlcl86IG9mZnNldCBvZiB0aGUgb2JqZWN0IGZyb20gd2hlcmUgdGhlIHN0cmVhbSB3aWxsIHN0YXJ0XG4gIC8vICogYGxlbmd0aGAgX251bWJlcl86IGxlbmd0aCBvZiB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSByZWFkIGluIHRoZSBzdHJlYW0gKG9wdGlvbmFsLCBpZiBub3Qgc3BlY2lmaWVkIHdlIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgZnJvbSB0aGUgb2Zmc2V0KVxuICAvLyAqIGBnZXRPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJ31gLiBEZWZhdWx0IGlzIGB7fWAuIChvcHRpb25hbClcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBzdHJlYW0pYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyYCBpbiBjYXNlIG9mIGVycm9yLiBgc3RyZWFtYCBpcyB0aGUgb2JqZWN0IGNvbnRlbnQgc3RyZWFtXG4gIGdldFBhcnRpYWxPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgb2Zmc2V0LCBsZW5ndGgsIGdldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihsZW5ndGgpKSB7XG4gICAgICBjYiA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gMFxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKG9mZnNldCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29mZnNldCBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsZW5ndGggc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHZhciByYW5nZSA9ICcnXG4gICAgaWYgKG9mZnNldCB8fCBsZW5ndGgpIHtcbiAgICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgcmFuZ2UgPSBgYnl0ZXM9JHsrb2Zmc2V0fS1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9ICdieXRlcz0wLSdcbiAgICAgICAgb2Zmc2V0ID0gMFxuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICByYW5nZSArPSBgJHsrbGVuZ3RoICsgb2Zmc2V0IC0gMX1gXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSB7fVxuICAgIGlmIChyYW5nZSAhPT0gJycpIHtcbiAgICAgIGhlYWRlcnMucmFuZ2UgPSByYW5nZVxuICAgIH1cblxuICAgIHZhciBleHBlY3RlZFN0YXR1c0NvZGVzID0gWzIwMF1cbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIGV4cGVjdGVkU3RhdHVzQ29kZXMucHVzaCgyMDYpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuXG4gICAgdmFyIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGdldE9wdHMpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycywgcXVlcnkgfSwgJycsIGV4cGVjdGVkU3RhdHVzQ29kZXMsICcnLCB0cnVlLCBjYilcbiAgfVxuXG4gIC8vIFVwbG9hZHMgdGhlIG9iamVjdCB1c2luZyBjb250ZW50cyBmcm9tIGEgZmlsZVxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBmaWxlUGF0aGAgX3N0cmluZ186IGZpbGUgcGF0aCBvZiB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAvLyAqIGBtZXRhRGF0YWAgX0phdmFzY3JpcHQgT2JqZWN0XzogbWV0YURhdGEgYXNzb3NjaWF0ZWQgd2l0aCB0aGUgb2JqZWN0XG4gIC8vICogYGNhbGxiYWNrKGVyciwgb2JqSW5mbylgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYG9iakluZm9gIF9vYmplY3RfIHdoaWNoIGNvbnRhaW5zIHZlcnNpb25JZCBhbmQgZXRhZy5cbiAgZlB1dE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBmaWxlUGF0aCwgbWV0YURhdGEsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVBhdGggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKG1ldGFEYXRhKSkge1xuICAgICAgY2FsbGJhY2sgPSBtZXRhRGF0YVxuICAgICAgbWV0YURhdGEgPSB7fSAvLyBTZXQgbWV0YURhdGEgZW1wdHkgaWYgbm8gbWV0YURhdGEgcHJvdmlkZWQuXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWV0YURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZXRhRGF0YSBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG5cbiAgICAvLyBJbnNlcnRzIGNvcnJlY3QgYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlIGJhc2VkIG9uIG1ldGFEYXRhIGFuZCBmaWxlUGF0aFxuICAgIG1ldGFEYXRhID0gaW5zZXJ0Q29udGVudFR5cGUobWV0YURhdGEsIGZpbGVQYXRoKVxuXG4gICAgLy8gVXBkYXRlcyBtZXRhRGF0YSB0byBoYXZlIHRoZSBjb3JyZWN0IHByZWZpeCBpZiBuZWVkZWRcbiAgICBtZXRhRGF0YSA9IHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YSlcbiAgICB2YXIgc2l6ZVxuICAgIHZhciBwYXJ0U2l6ZVxuXG4gICAgYXN5bmMud2F0ZXJmYWxsKFxuICAgICAgW1xuICAgICAgICAoY2IpID0+IGZzLnN0YXQoZmlsZVBhdGgsIGNiKSxcbiAgICAgICAgKHN0YXRzLCBjYikgPT4ge1xuICAgICAgICAgIHNpemUgPSBzdGF0cy5zaXplXG4gICAgICAgICAgdmFyIHN0cmVhbVxuICAgICAgICAgIHZhciBjYlRyaWdnZXJlZCA9IGZhbHNlXG4gICAgICAgICAgdmFyIG9yaWdDYiA9IGNiXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoY2JUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYlRyaWdnZXJlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdDYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaXplID4gdGhpcy5tYXhPYmplY3RTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKGAke2ZpbGVQYXRofSBzaXplIDogJHtzdGF0cy5zaXplfSwgbWF4IGFsbG93ZWQgc2l6ZSA6IDVUQmApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2l6ZSA8PSB0aGlzLnBhcnRTaXplKSB7XG4gICAgICAgICAgICAvLyBzaW1wbGUgUFVUIHJlcXVlc3QsIG5vIG11bHRpcGFydFxuICAgICAgICAgICAgdmFyIG11bHRpcGFydCA9IGZhbHNlXG4gICAgICAgICAgICB2YXIgdXBsb2FkZXIgPSB0aGlzLmdldFVwbG9hZGVyKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBtdWx0aXBhcnQpXG4gICAgICAgICAgICB2YXIgaGFzaCA9IHRyYW5zZm9ybWVycy5nZXRIYXNoU3VtbWVyKHRoaXMuZW5hYmxlU0hBMjU2KVxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gMFxuICAgICAgICAgICAgdmFyIGVuZCA9IHNpemUgLSAxXG4gICAgICAgICAgICB2YXIgYXV0b0Nsb3NlID0gdHJ1ZVxuICAgICAgICAgICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgZW5kID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IHN0YXJ0LCBlbmQsIGF1dG9DbG9zZSB9XG4gICAgICAgICAgICBwaXBlc2V0dXAoZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucyksIGhhc2gpXG4gICAgICAgICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIG1kNXN1bSA9IGRhdGEubWQ1c3VtXG4gICAgICAgICAgICAgICAgdmFyIHNoYTI1NnN1bSA9IGRhdGEuc2hhMjU2c3VtXG4gICAgICAgICAgICAgICAgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICB1cGxvYWRlcihzdHJlYW0sIHNpemUsIHNoYTI1NnN1bSwgbWQ1c3VtLCAoZXJyLCBvYmpJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG9iakluZm8pXG4gICAgICAgICAgICAgICAgICBjYih0cnVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maW5kVXBsb2FkSWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgY2IpXG4gICAgICAgIH0sXG4gICAgICAgICh1cGxvYWRJZCwgY2IpID0+IHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBpbmNvbXBsZXRlIHVwbG9hZCwgZmV0Y2ggYWxsIGl0cyB1cGxvYWRlZCBwYXJ0cyBpbmZvXG4gICAgICAgICAgaWYgKHVwbG9hZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGFydHMoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIChlLCBldGFncykgPT4gY2IoZSwgdXBsb2FkSWQsIGV0YWdzKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIHByZXZpb3VzIHVwbG9hZCwgaW5pdGlhdGUgYSBuZXcgb25lXG4gICAgICAgICAgdGhpcy5pbml0aWF0ZU5ld011bHRpcGFydFVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBtZXRhRGF0YSwgKGUsIHVwbG9hZElkKSA9PiBjYihlLCB1cGxvYWRJZCwgW10pKVxuICAgICAgICB9LFxuICAgICAgICAodXBsb2FkSWQsIGV0YWdzLCBjYikgPT4ge1xuICAgICAgICAgIHBhcnRTaXplID0gdGhpcy5jYWxjdWxhdGVQYXJ0U2l6ZShzaXplKVxuICAgICAgICAgIHZhciBtdWx0aXBhcnQgPSB0cnVlXG4gICAgICAgICAgdmFyIHVwbG9hZGVyID0gdGhpcy5nZXRVcGxvYWRlcihidWNrZXROYW1lLCBvYmplY3ROYW1lLCBtZXRhRGF0YSwgbXVsdGlwYXJ0KVxuXG4gICAgICAgICAgLy8gY29udmVydCBhcnJheSB0byBvYmplY3QgdG8gbWFrZSB0aGluZ3MgZWFzeVxuICAgICAgICAgIHZhciBwYXJ0cyA9IGV0YWdzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoIWFjY1tpdGVtLnBhcnRdKSB7XG4gICAgICAgICAgICAgIGFjY1tpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIHZhciBwYXJ0c0RvbmUgPSBbXVxuICAgICAgICAgIHZhciBwYXJ0TnVtYmVyID0gMVxuICAgICAgICAgIHZhciB1cGxvYWRlZFNpemUgPSAwXG4gICAgICAgICAgYXN5bmMud2hpbHN0KFxuICAgICAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgICAgIGNiKG51bGwsIHVwbG9hZGVkU2l6ZSA8IHNpemUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgICAgIHZhciBzdHJlYW1cbiAgICAgICAgICAgICAgdmFyIGNiVHJpZ2dlcmVkID0gZmFsc2VcbiAgICAgICAgICAgICAgdmFyIG9yaWdDYiA9IGNiXG4gICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChjYlRyaWdnZXJlZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNiVHJpZ2dlcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdDYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1twYXJ0TnVtYmVyXVxuICAgICAgICAgICAgICB2YXIgaGFzaCA9IHRyYW5zZm9ybWVycy5nZXRIYXNoU3VtbWVyKHRoaXMuZW5hYmxlU0hBMjU2KVxuICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gcGFydFNpemVcbiAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHNpemUgLSB1cGxvYWRlZFNpemUpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSBzaXplIC0gdXBsb2FkZWRTaXplXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdXBsb2FkZWRTaXplXG4gICAgICAgICAgICAgIHZhciBlbmQgPSB1cGxvYWRlZFNpemUgKyBsZW5ndGggLSAxXG4gICAgICAgICAgICAgIHZhciBhdXRvQ2xvc2UgPSB0cnVlXG4gICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBhdXRvQ2xvc2UsIHN0YXJ0LCBlbmQgfVxuICAgICAgICAgICAgICAvLyB2ZXJpZnkgbWQ1c3VtIG9mIGVhY2ggcGFydFxuICAgICAgICAgICAgICBwaXBlc2V0dXAoZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucyksIGhhc2gpXG4gICAgICAgICAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgIHZhciBtZDVzdW1IZXggPSBCdWZmZXIuZnJvbShkYXRhLm1kNXN1bSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgJiYgbWQ1c3VtSGV4ID09PSBwYXJ0LmV0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWQ1IG1hdGNoZXMsIGNodW5rIGFscmVhZHkgdXBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgcGFydHNEb25lLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBwYXJ0LmV0YWcgfSlcbiAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcisrXG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkU2l6ZSArPSBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgaXMgbm90IHVwbG9hZGVkIHlldCwgb3IgbWQ1IG1pc21hdGNoXG4gICAgICAgICAgICAgICAgICBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgdXBsb2FkZXIodXBsb2FkSWQsIHBhcnROdW1iZXIsIHN0cmVhbSwgbGVuZ3RoLCBkYXRhLnNoYTI1NnN1bSwgZGF0YS5tZDVzdW0sIChlLCBvYmpJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFydHNEb25lLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBvYmpJbmZvLmV0YWcgfSlcbiAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcisrXG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkU2l6ZSArPSBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2IobnVsbCwgcGFydHNEb25lLCB1cGxvYWRJZClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICAvLyBhbGwgcGFydHMgdXBsb2FkZWQsIGNvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkXG4gICAgICAgIChldGFncywgdXBsb2FkSWQsIGNiKSA9PiB0aGlzLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHVwbG9hZElkLCBldGFncywgY2IpLFxuICAgICAgXSxcbiAgICAgIChlcnIsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgaWYgKGVyciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVyciwgLi4ucmVzdClcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gVXBsb2FkcyB0aGUgb2JqZWN0LlxuICAvL1xuICAvLyBVcGxvYWRpbmcgYSBzdHJlYW1cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogUmVhZGFibGUgc3RyZWFtXG4gIC8vICogYHNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3QgKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIsIGV0YWcpYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBldGFnYCBfc3RyaW5nXyBpcyB0aGUgZXRhZyBvZiB0aGUgb2JqZWN0IHVwbG9hZGVkLlxuICAvL1xuICAvLyBVcGxvYWRpbmcgXCJCdWZmZXJcIiBvciBcInN0cmluZ1wiXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYHN0cmluZyBvciBCdWZmZXJgIF9zdHJpbmdfIG9yIF9CdWZmZXJfOiBzdHJpbmcgb3IgYnVmZmVyXG4gIC8vICogYGNhbGxiYWNrKGVyciwgb2JqSW5mbylgIF9mdW5jdGlvbl86IGBlcnJgIGlzIGBudWxsYCBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGBpbmZvYCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBvYmplY3QgZGV0YWlsczpcbiAgLy8gICAqIGBldGFnYCBfc3RyaW5nXzogZXRhZyBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgdmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbklkIG9mIHRoZSBvYmplY3RcbiAgcHV0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHN0cmVhbSwgc2l6ZSwgbWV0YURhdGEsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICAvLyBXZSdsbCBuZWVkIHRvIHNoaWZ0IGFyZ3VtZW50cyB0byB0aGUgbGVmdCBiZWNhdXNlIG9mIHNpemUgYW5kIG1ldGFEYXRhLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNpemUpKSB7XG4gICAgICBjYWxsYmFjayA9IHNpemVcbiAgICAgIG1ldGFEYXRhID0ge31cbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24obWV0YURhdGEpKSB7XG4gICAgICBjYWxsYmFjayA9IG1ldGFEYXRhXG4gICAgICBtZXRhRGF0YSA9IHt9XG4gICAgfVxuXG4gICAgLy8gV2UnbGwgbmVlZCB0byBzaGlmdCBhcmd1bWVudHMgdG8gdGhlIGxlZnQgYmVjYXVzZSBvZiBtZXRhRGF0YVxuICAgIC8vIGFuZCBzaXplIGJlaW5nIG9wdGlvbmFsLlxuICAgIGlmIChpc09iamVjdChzaXplKSkge1xuICAgICAgbWV0YURhdGEgPSBzaXplXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlcyBNZXRhZGF0YSBoYXMgYXBwcm9wcmlhdGUgcHJlZml4IGZvciBBMyBBUElcbiAgICBtZXRhRGF0YSA9IHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YSlcbiAgICBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgfHwgc3RyZWFtIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAvLyBBZGFwdHMgdGhlIG5vbi1zdHJlYW0gaW50ZXJmYWNlIGludG8gYSBzdHJlYW0uXG4gICAgICBzaXplID0gc3RyZWFtLmxlbmd0aFxuICAgICAgc3RyZWFtID0gcmVhZGFibGVTdHJlYW0oc3RyZWFtKVxuICAgIH0gZWxzZSBpZiAoIWlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcmQgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJlYW0uUmVhZGFibGVcIiBvciBcIkJ1ZmZlclwiIG9yIFwic3RyaW5nXCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKHNpemUpICYmIHNpemUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSwgZ2l2ZW4gc2l6ZTogJHtzaXplfWApXG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBwYXJ0IHNpemUgYW5kIGZvcndhcmQgdGhhdCB0byB0aGUgQmxvY2tTdHJlYW0uIERlZmF1bHQgdG8gdGhlXG4gICAgLy8gbGFyZ2VzdCBibG9jayBzaXplIHBvc3NpYmxlIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoIWlzTnVtYmVyKHNpemUpKSB7XG4gICAgICBzaXplID0gdGhpcy5tYXhPYmplY3RTaXplXG4gICAgfVxuXG4gICAgc2l6ZSA9IHRoaXMuY2FsY3VsYXRlUGFydFNpemUoc2l6ZSlcblxuICAgIC8vIHMzIHJlcXVpcmVzIHRoYXQgYWxsIG5vbi1lbmQgY2h1bmtzIGJlIGF0IGxlYXN0IGB0aGlzLnBhcnRTaXplYCxcbiAgICAvLyBzbyB3ZSBjaHVuayB0aGUgc3RyZWFtIHVudGlsIHdlIGhpdCBlaXRoZXIgdGhhdCBzaXplIG9yIHRoZSBlbmQgYmVmb3JlXG4gICAgLy8gd2UgZmx1c2ggaXQgdG8gczMuXG4gICAgbGV0IGNodW5rZXIgPSBuZXcgQmxvY2tTdHJlYW0yKHsgc2l6ZSwgemVyb1BhZGRpbmc6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGlzIGlzIGEgV3JpdGFibGUgc3RyZWFtIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW4gb3JkZXIgdG8gdXBsb2FkXG4gICAgLy8gdG8gdGhlIHNwZWNpZmllZCBidWNrZXQgYW5kIG9iamVjdCBhdXRvbWF0aWNhbGx5LlxuICAgIGxldCB1cGxvYWRlciA9IG5ldyBPYmplY3RVcGxvYWRlcih0aGlzLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spXG4gICAgLy8gc3RyZWFtID0+IGNodW5rZXIgPT4gdXBsb2FkZXJcbiAgICBwaXBlc2V0dXAoc3RyZWFtLCBjaHVua2VyLCB1cGxvYWRlcilcbiAgfVxuXG4gIC8vIENvcHkgdGhlIG9iamVjdC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3JjT2JqZWN0YCBfc3RyaW5nXzogcGF0aCBvZiB0aGUgc291cmNlIG9iamVjdCB0byBiZSBjb3BpZWRcbiAgLy8gKiBgY29uZGl0aW9uc2AgX0NvcHlDb25kaXRpb25zXzogY29weSBjb25kaXRpb25zIHRoYXQgbmVlZHMgdG8gYmUgc2F0aXNmaWVkIChvcHRpb25hbCwgZGVmYXVsdCBgbnVsbGApXG4gIC8vICogYGNhbGxiYWNrKGVyciwge2V0YWcsIGxhc3RNb2RpZmllZH0pYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBldGFnYCBfc3RyaW5nXyBhbmQgYGxpc3RNb2RpZmVkYCBfRGF0ZV8gYXJlIHJlc3BlY3RpdmVseSB0aGUgZXRhZyBhbmQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgbmV3bHkgY29waWVkIG9iamVjdFxuICBjb3B5T2JqZWN0VjEoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkge1xuICAgIHZhciBidWNrZXROYW1lID0gYXJnMVxuICAgIHZhciBvYmplY3ROYW1lID0gYXJnMlxuICAgIHZhciBzcmNPYmplY3QgPSBhcmczXG4gICAgdmFyIGNvbmRpdGlvbnMsIGNiXG4gICAgaWYgKHR5cGVvZiBhcmc0ID09ICdmdW5jdGlvbicgJiYgYXJnNSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25kaXRpb25zID0gbnVsbFxuICAgICAgY2IgPSBhcmc0XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMgPSBhcmc0XG4gICAgICBjYiA9IGFyZzVcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzcmNPYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzcmNPYmplY3Qgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChzcmNPYmplY3QgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgRW1wdHkgc291cmNlIHByZWZpeGApXG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbnMgIT09IG51bGwgJiYgIShjb25kaXRpb25zIGluc3RhbmNlb2YgQ29weUNvbmRpdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb25kaXRpb25zIHNob3VsZCBiZSBvZiB0eXBlIFwiQ29weUNvbmRpdGlvbnNcIicpXG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSB1cmlSZXNvdXJjZUVzY2FwZShzcmNPYmplY3QpXG5cbiAgICBpZiAoY29uZGl0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbmRpdGlvbnMubW9kaWZpZWQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW1vZGlmaWVkLXNpbmNlJ10gPSBjb25kaXRpb25zLm1vZGlmaWVkXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9ucy51bm1vZGlmaWVkICE9PSAnJykge1xuICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlJ10gPSBjb25kaXRpb25zLnVubW9kaWZpZWRcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLm1hdGNoRVRhZyAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbWF0Y2gnXSA9IGNvbmRpdGlvbnMubWF0Y2hFVGFnXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9ucy5tYXRjaEV0YWdFeGNlcHQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW5vbmUtbWF0Y2gnXSA9IGNvbmRpdGlvbnMubWF0Y2hFVGFnRXhjZXB0XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdQVVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gY2IobnVsbCwgZGF0YSkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBNZXRob2QgdG8gcGVyZm9ybSBjb3B5IG9mIGFuIG9iamVjdC5cbiAgICogQHBhcmFtIHNvdXJjZUNvbmZpZyBfX29iamVjdF9fICAgaW5zdGFuY2Ugb2YgQ29weVNvdXJjZU9wdGlvbnMgQGxpbmsgLi9oZWxwZXJzL0NvcHlTb3VyY2VPcHRpb25zXG4gICAqIEBwYXJhbSBkZXN0Q29uZmlnICBfX29iamVjdF9fICAgaW5zdGFuY2Ugb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucyBAbGluayAuL2hlbHBlcnMvQ29weURlc3RpbmF0aW9uT3B0aW9uc1xuICAgKiBAcGFyYW0gY2IgX19mdW5jdGlvbl9fIGNhbGxlZCB3aXRoIG51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3JcbiAgICogQHJldHVybnMgUHJvbWlzZSBpZiBubyBjYWxsYWNrIGlzIHBhc3NlZC5cbiAgICovXG4gIGNvcHlPYmplY3RWMihzb3VyY2VDb25maWcsIGRlc3RDb25maWcsIGNiKSB7XG4gICAgaWYgKCEoc291cmNlQ29uZmlnIGluc3RhbmNlb2YgQ29weVNvdXJjZU9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdzb3VyY2VDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weVNvdXJjZU9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCEoZGVzdENvbmZpZyBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdkZXN0Q29uZmlnIHNob3VsZCBvZiB0eXBlIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCFkZXN0Q29uZmlnLnZhbGlkYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWRlc3RDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZUNvbmZpZy5nZXRIZWFkZXJzKCksIGRlc3RDb25maWcuZ2V0SGVhZGVycygpKVxuXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IGRlc3RDb25maWcuQnVja2V0XG4gICAgY29uc3Qgb2JqZWN0TmFtZSA9IGRlc3RDb25maWcuT2JqZWN0XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc0hlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzXG5cbiAgICAgICAgICBjb25zdCBjb3B5T2JqUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBCdWNrZXQ6IGRlc3RDb25maWcuQnVja2V0LFxuICAgICAgICAgICAgS2V5OiBkZXN0Q29uZmlnLk9iamVjdCxcbiAgICAgICAgICAgIExhc3RNb2RpZmllZDogZGF0YS5MYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICBNZXRhRGF0YTogZXh0cmFjdE1ldGFkYXRhKHJlc0hlYWRlcnMpLFxuICAgICAgICAgICAgVmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzSGVhZGVycyksXG4gICAgICAgICAgICBTb3VyY2VWZXJzaW9uSWQ6IGdldFNvdXJjZVZlcnNpb25JZChyZXNIZWFkZXJzKSxcbiAgICAgICAgICAgIEV0YWc6IHNhbml0aXplRVRhZyhyZXNIZWFkZXJzLmV0YWcpLFxuICAgICAgICAgICAgU2l6ZTogK3Jlc0hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10sXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGNvcHlPYmpSZXNwb25zZSlcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgQ29weSBPYmplY3QgQVBJLlxuICBjb3B5T2JqZWN0KC4uLmFsbEFyZ3MpIHtcbiAgICBpZiAoYWxsQXJnc1swXSBpbnN0YW5jZW9mIENvcHlTb3VyY2VPcHRpb25zICYmIGFsbEFyZ3NbMV0gaW5zdGFuY2VvZiBDb3B5RGVzdGluYXRpb25PcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0VjIoLi4uYXJndW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0VjEoLi4uYXJndW1lbnRzKVxuICB9XG5cbiAgLy8gbGlzdCBhIGJhdGNoIG9mIG9iamVjdHNcbiAgbGlzdE9iamVjdHNRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIG1hcmtlciwgbGlzdFF1ZXJ5T3B0cyA9IHt9KSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcobWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBsZXQgeyBEZWxpbWl0ZXIsIE1heEtleXMsIEluY2x1ZGVWZXJzaW9uIH0gPSBsaXN0UXVlcnlPcHRzXG5cbiAgICBpZiAoIWlzT2JqZWN0KGxpc3RRdWVyeU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0UXVlcnlPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGlmICghaXNTdHJpbmcoRGVsaW1pdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVsaW1pdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKE1heEtleXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNYXhLZXlzIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBbXVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKERlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYGVuY29kaW5nLXR5cGU9dXJsYClcblxuICAgIGlmIChJbmNsdWRlVmVyc2lvbikge1xuICAgICAgcXVlcmllcy5wdXNoKGB2ZXJzaW9uc2ApXG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcikge1xuICAgICAgbWFya2VyID0gdXJpRXNjYXBlKG1hcmtlcilcbiAgICAgIGlmIChJbmNsdWRlVmVyc2lvbikge1xuICAgICAgICBxdWVyaWVzLnB1c2goYGtleS1tYXJrZXI9JHttYXJrZXJ9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJpZXMucHVzaChgbWFya2VyPSR7bWFya2VyfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gbmVlZCB0byBlc2NhcGUgbWF4S2V5c1xuICAgIGlmIChNYXhLZXlzKSB7XG4gICAgICBpZiAoTWF4S2V5cyA+PSAxMDAwKSB7XG4gICAgICAgIE1heEtleXMgPSAxMDAwXG4gICAgICB9XG4gICAgICBxdWVyaWVzLnB1c2goYG1heC1rZXlzPSR7TWF4S2V5c31gKVxuICAgIH1cbiAgICBxdWVyaWVzLnNvcnQoKVxuICAgIHZhciBxdWVyeSA9ICcnXG4gICAgaWYgKHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyaWVzLmpvaW4oJyYnKX1gXG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIoKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmVtaXQoJ2Vycm9yJywgZSlcbiAgICAgIH1cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgfSlcbiAgICByZXR1cm4gdHJhbnNmb3JtZXJcbiAgfVxuXG4gIC8vIExpc3QgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gIC8vICogYGxpc3RPcHRzIF9vYmplY3RfOiBxdWVyeSBwYXJhbXMgdG8gbGlzdCBvYmplY3Qgd2l0aCBiZWxvdyBrZXlzXG4gIC8vICogICAgbGlzdE9wdHMuTWF4S2V5cyBfaW50XyBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHRvIHJldHVyblxuICAvLyAqICAgIGxpc3RPcHRzLkluY2x1ZGVWZXJzaW9uICBfYm9vbF8gdHJ1ZXxmYWxzZSB0byBpbmNsdWRlIHZlcnNpb25zLlxuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICogYG9iai5uYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5wcmVmaXhgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3QgcHJlZml4XG4gIC8vICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5ldGFnYCBfc3RyaW5nXzogZXRhZyBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICAvLyAqIGBvYmouaXNEZWxldGVNYXJrZXJgIF9ib29sZWFuXzogdHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSBtYXJrZXJcbiAgLy8gKiBgb2JqLnZlcnNpb25JZGAgX3N0cmluZ186IHZlcnNpb25JZCBvZiB0aGUgb2JqZWN0XG4gIGxpc3RPYmplY3RzKGJ1Y2tldE5hbWUsIHByZWZpeCwgcmVjdXJzaXZlLCBsaXN0T3B0cyA9IHt9KSB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFByZWZpeChwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgSW52YWxpZCBwcmVmaXggOiAke3ByZWZpeH1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4ocmVjdXJzaXZlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVjdXJzaXZlIHNob3VsZCBiZSBvZiB0eXBlIFwiYm9vbGVhblwiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChsaXN0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3RPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICB2YXIgbWFya2VyID0gJydcbiAgICBjb25zdCBsaXN0UXVlcnlPcHRzID0ge1xuICAgICAgRGVsaW1pdGVyOiByZWN1cnNpdmUgPyAnJyA6ICcvJywgLy8gaWYgcmVjdXJzaXZlIGlzIGZhbHNlIHNldCBkZWxpbWl0ZXIgdG8gJy8nXG4gICAgICBNYXhLZXlzOiAxMDAwLFxuICAgICAgSW5jbHVkZVZlcnNpb246IGxpc3RPcHRzLkluY2x1ZGVWZXJzaW9uLFxuICAgIH1cbiAgICB2YXIgb2JqZWN0cyA9IFtdXG4gICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICB2YXIgcmVhZFN0cmVhbSA9IFN0cmVhbS5SZWFkYWJsZSh7IG9iamVjdE1vZGU6IHRydWUgfSlcbiAgICByZWFkU3RyZWFtLl9yZWFkID0gKCkgPT4ge1xuICAgICAgLy8gcHVzaCBvbmUgb2JqZWN0IHBlciBfcmVhZCgpXG4gICAgICBpZiAob2JqZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgcmVhZFN0cmVhbS5wdXNoKG9iamVjdHMuc2hpZnQoKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaChudWxsKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG9iamVjdHMgdG8gcHVzaCBkbyBxdWVyeSBmb3IgdGhlIG5leHQgYmF0Y2ggb2Ygb2JqZWN0c1xuICAgICAgdGhpcy5saXN0T2JqZWN0c1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgbWFya2VyLCBsaXN0UXVlcnlPcHRzKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgICAgIG1hcmtlciA9IHJlc3VsdC5uZXh0TWFya2VyIHx8IHJlc3VsdC52ZXJzaW9uSWRNYXJrZXJcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdHMgPSByZXN1bHQub2JqZWN0c1xuICAgICAgICAgIHJlYWRTdHJlYW0uX3JlYWQoKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gbGlzdE9iamVjdHNWMlF1ZXJ5IC0gKExpc3QgT2JqZWN0cyBWMikgLSBMaXN0IHNvbWUgb3IgYWxsICh1cCB0byAxMDAwKSBvZiB0aGUgb2JqZWN0cyBpbiBhIGJ1Y2tldC5cbiAgLy9cbiAgLy8gWW91IGNhbiB1c2UgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBhcyBzZWxlY3Rpb24gY3JpdGVyaWEgdG8gcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvLyByZXF1ZXN0IHBhcmFtZXRlcnMgOi1cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiBMaW1pdHMgdGhlIHJlc3BvbnNlIHRvIGtleXMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LlxuICAvLyAqIGBjb250aW51YXRpb24tdG9rZW5gIF9zdHJpbmdfOiBVc2VkIHRvIGNvbnRpbnVlIGl0ZXJhdGluZyBvdmVyIGEgc2V0IG9mIG9iamVjdHMuXG4gIC8vICogYGRlbGltaXRlcmAgX3N0cmluZ186IEEgZGVsaW1pdGVyIGlzIGEgY2hhcmFjdGVyIHlvdSB1c2UgdG8gZ3JvdXAga2V5cy5cbiAgLy8gKiBgbWF4LWtleXNgIF9udW1iZXJfOiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICAvLyAqIGBzdGFydC1hZnRlcmAgX3N0cmluZ186IFNwZWNpZmllcyB0aGUga2V5IHRvIHN0YXJ0IGFmdGVyIHdoZW4gbGlzdGluZyBvYmplY3RzIGluIGEgYnVja2V0LlxuICBsaXN0T2JqZWN0c1YyUXVlcnkoYnVja2V0TmFtZSwgcHJlZml4LCBjb250aW51YXRpb25Ub2tlbiwgZGVsaW1pdGVyLCBtYXhLZXlzLCBzdGFydEFmdGVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoY29udGludWF0aW9uVG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb250aW51YXRpb25Ub2tlbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhkZWxpbWl0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkZWxpbWl0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobWF4S2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEtleXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIHZhciBxdWVyaWVzID0gW11cblxuICAgIC8vIENhbGwgZm9yIGxpc3Rpbmcgb2JqZWN0cyB2MiBBUElcbiAgICBxdWVyaWVzLnB1c2goYGxpc3QtdHlwZT0yYClcbiAgICBxdWVyaWVzLnB1c2goYGVuY29kaW5nLXR5cGU9dXJsYClcblxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcblxuICAgIGlmIChjb250aW51YXRpb25Ub2tlbikge1xuICAgICAgY29udGludWF0aW9uVG9rZW4gPSB1cmlFc2NhcGUoY29udGludWF0aW9uVG9rZW4pXG4gICAgICBxdWVyaWVzLnB1c2goYGNvbnRpbnVhdGlvbi10b2tlbj0ke2NvbnRpbnVhdGlvblRva2VufWApXG4gICAgfVxuICAgIC8vIFNldCBzdGFydC1hZnRlclxuICAgIGlmIChzdGFydEFmdGVyKSB7XG4gICAgICBzdGFydEFmdGVyID0gdXJpRXNjYXBlKHN0YXJ0QWZ0ZXIpXG4gICAgICBxdWVyaWVzLnB1c2goYHN0YXJ0LWFmdGVyPSR7c3RhcnRBZnRlcn1gKVxuICAgIH1cbiAgICAvLyBubyBuZWVkIHRvIGVzY2FwZSBtYXhLZXlzXG4gICAgaWYgKG1heEtleXMpIHtcbiAgICAgIGlmIChtYXhLZXlzID49IDEwMDApIHtcbiAgICAgICAgbWF4S2V5cyA9IDEwMDBcbiAgICAgIH1cbiAgICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9JHttYXhLZXlzfWApXG4gICAgfVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgdmFyIHF1ZXJ5ID0gJydcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJpZXMuam9pbignJicpfWBcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldExpc3RPYmplY3RzVjJUcmFuc2Zvcm1lcigpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG5cbiAgLy8gTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHVzaW5nIFMzIExpc3RPYmplY3RzIFYyXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiB0aGUgcHJlZml4IG9mIHRoZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGB0cnVlYCBpbmRpY2F0ZXMgcmVjdXJzaXZlIHN0eWxlIGxpc3RpbmcgYW5kIGBmYWxzZWAgaW5kaWNhdGVzIGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIGRlbGltaXRlZCBieSAnLycuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvLyAqIGBzdGFydEFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoucHJlZml4YCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0IHByZWZpeFxuICAvLyAgICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoubGFzdE1vZGlmaWVkYCBfRGF0ZV86IG1vZGlmaWVkIHRpbWUgc3RhbXBcbiAgbGlzdE9iamVjdHNWMihidWNrZXROYW1lLCBwcmVmaXgsIHJlY3Vyc2l2ZSwgc3RhcnRBZnRlcikge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhcnRBZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydEFmdGVyID0gJydcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN0YXJ0QWZ0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdGFydEFmdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIgY29udGludWF0aW9uVG9rZW4gPSAnJ1xuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzVjJRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIDEwMDAsIHN0YXJ0QWZ0ZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RzID0gcmVzdWx0Lm9iamVjdHNcbiAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRTdHJlYW1cbiAgfVxuXG4gIC8vIFN0YXQgaW5mb3JtYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RhdE9wdHNgICBfb2JqZWN0XyA6IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpLlxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHN0YXQpYCBfZnVuY3Rpb25fOiBgZXJyYCBpcyBub3QgYG51bGxgIGluIGNhc2Ugb2YgZXJyb3IsIGBzdGF0YCBjb250YWlucyB0aGUgb2JqZWN0IGluZm9ybWF0aW9uOlxuICAvLyAgICogYHN0YXQuc2l6ZWAgX251bWJlcl86IHNpemUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYHN0YXQuZXRhZ2AgX3N0cmluZ186IGV0YWcgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYHN0YXQubWV0YURhdGFgIF9zdHJpbmdfOiBNZXRhRGF0YSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgc3RhdC5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICAvLyAgICogYHN0YXQudmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbiBpZCBvZiB0aGUgb2JqZWN0IGlmIGF2YWlsYWJsZVxuICBzdGF0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHN0YXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChpc0Z1bmN0aW9uKHN0YXRPcHRzKSkge1xuICAgICAgY2IgPSBzdGF0T3B0c1xuICAgICAgc3RhdE9wdHMgPSB7fVxuICAgIH1cblxuICAgIGlmICghaXNPYmplY3Qoc3RhdE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdzdGF0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoc3RhdE9wdHMpXG4gICAgdmFyIG1ldGhvZCA9ICdIRUFEJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRyYWluIHRoZSBzb2NrZXQgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZC4gTm90ZSB0aGF0IHRoaXNcbiAgICAgIC8vIGlzIG5vdCBleHBlbnNpdmUgYXMgdGhlIHNvY2tldCB3aWxsIG5vdCBoYXZlIGFueSBkYXRhLlxuICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzaXplOiArcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSxcbiAgICAgICAgbWV0YURhdGE6IGV4dHJhY3RNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZShyZXNwb25zZS5oZWFkZXJzWydsYXN0LW1vZGlmaWVkJ10pLFxuICAgICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICB9XG5cbiAgICAgIGNiKG51bGwsIHJlc3VsdClcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGByZW1vdmVPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJywgZ292ZXJuYW5jZUJ5cGFzczp0cnVlfGZhbHNlLCBmb3JjZURlbGV0ZTp0cnVlfGZhbHNlfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBub24gYG51bGxgIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3JcbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlT3B0cykpIHtcbiAgICAgIGNiID0gcmVtb3ZlT3B0c1xuICAgICAgcmVtb3ZlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChyZW1vdmVPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncmVtb3ZlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHt9XG5cbiAgICBpZiAocmVtb3ZlT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLnZlcnNpb25JZCA9IGAke3JlbW92ZU9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaWYgKHJlbW92ZU9wdHMuZ292ZXJuYW5jZUJ5cGFzcykge1xuICAgICAgaGVhZGVyc1snWC1BbXotQnlwYXNzLUdvdmVybmFuY2UtUmV0ZW50aW9uJ10gPSB0cnVlXG4gICAgfVxuICAgIGlmIChyZW1vdmVPcHRzLmZvcmNlRGVsZXRlKSB7XG4gICAgICBoZWFkZXJzWyd4LW1pbmlvLWZvcmNlLWRlbGV0ZSddID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gICAgbGV0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMgfVxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnNbJ3F1ZXJ5J10gPSBxdWVyeVxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwLCAyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCB0aGUgb2JqZWN0cyByZXNpZGluZyBpbiB0aGUgb2JqZWN0c0xpc3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3RzTGlzdGAgX2FycmF5XzogYXJyYXkgb2Ygb2JqZWN0cyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWVzIGFzIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG9iamVjdCBrZXlzOiAgWydvYmplY3RuYW1lMScsJ29iamVjdG5hbWUyJ11cbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWUgYW5kIHZlcnNpb25JZCBhcyBhbiBvYmplY3Q6ICBbe25hbWU6XCJvYmplY3RuYW1lXCIsdmVyc2lvbklkOlwibXktdmVyc2lvbi1pZFwifV1cblxuICByZW1vdmVPYmplY3RzKGJ1Y2tldE5hbWUsIG9iamVjdHNMaXN0LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3RzTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29iamVjdHNMaXN0IHNob3VsZCBiZSBhIGxpc3QnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEVudHJpZXMgPSAxMDAwXG4gICAgY29uc3QgcXVlcnkgPSAnZGVsZXRlJ1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQT1NUJ1xuXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdHNMaXN0LnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICAgIHJlc3VsdC5saXN0LnB1c2goZW50cnkpXG4gICAgICAgIGlmIChyZXN1bHQubGlzdC5sZW5ndGggPT09IG1heEVudHJpZXMpIHtcbiAgICAgICAgICByZXN1bHQubGlzdE9mTGlzdC5wdXNoKHJlc3VsdC5saXN0KVxuICAgICAgICAgIHJlc3VsdC5saXN0ID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9LFxuICAgICAgeyBsaXN0T2ZMaXN0OiBbXSwgbGlzdDogW10gfSxcbiAgICApXG5cbiAgICBpZiAocmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0Lmxpc3RPZkxpc3QucHVzaChyZXN1bHQubGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcbiAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBbXVxuXG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIHJlc3VsdC5saXN0T2ZMaXN0LFxuICAgICAgKGxpc3QsIGJhdGNoQ2IpID0+IHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXVxuICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgb2JqZWN0cy5wdXNoKHsgS2V5OiB2YWx1ZS5uYW1lLCBWZXJzaW9uSWQ6IHZhbHVlLnZlcnNpb25JZCB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmplY3RzLnB1c2goeyBLZXk6IHZhbHVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsZXQgZGVsZXRlT2JqZWN0cyA9IHsgRGVsZXRlOiB7IFF1aWV0OiB0cnVlLCBPYmplY3Q6IG9iamVjdHMgfSB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSB9KVxuICAgICAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZGVsZXRlT2JqZWN0cylcbiAgICAgICAgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHBheWxvYWQpXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuXG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgICAgIGxldCByZW1vdmVPYmplY3RzUmVzdWx0XG4gICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXRjaENiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLnJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lcigpKVxuICAgICAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlT2JqZWN0c1Jlc3VsdCA9IGRhdGFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoQ2IoZSwgbnVsbClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLnB1c2gocmVtb3ZlT2JqZWN0c1Jlc3VsdClcbiAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoQ2IobnVsbCwgcmVtb3ZlT2JqZWN0c1Jlc3VsdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjYihudWxsLCBfLmZsYXR0ZW4oYmF0Y2hSZXN1bHRzKSlcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gR2V0IHRoZSBwb2xpY3kgb24gYSBidWNrZXQgb3IgYW4gb2JqZWN0IHByZWZpeC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGNhbGxiYWNrKGVyciwgcG9saWN5KWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgZnVuY3Rpb25cbiAgZ2V0QnVja2V0UG9saWN5KGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgLy8gVmFsaWRhdGUgYXJndW1lbnRzLlxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3BvbGljeSdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgcG9saWN5ID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5nZXRDb25jYXRlcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gKHBvbGljeSA9IGRhdGEpKVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHBvbGljeS50b1N0cmluZygpKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBTZXQgdGhlIHBvbGljeSBvbiBhIGJ1Y2tldCBvciBhbiBvYmplY3QgcHJlZml4LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgYnVja2V0UG9saWN5YCBfc3RyaW5nXzogYnVja2V0IHBvbGljeSAoSlNPTiBzdHJpbmdpZnknZWQpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uXG4gIHNldEJ1Y2tldFBvbGljeShidWNrZXROYW1lLCBwb2xpY3ksIGNiKSB7XG4gICAgLy8gVmFsaWRhdGUgYXJndW1lbnRzLlxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocG9saWN5KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0UG9saWN5RXJyb3IoYEludmFsaWQgYnVja2V0IHBvbGljeTogJHtwb2xpY3l9IC0gbXVzdCBiZSBcInN0cmluZ1wiYClcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBsZXQgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBsZXQgcXVlcnkgPSAncG9saWN5J1xuXG4gICAgaWYgKHBvbGljeSkge1xuICAgICAgbWV0aG9kID0gJ1BVVCdcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwb2xpY3ksIFsyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBnZW5lcmljIHByZXNpZ25lZCBVUkwgd2hpY2ggY2FuIGJlXG4gIC8vIHVzZWQgZm9yIEhUVFAgbWV0aG9kcyBHRVQsIFBVVCwgSEVBRCBhbmQgREVMRVRFXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgbWV0aG9kYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgSFRUUCBtZXRob2RcbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGV4cGlyeWAgX251bWJlcl86IGV4cGlyeSBpbiBzZWNvbmRzIChvcHRpb25hbCwgZGVmYXVsdCA3IGRheXMpXG4gIC8vICogYHJlcVBhcmFtc2AgX29iamVjdF86IHJlcXVlc3QgcGFyYW1ldGVycyAob3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwiMTBmYTk5NDYtM2Y2NC00MTM3LWE1OGYtODg4MDY1YzA3MzJlXCJ9XG4gIC8vICogYHJlcXVlc3REYXRlYCBfRGF0ZV86IEEgZGF0ZSBvYmplY3QsIHRoZSB1cmwgd2lsbCBiZSBpc3N1ZWQgYXQgKG9wdGlvbmFsKVxuICBwcmVzaWduZWRVcmwobWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXFQYXJhbXMsIHJlcXVlc3REYXRlLCBjYikge1xuICAgIGlmICh0aGlzLmFub255bW91cykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Bbm9ueW1vdXNSZXF1ZXN0RXJyb3IoJ1ByZXNpZ25lZCAnICsgbWV0aG9kICsgJyB1cmwgY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgYW5vbnltb3VzIHJlcXVlc3RzJylcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVxdWVzdERhdGUpKSB7XG4gICAgICBjYiA9IHJlcXVlc3REYXRlXG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVxUGFyYW1zKSkge1xuICAgICAgY2IgPSByZXFQYXJhbXNcbiAgICAgIHJlcVBhcmFtcyA9IHt9XG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oZXhwaXJlcykpIHtcbiAgICAgIGNiID0gZXhwaXJlc1xuICAgICAgcmVxUGFyYW1zID0ge31cbiAgICAgIGV4cGlyZXMgPSAyNCAqIDYwICogNjAgKiA3IC8vIDcgZGF5cyBpbiBzZWNvbmRzXG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihleHBpcmVzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwaXJlcyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChyZXFQYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXFQYXJhbXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZERhdGUocmVxdWVzdERhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXF1ZXN0RGF0ZSBzaG91bGQgYmUgb2YgdHlwZSBcIkRhdGVcIiBhbmQgdmFsaWQnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkocmVxUGFyYW1zKVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKGJ1Y2tldE5hbWUsIChlLCByZWdpb24pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgaXMgYWRkZWQgdG8gZW5zdXJlIHRoYXQgd2Ugc2VuZCBlcnJvciB0aHJvdWdoXG4gICAgICAvLyBjYWxsYmFjayBvbiBwcmVzaWduIGZhaWx1cmUuXG4gICAgICB2YXIgdXJsXG4gICAgICB2YXIgcmVxT3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoeyBtZXRob2QsIHJlZ2lvbiwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSlcblxuICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBwcmVzaWduU2lnbmF0dXJlVjQoXG4gICAgICAgICAgcmVxT3B0aW9ucyxcbiAgICAgICAgICB0aGlzLmFjY2Vzc0tleSxcbiAgICAgICAgICB0aGlzLnNlY3JldEtleSxcbiAgICAgICAgICB0aGlzLnNlc3Npb25Ub2tlbixcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgcmVxdWVzdERhdGUsXG4gICAgICAgICAgZXhwaXJlcyxcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAocGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKHBlKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdXJsKVxuICAgIH0pXG4gIH1cblxuICAvLyBHZW5lcmF0ZSBhIHByZXNpZ25lZCBVUkwgZm9yIEdFVFxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICAvLyAqIGByZXNwSGVhZGVyc2AgX29iamVjdF86IHJlc3BvbnNlIGhlYWRlcnMgdG8gb3ZlcnJpZGUgb3IgcmVxdWVzdCBwYXJhbXMgZm9yIHF1ZXJ5IChvcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCIxMGZhOTk0Ni0zZjY0LTQxMzctYTU4Zi04ODgwNjVjMDczMmVcIn1cbiAgLy8gKiBgcmVxdWVzdERhdGVgIF9EYXRlXzogQSBkYXRlIG9iamVjdCwgdGhlIHVybCB3aWxsIGJlIGlzc3VlZCBhdCAob3B0aW9uYWwpXG4gIHByZXNpZ25lZEdldE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXNwSGVhZGVycywgcmVxdWVzdERhdGUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihyZXNwSGVhZGVycykpIHtcbiAgICAgIGNiID0gcmVzcEhlYWRlcnNcbiAgICAgIHJlc3BIZWFkZXJzID0ge31cbiAgICAgIHJlcXVlc3REYXRlID0gbmV3IERhdGUoKVxuICAgIH1cblxuICAgIHZhciB2YWxpZFJlc3BIZWFkZXJzID0gW1xuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtdHlwZScsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1sYW5ndWFnZScsXG4gICAgICAncmVzcG9uc2UtZXhwaXJlcycsXG4gICAgICAncmVzcG9uc2UtY2FjaGUtY29udHJvbCcsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbicsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1lbmNvZGluZycsXG4gICAgXVxuICAgIHZhbGlkUmVzcEhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICBpZiAocmVzcEhlYWRlcnMgIT09IHVuZGVmaW5lZCAmJiByZXNwSGVhZGVyc1toZWFkZXJdICE9PSB1bmRlZmluZWQgJiYgIWlzU3RyaW5nKHJlc3BIZWFkZXJzW2hlYWRlcl0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHJlc3BvbnNlIGhlYWRlciAke2hlYWRlcn0gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcImApXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5wcmVzaWduZWRVcmwoJ0dFVCcsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGV4cGlyZXMsIHJlc3BIZWFkZXJzLCByZXF1ZXN0RGF0ZSwgY2IpXG4gIH1cblxuICAvLyBHZW5lcmF0ZSBhIHByZXNpZ25lZCBVUkwgZm9yIFBVVC4gVXNpbmcgdGhpcyBVUkwsIHRoZSBicm93c2VyIGNhbiB1cGxvYWQgdG8gUzMgb25seSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG5hbWUuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGV4cGlyeWAgX251bWJlcl86IGV4cGlyeSBpbiBzZWNvbmRzIChvcHRpb25hbCwgZGVmYXVsdCA3IGRheXMpXG4gIHByZXNpZ25lZFB1dE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByZXNpZ25lZFVybCgnUFVUJywgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgY2IpXG4gIH1cblxuICAvLyByZXR1cm4gUG9zdFBvbGljeSBvYmplY3RcbiAgbmV3UG9zdFBvbGljeSgpIHtcbiAgICByZXR1cm4gbmV3IFBvc3RQb2xpY3koKVxuICB9XG5cbiAgLy8gcHJlc2lnbmVkUG9zdFBvbGljeSBjYW4gYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlIHdhbnQgbW9yZSBjb250cm9sIG9uIHRoZSB1cGxvYWQgdGhhbiB3aGF0XG4gIC8vIHByZXNpZ25lZFB1dE9iamVjdCgpIHByb3ZpZGVzLiBpLmUgVXNpbmcgcHJlc2lnbmVkUG9zdFBvbGljeSB3ZSB3aWxsIGJlIGFibGUgdG8gcHV0IHBvbGljeSByZXN0cmljdGlvbnNcbiAgLy8gb24gdGhlIG9iamVjdCdzIGBuYW1lYCBgYnVja2V0YCBgZXhwaXJ5YCBgQ29udGVudC1UeXBlYCBgQ29udGVudC1EaXNwb3NpdGlvbmAgYG1ldGFEYXRhYFxuICBwcmVzaWduZWRQb3N0UG9saWN5KHBvc3RQb2xpY3ksIGNiKSB7XG4gICAgaWYgKHRoaXMuYW5vbnltb3VzKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkFub255bW91c1JlcXVlc3RFcnJvcignUHJlc2lnbmVkIFBPU1QgcG9saWN5IGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIGFub255bW91cyByZXF1ZXN0cycpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocG9zdFBvbGljeSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Bvc3RQb2xpY3kgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKHBvc3RQb2xpY3kuZm9ybURhdGEuYnVja2V0LCAoZSwgcmVnaW9uKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgdmFyIGRhdGVTdHIgPSBtYWtlRGF0ZUxvbmcoZGF0ZSlcblxuICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG5cbiAgICAgIGlmICghcG9zdFBvbGljeS5wb2xpY3kuZXhwaXJhdGlvbikge1xuICAgICAgICAvLyAnZXhwaXJhdGlvbicgaXMgbWFuZGF0b3J5IGZpZWxkIGZvciBTMy5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgZXhwaXJhdGlvbiBkYXRlIG9mIDcgZGF5cy5cbiAgICAgICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGV4cGlyZXMuc2V0U2Vjb25kcygyNCAqIDYwICogNjAgKiA3KVxuICAgICAgICBwb3N0UG9saWN5LnNldEV4cGlyZXMoZXhwaXJlcylcbiAgICAgIH1cblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWRhdGUnLCBkYXRlU3RyXSlcbiAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LWRhdGUnXSA9IGRhdGVTdHJcblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWFsZ29yaXRobScsICdBV1M0LUhNQUMtU0hBMjU2J10pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1hbGdvcml0aG0nXSA9ICdBV1M0LUhNQUMtU0hBMjU2J1xuXG4gICAgICBwb3N0UG9saWN5LnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckeC1hbXotY3JlZGVudGlhbCcsIHRoaXMuYWNjZXNzS2V5ICsgJy8nICsgZ2V0U2NvcGUocmVnaW9uLCBkYXRlKV0pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1jcmVkZW50aWFsJ10gPSB0aGlzLmFjY2Vzc0tleSArICcvJyArIGdldFNjb3BlKHJlZ2lvbiwgZGF0ZSlcblxuICAgICAgaWYgKHRoaXMuc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1zZWN1cml0eS10b2tlbicsIHRoaXMuc2Vzc2lvblRva2VuXSlcbiAgICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotc2VjdXJpdHktdG9rZW4nXSA9IHRoaXMuc2Vzc2lvblRva2VuXG4gICAgICB9XG5cbiAgICAgIHZhciBwb2xpY3lCYXNlNjQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwb3N0UG9saWN5LnBvbGljeSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhLnBvbGljeSA9IHBvbGljeUJhc2U2NFxuXG4gICAgICB2YXIgc2lnbmF0dXJlID0gcG9zdFByZXNpZ25TaWduYXR1cmVWNChyZWdpb24sIGRhdGUsIHRoaXMuc2VjcmV0S2V5LCBwb2xpY3lCYXNlNjQpXG5cbiAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LXNpZ25hdHVyZSddID0gc2lnbmF0dXJlXG4gICAgICB2YXIgb3B0cyA9IHt9XG4gICAgICBvcHRzLnJlZ2lvbiA9IHJlZ2lvblxuICAgICAgb3B0cy5idWNrZXROYW1lID0gcG9zdFBvbGljeS5mb3JtRGF0YS5idWNrZXRcbiAgICAgIHZhciByZXFPcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucyhvcHRzKVxuICAgICAgdmFyIHBvcnRTdHIgPSB0aGlzLnBvcnQgPT0gODAgfHwgdGhpcy5wb3J0ID09PSA0NDMgPyAnJyA6IGA6JHt0aGlzLnBvcnQudG9TdHJpbmcoKX1gXG4gICAgICB2YXIgdXJsU3RyID0gYCR7cmVxT3B0aW9ucy5wcm90b2NvbH0vLyR7cmVxT3B0aW9ucy5ob3N0fSR7cG9ydFN0cn0ke3JlcU9wdGlvbnMucGF0aH1gXG4gICAgICBjYihudWxsLCB7IHBvc3RVUkw6IHVybFN0ciwgZm9ybURhdGE6IHBvc3RQb2xpY3kuZm9ybURhdGEgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQ2FsbHMgaW1wbGVtZW50ZWQgYmVsb3cgYXJlIHJlbGF0ZWQgdG8gbXVsdGlwYXJ0LlxuXG4gIC8vIEluaXRpYXRlIGEgbmV3IG11bHRpcGFydCB1cGxvYWQuXG4gIGluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWV0YURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoJ2NvbnRlbnRUeXBlIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgbGV0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBtZXRhRGF0YSlcbiAgICB2YXIgcXVlcnkgPSAndXBsb2FkcydcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIoKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHVwbG9hZElkKSA9PiBjYihudWxsLCB1cGxvYWRJZCkpXG4gICAgfSlcbiAgfVxuXG4gIC8vIENvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLiBBZnRlciBhbGwgdGhlIHBhcnRzIGFyZSB1cGxvYWRlZCBpc3N1aW5nXG4gIC8vIHRoaXMgY2FsbCB3aWxsIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgb24gdGhlIHNlcnZlciBpbnRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIGV0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChldGFncykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwiQXJyYXlcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXJpRXNjYXBlKHVwbG9hZElkKX1gXG5cbiAgICB2YXIgcGFydHMgPSBbXVxuXG4gICAgZXRhZ3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIFBhcnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBQYXJ0TnVtYmVyOiBlbGVtZW50LnBhcnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFVGFnOiBlbGVtZW50LmV0YWcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHZhciBwYXlsb2FkT2JqZWN0ID0geyBDb21wbGV0ZU11bHRpcGFydFVwbG9hZDogcGFydHMgfVxuICAgIHZhciBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJDb2RlKSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBhcnQgQ29tcGxldGUgQVBJIHJldHVybnMgYW4gZXJyb3IgWE1MIGFmdGVyIGEgMjAwIGh0dHAgc3RhdHVzXG4gICAgICAgICAgICBjYihuZXcgZXJyb3JzLlMzRXJyb3IocmVzdWx0LmVyck1lc3NhZ2UpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZU11bHRpcGFydFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IobnVsbCwgY29tcGxldGVNdWx0aXBhcnRSZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBHZXQgcGFydC1pbmZvIG9mIGFsbCBwYXJ0cyBvZiBhbiBpbmNvbXBsZXRlIHVwbG9hZCBzcGVjaWZpZWQgYnkgdXBsb2FkSWQuXG4gIGxpc3RQYXJ0cyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghdXBsb2FkSWQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwbG9hZElkIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgfVxuICAgIHZhciBwYXJ0cyA9IFtdXG4gICAgdmFyIGxpc3ROZXh0ID0gKG1hcmtlcikgPT4ge1xuICAgICAgdGhpcy5saXN0UGFydHNRdWVyeShidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgbWFya2VyLCAoZSwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgY2IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChyZXN1bHQucGFydHMpXG4gICAgICAgIGlmIChyZXN1bHQuaXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgICBsaXN0TmV4dChyZXN1bHQubWFya2VyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNiKG51bGwsIHBhcnRzKVxuICAgICAgfSlcbiAgICB9XG4gICAgbGlzdE5leHQoMClcbiAgfVxuXG4gIC8vIENhbGxlZCBieSBsaXN0UGFydHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBwYXJ0LWluZm9cbiAgbGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIG1hcmtlciwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBpZiAoIXVwbG9hZElkKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd1cGxvYWRJZCBjYW5ub3QgYmUgZW1wdHknKVxuICAgIH1cbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChtYXJrZXIgJiYgbWFya2VyICE9PSAwKSB7XG4gICAgICBxdWVyeSArPSBgcGFydC1udW1iZXItbWFya2VyPSR7bWFya2VyfSZgXG4gICAgfVxuICAgIHF1ZXJ5ICs9IGB1cGxvYWRJZD0ke3VyaUVzY2FwZSh1cGxvYWRJZCl9YFxuXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRMaXN0UGFydHNUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gY2IobnVsbCwgZGF0YSkpXG4gICAgfSlcbiAgfVxuXG4gIC8vIENhbGxlZCBieSBsaXN0SW5jb21wbGV0ZVVwbG9hZHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBpbmNvbXBsZXRlIHVwbG9hZHMuXG4gIGxpc3RJbmNvbXBsZXRlVXBsb2Fkc1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgZGVsaW1pdGVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoa2V5TWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2V5TWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkTWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWRNYXJrZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoZGVsaW1pdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGVsaW1pdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICB2YXIgcXVlcmllcyA9IFtdXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcblxuICAgIGlmIChrZXlNYXJrZXIpIHtcbiAgICAgIGtleU1hcmtlciA9IHVyaUVzY2FwZShrZXlNYXJrZXIpXG4gICAgICBxdWVyaWVzLnB1c2goYGtleS1tYXJrZXI9JHtrZXlNYXJrZXJ9YClcbiAgICB9XG4gICAgaWYgKHVwbG9hZElkTWFya2VyKSB7XG4gICAgICBxdWVyaWVzLnB1c2goYHVwbG9hZC1pZC1tYXJrZXI9JHt1cGxvYWRJZE1hcmtlcn1gKVxuICAgIH1cblxuICAgIHZhciBtYXhVcGxvYWRzID0gMTAwMFxuICAgIHF1ZXJpZXMucHVzaChgbWF4LXVwbG9hZHM9JHttYXhVcGxvYWRzfWApXG4gICAgcXVlcmllcy5zb3J0KClcbiAgICBxdWVyaWVzLnVuc2hpZnQoJ3VwbG9hZHMnKVxuICAgIHZhciBxdWVyeSA9ICcnXG4gICAgaWYgKHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyaWVzLmpvaW4oJyYnKX1gXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmVtaXQoJ2Vycm9yJywgZSlcbiAgICAgIH1cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgfSlcbiAgICByZXR1cm4gdHJhbnNmb3JtZXJcbiAgfVxuXG4gIC8vIEZpbmQgdXBsb2FkSWQgb2YgYW4gaW5jb21wbGV0ZSB1cGxvYWQuXG4gIGZpbmRVcGxvYWRJZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBsYXRlc3RVcGxvYWRcbiAgICB2YXIgbGlzdE5leHQgPSAoa2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlcikgPT4ge1xuICAgICAgdGhpcy5saXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXROYW1lLCBvYmplY3ROYW1lLCBrZXlNYXJrZXIsIHVwbG9hZElkTWFya2VyLCAnJylcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC51cGxvYWRzLmZvckVhY2goKHVwbG9hZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVwbG9hZC5rZXkgPT09IG9iamVjdE5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCFsYXRlc3RVcGxvYWQgfHwgdXBsb2FkLmluaXRpYXRlZC5nZXRUaW1lKCkgPiBsYXRlc3RVcGxvYWQuaW5pdGlhdGVkLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIGxhdGVzdFVwbG9hZCA9IHVwbG9hZFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBsaXN0TmV4dChyZXN1bHQubmV4dEtleU1hcmtlciwgcmVzdWx0Lm5leHRVcGxvYWRJZE1hcmtlcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF0ZXN0VXBsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbGF0ZXN0VXBsb2FkLnVwbG9hZElkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYihudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGxpc3ROZXh0KCcnLCAnJylcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB1cGxvYWRpbmcgb2JqZWN0cy5cbiAgLy8gSWYgbXVsdGlwYXJ0ID09PSB0cnVlLCBpdCByZXR1cm5zIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byB1cGxvYWRcbiAgLy8gYSBwYXJ0IG9mIHRoZSBtdWx0aXBhcnQuXG4gIGdldFVwbG9hZGVyKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBtdWx0aXBhcnQpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihtdWx0aXBhcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdWx0aXBhcnQgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KG1ldGFEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWV0YWRhdGEgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgdmFyIHZhbGlkYXRlID0gKHN0cmVhbSwgbGVuZ3RoLCBzaGEyNTZzdW0sIG1kNXN1bSwgY2IpID0+IHtcbiAgICAgIGlmICghaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmVhbSBzaG91bGQgYmUgb2YgdHlwZSBcIlN0cmVhbVwiJylcbiAgICAgIH1cbiAgICAgIGlmICghaXNOdW1iZXIobGVuZ3RoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsZW5ndGggc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgICBpZiAoIWlzU3RyaW5nKHNoYTI1NnN1bSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFpc1N0cmluZyhtZDVzdW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21kNXN1bSBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICAgIH1cbiAgICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHNpbXBsZVVwbG9hZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHZhbGlkYXRlKC4uLmFyZ3MpXG4gICAgICB2YXIgcXVlcnkgPSAnJ1xuICAgICAgdXBsb2FkKHF1ZXJ5LCAuLi5hcmdzKVxuICAgIH1cbiAgICB2YXIgbXVsdGlwYXJ0VXBsb2FkZXIgPSAodXBsb2FkSWQsIHBhcnROdW1iZXIsIC4uLnJlc3QpID0+IHtcbiAgICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFpc051bWJlcihwYXJ0TnVtYmVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJ0TnVtYmVyIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgICAgfVxuICAgICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbXB0eSB1cGxvYWRJZCcpXG4gICAgICB9XG4gICAgICBpZiAoIXBhcnROdW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncGFydE51bWJlciBjYW5ub3QgYmUgMCcpXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZSguLi5yZXN0KVxuICAgICAgdmFyIHF1ZXJ5ID0gYHBhcnROdW1iZXI9JHtwYXJ0TnVtYmVyfSZ1cGxvYWRJZD0ke3VyaUVzY2FwZSh1cGxvYWRJZCl9YFxuICAgICAgdXBsb2FkKHF1ZXJ5LCAuLi5yZXN0KVxuICAgIH1cbiAgICB2YXIgdXBsb2FkID0gKHF1ZXJ5LCBzdHJlYW0sIGxlbmd0aCwgc2hhMjU2c3VtLCBtZDVzdW0sIGNiKSA9PiB7XG4gICAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICAgIGxldCBoZWFkZXJzID0geyAnQ29udGVudC1MZW5ndGgnOiBsZW5ndGggfVxuXG4gICAgICBpZiAoIW11bHRpcGFydCkge1xuICAgICAgICBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgbWV0YURhdGEsIGhlYWRlcnMpXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IG1kNXN1bVxuICAgICAgfVxuICAgICAgdGhpcy5tYWtlUmVxdWVzdFN0cmVhbShcbiAgICAgICAgeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgc2hhMjU2c3VtLFxuICAgICAgICBbMjAwXSxcbiAgICAgICAgJycsXG4gICAgICAgIHRydWUsXG4gICAgICAgIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICAgIGlmIChtdWx0aXBhcnQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBhcnRVcGxvYWRlclxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlVXBsb2FkZXJcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9ucyBpbiB0aGUgUzMgcHJvdmlkZXJcbiAgc2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNvbmZpZywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdGlmaWNhdGlvbiBjb25maWcgc2hvdWxkIGJlIG9mIHR5cGUgXCJPYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBxdWVyeSA9ICdub3RpZmljYXRpb24nXG4gICAgdmFyIGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdOb3RpZmljYXRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICB2YXIgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgcmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgdGhpcy5zZXRCdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgbmV3IE5vdGlmaWNhdGlvbkNvbmZpZygpLCBjYilcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgbGlzdCBvZiBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbnMgc3RvcmVkXG4gIC8vIGluIHRoZSBTMyBwcm92aWRlclxuICBnZXRCdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgcXVlcnkgPSAnbm90aWZpY2F0aW9uJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKVxuICAgICAgdmFyIGJ1Y2tldE5vdGlmaWNhdGlvblxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4gKGJ1Y2tldE5vdGlmaWNhdGlvbiA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgYnVja2V0Tm90aWZpY2F0aW9uKSlcbiAgICB9KVxuICB9XG5cbiAgLy8gTGlzdGVucyBmb3IgYnVja2V0IG5vdGlmaWNhdGlvbnMuIFJldHVybnMgYW4gRXZlbnRFbWl0dGVyLlxuICBsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgcHJlZml4LCBzdWZmaXgsIGV2ZW50cykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN1ZmZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N1ZmZpeCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V2ZW50cyBtdXN0IGJlIG9mIHR5cGUgQXJyYXknKVxuICAgIH1cbiAgICBsZXQgbGlzdGVuZXIgPSBuZXcgTm90aWZpY2F0aW9uUG9sbGVyKHRoaXMsIGJ1Y2tldE5hbWUsIHByZWZpeCwgc3VmZml4LCBldmVudHMpXG4gICAgbGlzdGVuZXIuc3RhcnQoKVxuXG4gICAgcmV0dXJuIGxpc3RlbmVyXG4gIH1cblxuICBnZXRCdWNrZXRWZXJzaW9uaW5nKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ3ZlcnNpb25pbmcnXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgdmVyc2lvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgdmVyc2lvbkNvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCB2ZXJzaW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzZXRCdWNrZXRWZXJzaW9uaW5nKGJ1Y2tldE5hbWUsIHZlcnNpb25Db25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFPYmplY3Qua2V5cyh2ZXJzaW9uQ29uZmlnKS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3ZlcnNpb25Db25maWcgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdQVVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ3ZlcnNpb25pbmcnXG4gICAgdmFyIGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdWZXJzaW9uaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgdmFyIHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHZlcnNpb25Db25maWcpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBUbyBzZXQgVGFncyBvbiBhIGJ1Y2tldCBvciBvYmplY3QgYmFzZWQgb24gdGhlIHBhcmFtc1xuICAgKiAgX19Bcmd1bWVudHNfX1xuICAgKiB0YWdnaW5nUGFyYW1zIF9vYmplY3RfIFdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllc1xuICAgKiAgYnVja2V0TmFtZSBfc3RyaW5nXyxcbiAgICogIG9iamVjdE5hbWUgX3N0cmluZ18gKE9wdGlvbmFsKSxcbiAgICogIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiAgcHV0T3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqICBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRUYWdnaW5nKHRhZ2dpbmdQYXJhbXMpIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMgPSB7fSwgY2IgfSA9IHRhZ2dpbmdQYXJhbXNcbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICd0YWdnaW5nJ1xuXG4gICAgaWYgKHB1dE9wdHMgJiYgcHV0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke3B1dE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgdGFnc0xpc3QgPSBbXVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICB0YWdzTGlzdC5wdXNoKHsgS2V5OiBrZXksIFZhbHVlOiB2YWx1ZSB9KVxuICAgIH1cbiAgICBjb25zdCB0YWdnaW5nQ29uZmlnID0ge1xuICAgICAgVGFnZ2luZzoge1xuICAgICAgICBUYWdTZXQ6IHtcbiAgICAgICAgICBUYWc6IHRhZ3NMaXN0LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IGhlYWRsZXNzOiB0cnVlLCByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdCh0YWdnaW5nQ29uZmlnKVxuICAgIHBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShwYXlsb2FkKVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH1cblxuICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICByZXF1ZXN0T3B0aW9uc1snb2JqZWN0TmFtZSddID0gb2JqZWN0TmFtZVxuICAgIH1cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLyoqIFNldCBUYWdzIG9uIGEgQnVja2V0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHNldEJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgdGFncywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHRhZ3MpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heGltdW0gdGFncyBhbGxvd2VkIGlzIDEwXCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldFRhZ2dpbmcoeyBidWNrZXROYW1lLCB0YWdzLCBjYiB9KVxuICB9XG5cbiAgLyoqIFNldCBUYWdzIG9uIGFuIE9iamVjdFxuICAgKiBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogb2JqZWN0TmFtZSBfc3RyaW5nX1xuICAgKiAgKiB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogIHB1dE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9LFxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0T2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihwdXRPcHRzKSkge1xuICAgICAgY2IgPSBwdXRPcHRzXG4gICAgICBwdXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KHRhZ3MpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ01heGltdW0gdGFncyBhbGxvd2VkIGlzIDEwXCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldFRhZ2dpbmcoeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzLCBjYiB9KVxuICB9XG5cbiAgLyoqIFJlbW92ZSBUYWdzIG9uIGFuIEJ1Y2tldC9PYmplY3QgYmFzZWQgb24gcGFyYW1zXG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfIChvcHRpb25hbClcbiAgICogcmVtb3ZlT3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmVtb3ZlT3B0cywgY2IgfSkge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgbGV0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG5cbiAgICBpZiAocmVtb3ZlT3B0cyAmJiBPYmplY3Qua2V5cyhyZW1vdmVPcHRzKS5sZW5ndGggJiYgcmVtb3ZlT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke3JlbW92ZU9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwLCAyMDRdLCAnJywgdHJ1ZSwgY2IpXG4gIH1cblxuICAvKiogUmVtb3ZlIFRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYnVja2V0XG4gICAqICBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZUJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgY2IgfSlcbiAgfVxuXG4gIC8qKiBSZW1vdmUgdGFncyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfXG4gICAqIHJlbW92ZU9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcuIHtWZXJzaW9uSUQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifVxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcmVtb3ZlT2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCByZW1vdmVPcHRzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBvYmplY3QgbmFtZTogJyArIG9iamVjdE5hbWUpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlbW92ZU9wdHMpKSB7XG4gICAgICBjYiA9IHJlbW92ZU9wdHNcbiAgICAgIHJlbW92ZU9wdHMgPSB7fVxuICAgIH1cbiAgICBpZiAocmVtb3ZlT3B0cyAmJiBPYmplY3Qua2V5cyhyZW1vdmVPcHRzKS5sZW5ndGggJiYgIWlzT2JqZWN0KHJlbW92ZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZW1vdmVPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlVGFnZ2luZyh7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMsIGNiIH0pXG4gIH1cblxuICAvKiogR2V0IFRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgQnVja2V0XG4gICAqICBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yLCB0YWdzKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIGdldEJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0VGFnc1RyYW5zZm9ybWVyKClcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgbGV0IHRhZ3NMaXN0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAodGFnc0xpc3QgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRhZ3NMaXN0KSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEdldCB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggYSBidWNrZXQgT1IgYW4gb2JqZWN0XG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogb2JqZWN0TmFtZSBfc3RyaW5nXyAoT3B0aW9uYWwpXG4gICAqIGdldE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9XG4gICAqIGBjYihlcnJvciwgdGFncylgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBnZXRPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMgPSB7fSwgY2IgPSAoKSA9PiBmYWxzZSkge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgb2JqZWN0IG5hbWU6ICcgKyBvYmplY3ROYW1lKVxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignZ2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoZ2V0T3B0cyAmJiBnZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyeX0mdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9XG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRUYWdzVHJhbnNmb3JtZXIoKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBsZXQgdGFnc0xpc3RcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+ICh0YWdzTGlzdCA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgdGFnc0xpc3QpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogcG9saWN5Q29uZmlnIF9vYmplY3RfIGEgdmFsaWQgcG9saWN5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgYXBwbHlCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgcG9saWN5Q29uZmlnLCBjYikge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuXG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ0xpZmVjeWNsZUNvbmZpZ3VyYXRpb24nLFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChwb2xpY3lDb25maWcpXG4gICAgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHBheWxvYWQpXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogUmVtb3ZlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9mIGEgYnVja2V0LlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2xpZmVjeWNsZSdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogU2V0L092ZXJyaWRlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9uIGEgYnVja2V0LiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBlbXB0eSwgaXQgcmVtb3ZlcyB0aGUgY29uZmlndXJhdGlvbi5cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBsaWZlQ3ljbGVDb25maWcgX29iamVjdF8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAobnVsbCBvciAnJykgdG8gcmVtb3ZlIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvbi4gb3IgYSB2YWxpZCBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGxpZmVDeWNsZUNvbmZpZyA9IG51bGwsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShsaWZlQ3ljbGVDb25maWcpKSB7XG4gICAgICB0aGlzLnJlbW92ZUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBseUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBsaWZlQ3ljbGVDb25maWcsIGNiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGNvbmZpZylgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGFzIHRoZSBlcnJvciBhcmd1bWVudC5cbiAgICovXG4gIGdldEJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMubGlmZWN5Y2xlVHJhbnNmb3JtZXIoKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBsZXQgbGlmZWN5Y2xlQ29uZmlnXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAobGlmZWN5Y2xlQ29uZmlnID0gcmVzdWx0KSlcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiBjYihudWxsLCBsaWZlY3ljbGVDb25maWcpKVxuICAgIH0pXG4gIH1cblxuICBzZXRPYmplY3RMb2NrQ29uZmlnKGJ1Y2tldE5hbWUsIGxvY2tDb25maWdPcHRzID0ge30sIGNiKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uTW9kZXMgPSBbUkVURU5USU9OX01PREVTLkNPTVBMSUFOQ0UsIFJFVEVOVElPTl9NT0RFUy5HT1ZFUk5BTkNFXVxuICAgIGNvbnN0IHZhbGlkVW5pdHMgPSBbUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLkRBWVMsIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSU11cblxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGxvY2tDb25maWdPcHRzLm1vZGUgJiYgIXJldGVudGlvbk1vZGVzLmluY2x1ZGVzKGxvY2tDb25maWdPcHRzLm1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy5tb2RlIHNob3VsZCBiZSBvbmUgb2YgJHtyZXRlbnRpb25Nb2Rlc31gKVxuICAgIH1cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMudW5pdCAmJiAhdmFsaWRVbml0cy5pbmNsdWRlcyhsb2NrQ29uZmlnT3B0cy51bml0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgbG9ja0NvbmZpZ09wdHMudW5pdCBzaG91bGQgYmUgb25lIG9mICR7dmFsaWRVbml0c31gKVxuICAgIH1cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgJiYgIWlzTnVtYmVyKGxvY2tDb25maWdPcHRzLnZhbGlkaXR5KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgbG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgc2hvdWxkIGJlIGEgbnVtYmVyYClcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ29iamVjdC1sb2NrJ1xuXG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIE9iamVjdExvY2tFbmFibGVkOiAnRW5hYmxlZCcsXG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhsb2NrQ29uZmlnT3B0cylcbiAgICAvLyBDaGVjayBpZiBrZXlzIGFyZSBwcmVzZW50IGFuZCBhbGwga2V5cyBhcmUgcHJlc2VudC5cbiAgICBpZiAoY29uZmlnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXy5kaWZmZXJlbmNlKGNvbmZpZ0tleXMsIFsndW5pdCcsICdtb2RlJywgJ3ZhbGlkaXR5J10pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBsb2NrQ29uZmlnT3B0cy5tb2RlLGxvY2tDb25maWdPcHRzLnVuaXQsbG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgYWxsIHRoZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzcGVjaWZpZWQuYCxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnLlJ1bGUgPSB7XG4gICAgICAgICAgRGVmYXVsdFJldGVudGlvbjoge30sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2tDb25maWdPcHRzLm1vZGUpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLk1vZGUgPSBsb2NrQ29uZmlnT3B0cy5tb2RlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2tDb25maWdPcHRzLnVuaXQgPT09IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5EQVlTKSB7XG4gICAgICAgICAgY29uZmlnLlJ1bGUuRGVmYXVsdFJldGVudGlvbi5EYXlzID0gbG9ja0NvbmZpZ09wdHMudmFsaWRpdHlcbiAgICAgICAgfSBlbHNlIGlmIChsb2NrQ29uZmlnT3B0cy51bml0ID09PSBSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuWUVBUlMpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLlllYXJzID0gbG9ja0NvbmZpZ09wdHMudmFsaWRpdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdPYmplY3RMb2NrQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldE9iamVjdExvY2tDb25maWcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ29iamVjdC1sb2NrJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IG9iamVjdExvY2tDb25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdExvY2tUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIG9iamVjdExvY2tDb25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgb2JqZWN0TG9ja0NvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHV0T2JqZWN0UmV0ZW50aW9uKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJldGVudGlvbk9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHJldGVudGlvbk9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXRlbnRpb25PcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzICYmICFpc0Jvb2xlYW4ocmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBnb3Zlcm5hbmNlQnlwYXNzJywgcmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZXRlbnRpb25PcHRzLm1vZGUgJiZcbiAgICAgICAgIVtSRVRFTlRJT05fTU9ERVMuQ09NUExJQU5DRSwgUkVURU5USU9OX01PREVTLkdPVkVSTkFOQ0VdLmluY2x1ZGVzKHJldGVudGlvbk9wdHMubW9kZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIG9iamVjdCByZXRlbnRpb24gbW9kZSAnLCByZXRlbnRpb25PcHRzLm1vZGUpXG4gICAgICB9XG4gICAgICBpZiAocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUgJiYgIWlzU3RyaW5nKHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciByZXRhaW5VbnRpbERhdGUnLCByZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSlcbiAgICAgIH1cbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcocmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHZlcnNpb25JZCcsIHJldGVudGlvbk9wdHMudmVyc2lvbklkKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3JldGVudGlvbidcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGlmIChyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpIHtcbiAgICAgIGhlYWRlcnNbJ1gtQW16LUJ5cGFzcy1Hb3Zlcm5hbmNlLVJldGVudGlvbiddID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyByb290TmFtZTogJ1JldGVudGlvbicsIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuICAgIGNvbnN0IHBhcmFtcyA9IHt9XG5cbiAgICBpZiAocmV0ZW50aW9uT3B0cy5tb2RlKSB7XG4gICAgICBwYXJhbXMuTW9kZSA9IHJldGVudGlvbk9wdHMubW9kZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUpIHtcbiAgICAgIHBhcmFtcy5SZXRhaW5VbnRpbERhdGUgPSByZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7cmV0ZW50aW9uT3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChwYXJhbXMpXG5cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwLCAyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgZ2V0T2JqZWN0UmV0ZW50aW9uKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfSBlbHNlIGlmIChnZXRPcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcoZ2V0T3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdWZXJzaW9uSUQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChjYiAmJiAhaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3JldGVudGlvbidcbiAgICBpZiAoZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCByZXRlbnRpb25Db25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0ZW50aW9uQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHJldGVudGlvbkNvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0QnVja2V0RW5jcnlwdGlvbihidWNrZXROYW1lLCBlbmNyeXB0aW9uQ29uZmlnLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oZW5jcnlwdGlvbkNvbmZpZykpIHtcbiAgICAgIGNiID0gZW5jcnlwdGlvbkNvbmZpZ1xuICAgICAgZW5jcnlwdGlvbkNvbmZpZyA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlbmNyeXB0aW9uQ29uZmlnKSAmJiBlbmNyeXB0aW9uQ29uZmlnLlJ1bGUubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBSdWxlIGxlbmd0aC4gT25seSBvbmUgcnVsZSBpcyBhbGxvd2VkLjogJyArIGVuY3J5cHRpb25Db25maWcuUnVsZSlcbiAgICB9XG4gICAgaWYgKGNiICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBsZXQgZW5jcnlwdGlvbk9iaiA9IGVuY3J5cHRpb25Db25maWdcbiAgICBpZiAoXy5pc0VtcHR5KGVuY3J5cHRpb25Db25maWcpKSB7XG4gICAgICBlbmNyeXB0aW9uT2JqID0ge1xuICAgICAgICAvLyBEZWZhdWx0IE1pbklPIFNlcnZlciBTdXBwb3J0ZWQgUnVsZVxuICAgICAgICBSdWxlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgQXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDoge1xuICAgICAgICAgICAgICBTU0VBbGdvcml0aG06ICdBRVMyNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICdlbmNyeXB0aW9uJ1xuICAgIGxldCBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZW5jcnlwdGlvbk9iailcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRCdWNrZXRFbmNyeXB0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdlbmNyeXB0aW9uJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IGJ1Y2tldEVuY0NvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuYnVja2V0RW5jcnlwdGlvblRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgYnVja2V0RW5jQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIGJ1Y2tldEVuY0NvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG4gIHJlbW92ZUJ1Y2tldEVuY3J5cHRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lLCByZXBsaWNhdGlvbkNvbmZpZyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVwbGljYXRpb25Db25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXBsaWNhdGlvbkNvbmZpZyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5yb2xlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdSb2xlIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgICB9IGVsc2UgaWYgKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUgJiYgIWlzU3RyaW5nKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJvbGUnLCByZXBsaWNhdGlvbkNvbmZpZy5yb2xlKVxuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5ydWxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWluaW11bSBvbmUgcmVwbGljYXRpb24gcnVsZSBtdXN0IGJlIHNwZWNpZmllZCcpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBjb25zdCByZXBsaWNhdGlvblBhcmFtc0NvbmZpZyA9IHtcbiAgICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBSb2xlOiByZXBsaWNhdGlvbkNvbmZpZy5yb2xlLFxuICAgICAgICBSdWxlOiByZXBsaWNhdGlvbkNvbmZpZy5ydWxlcyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuXG4gICAgbGV0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnKVxuXG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdyZXBsaWNhdGlvbidcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCByZXBsaWNhdGlvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMucmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJlcGxpY2F0aW9uQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHJlcGxpY2F0aW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZW1vdmVCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDAsIDIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRPYmplY3RMZWdhbEhvbGQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIk9iamVjdFwiJylcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKGdldE9wdHMpLmxlbmd0aCA+IDAgJiYgZ2V0T3B0cy52ZXJzaW9uSWQgJiYgIWlzU3RyaW5nKGdldE9wdHMudmVyc2lvbklkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmVyc2lvbklkIHNob3VsZCBiZSBvZiB0eXBlIHN0cmluZy46JywgZ2V0T3B0cy52ZXJzaW9uSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICdsZWdhbC1ob2xkJ1xuXG4gICAgaWYgKGdldE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSArPSBgJnZlcnNpb25JZD0ke2dldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgbGVnYWxIb2xkQ29uZmlnID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5vYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGxlZ2FsSG9sZENvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBsZWdhbEhvbGRDb25maWcpXG4gICAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHNldE9iamVjdExlZ2FsSG9sZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgIHN0YXR1czogTEVHQUxfSE9MRF9TVEFUVVMuRU5BQkxFRCxcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oc2V0T3B0cykpIHtcbiAgICAgIGNiID0gc2V0T3B0c1xuICAgICAgc2V0T3B0cyA9IGRlZmF1bHRPcHRzXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChzZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIk9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFbTEVHQUxfSE9MRF9TVEFUVVMuRU5BQkxFRCwgTEVHQUxfSE9MRF9TVEFUVVMuRElTQUJMRURdLmluY2x1ZGVzKHNldE9wdHMuc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0YXR1czogJyArIHNldE9wdHMuc3RhdHVzKVxuICAgICAgfVxuICAgICAgaWYgKHNldE9wdHMudmVyc2lvbklkICYmICFzZXRPcHRzLnZlcnNpb25JZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmVyc2lvbklkIHNob3VsZCBiZSBvZiB0eXBlIHN0cmluZy46JyArIHNldE9wdHMudmVyc2lvbklkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eShzZXRPcHRzKSkge1xuICAgICAgc2V0T3B0cyA9IHtcbiAgICAgICAgZGVmYXVsdE9wdHMsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAnbGVnYWwtaG9sZCdcblxuICAgIGlmIChzZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtzZXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIFN0YXR1czogc2V0T3B0cy5zdGF0dXMsXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJvb3ROYW1lOiAnTGVnYWxIb2xkJywgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sIGhlYWRsZXNzOiB0cnVlIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgTWV0aG9kIHRvIGFib3J0IGEgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IGluIGNhc2Ugb2YgYW55IGVycm9ycy5cbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgX19zdHJpbmdfXyBCdWNrZXQgTmFtZVxuICAgKiBAcGFyYW0gb2JqZWN0TmFtZSBfX3N0cmluZ19fIE9iamVjdCBOYW1lXG4gICAqIEBwYXJhbSB1cGxvYWRJZCBfX3N0cmluZ19fIGlkIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCB0byBjYW5jZWwgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0IHNlcXVlbmNlLlxuICAgKiBAcGFyYW0gY2IgX19mdW5jdGlvbl9fIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBhYm9ydE11bHRpcGFydFVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGxldCBxdWVyeSA9IGB1cGxvYWRJZD0ke3VwbG9hZElkfWBcblxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWU6IG9iamVjdE5hbWUsIHF1ZXJ5IH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHVwbG9hZCBhIHBhcnQgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gcGFydENvbmZpZyBfX29iamVjdF9fIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcuXG4gICAqICAgIGJ1Y2tldE5hbWUgX19zdHJpbmdfX1xuICAgKiAgICBvYmplY3ROYW1lIF9fc3RyaW5nX19cbiAgICogICAgdXBsb2FkSUQgX19zdHJpbmdfX1xuICAgKiAgICBwYXJ0TnVtYmVyIF9fbnVtYmVyX19cbiAgICogICAgaGVhZGVycyBfX29iamVjdF9fXG4gICAqIEBwYXJhbSBjYiBjYWxsZWQgd2l0aCBudWxsIGluY2FzZSBvZiBlcnJvci5cbiAgICovXG4gIHVwbG9hZFBhcnRDb3B5KHBhcnRDb25maWcsIGNiKSB7XG4gICAgY29uc3QgeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJRCwgcGFydE51bWJlciwgaGVhZGVycyB9ID0gcGFydENvbmZpZ1xuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSBgdXBsb2FkSWQ9JHt1cGxvYWRJRH0mcGFydE51bWJlcj0ke3BhcnROdW1iZXJ9YFxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWU6IG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH1cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBsZXQgcGFydENvcHlSZXN1bHQgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMudXBsb2FkUGFydFRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgcGFydENvcHlSZXN1bHQgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgbGV0IHVwbG9hZFBhcnRDb3B5UmVzID0ge1xuICAgICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHBhcnRDb3B5UmVzdWx0LkVUYWcpLFxuICAgICAgICAgICAga2V5OiBvYmplY3ROYW1lLFxuICAgICAgICAgICAgcGFydDogcGFydE51bWJlcixcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYihudWxsLCB1cGxvYWRQYXJ0Q29weVJlcylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29tcG9zZU9iamVjdChkZXN0T2JqQ29uZmlnID0ge30sIHNvdXJjZU9iakxpc3QgPSBbXSwgY2IpIHtcbiAgICBjb25zdCBtZSA9IHRoaXMgLy8gbWFueSBhc3luYyBmbG93cy4gc28gc3RvcmUgdGhlIHJlZi5cbiAgICBjb25zdCBzb3VyY2VGaWxlc0xlbmd0aCA9IHNvdXJjZU9iakxpc3QubGVuZ3RoXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlT2JqTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NvdXJjZUNvbmZpZyBzaG91bGQgYW4gYXJyYXkgb2YgQ29weVNvdXJjZU9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCEoZGVzdE9iakNvbmZpZyBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdkZXN0Q29uZmlnIHNob3VsZCBvZiB0eXBlIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMgJylcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRmlsZXNMZW5ndGggPCAxIHx8IHNvdXJjZUZpbGVzTGVuZ3RoID4gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBcIlRoZXJlIG11c3QgYmUgYXMgbGVhc3Qgb25lIGFuZCB1cCB0byAke1BBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UfSBzb3VyY2Ugb2JqZWN0cy5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlc0xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXNvdXJjZU9iakxpc3RbaV0udmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlc3RPYmpDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3RhdE9wdGlvbnMgPSAoc3JjQ29uZmlnKSA9PiB7XG4gICAgICBsZXQgc3RhdE9wdHMgPSB7fVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc3JjQ29uZmlnLlZlcnNpb25JRCkpIHtcbiAgICAgICAgc3RhdE9wdHMgPSB7XG4gICAgICAgICAgdmVyc2lvbklkOiBzcmNDb25maWcuVmVyc2lvbklELFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdE9wdHNcbiAgICB9XG4gICAgY29uc3Qgc3JjT2JqZWN0U2l6ZXMgPSBbXVxuICAgIGxldCB0b3RhbFNpemUgPSAwXG4gICAgbGV0IHRvdGFsUGFydHMgPSAwXG5cbiAgICBjb25zdCBzb3VyY2VPYmpTdGF0cyA9IHNvdXJjZU9iakxpc3QubWFwKChzcmNJdGVtKSA9PlxuICAgICAgbWUuc3RhdE9iamVjdChzcmNJdGVtLkJ1Y2tldCwgc3JjSXRlbS5PYmplY3QsIGdldFN0YXRPcHRpb25zKHNyY0l0ZW0pKSxcbiAgICApXG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc291cmNlT2JqU3RhdHMpXG4gICAgICAudGhlbigoc3JjT2JqZWN0SW5mb3MpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkU3RhdHMgPSBzcmNPYmplY3RJbmZvcy5tYXAoKHJlc0l0ZW1TdGF0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY0NvbmZpZyA9IHNvdXJjZU9iakxpc3RbaW5kZXhdXG5cbiAgICAgICAgICBsZXQgc3JjQ29weVNpemUgPSByZXNJdGVtU3RhdC5zaXplXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBzZWdtZW50IGlzIHNwZWNpZmllZCwgYW5kIGlmIHNvLCBpcyB0aGVcbiAgICAgICAgICAvLyBzZWdtZW50IHdpdGhpbiBvYmplY3QgYm91bmRzP1xuICAgICAgICAgIGlmIChzcmNDb25maWcuTWF0Y2hSYW5nZSkge1xuICAgICAgICAgICAgLy8gU2luY2UgcmFuZ2UgaXMgc3BlY2lmaWVkLFxuICAgICAgICAgICAgLy8gICAgMCA8PSBzcmMuc3JjU3RhcnQgPD0gc3JjLnNyY0VuZFxuICAgICAgICAgICAgLy8gc28gb25seSBpbnZhbGlkIGNhc2UgdG8gY2hlY2sgaXM6XG4gICAgICAgICAgICBjb25zdCBzcmNTdGFydCA9IHNyY0NvbmZpZy5TdGFydFxuICAgICAgICAgICAgY29uc3Qgc3JjRW5kID0gc3JjQ29uZmlnLkVuZFxuICAgICAgICAgICAgaWYgKHNyY0VuZCA+PSBzcmNDb3B5U2l6ZSB8fCBzcmNTdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29weVNyY09wdGlvbnMgJHtpbmRleH0gaGFzIGludmFsaWQgc2VnbWVudC10by1jb3B5IFske3NyY1N0YXJ0fSwgJHtzcmNFbmR9XSAoc2l6ZSBpcyAke3NyY0NvcHlTaXplfSlgLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcmNDb3B5U2l6ZSA9IHNyY0VuZCAtIHNyY1N0YXJ0ICsgMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9ubHkgdGhlIGxhc3Qgc291cmNlIG1heSBiZSBsZXNzIHRoYW4gYGFic01pblBhcnRTaXplYFxuICAgICAgICAgIGlmIChzcmNDb3B5U2l6ZSA8IFBBUlRfQ09OU1RSQUlOVFMuQUJTX01JTl9QQVJUX1NJWkUgJiYgaW5kZXggPCBzb3VyY2VGaWxlc0xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBDb3B5U3JjT3B0aW9ucyAke2luZGV4fSBpcyB0b28gc21hbGwgKCR7c3JjQ29weVNpemV9KSBhbmQgaXQgaXMgbm90IHRoZSBsYXN0IHBhcnQuYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJcyBkYXRhIHRvIGNvcHkgdG9vIGxhcmdlP1xuICAgICAgICAgIHRvdGFsU2l6ZSArPSBzcmNDb3B5U2l6ZVxuICAgICAgICAgIGlmICh0b3RhbFNpemUgPiBQQVJUX0NPTlNUUkFJTlRTLk1BWF9NVUxUSVBBUlRfUFVUX09CSkVDVF9TSVpFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDYW5ub3QgY29tcG9zZSBhbiBvYmplY3Qgb2Ygc2l6ZSAke3RvdGFsU2l6ZX0gKD4gNVRpQilgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHJlY29yZCBzb3VyY2Ugc2l6ZVxuICAgICAgICAgIHNyY09iamVjdFNpemVzW2luZGV4XSA9IHNyY0NvcHlTaXplXG5cbiAgICAgICAgICAvLyBjYWxjdWxhdGUgcGFydHMgbmVlZGVkIGZvciBjdXJyZW50IHNvdXJjZVxuICAgICAgICAgIHRvdGFsUGFydHMgKz0gcGFydHNSZXF1aXJlZChzcmNDb3B5U2l6ZSlcbiAgICAgICAgICAvLyBEbyB3ZSBuZWVkIG1vcmUgcGFydHMgdGhhbiB3ZSBhcmUgYWxsb3dlZD9cbiAgICAgICAgICBpZiAodG90YWxQYXJ0cyA+IFBBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgICBgWW91ciBwcm9wb3NlZCBjb21wb3NlIG9iamVjdCByZXF1aXJlcyBtb3JlIHRoYW4gJHtQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVH0gcGFydHNgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXNJdGVtU3RhdFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgodG90YWxQYXJ0cyA9PT0gMSAmJiB0b3RhbFNpemUgPD0gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVF9TSVpFKSB8fCB0b3RhbFNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0KHNvdXJjZU9iakxpc3RbMF0sIGRlc3RPYmpDb25maWcsIGNiKSAvLyB1c2UgY29weU9iamVjdFYyXG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmVzZXJ2ZSBldGFnIHRvIGF2b2lkIG1vZGlmaWNhdGlvbiBvZiBvYmplY3Qgd2hpbGUgY29weWluZy5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc291cmNlT2JqTGlzdFtpXS5NYXRjaEVUYWcgPSB2YWxpZGF0ZWRTdGF0c1tpXS5ldGFnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFBhcnRTaXplTGlzdCA9IHZhbGlkYXRlZFN0YXRzLm1hcCgocmVzSXRlbVN0YXQsIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbFNpemUgPSBjYWxjdWxhdGVFdmVuU3BsaXRzKHNyY09iamVjdFNpemVzW2lkeF0sIHNvdXJjZU9iakxpc3RbaWR4XSlcbiAgICAgICAgICByZXR1cm4gY2FsU2l6ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldFVwbG9hZFBhcnRDb25maWdMaXN0KHVwbG9hZElkKSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkUGFydENvbmZpZ0xpc3QgPSBbXVxuXG4gICAgICAgICAgc3BsaXRQYXJ0U2l6ZUxpc3QuZm9yRWFjaCgoc3BsaXRTaXplLCBzcGxpdEluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0SW5kZXg6IHN0YXJ0SWR4LCBlbmRJbmRleDogZW5kSWR4LCBvYmpJbmZvOiBvYmpDb25maWcgfSA9IHNwbGl0U2l6ZVxuXG4gICAgICAgICAgICBsZXQgcGFydEluZGV4ID0gc3BsaXRJbmRleCArIDEgLy8gcGFydCBpbmRleCBzdGFydHMgZnJvbSAxLlxuICAgICAgICAgICAgY29uc3QgdG90YWxVcGxvYWRzID0gQXJyYXkuZnJvbShzdGFydElkeClcblxuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHNvdXJjZU9iakxpc3Rbc3BsaXRJbmRleF0uZ2V0SGVhZGVycygpXG5cbiAgICAgICAgICAgIHRvdGFsVXBsb2Fkcy5mb3JFYWNoKChzcGxpdFN0YXJ0LCB1cGxkQ3RySWR4KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBzcGxpdEVuZCA9IGVuZElkeFt1cGxkQ3RySWR4XVxuXG4gICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9iaiA9IGAke29iakNvbmZpZy5CdWNrZXR9LyR7b2JqQ29uZmlnLk9iamVjdH1gXG4gICAgICAgICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSBgJHtzb3VyY2VPYmp9YFxuICAgICAgICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1yYW5nZSddID0gYGJ5dGVzPSR7c3BsaXRTdGFydH0tJHtzcGxpdEVuZH1gXG5cbiAgICAgICAgICAgICAgY29uc3QgdXBsb2FkUGFydENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBidWNrZXROYW1lOiBkZXN0T2JqQ29uZmlnLkJ1Y2tldCxcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiBkZXN0T2JqQ29uZmlnLk9iamVjdCxcbiAgICAgICAgICAgICAgICB1cGxvYWRJRDogdXBsb2FkSWQsXG4gICAgICAgICAgICAgICAgcGFydE51bWJlcjogcGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgc291cmNlT2JqOiBzb3VyY2VPYmosXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1cGxvYWRQYXJ0Q29uZmlnTGlzdC5wdXNoKHVwbG9hZFBhcnRDb25maWcpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdXBsb2FkUGFydENvbmZpZ0xpc3RcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBlcmZvcm1VcGxvYWRQYXJ0cyA9ICh1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZExpc3QgPSBnZXRVcGxvYWRQYXJ0Q29uZmlnTGlzdCh1cGxvYWRJZClcblxuICAgICAgICAgIGFzeW5jLm1hcCh1cGxvYWRMaXN0LCBtZS51cGxvYWRQYXJ0Q29weS5iaW5kKG1lKSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmFib3J0TXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgdXBsb2FkSWQsIGNiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydHNEb25lID0gcmVzLm1hcCgocGFydENvcHkpID0+ICh7IGV0YWc6IHBhcnRDb3B5LmV0YWcsIHBhcnQ6IHBhcnRDb3B5LnBhcnQgfSkpXG4gICAgICAgICAgICByZXR1cm4gbWUuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoZGVzdE9iakNvbmZpZy5CdWNrZXQsIGRlc3RPYmpDb25maWcuT2JqZWN0LCB1cGxvYWRJZCwgcGFydHNEb25lLCBjYilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VXBsb2FkSGVhZGVycyA9IGRlc3RPYmpDb25maWcuZ2V0SGVhZGVycygpXG5cbiAgICAgICAgbWUuaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQoZGVzdE9iakNvbmZpZy5CdWNrZXQsIGRlc3RPYmpDb25maWcuT2JqZWN0LCBuZXdVcGxvYWRIZWFkZXJzLCAoZXJyLCB1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIsIG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICAgIHBlcmZvcm1VcGxvYWRQYXJ0cyh1cGxvYWRJZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNiKGVycm9yLCBudWxsKVxuICAgICAgfSlcbiAgfVxuICBzZWxlY3RPYmplY3RDb250ZW50KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNlbGVjdE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzKSkge1xuICAgICAgaWYgKCFpc1N0cmluZyhzZWxlY3RPcHRzLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NxbEV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnB1dFNlcmlhbGl6YXRpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lucHV0U2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCcpXG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzLm91dHB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHB1dFNlcmlhbGl6YXRpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHB1dFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWxpZCBzZWxlY3QgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUE9TVCdcbiAgICBsZXQgcXVlcnkgPSBgc2VsZWN0YFxuICAgIHF1ZXJ5ICs9ICcmc2VsZWN0LXR5cGU9MidcblxuICAgIGNvbnN0IGNvbmZpZyA9IFtcbiAgICAgIHtcbiAgICAgICAgRXhwcmVzc2lvbjogc2VsZWN0T3B0cy5leHByZXNzaW9uLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgRXhwcmVzc2lvblR5cGU6IHNlbGVjdE9wdHMuZXhwcmVzc2lvblR5cGUgfHwgJ1NRTCcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBJbnB1dFNlcmlhbGl6YXRpb246IFtzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBPdXRwdXRTZXJpYWxpemF0aW9uOiBbc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uXSxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgLy8gT3B0aW9uYWxcbiAgICBpZiAoc2VsZWN0T3B0cy5yZXF1ZXN0UHJvZ3Jlc3MpIHtcbiAgICAgIGNvbmZpZy5wdXNoKHsgUmVxdWVzdFByb2dyZXNzOiBzZWxlY3RPcHRzLnJlcXVlc3RQcm9ncmVzcyB9KVxuICAgIH1cbiAgICAvLyBPcHRpb25hbFxuICAgIGlmIChzZWxlY3RPcHRzLnNjYW5SYW5nZSkge1xuICAgICAgY29uZmlnLnB1c2goeyBTY2FuUmFuZ2U6IHNlbGVjdE9wdHMuc2NhblJhbmdlIH0pXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ1NlbGVjdE9iamVjdENvbnRlbnRSZXF1ZXN0JyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBzZWxlY3RSZXN1bHRcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLnNlbGVjdE9iamVjdENvbnRlbnRUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHNlbGVjdFJlc3VsdCA9IHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgc2VsZWN0UmVzdWx0KVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50RXh0ZW5zaW9ucykge1xuICAgICAgdGhpcy5jbGllbnRFeHRlbnNpb25zID0gbmV3IGV4dGVuc2lvbnModGhpcylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50RXh0ZW5zaW9uc1xuICB9XG59XG5cbi8vIFByb21pc2lmeSB2YXJpb3VzIHB1YmxpYy1mYWNpbmcgQVBJcyBvbiB0aGUgQ2xpZW50IG1vZHVsZS5cbkNsaWVudC5wcm90b3R5cGUubWFrZUJ1Y2tldCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLm1ha2VCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmxpc3RCdWNrZXRzID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUubGlzdEJ1Y2tldHMpXG5DbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0KVxuXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuZ2V0UGFydGlhbE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldFBhcnRpYWxPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmZHZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5mR2V0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmZQdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5mUHV0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5jb3B5T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuY29weU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnN0YXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlT2JqZWN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdHMpXG5cbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkVXJsID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkVXJsKVxuQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRHZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRHZXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFB1dE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFB1dE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkUG9zdFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFBvc3RQb2xpY3kpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldE5vdGlmaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldE5vdGlmaWNhdGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0Tm90aWZpY2F0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0Tm90aWZpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVBbGxCdWNrZXROb3RpZmljYXRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVBbGxCdWNrZXROb3RpZmljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFBvbGljeSlcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UG9saWN5ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UG9saWN5KVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVJbmNvbXBsZXRlVXBsb2FkID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlSW5jb21wbGV0ZVVwbG9hZClcbkNsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0VmVyc2lvbmluZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFZlcnNpb25pbmcpXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFZlcnNpb25pbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRWZXJzaW9uaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlT2JqZWN0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRMaWZlY3ljbGUgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRMaWZlY3ljbGUpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldExpZmVjeWNsZSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldExpZmVjeWNsZSlcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0TGlmZWN5Y2xlID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0TGlmZWN5Y2xlKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMb2NrQ29uZmlnID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TG9ja0NvbmZpZylcbkNsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0TG9ja0NvbmZpZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdExvY2tDb25maWcpXG5DbGllbnQucHJvdG90eXBlLnB1dE9iamVjdFJldGVudGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnB1dE9iamVjdFJldGVudGlvbilcbkNsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0UmV0ZW50aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0UmV0ZW50aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRFbmNyeXB0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0RW5jcnlwdGlvbilcbkNsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0RW5jcnlwdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldEVuY3J5cHRpb24pXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldEVuY3J5cHRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRFbmNyeXB0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMZWdhbEhvbGQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMZWdhbEhvbGQpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdExlZ2FsSG9sZCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdExlZ2FsSG9sZClcbkNsaWVudC5wcm90b3R5cGUuY29tcG9zZU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmNvbXBvc2VPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnNlbGVjdE9iamVjdENvbnRlbnQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZWxlY3RPYmplY3RDb250ZW50KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBZ0JBLElBQUFBLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQVAsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLElBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUVBLElBQUFVLE1BQUEsR0FBQVgsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFFBQUEsR0FBQVosT0FBQTtBQXlDQWEsTUFBQSxDQUFBQyxJQUFBLENBQUFGLFFBQUEsRUFBQUcsT0FBQSxXQUFBQyxHQUFBO0VBQUEs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 /***/ }), @@ -81931,18 +85108,25 @@ class ObjectUploader extends _stream.Transform { // If no upload ID exists, initiate a new one. if (!id) { - this.client.initiateNewMultipartUpload(this.bucketName, this.objectName, this.metaData).then(id => { + this.client.initiateNewMultipartUpload(this.bucketName, this.objectName, this.metaData, (err, id) => { + if (err) { + return callback(err); + } this.id = id; // We are now ready to accept new chunks — this will flush the buffered chunk. this.emit('ready'); - }, err => callback(err)); + }); return; } this.id = id; // Retrieve the pre-uploaded parts, if we need to resume the upload. - this.client.listParts(this.bucketName, this.objectName, id).then(etags => { + this.client.listParts(this.bucketName, this.objectName, id, (err, etags) => { + if (err) { + return this.emit('error', err); + } + // It is possible for no parts to be already uploaded. if (!etags) { etags = []; @@ -81956,8 +85140,6 @@ class ObjectUploader extends _stream.Transform { return prev; }, {}); this.emit('ready'); - }, err => { - return this.emit('error', err); }); }); return; @@ -82083,7 +85265,7 @@ class ObjectUploader extends _stream.Transform { exports.ObjectUploader = ObjectUploader; var _default = ObjectUploader; exports["default"] = _default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3RyZWFtIiwicXVlcnlzdHJpbmciLCJfaGVscGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk9iamVjdFVwbG9hZGVyIiwiVHJhbnNmb3JtIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsInBhcnRTaXplIiwibWV0YURhdGEiLCJjYWxsYmFjayIsImVtcHR5U3RyZWFtIiwicGFydE51bWJlciIsIm9sZFBhcnRzIiwiZXRhZ3MiLCJpZCIsIm9uIiwiZXJyIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJtZXRob2QiLCJoZWFkZXJzIiwibGVuZ3RoIiwibWQ1ZGlnZXN0IiwiZW5hYmxlU0hBMjU2IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRpZ2VzdCIsInRvU3RyaW5nIiwib3B0aW9ucyIsImFzc2lnbiIsInF1ZXJ5IiwibWFrZVJlcXVlc3QiLCJyZXNwb25zZSIsInJlc3VsdCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJ2ZXJzaW9uSWQiLCJnZXRWZXJzaW9uSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJvbmNlIiwiZmluZFVwbG9hZElkIiwiZW1pdCIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwidGhlbiIsImxpc3RQYXJ0cyIsInJlZHVjZSIsInByZXYiLCJpdGVtIiwicGFydCIsIm9sZFBhcnQiLCJwdXNoIiwic3RyaW5naWZ5IiwidXBsb2FkSWQiLCJyZXBsYWNlIiwiX2ZsdXNoIiwiY29tcGxldGVNdWx0aXBhcnRVcGxvYWQiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyJvYmplY3QtdXBsb2FkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTYgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgQ3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5LXN0cmluZydcblxuaW1wb3J0IHsgZ2V0VmVyc2lvbklkLCBzYW5pdGl6ZUVUYWcgfSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcblxuLy8gV2UgZXh0ZW5kIFRyYW5zZm9ybSBiZWNhdXNlIFdyaXRhYmxlIGRvZXMgbm90IGltcGxlbWVudCAuX2ZsdXNoKCkuXG5leHBvcnQgY2xhc3MgT2JqZWN0VXBsb2FkZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHBhcnRTaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5lbXB0eVN0cmVhbSA9IHRydWVcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldE5hbWVcbiAgICB0aGlzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lXG4gICAgLy8gVGhlIHNpemUgb2YgZWFjaCBtdWx0aXBhcnQsIGNodW5rZWQgYnkgQmxvY2tTdHJlYW0yLlxuICAgIHRoaXMucGFydFNpemUgPSBwYXJ0U2l6ZVxuICAgIC8vIFRoaXMgaXMgdGhlIG1ldGFkYXRhIGZvciB0aGUgb2JqZWN0LlxuICAgIHRoaXMubWV0YURhdGEgPSBtZXRhRGF0YVxuXG4gICAgLy8gQ2FsbCBsaWtlOiBjYWxsYmFjayhlcnJvciwge2V0YWcsIHZlcnNpb25JZH0pLlxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuXG4gICAgLy8gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgbnVtYmVyIGNodW5rL3BhcnQgd2UncmUgb24uIFRoaXMgaW5jcmVtZW50c1xuICAgIC8vIGVhY2ggdGltZSBfd3JpdGUoKSBpcyBjYWxsZWQuIFN0YXJ0cyB3aXRoIDEsIG5vdCAwLlxuICAgIHRoaXMucGFydE51bWJlciA9IDFcblxuICAgIC8vIEEgbGlzdCBvZiB0aGUgcHJldmlvdXNseSB1cGxvYWRlZCBjaHVua3MsIGZvciByZXN1bWluZyBhIGZpbGUgdXBsb2FkLiBUaGlzXG4gICAgLy8gd2lsbCBiZSBudWxsIGlmIHdlIGFyZW4ndCByZXN1bWluZyBhbiB1cGxvYWQuXG4gICAgdGhpcy5vbGRQYXJ0cyA9IG51bGxcblxuICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGV0YWdzIGZvciBhZ2dyZWdhdGluZyB0aGUgY2h1bmtzIHRvZ2V0aGVyIGxhdGVyLiBFYWNoXG4gICAgLy8gZXRhZyByZXByZXNlbnRzIGEgc2luZ2xlIGNodW5rIG9mIHRoZSBmaWxlLlxuICAgIHRoaXMuZXRhZ3MgPSBbXVxuXG4gICAgLy8gVGhpcyBpcyBmb3IgdGhlIG11bHRpcGFydCB1cGxvYWQgcmVxdWVzdCDigJQgaWYgbnVsbCwgd2UncmUgZWl0aGVyIG5vdCBpbml0aWF0ZWRcbiAgICAvLyB5ZXQgb3Igd2UncmUgZmx1c2hpbmcgaW4gb25lIHBhY2tldC5cbiAgICB0aGlzLmlkID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIGVycm9ycy5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9KVxuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbXB0eVN0cmVhbSA9IGZhbHNlXG4gICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IGhlYWRlcnMgPSB7ICdDb250ZW50LUxlbmd0aCc6IGNodW5rLmxlbmd0aCB9XG4gICAgbGV0IG1kNWRpZ2VzdCA9ICcnXG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBDb250ZW50LU1ENSBoZWFkZXIgaWYgU0hBMjU2IGlzIG5vdCBzZXQuXG4gICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBvbmx5IHdoZW4gdGhlcmUgaXMgYSBzZWN1cmUgY29ubmVjdGlvbiB0byB0aGUgczMgc2VydmVyLlxuICAgIGlmICghdGhpcy5jbGllbnQuZW5hYmxlU0hBMjU2KSB7XG4gICAgICBtZDVkaWdlc3QgPSBDcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGNodW5rKS5kaWdlc3QoKVxuICAgICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IG1kNWRpZ2VzdC50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG4gICAgLy8gV2UgY2FuIGZsdXNoIHRoZSBvYmplY3QgaW4gb25lIHBhY2tldCBpZiBpdCBmaXRzIGluIG9uZSBjaHVuay4gVGhpcyBpcyB0cnVlXG4gICAgLy8gaWYgdGhlIGNodW5rIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBwYXJ0IHNpemUsIHNpZ25pZnlpbmcgdGhlIGVuZCBvZiB0aGVcbiAgICAvLyBzdHJlYW0uXG4gICAgaWYgKHRoaXMucGFydE51bWJlciA9PSAxICYmIGNodW5rLmxlbmd0aCA8IHRoaXMucGFydFNpemUpIHtcbiAgICAgIC8vIFBVVCB0aGUgY2h1bmsgaW4gYSBzaW5nbGUgcmVxdWVzdCDigJQgdXNlIGFuIGVtcHR5IHF1ZXJ5LlxuICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgLy8gU2V0IHVzZXIgbWV0YWRhdGEgYXMgdGhpcyBpcyBub3QgYSBtdWx0aXBhcnQgdXBsb2FkXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubWV0YURhdGEsIGhlYWRlcnMpLFxuICAgICAgICBxdWVyeTogJycsXG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdChvcHRpb25zLCBjaHVuaywgWzIwMF0sICcnLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgIGV0YWc6IHNhbml0aXplRVRhZyhyZXNwb25zZS5oZWFkZXJzLmV0YWcpLFxuICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSB0aGUgJ2RhdGEnIGV2ZW50IHNvIHRoYXQgdGhlIHN0cmVhbSBjbG9zZXMuIChub2RlanMgc3RyZWFtIHJlcXVpcmVtZW50KVxuICAgICAgICByZXNwb25zZS5vbignZGF0YScsICgpID0+IHt9KVxuXG4gICAgICAgIC8vIEdpdmUgdGhlIGV0YWcgYmFjaywgd2UncmUgZG9uZSFcblxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWNhdXNlIHdlJ3JlIHN1cmUgdGhlIHN0cmVhbSBoYXMgZW5kZWQsIGFsbG93IGl0IHRvIGZsdXNoIGFuZCBlbmQuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHdlIGFyZW4ndCBmbHVzaGluZyBpbiBvbmUgcGFja2V0LCB3ZSBuZWVkIHRvIGluaXRpYXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLFxuICAgIC8vIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZS4gVGhlIHdyaXRlIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgdGhlIHVwbG9hZCBoYXMgYmVlblxuICAgIC8vIGluaXRpYXRlZC5cbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gICAgICB9KVxuXG4gICAgICAvLyBDaGVjayBmb3IgYW4gaW5jb21wbGV0ZSBwcmV2aW91cyB1cGxvYWQuXG4gICAgICB0aGlzLmNsaWVudC5maW5kVXBsb2FkSWQodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIChlcnIsIGlkKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHVwbG9hZCBJRCBleGlzdHMsIGluaXRpYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIHRoaXMuY2xpZW50LmluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCB0aGlzLm1ldGFEYXRhKS50aGVuKFxuICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgICAgICAgICAgIC8vIFdlIGFyZSBub3cgcmVhZHkgdG8gYWNjZXB0IG5ldyBjaHVua3Mg4oCUIHRoaXMgd2lsbCBmbHVzaCB0aGUgYnVmZmVyZWQgY2h1bmsuXG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVhZHknKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IGNhbGxiYWNrKGVyciksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlkID0gaWRcblxuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcHJlLXVwbG9hZGVkIHBhcnRzLCBpZiB3ZSBuZWVkIHRvIHJlc3VtZSB0aGUgdXBsb2FkLlxuICAgICAgICB0aGlzLmNsaWVudC5saXN0UGFydHModGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIGlkKS50aGVuKFxuICAgICAgICAgIChldGFncykgPT4ge1xuICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIG5vIHBhcnRzIHRvIGJlIGFscmVhZHkgdXBsb2FkZWQuXG4gICAgICAgICAgICBpZiAoIWV0YWdzKSB7XG4gICAgICAgICAgICAgIGV0YWdzID0gW11cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gb2xkUGFydHMgd2lsbCBiZWNvbWUgYW4gb2JqZWN0LCBhbGxvd2luZyBvbGRQYXJ0c1twYXJ0TnVtYmVyXS5ldGFnXG4gICAgICAgICAgICB0aGlzLm9sZFBhcnRzID0gZXRhZ3MucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBpdGVtKSB7XG4gICAgICAgICAgICAgIGlmICghcHJldltpdGVtLnBhcnRdKSB7XG4gICAgICAgICAgICAgICAgcHJldltpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2XG4gICAgICAgICAgICB9LCB7fSlcblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkeScpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDb250aW51ZSB1cGxvYWRpbmcgdmFyaW91cyBwYXJ0cyBpZiB3ZSBoYXZlIGluaXRpYXRlZCBtdWx0aXBhcnQgdXBsb2FkLlxuICAgIGxldCBwYXJ0TnVtYmVyID0gdGhpcy5wYXJ0TnVtYmVyKytcblxuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHVwbG9hZGVkIHRoaXMgY2h1bmsuIElmIHRoZSBoYXNoIHN1bXMgbWF0Y2gsXG4gICAgLy8gd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgY2h1bmsuXG4gICAgaWYgKHRoaXMub2xkUGFydHMpIHtcbiAgICAgIGxldCBvbGRQYXJ0ID0gdGhpcy5vbGRQYXJ0c1twYXJ0TnVtYmVyXVxuXG4gICAgICAvLyBDYWx1bGNhdGUgdGhlIG1kNSBoYXNoLCBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkLlxuICAgICAgaWYgKCFtZDVkaWdlc3QpIHtcbiAgICAgICAgbWQ1ZGlnZXN0ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShjaHVuaykuZGlnZXN0KClcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFBhcnQgJiYgbWQ1ZGlnZXN0LnRvU3RyaW5nKCdoZXgnKSA9PT0gb2xkUGFydC5ldGFnKSB7XG4gICAgICAgIC8vIFRoZSBtZDUgbWF0Y2hlcywgdGhlIGNodW5rIGhhcyBhbHJlYWR5IGJlZW4gdXBsb2FkZWQuXG4gICAgICAgIHRoaXMuZXRhZ3MucHVzaCh7IHBhcnQ6IHBhcnROdW1iZXIsIGV0YWc6IG9sZFBhcnQuZXRhZyB9KVxuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIGNodW5rIHdpdGggYW4gdXBsb2FkZXIuXG4gICAgbGV0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHtcbiAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICB1cGxvYWRJZDogdGhpcy5pZCxcbiAgICB9KVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBxdWVyeSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3ROYW1lOiB0aGlzLm9iamVjdE5hbWUsXG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQubWFrZVJlcXVlc3Qob3B0aW9ucywgY2h1bmssIFsyMDBdLCAnJywgdHJ1ZSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgIH1cblxuICAgICAgLy8gSW4gb3JkZXIgdG8gYWdncmVnYXRlIHRoZSBwYXJ0cyB0b2dldGhlciwgd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBldGFncy5cbiAgICAgIGxldCBldGFnID0gcmVzcG9uc2UuaGVhZGVycy5ldGFnXG4gICAgICBpZiAoZXRhZykge1xuICAgICAgICBldGFnID0gZXRhZy5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXCIkLywgJycpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXRhZ3MucHVzaCh7IHBhcnQ6IHBhcnROdW1iZXIsIGV0YWcgfSlcblxuICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICByZXNwb25zZS5vbignZGF0YScsICgpID0+IHt9KVxuXG4gICAgICAvLyBXZSdyZSByZWFkeSBmb3IgdGhlIG5leHQgY2h1bmsuXG4gICAgICBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIF9mbHVzaChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmVtcHR5U3RyZWFtKSB7XG4gICAgICBsZXQgbWV0aG9kID0gJ1BVVCdcbiAgICAgIGxldCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tZXRhRGF0YSwgeyAnQ29udGVudC1MZW5ndGgnOiAwIH0pXG4gICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBxdWVyeTogJycsXG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdChvcHRpb25zLCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgdmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZ25vcmUgdGhlICdkYXRhJyBldmVudCBzbyB0aGF0IHRoZSBzdHJlYW0gY2xvc2VzLiAobm9kZWpzIHN0cmVhbSByZXF1aXJlbWVudClcbiAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgICAvLyBHaXZlIHRoZSBldGFnIGJhY2ssIHdlJ3JlIGRvbmUhXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UncmUgc3VyZSB0aGUgc3RyZWFtIGhhcyBlbmRlZCwgYWxsb3cgaXQgdG8gZmx1c2ggYW5kIGVuZC5cbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIElmIGl0IGhhcyBiZWVuIHVwbG9hZGVkIGluIGEgc2luZ2xlIHBhY2tldCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy5cbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbGwgb2YgdGhlIGNodW5rcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHksIHRodXNcbiAgICAvLyBjb21wbGV0aW5nIHRoZSBtdWx0aXBhcnQgdXBsb2FkLlxuICAgIHRoaXMuY2xpZW50LmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCB0aGlzLmlkLCB0aGlzLmV0YWdzLCAoZXJyLCBldGFnKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgb3VyIGNhbGxiYWNrIG9uIHRoZSBuZXh0IHRpY2sgdG8gYWxsb3cgdGhlIHN0cmVhbXMgaW5mcmFzdHJ1Y3R1cmVcbiAgICAgIC8vIHRvIGZpbmlzaCB3aGF0IGl0cyBkb2luZyBiZWZvcmUgd2UgY29udGludWUuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCBldGFnKVxuICAgICAgfSlcblxuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gZGVwcmVjYXRlZCBkZWZhdWx0IGV4cG9ydCwgcGxlYXNlIHVzZSBuYW1lZCBleHBvcnRzLlxuLy8ga2VlcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVmYXVsdC1leHBvcnRcbmV4cG9ydCBkZWZhdWx0IE9iamVjdFVwbG9hZGVyXG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLFdBQUEsR0FBQUgsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUFpRSxTQUFBSSx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBTix3QkFBQVUsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3RyZWFtIiwicXVlcnlzdHJpbmciLCJfaGVscGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk9iamVjdFVwbG9hZGVyIiwiVHJhbnNmb3JtIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsInBhcnRTaXplIiwibWV0YURhdGEiLCJjYWxsYmFjayIsImVtcHR5U3RyZWFtIiwicGFydE51bWJlciIsIm9sZFBhcnRzIiwiZXRhZ3MiLCJpZCIsIm9uIiwiZXJyIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJtZXRob2QiLCJoZWFkZXJzIiwibGVuZ3RoIiwibWQ1ZGlnZXN0IiwiZW5hYmxlU0hBMjU2IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRpZ2VzdCIsInRvU3RyaW5nIiwib3B0aW9ucyIsImFzc2lnbiIsInF1ZXJ5IiwibWFrZVJlcXVlc3QiLCJyZXNwb25zZSIsInJlc3VsdCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJ2ZXJzaW9uSWQiLCJnZXRWZXJzaW9uSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJvbmNlIiwiZmluZFVwbG9hZElkIiwiZW1pdCIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwibGlzdFBhcnRzIiwicmVkdWNlIiwicHJldiIsIml0ZW0iLCJwYXJ0Iiwib2xkUGFydCIsInB1c2giLCJzdHJpbmdpZnkiLCJ1cGxvYWRJZCIsInJlcGxhY2UiLCJfZmx1c2giLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIm9iamVjdC11cGxvYWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuXG5pbXBvcnQgeyBnZXRWZXJzaW9uSWQsIHNhbml0aXplRVRhZyB9IGZyb20gJy4vaW50ZXJuYWwvaGVscGVyLnRzJ1xuXG4vLyBXZSBleHRlbmQgVHJhbnNmb3JtIGJlY2F1c2UgV3JpdGFibGUgZG9lcyBub3QgaW1wbGVtZW50IC5fZmx1c2goKS5cbmV4cG9ydCBjbGFzcyBPYmplY3RVcGxvYWRlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcGFydFNpemUsIG1ldGFEYXRhLCBjYWxsYmFjaykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmVtcHR5U3RyZWFtID0gdHJ1ZVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5idWNrZXROYW1lID0gYnVja2V0TmFtZVxuICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWVcbiAgICAvLyBUaGUgc2l6ZSBvZiBlYWNoIG11bHRpcGFydCwgY2h1bmtlZCBieSBCbG9ja1N0cmVhbTIuXG4gICAgdGhpcy5wYXJ0U2l6ZSA9IHBhcnRTaXplXG4gICAgLy8gVGhpcyBpcyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBvYmplY3QuXG4gICAgdGhpcy5tZXRhRGF0YSA9IG1ldGFEYXRhXG5cbiAgICAvLyBDYWxsIGxpa2U6IGNhbGxiYWNrKGVycm9yLCB7ZXRhZywgdmVyc2lvbklkfSkuXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG5cbiAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBudW1iZXIgY2h1bmsvcGFydCB3ZSdyZSBvbi4gVGhpcyBpbmNyZW1lbnRzXG4gICAgLy8gZWFjaCB0aW1lIF93cml0ZSgpIGlzIGNhbGxlZC4gU3RhcnRzIHdpdGggMSwgbm90IDAuXG4gICAgdGhpcy5wYXJ0TnVtYmVyID0gMVxuXG4gICAgLy8gQSBsaXN0IG9mIHRoZSBwcmV2aW91c2x5IHVwbG9hZGVkIGNodW5rcywgZm9yIHJlc3VtaW5nIGEgZmlsZSB1cGxvYWQuIFRoaXNcbiAgICAvLyB3aWxsIGJlIG51bGwgaWYgd2UgYXJlbid0IHJlc3VtaW5nIGFuIHVwbG9hZC5cbiAgICB0aGlzLm9sZFBhcnRzID0gbnVsbFxuXG4gICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgZXRhZ3MgZm9yIGFnZ3JlZ2F0aW5nIHRoZSBjaHVua3MgdG9nZXRoZXIgbGF0ZXIuIEVhY2hcbiAgICAvLyBldGFnIHJlcHJlc2VudHMgYSBzaW5nbGUgY2h1bmsgb2YgdGhlIGZpbGUuXG4gICAgdGhpcy5ldGFncyA9IFtdXG5cbiAgICAvLyBUaGlzIGlzIGZvciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IOKAlCBpZiBudWxsLCB3ZSdyZSBlaXRoZXIgbm90IGluaXRpYXRlZFxuICAgIC8vIHlldCBvciB3ZSdyZSBmbHVzaGluZyBpbiBvbmUgcGFja2V0LlxuICAgIHRoaXMuaWQgPSBudWxsXG5cbiAgICAvLyBIYW5kbGUgZXJyb3JzLlxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0pXG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtcHR5U3RyZWFtID0gZmFsc2VcbiAgICBsZXQgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgaGVhZGVycyA9IHsgJ0NvbnRlbnQtTGVuZ3RoJzogY2h1bmsubGVuZ3RoIH1cbiAgICBsZXQgbWQ1ZGlnZXN0ID0gJydcblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IENvbnRlbnQtTUQ1IGhlYWRlciBpZiBTSEEyNTYgaXMgbm90IHNldC5cbiAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHNlY3VyZSBjb25uZWN0aW9uIHRvIHRoZSBzMyBzZXJ2ZXIuXG4gICAgaWYgKCF0aGlzLmNsaWVudC5lbmFibGVTSEEyNTYpIHtcbiAgICAgIG1kNWRpZ2VzdCA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY2h1bmspLmRpZ2VzdCgpXG4gICAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gbWQ1ZGlnZXN0LnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbiAgICAvLyBXZSBjYW4gZmx1c2ggdGhlIG9iamVjdCBpbiBvbmUgcGFja2V0IGlmIGl0IGZpdHMgaW4gb25lIGNodW5rLiBUaGlzIGlzIHRydWVcbiAgICAvLyBpZiB0aGUgY2h1bmsgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHBhcnQgc2l6ZSwgc2lnbmlmeWluZyB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBpZiAodGhpcy5wYXJ0TnVtYmVyID09IDEgJiYgY2h1bmsubGVuZ3RoIDwgdGhpcy5wYXJ0U2l6ZSkge1xuICAgICAgLy8gUFVUIHRoZSBjaHVuayBpbiBhIHNpbmdsZSByZXF1ZXN0IOKAlCB1c2UgYW4gZW1wdHkgcXVlcnkuXG4gICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICAvLyBTZXQgdXNlciBtZXRhZGF0YSBhcyB0aGlzIGlzIG5vdCBhIG11bHRpcGFydCB1cGxvYWRcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tZXRhRGF0YSwgaGVhZGVycyksXG4gICAgICAgIHF1ZXJ5OiAnJyxcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBvYmplY3ROYW1lOiB0aGlzLm9iamVjdE5hbWUsXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0KG9wdGlvbnMsIGNodW5rLCBbMjAwXSwgJycsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgdmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG5cbiAgICAgICAgLy8gR2l2ZSB0aGUgZXRhZyBiYWNrLCB3ZSdyZSBkb25lIVxuXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UncmUgc3VyZSB0aGUgc3RyZWFtIGhhcyBlbmRlZCwgYWxsb3cgaXQgdG8gZmx1c2ggYW5kIGVuZC5cbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYXJlbid0IGZsdXNoaW5nIGluIG9uZSBwYWNrZXQsIHdlIG5lZWQgdG8gaW5pdGlhdGUgdGhlIG11bHRpcGFydCB1cGxvYWQsXG4gICAgLy8gaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBkb25lLiBUaGUgd3JpdGUgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCB0aGUgdXBsb2FkIGhhcyBiZWVuXG4gICAgLy8gaW5pdGlhdGVkLlxuICAgIGlmICh0aGlzLmlkID09PSBudWxsKSB7XG4gICAgICB0aGlzLm9uY2UoJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaylcbiAgICAgIH0pXG5cbiAgICAgIC8vIENoZWNrIGZvciBhbiBpbmNvbXBsZXRlIHByZXZpb3VzIHVwbG9hZC5cbiAgICAgIHRoaXMuY2xpZW50LmZpbmRVcGxvYWRJZCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMub2JqZWN0TmFtZSwgKGVyciwgaWQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gdXBsb2FkIElEIGV4aXN0cywgaW5pdGlhdGUgYSBuZXcgb25lLlxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5jbGllbnQuaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIHRoaXMubWV0YURhdGEsIChlcnIsIGlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgICAgICAgICAvLyBXZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCBuZXcgY2h1bmtzIOKAlCB0aGlzIHdpbGwgZmx1c2ggdGhlIGJ1ZmZlcmVkIGNodW5rLlxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkeScpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkXG5cbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByZS11cGxvYWRlZCBwYXJ0cywgaWYgd2UgbmVlZCB0byByZXN1bWUgdGhlIHVwbG9hZC5cbiAgICAgICAgdGhpcy5jbGllbnQubGlzdFBhcnRzKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCBpZCwgKGVyciwgZXRhZ3MpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3Igbm8gcGFydHMgdG8gYmUgYWxyZWFkeSB1cGxvYWRlZC5cbiAgICAgICAgICBpZiAoIWV0YWdzKSB7XG4gICAgICAgICAgICBldGFncyA9IFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gb2xkUGFydHMgd2lsbCBiZWNvbWUgYW4gb2JqZWN0LCBhbGxvd2luZyBvbGRQYXJ0c1twYXJ0TnVtYmVyXS5ldGFnXG4gICAgICAgICAgdGhpcy5vbGRQYXJ0cyA9IGV0YWdzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgaXRlbSkge1xuICAgICAgICAgICAgaWYgKCFwcmV2W2l0ZW0ucGFydF0pIHtcbiAgICAgICAgICAgICAgcHJldltpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgICB9LCB7fSlcblxuICAgICAgICAgIHRoaXMuZW1pdCgncmVhZHknKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29udGludWUgdXBsb2FkaW5nIHZhcmlvdXMgcGFydHMgaWYgd2UgaGF2ZSBpbml0aWF0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAgICBsZXQgcGFydE51bWJlciA9IHRoaXMucGFydE51bWJlcisrXG5cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSB1cGxvYWRlZCB0aGlzIGNodW5rLiBJZiB0aGUgaGFzaCBzdW1zIG1hdGNoLFxuICAgIC8vIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0IGNodW5rLlxuICAgIGlmICh0aGlzLm9sZFBhcnRzKSB7XG4gICAgICBsZXQgb2xkUGFydCA9IHRoaXMub2xkUGFydHNbcGFydE51bWJlcl1cblxuICAgICAgLy8gQ2FsdWxjYXRlIHRoZSBtZDUgaGFzaCwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgIGlmICghbWQ1ZGlnZXN0KSB7XG4gICAgICAgIG1kNWRpZ2VzdCA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY2h1bmspLmRpZ2VzdCgpXG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRQYXJ0ICYmIG1kNWRpZ2VzdC50b1N0cmluZygnaGV4JykgPT09IG9sZFBhcnQuZXRhZykge1xuICAgICAgICAvLyBUaGUgbWQ1IG1hdGNoZXMsIHRoZSBjaHVuayBoYXMgYWxyZWFkeSBiZWVuIHVwbG9hZGVkLlxuICAgICAgICB0aGlzLmV0YWdzLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBvbGRQYXJ0LmV0YWcgfSlcblxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBjaHVuayB3aXRoIGFuIHVwbG9hZGVyLlxuICAgIGxldCBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh7XG4gICAgICBwYXJ0TnVtYmVyOiBwYXJ0TnVtYmVyLFxuICAgICAgdXBsb2FkSWQ6IHRoaXMuaWQsXG4gICAgfSlcblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgcXVlcnksXG4gICAgICBoZWFkZXJzLFxuICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgIH1cblxuICAgIHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0KG9wdGlvbnMsIGNodW5rLCBbMjAwXSwgJycsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG5cbiAgICAgIC8vIEluIG9yZGVyIHRvIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgdG9nZXRoZXIsIHdlIG5lZWQgdG8gY29sbGVjdCB0aGUgZXRhZ3MuXG4gICAgICBsZXQgZXRhZyA9IHJlc3BvbnNlLmhlYWRlcnMuZXRhZ1xuICAgICAgaWYgKGV0YWcpIHtcbiAgICAgICAgZXRhZyA9IGV0YWcucmVwbGFjZSgvXlwiLywgJycpLnJlcGxhY2UoL1wiJC8sICcnKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmV0YWdzLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnIH0pXG5cbiAgICAgIC8vIElnbm9yZSB0aGUgJ2RhdGEnIGV2ZW50IHNvIHRoYXQgdGhlIHN0cmVhbSBjbG9zZXMuIChub2RlanMgc3RyZWFtIHJlcXVpcmVtZW50KVxuICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgLy8gV2UncmUgcmVhZHkgZm9yIHRoZSBuZXh0IGNodW5rLlxuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5lbXB0eVN0cmVhbSkge1xuICAgICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubWV0YURhdGEsIHsgJ0NvbnRlbnQtTGVuZ3RoJzogMCB9KVxuICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6ICcnLFxuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdE5hbWU6IHRoaXMub2JqZWN0TmFtZSxcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGllbnQubWFrZVJlcXVlc3Qob3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgIGV0YWc6IHNhbml0aXplRVRhZyhyZXNwb25zZS5oZWFkZXJzLmV0YWcpLFxuICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG5cbiAgICAgICAgLy8gR2l2ZSB0aGUgZXRhZyBiYWNrLCB3ZSdyZSBkb25lIVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWNhdXNlIHdlJ3JlIHN1cmUgdGhlIHN0cmVhbSBoYXMgZW5kZWQsIGFsbG93IGl0IHRvIGZsdXNoIGFuZCBlbmQuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBJZiBpdCBoYXMgYmVlbiB1cGxvYWRlZCBpbiBhIHNpbmdsZSBwYWNrZXQsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuXG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYWxsIG9mIHRoZSBjaHVua3MgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0aHVzXG4gICAgLy8gY29tcGxldGluZyB0aGUgbXVsdGlwYXJ0IHVwbG9hZC5cbiAgICB0aGlzLmNsaWVudC5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMub2JqZWN0TmFtZSwgdGhpcy5pZCwgdGhpcy5ldGFncywgKGVyciwgZXRhZykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIG91ciBjYWxsYmFjayBvbiB0aGUgbmV4dCB0aWNrIHRvIGFsbG93IHRoZSBzdHJlYW1zIGluZnJhc3RydWN0dXJlXG4gICAgICAvLyB0byBmaW5pc2ggd2hhdCBpdHMgZG9pbmcgYmVmb3JlIHdlIGNvbnRpbnVlLlxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgZXRhZylcbiAgICAgIH0pXG5cbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9XG59XG5cbi8vIGRlcHJlY2F0ZWQgZGVmYXVsdCBleHBvcnQsIHBsZWFzZSB1c2UgbmFtZWQgZXhwb3J0cy5cbi8vIGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBPYmplY3RVcGxvYWRlclxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxXQUFBLEdBQUFILHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFBaUUsU0FBQUkseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQU4sd0JBQUFVLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FB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 /***/ }), @@ -82417,14 +85599,19 @@ Object.defineProperty(exports, "__esModule", ({ exports.bucketEncryptionTransformer = bucketEncryptionTransformer; exports.bucketVersioningTransformer = bucketVersioningTransformer; exports.getBucketNotificationTransformer = getBucketNotificationTransformer; +exports.getBucketRegionTransformer = getBucketRegionTransformer; exports.getCompleteMultipartTransformer = getCompleteMultipartTransformer; exports.getConcater = getConcater; exports.getCopyObjectTransformer = getCopyObjectTransformer; +exports.getErrorTransformer = getErrorTransformer; exports.getHashSummer = getHashSummer; +exports.getInitiateMultipartTransformer = getInitiateMultipartTransformer; +exports.getListBucketTransformer = getListBucketTransformer; exports.getListMultipartTransformer = getListMultipartTransformer; exports.getListObjectsTransformer = getListObjectsTransformer; exports.getListObjectsV2Transformer = getListObjectsV2Transformer; exports.getListObjectsV2WithMetadataTransformer = getListObjectsV2WithMetadataTransformer; +exports.getListPartsTransformer = getListPartsTransformer; exports.getNotificationTransformer = getNotificationTransformer; exports.getTagsTransformer = getTagsTransformer; exports.lifecycleTransformer = lifecycleTransformer; @@ -82432,11 +85619,14 @@ exports.objectLegalHoldTransformer = objectLegalHoldTransformer; exports.objectLockTransformer = objectLockTransformer; exports.objectRetentionTransformer = objectRetentionTransformer; exports.removeObjectsTransformer = removeObjectsTransformer; +exports.replicationConfigTransformer = replicationConfigTransformer; exports.selectObjectContentTransformer = selectObjectContentTransformer; exports.uploadPartTransformer = uploadPartTransformer; var Crypto = _interopRequireWildcard(__nccwpck_require__(6113), true); var _jsonStream = __nccwpck_require__(1676); +var _lodash = __nccwpck_require__(250); var _through = __nccwpck_require__(8180); +var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); var _helper = __nccwpck_require__(9921); var xmlParsers = _interopRequireWildcard(__nccwpck_require__(714), true); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -82493,6 +85683,65 @@ function getConcater(parser, emitError) { }); } +// Generates an Error object depending on http statusCode and XML body +function getErrorTransformer(response) { + var statusCode = response.statusCode; + var code, message; + if (statusCode === 301) { + code = 'MovedPermanently'; + message = 'Moved Permanently'; + } else if (statusCode === 307) { + code = 'TemporaryRedirect'; + message = 'Are you using the correct endpoint URL?'; + } else if (statusCode === 403) { + code = 'AccessDenied'; + message = 'Valid and authorized credentials required'; + } else if (statusCode === 404) { + code = 'NotFound'; + message = 'Not Found'; + } else if (statusCode === 405) { + code = 'MethodNotAllowed'; + message = 'Method Not Allowed'; + } else if (statusCode === 501) { + code = 'MethodNotAllowed'; + message = 'Method Not Allowed'; + } else { + code = 'UnknownError'; + message = `${statusCode}`; + } + var headerInfo = {}; + // A value created by S3 compatible server that uniquely identifies + // the request. + headerInfo.amzRequestid = response.headersSent ? response.getHeader('x-amz-request-id') : null; + // A special token that helps troubleshoot API replies and issues. + headerInfo.amzId2 = response.headersSent ? response.getHeader('x-amz-id-2') : null; + // Region where the bucket is located. This header is returned only + // in HEAD bucket and ListObjects response. + headerInfo.amzBucketRegion = response.headersSent ? response.getHeader('x-amz-bucket-region') : null; + return getConcater(xmlString => { + let getError = () => { + // Message should be instantiated for each S3Errors. + var e = new errors.S3Error(message); + // S3 Error code. + e.code = code; + _lodash.each(headerInfo, (value, key) => { + e[key] = value; + }); + return e; + }; + if (!xmlString) { + return getError(); + } + let e; + try { + e = xmlParsers.parseError(xmlString, headerInfo); + } catch (ex) { + return getError(); + } + return e; + }, true); +} + // A through stream that calculates md5sum and sha256sum function getHashSummer(enableSHA256) { var md5 = Crypto.createHash('md5'); @@ -82530,11 +85779,26 @@ function getCopyObjectTransformer() { return getConcater(xmlParsers.parseCopyObject); } +// Parses listBuckets response. +function getListBucketTransformer() { + return getConcater(xmlParsers.parseListBucket); +} + // Parses listMultipartUploads response. function getListMultipartTransformer() { return getConcater(xmlParsers.parseListMultipart); } +// Parses listParts response. +function getListPartsTransformer() { + return getConcater(xmlParsers.parseListParts); +} + +// Parses initMultipartUpload response. +function getInitiateMultipartTransformer() { + return getConcater(xmlParsers.parseInitiateMultipart); +} + // Parses listObjects response. function getListObjectsTransformer() { return getConcater(xmlParsers.parseListObjects); @@ -82555,6 +85819,11 @@ function getCompleteMultipartTransformer() { return getConcater(xmlParsers.parseCompleteMultipart); } +// Parses getBucketLocation response. +function getBucketRegionTransformer() { + return getConcater(xmlParsers.parseBucketRegion); +} + // Parses GET/SET BucketNotification response function getBucketNotificationTransformer() { return getConcater(xmlParsers.parseBucketNotification); @@ -82583,6 +85852,9 @@ function objectRetentionTransformer() { function bucketEncryptionTransformer() { return getConcater(xmlParsers.parseBucketEncryptionConfig); } +function replicationConfigTransformer() { + return getConcater(xmlParsers.parseReplicationConfig); +} function objectLegalHoldTransformer() { return getConcater(xmlParsers.parseObjectLegalHoldConfig); } @@ -82595,7 +85867,7 @@ function selectObjectContentTransformer() { function removeObjectsTransformer() { return getConcater(xmlParsers.removeObjectsParser); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfanNvblN0cmVhbSIsIl90aHJvdWdoIiwiX2hlbHBlciIsInhtbFBhcnNlcnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiZ2V0Q29uY2F0ZXIiLCJwYXJzZXIiLCJlbWl0RXJyb3IiLCJvYmplY3RNb2RlIiwiYnVmcyIsImlzRnVuY3Rpb24iLCJUeXBlRXJyb3IiLCJUaHJvdWdoMiIsImNodW5rIiwiZW5jIiwiY2IiLCJwdXNoIiwiQnVmZmVyIiwiY29uY2F0IiwidG9TdHJpbmciLCJsZW5ndGgiLCJnZXRIYXNoU3VtbWVyIiwiZW5hYmxlU0hBMjU2IiwibWQ1IiwiY3JlYXRlSGFzaCIsInNoYTI1NiIsInVwZGF0ZSIsIm1kNXN1bSIsInNoYTI1NnN1bSIsImRpZ2VzdCIsImhhc2hEYXRhIiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwicGFyc2VDb3B5T2JqZWN0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsInBhcnNlTGlzdE9iamVjdHMiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjIiLCJnZXRMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VDb21wbGV0ZU11bHRpcGFydCIsImdldEJ1Y2tldE5vdGlmaWNhdGlvblRyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXROb3RpZmljYXRpb24iLCJnZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lciIsIkpTT05QYXJzZXIiLCJidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIiLCJwYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWciLCJnZXRUYWdzVHJhbnNmb3JtZXIiLCJwYXJzZVRhZ2dpbmciLCJsaWZlY3ljbGVUcmFuc2Zvcm1lciIsInBhcnNlTGlmZWN5Y2xlQ29uZmlnIiwib2JqZWN0TG9ja1RyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsImJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lciIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsIm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWciLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0UGFyc2VyIiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1BhcnNlciJdLCJzb3VyY2VzIjpbInRyYW5zZm9ybWVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSwgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5cbmltcG9ydCBKU09OUGFyc2VyIGZyb20gJ2pzb24tc3RyZWFtJ1xuaW1wb3J0IFRocm91Z2gyIGZyb20gJ3Rocm91Z2gyJ1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB4bWxQYXJzZXJzIGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbi8vIGdldENvbmNhdGVyIHJldHVybnMgYSBzdHJlYW0gdGhhdCBjb25jYXRlbmF0ZXMgdGhlIGlucHV0IGFuZCBlbWl0c1xuLy8gdGhlIGNvbmNhdGVuYXRlZCBvdXRwdXQgd2hlbiAnZW5kJyBoYXMgcmVhY2hlZC4gSWYgYW4gb3B0aW9uYWxcbi8vIHBhcnNlciBmdW5jdGlvbiBpcyBwYXNzZWQgdXBvbiByZWFjaGluZyB0aGUgJ2VuZCcgb2YgdGhlIHN0cmVhbSxcbi8vIGBwYXJzZXIoY29uY2F0ZW5hdGVkX2RhdGEpYCB3aWxsIGJlIGVtaXR0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY2F0ZXIocGFyc2VyLCBlbWl0RXJyb3IpIHtcbiAgdmFyIG9iamVjdE1vZGUgPSBmYWxzZVxuICB2YXIgYnVmcyA9IFtdXG5cbiAgaWYgKHBhcnNlciAmJiAhaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gIH1cblxuICBpZiAocGFyc2VyKSB7XG4gICAgb2JqZWN0TW9kZSA9IHRydWVcbiAgfVxuXG4gIHJldHVybiBUaHJvdWdoMihcbiAgICB7IG9iamVjdE1vZGUgfSxcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGJ1ZnMucHVzaChjaHVuaylcbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgaWYgKGVtaXRFcnJvcikge1xuICAgICAgICBjYihwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgLy8gY2IoZSkgd291bGQgbWVhbiB3ZSBoYXZlIHRvIGVtaXQgJ2VuZCcgYnkgZXhwbGljaXRseSBjYWxsaW5nIHRoaXMucHVzaChudWxsKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYnVmcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICAgIHRoaXMucHVzaChwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gQSB0aHJvdWdoIHN0cmVhbSB0aGF0IGNhbGN1bGF0ZXMgbWQ1c3VtIGFuZCBzaGEyNTZzdW1cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYXNoU3VtbWVyKGVuYWJsZVNIQTI1Nikge1xuICB2YXIgbWQ1ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpXG4gIHZhciBzaGEyNTYgPSBDcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JylcblxuICByZXR1cm4gVGhyb3VnaDIub2JqKFxuICAgIGZ1bmN0aW9uIChjaHVuaywgZW5jLCBjYikge1xuICAgICAgaWYgKGVuYWJsZVNIQTI1Nikge1xuICAgICAgICBzaGEyNTYudXBkYXRlKGNodW5rKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWQ1LnVwZGF0ZShjaHVuaylcbiAgICAgIH1cbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIG1kNXN1bSA9ICcnXG4gICAgICB2YXIgc2hhMjU2c3VtID0gJydcbiAgICAgIGlmIChlbmFibGVTSEEyNTYpIHtcbiAgICAgICAgc2hhMjU2c3VtID0gc2hhMjU2LmRpZ2VzdCgnaGV4JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1kNXN1bSA9IG1kNS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICB9XG4gICAgICB2YXIgaGFzaERhdGEgPSB7IG1kNXN1bSwgc2hhMjU2c3VtIH1cbiAgICAgIHRoaXMucHVzaChoYXNoRGF0YSlcbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gRm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gYSBzdHJlYW0gb2JqZWN0IHRoYXQgcGFyc2VzIFhNTFxuLy8gYW5kIGVtaXRzIHN1aXRhYmxlIEphdmFzY3JpcHQgb2JqZWN0cy5cblxuLy8gUGFyc2VzIENvcHlPYmplY3QgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUNvcHlPYmplY3QpXG59XG5cbi8vIFBhcnNlcyBsaXN0TXVsdGlwYXJ0VXBsb2FkcyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGxpc3RPYmplY3RzIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE9iamVjdHMpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE9iamVjdHNWMilcbn1cblxuLy8gUGFyc2VzIGxpc3RPYmplY3RzIHdpdGggbWV0YWRhdGEgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEpXG59XG5cbi8vIFBhcnNlcyBjb21wbGV0ZU11bHRpcGFydFVwbG9hZCByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUNvbXBsZXRlTXVsdGlwYXJ0KVxufVxuXG4vLyBQYXJzZXMgR0VUL1NFVCBCdWNrZXROb3RpZmljYXRpb24gcmVzcG9uc2VcbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VCdWNrZXROb3RpZmljYXRpb24pXG59XG5cbi8vIFBhcnNlcyBhIG5vdGlmaWNhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lcigpIHtcbiAgLy8gVGhpcyB3aWxsIHBhcnNlIGFuZCByZXR1cm4gZWFjaCBvYmplY3QuXG4gIHJldHVybiBuZXcgSlNPTlBhcnNlcigpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlQnVja2V0VmVyc2lvbmluZ0NvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhZ3NUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VUYWdnaW5nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlmZWN5Y2xlVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlmZWN5Y2xlQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TG9ja1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZU9iamVjdExvY2tDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RSZXRlbnRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RSZXRlbnRpb25Db25maWcpXG59XG5leHBvcnQgZnVuY3Rpb24gYnVja2V0RW5jcnlwdGlvblRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldEVuY3J5cHRpb25Db25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRQYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnVwbG9hZFBhcnRQYXJzZXIpXG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5yZW1vdmVPYmplY3RzUGFyc2VyKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUwsdUJBQUEsQ0FBQUMsT0FBQTtBQUE4QyxTQUFBSyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBUCx3QkFBQVcsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxD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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfanNvblN0cmVhbSIsIl9sb2Rhc2giLCJfdGhyb3VnaCIsImVycm9ycyIsIl9oZWxwZXIiLCJ4bWxQYXJzZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsImdldENvbmNhdGVyIiwicGFyc2VyIiwiZW1pdEVycm9yIiwib2JqZWN0TW9kZSIsImJ1ZnMiLCJpc0Z1bmN0aW9uIiwiVHlwZUVycm9yIiwiVGhyb3VnaDIiLCJjaHVuayIsImVuYyIsImNiIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsInRvU3RyaW5nIiwibGVuZ3RoIiwiZ2V0RXJyb3JUcmFuc2Zvcm1lciIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsImNvZGUiLCJtZXNzYWdlIiwiaGVhZGVySW5mbyIsImFtelJlcXVlc3RpZCIsImhlYWRlcnNTZW50IiwiZ2V0SGVhZGVyIiwiYW16SWQyIiwiYW16QnVja2V0UmVnaW9uIiwieG1sU3RyaW5nIiwiZ2V0RXJyb3IiLCJlIiwiUzNFcnJvciIsIl8iLCJlYWNoIiwidmFsdWUiLCJwYXJzZUVycm9yIiwiZXgiLCJnZXRIYXNoU3VtbWVyIiwiZW5hYmxlU0hBMjU2IiwibWQ1IiwiY3JlYXRlSGFzaCIsInNoYTI1NiIsInVwZGF0ZSIsIm1kNXN1bSIsInNoYTI1NnN1bSIsImRpZ2VzdCIsImhhc2hEYXRhIiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwicGFyc2VDb3B5T2JqZWN0IiwiZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0QnVja2V0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwiZ2V0TGlzdFBhcnRzVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RQYXJ0cyIsImdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsInBhcnNlTGlzdE9iamVjdHMiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjIiLCJnZXRMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VDb21wbGV0ZU11bHRpcGFydCIsImdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXRSZWdpb24iLCJnZXRCdWNrZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lciIsInBhcnNlQnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJKU09OUGFyc2VyIiwiYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwiZ2V0VGFnc1RyYW5zZm9ybWVyIiwicGFyc2VUYWdnaW5nIiwibGlmZWN5Y2xlVHJhbnNmb3JtZXIiLCJwYXJzZUxpZmVjeWNsZUNvbmZpZyIsIm9iamVjdExvY2tUcmFuc2Zvcm1lciIsInBhcnNlT2JqZWN0TG9ja0NvbmZpZyIsIm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RSZXRlbnRpb25Db25maWciLCJidWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIiLCJwYXJzZUJ1Y2tldEVuY3J5cHRpb25Db25maWciLCJyZXBsaWNhdGlvbkNvbmZpZ1RyYW5zZm9ybWVyIiwicGFyc2VSZXBsaWNhdGlvbkNvbmZpZyIsIm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWciLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0UGFyc2VyIiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1BhcnNlciJdLCJzb3VyY2VzIjpbInRyYW5zZm9ybWVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSwgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5cbmltcG9ydCBKU09OUGFyc2VyIGZyb20gJ2pzb24tc3RyZWFtJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IFRocm91Z2gyIGZyb20gJ3Rocm91Z2gyJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB4bWxQYXJzZXJzIGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbi8vIGdldENvbmNhdGVyIHJldHVybnMgYSBzdHJlYW0gdGhhdCBjb25jYXRlbmF0ZXMgdGhlIGlucHV0IGFuZCBlbWl0c1xuLy8gdGhlIGNvbmNhdGVuYXRlZCBvdXRwdXQgd2hlbiAnZW5kJyBoYXMgcmVhY2hlZC4gSWYgYW4gb3B0aW9uYWxcbi8vIHBhcnNlciBmdW5jdGlvbiBpcyBwYXNzZWQgdXBvbiByZWFjaGluZyB0aGUgJ2VuZCcgb2YgdGhlIHN0cmVhbSxcbi8vIGBwYXJzZXIoY29uY2F0ZW5hdGVkX2RhdGEpYCB3aWxsIGJlIGVtaXR0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY2F0ZXIocGFyc2VyLCBlbWl0RXJyb3IpIHtcbiAgdmFyIG9iamVjdE1vZGUgPSBmYWxzZVxuICB2YXIgYnVmcyA9IFtdXG5cbiAgaWYgKHBhcnNlciAmJiAhaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gIH1cblxuICBpZiAocGFyc2VyKSB7XG4gICAgb2JqZWN0TW9kZSA9IHRydWVcbiAgfVxuXG4gIHJldHVybiBUaHJvdWdoMihcbiAgICB7IG9iamVjdE1vZGUgfSxcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGJ1ZnMucHVzaChjaHVuaylcbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgaWYgKGVtaXRFcnJvcikge1xuICAgICAgICBjYihwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgLy8gY2IoZSkgd291bGQgbWVhbiB3ZSBoYXZlIHRvIGVtaXQgJ2VuZCcgYnkgZXhwbGljaXRseSBjYWxsaW5nIHRoaXMucHVzaChudWxsKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYnVmcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICAgIHRoaXMucHVzaChwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gR2VuZXJhdGVzIGFuIEVycm9yIG9iamVjdCBkZXBlbmRpbmcgb24gaHR0cCBzdGF0dXNDb2RlIGFuZCBYTUwgYm9keVxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yVHJhbnNmb3JtZXIocmVzcG9uc2UpIHtcbiAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlXG4gIHZhciBjb2RlLCBtZXNzYWdlXG4gIGlmIChzdGF0dXNDb2RlID09PSAzMDEpIHtcbiAgICBjb2RlID0gJ01vdmVkUGVybWFuZW50bHknXG4gICAgbWVzc2FnZSA9ICdNb3ZlZCBQZXJtYW5lbnRseSdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSAzMDcpIHtcbiAgICBjb2RlID0gJ1RlbXBvcmFyeVJlZGlyZWN0J1xuICAgIG1lc3NhZ2UgPSAnQXJlIHlvdSB1c2luZyB0aGUgY29ycmVjdCBlbmRwb2ludCBVUkw/J1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgIGNvZGUgPSAnQWNjZXNzRGVuaWVkJ1xuICAgIG1lc3NhZ2UgPSAnVmFsaWQgYW5kIGF1dGhvcml6ZWQgY3JlZGVudGlhbHMgcmVxdWlyZWQnXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgY29kZSA9ICdOb3RGb3VuZCdcbiAgICBtZXNzYWdlID0gJ05vdCBGb3VuZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA0MDUpIHtcbiAgICBjb2RlID0gJ01ldGhvZE5vdEFsbG93ZWQnXG4gICAgbWVzc2FnZSA9ICdNZXRob2QgTm90IEFsbG93ZWQnXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNTAxKSB7XG4gICAgY29kZSA9ICdNZXRob2ROb3RBbGxvd2VkJ1xuICAgIG1lc3NhZ2UgPSAnTWV0aG9kIE5vdCBBbGxvd2VkJ1xuICB9IGVsc2Uge1xuICAgIGNvZGUgPSAnVW5rbm93bkVycm9yJ1xuICAgIG1lc3NhZ2UgPSBgJHtzdGF0dXNDb2RlfWBcbiAgfVxuXG4gIHZhciBoZWFkZXJJbmZvID0ge31cbiAgLy8gQSB2YWx1ZSBjcmVhdGVkIGJ5IFMzIGNvbXBhdGlibGUgc2VydmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllc1xuICAvLyB0aGUgcmVxdWVzdC5cbiAgaGVhZGVySW5mby5hbXpSZXF1ZXN0aWQgPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotcmVxdWVzdC1pZCcpIDogbnVsbFxuICAvLyBBIHNwZWNpYWwgdG9rZW4gdGhhdCBoZWxwcyB0cm91Ymxlc2hvb3QgQVBJIHJlcGxpZXMgYW5kIGlzc3Vlcy5cbiAgaGVhZGVySW5mby5hbXpJZDIgPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotaWQtMicpIDogbnVsbFxuICAvLyBSZWdpb24gd2hlcmUgdGhlIGJ1Y2tldCBpcyBsb2NhdGVkLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5XG4gIC8vIGluIEhFQUQgYnVja2V0IGFuZCBMaXN0T2JqZWN0cyByZXNwb25zZS5cbiAgaGVhZGVySW5mby5hbXpCdWNrZXRSZWdpb24gPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotYnVja2V0LXJlZ2lvbicpIDogbnVsbFxuXG4gIHJldHVybiBnZXRDb25jYXRlcigoeG1sU3RyaW5nKSA9PiB7XG4gICAgbGV0IGdldEVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gTWVzc2FnZSBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciBlYWNoIFMzRXJyb3JzLlxuICAgICAgdmFyIGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IobWVzc2FnZSlcbiAgICAgIC8vIFMzIEVycm9yIGNvZGUuXG4gICAgICBlLmNvZGUgPSBjb2RlXG4gICAgICBfLmVhY2goaGVhZGVySW5mbywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgZVtrZXldID0gdmFsdWVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZVxuICAgIH1cbiAgICBpZiAoIXhtbFN0cmluZykge1xuICAgICAgcmV0dXJuIGdldEVycm9yKClcbiAgICB9XG4gICAgbGV0IGVcbiAgICB0cnkge1xuICAgICAgZSA9IHhtbFBhcnNlcnMucGFyc2VFcnJvcih4bWxTdHJpbmcsIGhlYWRlckluZm8pXG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBnZXRFcnJvcigpXG4gICAgfVxuICAgIHJldHVybiBlXG4gIH0sIHRydWUpXG59XG5cbi8vIEEgdGhyb3VnaCBzdHJlYW0gdGhhdCBjYWxjdWxhdGVzIG1kNXN1bSBhbmQgc2hhMjU2c3VtXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFzaFN1bW1lcihlbmFibGVTSEEyNTYpIHtcbiAgdmFyIG1kNSA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKVxuICB2YXIgc2hhMjU2ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG5cbiAgcmV0dXJuIFRocm91Z2gyLm9iaihcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGlmIChlbmFibGVTSEEyNTYpIHtcbiAgICAgICAgc2hhMjU2LnVwZGF0ZShjaHVuaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1kNS51cGRhdGUoY2h1bmspXG4gICAgICB9XG4gICAgICBjYigpXG4gICAgfSxcbiAgICBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBtZDVzdW0gPSAnJ1xuICAgICAgdmFyIHNoYTI1NnN1bSA9ICcnXG4gICAgICBpZiAoZW5hYmxlU0hBMjU2KSB7XG4gICAgICAgIHNoYTI1NnN1bSA9IHNoYTI1Ni5kaWdlc3QoJ2hleCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZDVzdW0gPSBtZDUuZGlnZXN0KCdiYXNlNjQnKVxuICAgICAgfVxuICAgICAgdmFyIGhhc2hEYXRhID0geyBtZDVzdW0sIHNoYTI1NnN1bSB9XG4gICAgICB0aGlzLnB1c2goaGFzaERhdGEpXG4gICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIGNiKClcbiAgICB9LFxuICApXG59XG5cbi8vIEZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIGEgc3RyZWFtIG9iamVjdCB0aGF0IHBhcnNlcyBYTUxcbi8vIGFuZCBlbWl0cyBzdWl0YWJsZSBKYXZhc2NyaXB0IG9iamVjdHMuXG5cbi8vIFBhcnNlcyBDb3B5T2JqZWN0IHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VDb3B5T2JqZWN0KVxufVxuXG4vLyBQYXJzZXMgbGlzdEJ1Y2tldHMgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RCdWNrZXQpXG59XG5cbi8vIFBhcnNlcyBsaXN0TXVsdGlwYXJ0VXBsb2FkcyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGxpc3RQYXJ0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0UGFydHNUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VMaXN0UGFydHMpXG59XG5cbi8vIFBhcnNlcyBpbml0TXVsdGlwYXJ0VXBsb2FkIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlSW5pdGlhdGVNdWx0aXBhcnQpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0T2JqZWN0c1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzKVxufVxuXG4vLyBQYXJzZXMgbGlzdE9iamVjdHMgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzVjIpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyB3aXRoIG1ldGFkYXRhIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldExpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhKVxufVxuXG4vLyBQYXJzZXMgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VDb21wbGV0ZU11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGdldEJ1Y2tldExvY2F0aW9uIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldFJlZ2lvbilcbn1cblxuLy8gUGFyc2VzIEdFVC9TRVQgQnVja2V0Tm90aWZpY2F0aW9uIHJlc3BvbnNlXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlQnVja2V0Tm90aWZpY2F0aW9uKVxufVxuXG4vLyBQYXJzZXMgYSBub3RpZmljYXRpb24uXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKSB7XG4gIC8vIFRoaXMgd2lsbCBwYXJzZSBhbmQgcmV0dXJuIGVhY2ggb2JqZWN0LlxuICByZXR1cm4gbmV3IEpTT05QYXJzZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWdzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlVGFnZ2luZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpZmVjeWNsZVRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpZmVjeWNsZUNvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdExvY2tUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RMb2NrQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlT2JqZWN0UmV0ZW50aW9uQ29uZmlnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VCdWNrZXRFbmNyeXB0aW9uQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VSZXBsaWNhdGlvbkNvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBhcnRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMudXBsb2FkUGFydFBhcnNlcilcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RPYmplY3RDb250ZW50VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcigpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVPYmplY3RzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnJlbW92ZU9i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 /***/ }), @@ -82610,23 +85882,30 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.parseBucketEncryptionConfig = parseBucketEncryptionConfig; exports.parseBucketNotification = parseBucketNotification; +exports.parseBucketRegion = parseBucketRegion; exports.parseBucketVersioningConfig = parseBucketVersioningConfig; exports.parseCompleteMultipart = parseCompleteMultipart; exports.parseCopyObject = parseCopyObject; +exports.parseError = parseError; +exports.parseInitiateMultipart = parseInitiateMultipart; exports.parseLifecycleConfig = parseLifecycleConfig; +exports.parseListBucket = parseListBucket; exports.parseListMultipart = parseListMultipart; exports.parseListObjects = parseListObjects; exports.parseListObjectsV2 = parseListObjectsV2; exports.parseListObjectsV2WithMetadata = parseListObjectsV2WithMetadata; +exports.parseListParts = parseListParts; exports.parseObjectLegalHoldConfig = parseObjectLegalHoldConfig; exports.parseObjectLockConfig = parseObjectLockConfig; exports.parseObjectRetentionConfig = parseObjectRetentionConfig; +exports.parseReplicationConfig = parseReplicationConfig; exports.parseSelectObjectContentResponse = parseSelectObjectContentResponse; exports.parseTagging = parseTagging; exports.removeObjectsParser = removeObjectsParser; exports.uploadPartParser = uploadPartParser; var _bufferCrc = __nccwpck_require__(4024); var _fastXmlParser = __nccwpck_require__(2603); +var _lodash = __nccwpck_require__(250); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); var _helpers = __nccwpck_require__(9455); var _helper = __nccwpck_require__(9921); @@ -82649,11 +85928,25 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && * limitations under the License. */ -const fxpWithoutNumParser = new _fastXmlParser.XMLParser({ - numberParseOptions: { - skipLike: /./ +// Parse XML and return information as Javascript types +const fxp = new _fastXmlParser.XMLParser(); + +// parse error XML response +function parseError(xml, headerInfo) { + var xmlErr = {}; + var xmlObj = fxp.parse(xml); + if (xmlObj.Error) { + xmlErr = xmlObj.Error; } -}); + var e = new errors.S3Error(); + _lodash.each(xmlErr, (value, key) => { + e[key.toLowerCase()] = value; + }); + _lodash.each(headerInfo, (value, key) => { + e[key] = value; + }); + return e; +} // parse XML response for copy object function parseCopyObject(xml) { @@ -82694,7 +85987,7 @@ function parseListMultipart(xml) { result.nextKeyMarker = xmlobj.NextKeyMarker; } if (xmlobj.NextUploadIdMarker) { - result.nextUploadIdMarker = xmlobj.nextUploadIdMarker || ''; + result.nextUploadIdMarker = xmlobj.nextUploadIdMarker; } if (xmlobj.CommonPrefixes) { (0, _helper.toArray)(xmlobj.CommonPrefixes).forEach(prefix => { @@ -82731,6 +86024,27 @@ function parseListMultipart(xml) { } // parse XML response to list all the owned buckets +function parseListBucket(xml) { + var result = []; + var xmlobj = (0, _helper.parseXml)(xml); + if (!xmlobj.ListAllMyBucketsResult) { + throw new errors.InvalidXMLError('Missing tag: "ListAllMyBucketsResult"'); + } + xmlobj = xmlobj.ListAllMyBucketsResult; + if (xmlobj.Buckets) { + if (xmlobj.Buckets.Bucket) { + (0, _helper.toArray)(xmlobj.Buckets.Bucket).forEach(bucket => { + var name = bucket.Name; + var creationDate = new Date(bucket.CreationDate); + result.push({ + name, + creationDate + }); + }); + } + } + return result; +} // parse XML response for bucket notification function parseBucketNotification(xml) { @@ -82821,6 +86135,58 @@ function parseBucketNotification(xml) { return result; } +// parse XML response for bucket region +function parseBucketRegion(xml) { + // return region information + return (0, _helper.parseXml)(xml).LocationConstraint; +} + +// parse XML response for list parts of an in progress multipart upload +function parseListParts(xml) { + var xmlobj = (0, _helper.parseXml)(xml); + var result = { + isTruncated: false, + parts: [], + marker: undefined + }; + if (!xmlobj.ListPartsResult) { + throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"'); + } + xmlobj = xmlobj.ListPartsResult; + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated; + } + if (xmlobj.NextPartNumberMarker) { + result.marker = +(0, _helper.toArray)(xmlobj.NextPartNumberMarker)[0]; + } + if (xmlobj.Part) { + (0, _helper.toArray)(xmlobj.Part).forEach(p => { + var part = +(0, _helper.toArray)(p.PartNumber)[0]; + var lastModified = new Date(p.LastModified); + var etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, ''); + result.parts.push({ + part, + lastModified, + etag + }); + }); + } + return result; +} + +// parse XML response when a new multipart upload is initiated +function parseInitiateMultipart(xml) { + var xmlobj = (0, _helper.parseXml)(xml); + if (!xmlobj.InitiateMultipartUploadResult) { + throw new errors.InvalidXMLError('Missing tag: "InitiateMultipartUploadResult"'); + } + xmlobj = xmlobj.InitiateMultipartUploadResult; + if (xmlobj.UploadId) { + return xmlobj.UploadId; + } + throw new errors.InvalidXMLError('Missing tag: "UploadId"'); +} + // parse XML response when a multipart upload is completed function parseCompleteMultipart(xml) { var xmlobj = (0, _helper.parseXml)(xml).CompleteMultipartUploadResult; @@ -82861,12 +86227,11 @@ const formatObjInfo = (content, opts = {}) => { const name = (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(Key)[0]); const lastModified = new Date((0, _helper.toArray)(LastModified)[0]); const etag = (0, _helper.sanitizeETag)((0, _helper.toArray)(ETag)[0]); - const size = (0, _helper.sanitizeSize)(Size); return { name, lastModified, etag, - size, + size: Size, versionId: VersionId, isLatest: IsLatest, isDeleteMarker: opts.IsDeleteMarker ? opts.IsDeleteMarker : false @@ -82881,7 +86246,7 @@ function parseListObjects(xml) { }; let isTruncated = false; let nextMarker, nextVersionKeyMarker; - const xmlobj = fxpWithoutNumParser.parse(xml); + const xmlobj = (0, _helper.parseXml)(xml); const parseCommonPrefixesEntity = responseEntity => { if (responseEntity) { (0, _helper.toArray)(responseEntity).forEach(commonPrefix => { @@ -82903,7 +86268,7 @@ function parseListObjects(xml) { const name = (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(content.Key)[0]); const lastModified = new Date((0, _helper.toArray)(content.LastModified)[0]); const etag = (0, _helper.sanitizeETag)((0, _helper.toArray)(content.ETag)[0]); - const size = (0, _helper.sanitizeSize)(content.Size); + const size = content.Size; result.objects.push({ name, lastModified, @@ -83097,6 +86462,16 @@ function parseBucketEncryptionConfig(xml) { let encConfig = (0, _helper.parseXml)(xml); return encConfig; } +function parseReplicationConfig(xml) { + const xmlObj = (0, _helper.parseXml)(xml); + const replicationConfig = { + ReplicationConfiguration: { + role: xmlObj.ReplicationConfiguration.Role, + rules: (0, _helper.toArray)(xmlObj.ReplicationConfiguration.Rule) + } + }; + return replicationConfig; +} function parseObjectLegalHoldConfig(xml) { const xmlObj = (0, _helper.parseXml)(xml); return xmlObj.LegalHold; @@ -83246,7 +86621,222 @@ function parseSelectObjectContentResponse(res) { } // messageType End } // Top Level Stream End } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVmZmVyQ3JjIiwicmVxdWlyZSIsIl9mYXN0WG1sUGFyc2VyIiwiZXJyb3JzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfaGVscGVycyIsIl9oZWxwZXIiLCJfdHlwZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJmeHBXaXRob3V0TnVtUGFyc2VyIiwiWE1MUGFyc2VyIiwibnVtYmVyUGFyc2VPcHRpb25zIiwic2tpcExpa2UiLCJwYXJzZUNvcHlPYmplY3QiLCJ4bWwiLCJyZXN1bHQiLCJldGFnIiwibGFzdE1vZGlmaWVkIiwieG1sb2JqIiwicGFyc2VYbWwiLCJDb3B5T2JqZWN0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiRVRhZyIsInJlcGxhY2UiLCJMYXN0TW9kaWZpZWQiLCJEYXRlIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwidXBsb2FkcyIsInByZWZpeGVzIiwiaXNUcnVuY2F0ZWQiLCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCIsIklzVHJ1bmNhdGVkIiwiTmV4dEtleU1hcmtlciIsIm5leHRLZXlNYXJrZXIiLCJOZXh0VXBsb2FkSWRNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJDb21tb25QcmVmaXhlcyIsInRvQXJyYXkiLCJmb3JFYWNoIiwicHJlZml4IiwicHVzaCIsInNhbml0aXplT2JqZWN0S2V5IiwiUHJlZml4IiwiVXBsb2FkIiwidXBsb2FkIiwiS2V5IiwidXBsb2FkSWQiLCJVcGxvYWRJZCIsImluaXRpYXRvciIsImlkIiwiSW5pdGlhdG9yIiwiSUQiLCJkaXNwbGF5TmFtZSIsIkRpc3BsYXlOYW1lIiwib3duZXIiLCJPd25lciIsInN0b3JhZ2VDbGFzcyIsIlN0b3JhZ2VDbGFzcyIsImluaXRpYXRlZCIsIkluaXRpYXRlZCIsInBhcnNlQnVja2V0Tm90aWZpY2F0aW9uIiwiVG9waWNDb25maWd1cmF0aW9uIiwiUXVldWVDb25maWd1cmF0aW9uIiwiQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24iLCJnZW5FdmVudHMiLCJldmVudHMiLCJzM2V2ZW50IiwiZ2VuRmlsdGVyUnVsZXMiLCJmaWx0ZXJzIiwiUzNLZXkiLCJGaWx0ZXJSdWxlIiwicnVsZSIsIk5hbWUiLCJWYWx1ZSIsIk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJjb25maWciLCJJZCIsIlRvcGljIiwiRXZlbnQiLCJGaWx0ZXIiLCJRdWV1ZSIsIkNsb3VkRnVuY3Rpb24iLCJwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0IiwiQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJMb2NhdGlvbiIsImxvY2F0aW9uIiwiYnVja2V0IiwiQnVja2V0IiwiQ29kZSIsIk1lc3NhZ2UiLCJlcnJDb2RlIiwiZXJyTWVzc2FnZSIsImZvcm1hdE9iakluZm8iLCJjb250ZW50Iiwib3B0cyIsIlNpemUiLCJWZXJzaW9uSWQiLCJJc0xhdGVzdCIsImlzT2JqZWN0IiwibmFtZSIsInNhbml0aXplRVRhZyIsInNpemUiLCJzYW5pdGl6ZVNpemUiLCJ2ZXJzaW9uSWQiLCJpc0xhdGVzdCIsImlzRGVsZXRlTWFya2VyIiwiSXNEZWxldGVNYXJrZXIiLCJwYXJzZUxpc3RPYmplY3RzIiwib2JqZWN0cyIsIm5leHRNYXJrZXIiLCJuZXh0VmVyc2lvbktleU1hcmtlciIsInBhcnNlIiwicGFyc2VDb21tb25QcmVmaXhlc0VudGl0eSIsInJlc3BvbnNlRW50aXR5IiwiY29tbW9uUHJlZml4IiwibGlzdEJ1Y2tldFJlc3VsdCIsIkxpc3RCdWNrZXRSZXN1bHQiLCJsaXN0VmVyc2lvbnNSZXN1bHQiLCJMaXN0VmVyc2lvbnNSZXN1bHQiLCJDb250ZW50cyIsIk5leHRNYXJrZXIiLCJWZXJzaW9uIiwiRGVsZXRlTWFya2VyIiwiTmV4dFZlcnNpb25JZE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsInBhcnNlTGlzdE9iamVjdHNWMiIsIk5leHRDb250aW51YXRpb25Ub2tlbiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSIsIm1ldGFkYXRhIiwiVXNlck1ldGFkYXRhIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwieG1sT2JqIiwiVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24iLCJwYXJzZVRhZ2dpbmciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwidGFnUmVzdWx0IiwicGFyc2VMaWZlY3ljbGVDb25maWciLCJMaWZlY3ljbGVDb25maWd1cmF0aW9uIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ1Jlc3VsdCIsIk9iamVjdExvY2tDb25maWd1cmF0aW9uIiwib2JqZWN0TG9ja0VuYWJsZWQiLCJPYmplY3RMb2NrRW5hYmxlZCIsInJldGVudGlvblJlc3AiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIm1vZGUiLCJNb2RlIiwiaXNVbml0WWVhcnMiLCJZZWFycyIsInZhbGlkaXR5IiwidW5pdCIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIllFQVJTIiwiRGF5cyIsIkRBWVMiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsInJldGVudGlvbkNvbmZpZyIsIlJldGVudGlvbiIsInJldGFpblVudGlsRGF0ZSIsIlJldGFpblVudGlsRGF0ZSIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsImVuY0NvbmZpZyIsInBhcnNlT2JqZWN0TGVnYWxIb2xkQ29uZmlnIiwiTGVnYWxIb2xkIiwidXBsb2FkUGFydFBhcnNlciIsInJlc3BFbCIsIkNvcHlQYXJ0UmVzdWx0IiwicmVtb3ZlT2JqZWN0c1BhcnNlciIsIkRlbGV0ZVJlc3VsdCIsIkVycm9yIiwicGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UiLCJyZXMiLCJleHRyYWN0SGVhZGVyVHlwZSIsInN0cmVhbSIsImhlYWRlck5hbWVMZW4iLCJCdWZmZXIiLCJmcm9tIiwicmVhZCIsInJlYWRVSW50OCIsImhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIiwidG9TdHJpbmciLCJzcGxpdEJ5U2VwYXJhdG9yIiwic3BsaXQiLCJoZWFkZXJOYW1lIiwibGVuZ3RoIiwiZXh0cmFjdEhlYWRlclZhbHVlIiwiYm9keUxlbiIsInJlYWRVSW50MTZCRSIsImJvZHlOYW1lIiwic2VsZWN0UmVzdWx0cyIsIlNlbGVjdFJlc3VsdHMiLCJyZXNwb25zZVN0cmVhbSIsInJlYWRhYmxlU3RyZWFtIiwiX3JlYWRhYmxlU3RhdGUiLCJtc2dDcmNBY2N1bXVsYXRvciIsInRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciIsImNyYzMyIiwiaGVhZGVyQnl0ZXNCdWZmZXIiLCJjYWxjdWxhdGVkUHJlbHVkZUNyYyIsInJlYWRJbnQzMkJFIiwicHJlbHVkZUNyY0J1ZmZlciIsInRvdGFsTXNnTGVuZ3RoIiwiaGVhZGVyTGVuZ3RoIiwicHJlbHVkZUNyY0J5dGVWYWx1ZSIsImhlYWRlcnMiLCJoZWFkZXJCeXRlcyIsImhlYWRlclJlYWRlclN0cmVhbSIsImhlYWRlclR5cGVOYW1lIiwicGF5bG9hZFN0cmVhbSIsInBheUxvYWRMZW5ndGgiLCJwYXlMb2FkQnVmZmVyIiwibWVzc2FnZUNyY0J5dGVWYWx1ZSIsImNhbGN1bGF0ZWRDcmMiLCJtZXNzYWdlVHlwZSIsImVycm9yTWVzc2FnZSIsImNvbnRlbnRUeXBlIiwiZXZlbnRUeXBlIiwic2V0UmVzcG9uc2UiLCJyZWFkRGF0YSIsInNldFJlY29yZHMiLCJwcm9ncmVzc0RhdGEiLCJzZXRQcm9ncmVzcyIsInN0YXRzRGF0YSIsInNldFN0YXRzIiwid2FybmluZ01lc3NhZ2UiLCJjb25zb2xlIiwid2FybiJdLCJzb3VyY2VzIjpbInhtbC1wYXJzZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBjcmMzMiBmcm9tICdidWZmZXItY3JjMzInXG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInXG5cbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuL2Vycm9ycy50cydcbmltcG9ydCB7IFNlbGVjdFJlc3VsdHMgfSBmcm9tICcuL2hlbHBlcnMudHMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgcGFyc2VYbWwsXG4gIHJlYWRhYmxlU3RyZWFtLFxuICBzYW5pdGl6ZUVUYWcsXG4gIHNhbml0aXplT2JqZWN0S2V5LFxuICBzYW5pdGl6ZVNpemUsXG4gIHRvQXJyYXksXG59IGZyb20gJy4vaW50ZXJuYWwvaGVscGVyLnRzJ1xuaW1wb3J0IHsgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlLnRzJ1xuXG5jb25zdCBmeHBXaXRob3V0TnVtUGFyc2VyID0gbmV3IFhNTFBhcnNlcih7XG4gIG51bWJlclBhcnNlT3B0aW9uczoge1xuICAgIHNraXBMaWtlOiAvLi8sXG4gIH0sXG59KVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGNvcHkgb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb3B5T2JqZWN0KHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIGV0YWc6ICcnLFxuICAgIGxhc3RNb2RpZmllZDogJycsXG4gIH1cblxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5Db3B5T2JqZWN0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkNvcHlPYmplY3RSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkNvcHlPYmplY3RSZXN1bHRcbiAgaWYgKHhtbG9iai5FVGFnKSB7XG4gICAgcmVzdWx0LmV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuICB9XG4gIGlmICh4bWxvYmouTGFzdE1vZGlmaWVkKSB7XG4gICAgcmVzdWx0Lmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHhtbG9iai5MYXN0TW9kaWZpZWQpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdGluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE11bHRpcGFydCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB1cGxvYWRzOiBbXSxcbiAgICBwcmVmaXhlczogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXhtbG9iai5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dEtleU1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0S2V5TWFya2VyID0geG1sb2JqLk5leHRLZXlNYXJrZXJcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRVcGxvYWRJZE1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIgPSB4bWxvYmoubmV4dFVwbG9hZElkTWFya2VyIHx8ICcnXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKHByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0LnByZWZpeGVzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkocHJlZml4LlByZWZpeClbMF0pIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouVXBsb2FkKSB7XG4gICAgdG9BcnJheSh4bWxvYmouVXBsb2FkKS5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIHZhciBrZXkgPSB1cGxvYWQuS2V5XG4gICAgICB2YXIgdXBsb2FkSWQgPSB1cGxvYWQuVXBsb2FkSWRcbiAgICAgIHZhciBpbml0aWF0b3IgPSB7IGlkOiB1cGxvYWQuSW5pdGlhdG9yLklELCBkaXNwbGF5TmFtZTogdXBsb2FkLkluaXRpYXRvci5EaXNwbGF5TmFtZSB9XG4gICAgICB2YXIgb3duZXIgPSB7IGlkOiB1cGxvYWQuT3duZXIuSUQsIGRpc3BsYXlOYW1lOiB1cGxvYWQuT3duZXIuRGlzcGxheU5hbWUgfVxuICAgICAgdmFyIHN0b3JhZ2VDbGFzcyA9IHVwbG9hZC5TdG9yYWdlQ2xhc3NcbiAgICAgIHZhciBpbml0aWF0ZWQgPSBuZXcgRGF0ZSh1cGxvYWQuSW5pdGlhdGVkKVxuICAgICAgcmVzdWx0LnVwbG9hZHMucHVzaCh7IGtleSwgdXBsb2FkSWQsIGluaXRpYXRvciwgb3duZXIsIHN0b3JhZ2VDbGFzcywgaW5pdGlhdGVkIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB0byBsaXN0IGFsbCB0aGUgb3duZWQgYnVja2V0c1xuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBUb3BpY0NvbmZpZ3VyYXRpb246IFtdLFxuICAgIFF1ZXVlQ29uZmlndXJhdGlvbjogW10sXG4gICAgQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb246IFtdLFxuICB9XG4gIC8vIFBhcnNlIHRoZSBldmVudHMgbGlzdFxuICB2YXIgZ2VuRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRvQXJyYXkoZXZlbnRzKS5mb3JFYWNoKChzM2V2ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHMzZXZlbnQpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgLy8gUGFyc2UgYWxsIGZpbHRlciBydWxlc1xuICB2YXIgZ2VuRmlsdGVyUnVsZXMgPSBmdW5jdGlvbiAoZmlsdGVycykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdG9BcnJheShmaWx0ZXJzKVxuICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXkpIHtcbiAgICAgICAgZmlsdGVyc1swXS5TM0tleSA9IHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleSlcbiAgICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXlbMF0uRmlsdGVyUnVsZSkge1xuICAgICAgICAgIHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleVswXS5GaWx0ZXJSdWxlKS5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICAgICAgICB2YXIgTmFtZSA9IHRvQXJyYXkocnVsZS5OYW1lKVswXVxuICAgICAgICAgICAgdmFyIFZhbHVlID0gdG9BcnJheShydWxlLlZhbHVlKVswXVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBOYW1lLCBWYWx1ZSB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgeG1sb2JqID0geG1sb2JqLk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cblxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBUb3BpYyA9IHRvQXJyYXkoY29uZmlnLlRvcGljKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlRvcGljQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFRvcGljLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBRdWV1ZSA9IHRvQXJyYXkoY29uZmlnLlF1ZXVlKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlF1ZXVlQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFF1ZXVlLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgUXVldWVDb25maWd1cmF0aW9uIGFycmF5c1xuICBpZiAoeG1sb2JqLkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24pLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgdmFyIElkID0gdG9BcnJheShjb25maWcuSWQpWzBdXG4gICAgICB2YXIgQ2xvdWRGdW5jdGlvbiA9IHRvQXJyYXkoY29uZmlnLkNsb3VkRnVuY3Rpb24pWzBdXG4gICAgICB2YXIgRXZlbnQgPSBnZW5FdmVudHMoY29uZmlnLkV2ZW50KVxuICAgICAgdmFyIEZpbHRlciA9IGdlbkZpbHRlclJ1bGVzKGNvbmZpZy5GaWx0ZXIpXG4gICAgICByZXN1bHQuQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24ucHVzaCh7IElkLCBDbG91ZEZ1bmN0aW9uLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIHdoZW4gYSBtdWx0aXBhcnQgdXBsb2FkIGlzIGNvbXBsZXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tcGxldGVNdWx0aXBhcnQoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpLkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG4gIGlmICh4bWxvYmouTG9jYXRpb24pIHtcbiAgICB2YXIgbG9jYXRpb24gPSB0b0FycmF5KHhtbG9iai5Mb2NhdGlvbilbMF1cbiAgICB2YXIgYnVja2V0ID0gdG9BcnJheSh4bWxvYmouQnVja2V0KVswXVxuICAgIHZhciBrZXkgPSB4bWxvYmouS2V5XG4gICAgdmFyIGV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuXG4gICAgcmV0dXJuIHsgbG9jYXRpb24sIGJ1Y2tldCwga2V5LCBldGFnIH1cbiAgfVxuICAvLyBDb21wbGV0ZSBNdWx0aXBhcnQgY2FuIHJldHVybiBYTUwgRXJyb3IgYWZ0ZXIgYSAyMDAgT0sgcmVzcG9uc2VcbiAgaWYgKHhtbG9iai5Db2RlICYmIHhtbG9iai5NZXNzYWdlKSB7XG4gICAgdmFyIGVyckNvZGUgPSB0b0FycmF5KHhtbG9iai5Db2RlKVswXVxuICAgIHZhciBlcnJNZXNzYWdlID0gdG9BcnJheSh4bWxvYmouTWVzc2FnZSlbMF1cbiAgICByZXR1cm4geyBlcnJDb2RlLCBlcnJNZXNzYWdlIH1cbiAgfVxufVxuXG5jb25zdCBmb3JtYXRPYmpJbmZvID0gKGNvbnRlbnQsIG9wdHMgPSB7fSkgPT4ge1xuICBsZXQgeyBLZXksIExhc3RNb2RpZmllZCwgRVRhZywgU2l6ZSwgVmVyc2lvbklkLCBJc0xhdGVzdCB9ID0gY29udGVudFxuXG4gIGlmICghaXNPYmplY3Qob3B0cykpIHtcbiAgICBvcHRzID0ge31cbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KEtleSlbMF0pXG4gIGNvbnN0IGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHRvQXJyYXkoTGFzdE1vZGlmaWVkKVswXSlcbiAgY29uc3QgZXRhZyA9IHNhbml0aXplRVRhZyh0b0FycmF5KEVUYWcpWzBdKVxuICBjb25zdCBzaXplID0gc2FuaXRpemVTaXplKFNpemUpXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIGxhc3RNb2RpZmllZCxcbiAgICBldGFnLFxuICAgIHNpemUsXG4gICAgdmVyc2lvbklkOiBWZXJzaW9uSWQsXG4gICAgaXNMYXRlc3Q6IElzTGF0ZXN0LFxuICAgIGlzRGVsZXRlTWFya2VyOiBvcHRzLklzRGVsZXRlTWFya2VyID8gb3B0cy5Jc0RlbGV0ZU1hcmtlciA6IGZhbHNlLFxuICB9XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0cyh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gIH1cbiAgbGV0IGlzVHJ1bmNhdGVkID0gZmFsc2VcbiAgbGV0IG5leHRNYXJrZXIsIG5leHRWZXJzaW9uS2V5TWFya2VyXG4gIGNvbnN0IHhtbG9iaiA9IGZ4cFdpdGhvdXROdW1QYXJzZXIucGFyc2UoeG1sKVxuXG4gIGNvbnN0IHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkgPSAocmVzcG9uc2VFbnRpdHkpID0+IHtcbiAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHtcbiAgICAgIHRvQXJyYXkocmVzcG9uc2VFbnRpdHkpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBsaXN0QnVja2V0UmVzdWx0ID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgY29uc3QgbGlzdFZlcnNpb25zUmVzdWx0ID0geG1sb2JqLkxpc3RWZXJzaW9uc1Jlc3VsdFxuXG4gIGlmIChsaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuSXNUcnVuY2F0ZWQpIHtcbiAgICAgIGlzVHJ1bmNhdGVkID0gbGlzdEJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5Db250ZW50cykge1xuICAgICAgdG9BcnJheShsaXN0QnVja2V0UmVzdWx0LkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbnRlbnQuS2V5KVswXSlcbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUodG9BcnJheShjb250ZW50Lkxhc3RNb2RpZmllZClbMF0pXG4gICAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShjb250ZW50LkVUYWcpWzBdKVxuICAgICAgICBjb25zdCBzaXplID0gc2FuaXRpemVTaXplKGNvbnRlbnQuU2l6ZSlcbiAgICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5OZXh0TWFya2VyKSB7XG4gICAgICBuZXh0TWFya2VyID0gbGlzdEJ1Y2tldFJlc3VsdC5OZXh0TWFya2VyXG4gICAgfVxuICAgIHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkobGlzdEJ1Y2tldFJlc3VsdC5Db21tb25QcmVmaXhlcylcbiAgfVxuXG4gIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQpIHtcbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LklzVHJ1bmNhdGVkKSB7XG4gICAgICBpc1RydW5jYXRlZCA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cblxuICAgIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQuVmVyc2lvbikge1xuICAgICAgdG9BcnJheShsaXN0VmVyc2lvbnNSZXN1bHQuVmVyc2lvbikuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKGZvcm1hdE9iakluZm8oY29udGVudCkpXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LkRlbGV0ZU1hcmtlcikge1xuICAgICAgdG9BcnJheShsaXN0VmVyc2lvbnNSZXN1bHQuRGVsZXRlTWFya2VyKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goZm9ybWF0T2JqSW5mbyhjb250ZW50LCB7IElzRGVsZXRlTWFya2VyOiB0cnVlIH0pKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0Lk5leHRLZXlNYXJrZXIpIHtcbiAgICAgIG5leHRWZXJzaW9uS2V5TWFya2VyID0gbGlzdFZlcnNpb25zUmVzdWx0Lk5leHRLZXlNYXJrZXJcbiAgICB9XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0VmVyc2lvbklkTWFya2VyKSB7XG4gICAgICByZXN1bHQudmVyc2lvbklkTWFya2VyID0gbGlzdFZlcnNpb25zUmVzdWx0Lk5leHRWZXJzaW9uSWRNYXJrZXJcbiAgICB9XG4gICAgcGFyc2VDb21tb25QcmVmaXhlc0VudGl0eShsaXN0VmVyc2lvbnNSZXN1bHQuQ29tbW9uUHJlZml4ZXMpXG4gIH1cblxuICByZXN1bHQuaXNUcnVuY2F0ZWQgPSBpc1RydW5jYXRlZFxuICBpZiAoaXNUcnVuY2F0ZWQpIHtcbiAgICByZXN1bHQubmV4dE1hcmtlciA9IG5leHRWZXJzaW9uS2V5TWFya2VyIHx8IG5leHRNYXJrZXJcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0c1YyKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5MaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RCdWNrZXRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgcmVzdWx0Lm5leHRDb250aW51YXRpb25Ub2tlbiA9IHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW5cbiAgfVxuICBpZiAoeG1sb2JqLkNvbnRlbnRzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29udGVudHMpLmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgIHZhciBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShjb250ZW50LktleSlbMF0pXG4gICAgICB2YXIgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUoY29udGVudC5MYXN0TW9kaWZpZWQpXG4gICAgICB2YXIgZXRhZyA9IHNhbml0aXplRVRhZyhjb250ZW50LkVUYWcpXG4gICAgICB2YXIgc2l6ZSA9IGNvbnRlbnQuU2l6ZVxuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSB9KVxuICAgIH0pXG4gIH1cbiAgaWYgKHhtbG9iai5Db21tb25QcmVmaXhlcykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbW1vblByZWZpeGVzKS5mb3JFYWNoKChjb21tb25QcmVmaXgpID0+IHtcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29tbW9uUHJlZml4LlByZWZpeClbMF0pLCBzaXplOiAwIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIHdpdGggbWV0YWRhdGEgaW4gYSBidWNrZXRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEoeG1sKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgb2JqZWN0czogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIGlmICgheG1sb2JqLkxpc3RCdWNrZXRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdEJ1Y2tldFJlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdFxuICBpZiAoeG1sb2JqLklzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0LmlzVHJ1bmNhdGVkID0geG1sb2JqLklzVHJ1bmNhdGVkXG4gIH1cbiAgaWYgKHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW4pIHtcbiAgICByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuID0geG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlblxuICB9XG5cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICB2YXIgbmFtZSA9IHNhbml0aXplT2JqZWN0S2V5KGNvbnRlbnQuS2V5KVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGNvbnRlbnQuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgdmFyIHNpemUgPSBjb250ZW50LlNpemVcbiAgICAgIHZhciBtZXRhZGF0YVxuICAgICAgaWYgKGNvbnRlbnQuVXNlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgbWV0YWRhdGEgPSB0b0FycmF5KGNvbnRlbnQuVXNlck1ldGFkYXRhKVswXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEgPSBudWxsXG4gICAgICB9XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgbmFtZSwgbGFzdE1vZGlmaWVkLCBldGFnLCBzaXplLCBtZXRhZGF0YSB9KVxuICAgIH0pXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IHByZWZpeDogc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShjb21tb25QcmVmaXguUHJlZml4KVswXSksIHNpemU6IDAgfSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVja2V0VmVyc2lvbmluZ0NvbmZpZyh4bWwpIHtcbiAgdmFyIHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIHhtbE9iai5WZXJzaW9uaW5nQ29uZmlndXJhdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWdnaW5nKHhtbCkge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGxldCByZXN1bHQgPSBbXVxuICBpZiAoeG1sT2JqLlRhZ2dpbmcgJiYgeG1sT2JqLlRhZ2dpbmcuVGFnU2V0ICYmIHhtbE9iai5UYWdnaW5nLlRhZ1NldC5UYWcpIHtcbiAgICBjb25zdCB0YWdSZXN1bHQgPSB4bWxPYmouVGFnZ2luZy5UYWdTZXQuVGFnXG4gICAgLy8gaWYgaXQgaXMgYSBzaW5nbGUgdGFnIGNvbnZlcnQgaW50byBhbiBhcnJheSBzbyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIGFuIGFycmF5LlxuICAgIGlmIChpc09iamVjdCh0YWdSZXN1bHQpKSB7XG4gICAgICByZXN1bHQucHVzaCh0YWdSZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRhZ1Jlc3VsdFxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpZmVjeWNsZUNvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2JqZWN0TG9ja0NvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBsZXQgbG9ja0NvbmZpZ1Jlc3VsdCA9IHt9XG4gIGlmICh4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24pIHtcbiAgICBsb2NrQ29uZmlnUmVzdWx0ID0ge1xuICAgICAgb2JqZWN0TG9ja0VuYWJsZWQ6IHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5PYmplY3RMb2NrRW5hYmxlZCxcbiAgICB9XG4gICAgbGV0IHJldGVudGlvblJlc3BcbiAgICBpZiAoXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24gJiZcbiAgICAgIHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5SdWxlICYmXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uUnVsZS5EZWZhdWx0UmV0ZW50aW9uXG4gICAgKSB7XG4gICAgICByZXRlbnRpb25SZXNwID0geG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uLlJ1bGUuRGVmYXVsdFJldGVudGlvbiB8fCB7fVxuICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC5tb2RlID0gcmV0ZW50aW9uUmVzcC5Nb2RlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25SZXNwKSB7XG4gICAgICBjb25zdCBpc1VuaXRZZWFycyA9IHJldGVudGlvblJlc3AuWWVhcnNcbiAgICAgIGlmIChpc1VuaXRZZWFycykge1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnZhbGlkaXR5ID0gaXNVbml0WWVhcnNcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC51bml0ID0gUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLllFQVJTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnZhbGlkaXR5ID0gcmV0ZW50aW9uUmVzcC5EYXlzXG4gICAgICAgIGxvY2tDb25maWdSZXN1bHQudW5pdCA9IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5EQVlTXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2NrQ29uZmlnUmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2JqZWN0UmV0ZW50aW9uQ29uZmlnKHhtbCkge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGNvbnN0IHJldGVudGlvbkNvbmZpZyA9IHhtbE9iai5SZXRlbnRpb25cblxuICByZXR1cm4ge1xuICAgIG1vZGU6IHJldGVudGlvbkNvbmZpZy5Nb2RlLFxuICAgIHJldGFpblVudGlsRGF0ZTogcmV0ZW50aW9uQ29uZmlnLlJldGFpblVudGlsRGF0ZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCdWNrZXRFbmNyeXB0aW9uQ29uZmlnKHhtbCkge1xuICBsZXQgZW5jQ29uZmlnID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4gZW5jQ29uZmlnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxlZ2FsSG9sZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkUGFydFBhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXNwRWwgPSB4bWxPYmouQ29weVBhcnRSZXN1bHRcbiAgcmV0dXJuIHJlc3BFbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1BhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoeG1sT2JqLkRlbGV0ZVJlc3VsdCAmJiB4bWxPYmouRGVsZXRlUmVzdWx0LkVycm9yKSB7XG4gICAgLy8gcmV0dXJuIGVycm9ycyBhcyBhcnJheSBhbHdheXMuIGFzIHRoZSByZXNwb25zZSBpcyBvYmplY3QgaW4gY2FzZSBvZiBzaW5nbGUgb2JqZWN0IHBhc3NlZCBpbiByZW1vdmVPYmplY3RzXG4gICAgcmV0dXJuIHRvQXJyYXkoeG1sT2JqLkRlbGV0ZVJlc3VsdC5FcnJvcilcbiAgfVxuICByZXR1cm4gW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKHJlcykge1xuICAvLyBleHRyYWN0SGVhZGVyVHlwZSBleHRyYWN0cyB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaGVhZGVyIG1lc3NhZ2UsIHRoZSBoZWFkZXIgdHlwZS5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclR5cGUoc3RyZWFtKSB7XG4gICAgY29uc3QgaGVhZGVyTmFtZUxlbiA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKDEpKS5yZWFkVUludDgoKVxuICAgIGNvbnN0IGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yID0gQnVmZmVyLmZyb20oc3RyZWFtLnJlYWQoaGVhZGVyTmFtZUxlbikpLnRvU3RyaW5nKClcbiAgICBjb25zdCBzcGxpdEJ5U2VwYXJhdG9yID0gKGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIHx8ICcnKS5zcGxpdCgnOicpXG4gICAgY29uc3QgaGVhZGVyTmFtZSA9IHNwbGl0QnlTZXBhcmF0b3IubGVuZ3RoID49IDEgPyBzcGxpdEJ5U2VwYXJhdG9yWzFdIDogJydcbiAgICByZXR1cm4gaGVhZGVyTmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclZhbHVlKHN0cmVhbSkge1xuICAgIGNvbnN0IGJvZHlMZW4gPSBCdWZmZXIuZnJvbShzdHJlYW0ucmVhZCgyKSkucmVhZFVJbnQxNkJFKClcbiAgICBjb25zdCBib2R5TmFtZSA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKGJvZHlMZW4pKS50b1N0cmluZygpXG4gICAgcmV0dXJuIGJvZHlOYW1lXG4gIH1cblxuICBjb25zdCBzZWxlY3RSZXN1bHRzID0gbmV3IFNlbGVjdFJlc3VsdHMoe30pIC8vIHdpbGwgYmUgcmV0dXJuZWRcblxuICBjb25zdCByZXNwb25zZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHJlcykgLy8gY29udmVydCBieXRlIGFycmF5IHRvIGEgcmVhZGFibGUgcmVzcG9uc2VTdHJlYW1cbiAgd2hpbGUgKHJlc3BvbnNlU3RyZWFtLl9yZWFkYWJsZVN0YXRlLmxlbmd0aCkge1xuICAgIC8vIFRvcCBsZXZlbCByZXNwb25zZVN0cmVhbSByZWFkIHRyYWNrZXIuXG4gICAgbGV0IG1zZ0NyY0FjY3VtdWxhdG9yIC8vIGFjY3VtdWxhdGUgZnJvbSBzdGFydCBvZiB0aGUgbWVzc2FnZSB0aWxsIHRoZSBtZXNzYWdlIGNyYyBzdGFydC5cblxuICAgIGNvbnN0IHRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMih0b3RhbEJ5dGVMZW5ndGhCdWZmZXIpXG5cbiAgICBjb25zdCBoZWFkZXJCeXRlc0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihoZWFkZXJCeXRlc0J1ZmZlciwgbXNnQ3JjQWNjdW11bGF0b3IpXG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUHJlbHVkZUNyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKCkgLy8gdXNlIGl0IHRvIGNoZWNrIGlmIGFueSBDUkMgbWlzbWF0Y2ggaW4gaGVhZGVyIGl0c2VsZi5cblxuICAgIGNvbnN0IHByZWx1ZGVDcmNCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKDQpKSAvLyByZWFkIDQgYnl0ZXMgICAgaS5lIDQrNCA9OCArIDQgPSAxMiAoIHByZWx1ZGUgKyBwcmVsdWRlIGNyYylcbiAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKHByZWx1ZGVDcmNCdWZmZXIsIG1zZ0NyY0FjY3VtdWxhdG9yKVxuXG4gICAgY29uc3QgdG90YWxNc2dMZW5ndGggPSB0b3RhbEJ5dGVMZW5ndGhCdWZmZXIucmVhZEludDMyQkUoKVxuICAgIGNvbnN0IGhlYWRlckxlbmd0aCA9IGhlYWRlckJ5dGVzQnVmZmVyLnJlYWRJbnQzMkJFKClcbiAgICBjb25zdCBwcmVsdWRlQ3JjQnl0ZVZhbHVlID0gcHJlbHVkZUNyY0J1ZmZlci5yZWFkSW50MzJCRSgpXG5cbiAgICBpZiAocHJlbHVkZUNyY0J5dGVWYWx1ZSAhPT0gY2FsY3VsYXRlZFByZWx1ZGVDcmMpIHtcbiAgICAgIC8vIEhhbmRsZSBIZWFkZXIgQ1JDIG1pc21hdGNoIEVycm9yXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBIZWFkZXIgQ2hlY2tzdW0gTWlzbWF0Y2gsIFByZWx1ZGUgQ1JDIG9mICR7cHJlbHVkZUNyY0J5dGVWYWx1ZX0gZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgQ1JDIG9mICR7Y2FsY3VsYXRlZFByZWx1ZGVDcmN9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBpZiAoaGVhZGVyTGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGVhZGVyQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKGhlYWRlckxlbmd0aCkpXG4gICAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKGhlYWRlckJ5dGVzLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIGNvbnN0IGhlYWRlclJlYWRlclN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKGhlYWRlckJ5dGVzKVxuICAgICAgd2hpbGUgKGhlYWRlclJlYWRlclN0cmVhbS5fcmVhZGFibGVTdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGhlYWRlclR5cGVOYW1lID0gZXh0cmFjdEhlYWRlclR5cGUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgICBoZWFkZXJSZWFkZXJTdHJlYW0ucmVhZCgxKSAvLyBqdXN0IHJlYWQgYW5kIGlnbm9yZSBpdC5cbiAgICAgICAgaGVhZGVyc1toZWFkZXJUeXBlTmFtZV0gPSBleHRyYWN0SGVhZGVyVmFsdWUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkU3RyZWFtXG4gICAgY29uc3QgcGF5TG9hZExlbmd0aCA9IHRvdGFsTXNnTGVuZ3RoIC0gaGVhZGVyTGVuZ3RoIC0gMTZcbiAgICBpZiAocGF5TG9hZExlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBheUxvYWRCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpKVxuICAgICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihwYXlMb2FkQnVmZmVyLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIC8vIHJlYWQgdGhlIGNoZWNrc3VtIGVhcmx5IGFuZCBkZXRlY3QgYW55IG1pc21hdGNoIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBmdXJ0aGVyIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBtZXNzYWdlQ3JjQnl0ZVZhbHVlID0gQnVmZmVyLmZyb20ocmVzcG9uc2VTdHJlYW0ucmVhZCg0KSkucmVhZEludDMyQkUoKVxuICAgICAgY29uc3QgY2FsY3VsYXRlZENyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKClcbiAgICAgIC8vIEhhbmRsZSBtZXNzYWdlIENSQyBFcnJvclxuICAgICAgaWYgKG1lc3NhZ2VDcmNCeXRlVmFsdWUgIT09IGNhbGN1bGF0ZWRDcmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIENoZWNrc3VtIE1pc21hdGNoLCBNZXNzYWdlIENSQyBvZiAke21lc3NhZ2VDcmNCeXRlVmFsdWV9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIENSQyBvZiAke2NhbGN1bGF0ZWRDcmN9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcGF5bG9hZFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheUxvYWRCdWZmZXIpXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVR5cGUgPSBoZWFkZXJzWydtZXNzYWdlLXR5cGUnXVxuXG4gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGhlYWRlcnNbJ2Vycm9yLWNvZGUnXSArICc6XCInICsgaGVhZGVyc1snZXJyb3ItbWVzc2FnZSddICsgJ1wiJ1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgfVxuICAgICAgY2FzZSAnZXZlbnQnOiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gaGVhZGVyc1snZXZlbnQtdHlwZSddXG5cbiAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdFbmQnOiB7XG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlc3BvbnNlKHJlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RSZXN1bHRzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnUmVjb3Jkcyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWREYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlY29yZHMocmVhZERhdGEpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ1Byb2dyZXNzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQveG1sJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFByb2dyZXNzKHByb2dyZXNzRGF0YS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFVuZXhwZWN0ZWQgY29udGVudC10eXBlICR7Y29udGVudFR5cGV9IHNlbnQgZm9yIGV2ZW50LXR5cGUgUHJvZ3Jlc3NgXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdTdGF0cyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0L3htbCc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzRGF0YSA9IHBheWxvYWRTdHJlYW0ucmVhZChwYXlMb2FkTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgc2VsZWN0UmVzdWx0cy5zZXRTdGF0cyhzdGF0c0RhdGEudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVbmV4cGVjdGVkIGNvbnRlbnQtdHlwZSAke2NvbnRlbnRUeXBlfSBzZW50IGZvciBldmVudC10eXBlIFN0YXRzYFxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gQ29udGludWF0aW9uIG1lc3NhZ2U6IE5vdCBzdXJlIGlmIGl0IGlzIHN1cHBvcnRlZC4gZGlkIG5vdCBmaW5kIGEgcmVmZXJlbmNlIG9yIGFueSBtZXNzYWdlIGluIHJlc3BvbnNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHBheWxvYWQuXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBVbiBpbXBsZW1lbnRlZCBldmVudCBkZXRlY3RlZCAgJHttZXNzYWdlVHlwZX0uYFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nTWVzc2FnZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gZXZlbnRUeXBlIEVuZFxuICAgICAgfSAvLyBFdmVudCBFbmRcbiAgICB9IC8vIG1lc3NhZ2VUeXBlIEVuZFxuICB9IC8vIFRvcCBMZXZlbCBTdHJlYW0gRW5kXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBU0EsSUFBQU0sS0FBQSxHQUFBTixPQUFBO0FBQTZELFNBQUFPLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFMLHdCQUFBUyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVmZmVyQ3JjIiwicmVxdWlyZSIsIl9mYXN0WG1sUGFyc2VyIiwiX2xvZGFzaCIsImVycm9ycyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2hlbHBlcnMiLCJfaGVscGVyIiwiX3R5cGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiZnhwIiwiWE1MUGFyc2VyIiwicGFyc2VFcnJvciIsInhtbCIsImhlYWRlckluZm8iLCJ4bWxFcnIiLCJ4bWxPYmoiLCJwYXJzZSIsIkVycm9yIiwiZSIsIlMzRXJyb3IiLCJfIiwiZWFjaCIsInZhbHVlIiwidG9Mb3dlckNhc2UiLCJwYXJzZUNvcHlPYmplY3QiLCJyZXN1bHQiLCJldGFnIiwibGFzdE1vZGlmaWVkIiwieG1sb2JqIiwicGFyc2VYbWwiLCJDb3B5T2JqZWN0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiRVRhZyIsInJlcGxhY2UiLCJMYXN0TW9kaWZpZWQiLCJEYXRlIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwidXBsb2FkcyIsInByZWZpeGVzIiwiaXNUcnVuY2F0ZWQiLCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCIsIklzVHJ1bmNhdGVkIiwiTmV4dEtleU1hcmtlciIsIm5leHRLZXlNYXJrZXIiLCJOZXh0VXBsb2FkSWRNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJDb21tb25QcmVmaXhlcyIsInRvQXJyYXkiLCJmb3JFYWNoIiwicHJlZml4IiwicHVzaCIsInNhbml0aXplT2JqZWN0S2V5IiwiUHJlZml4IiwiVXBsb2FkIiwidXBsb2FkIiwiS2V5IiwidXBsb2FkSWQiLCJVcGxvYWRJZCIsImluaXRpYXRvciIsImlkIiwiSW5pdGlhdG9yIiwiSUQiLCJkaXNwbGF5TmFtZSIsIkRpc3BsYXlOYW1lIiwib3duZXIiLCJPd25lciIsInN0b3JhZ2VDbGFzcyIsIlN0b3JhZ2VDbGFzcyIsImluaXRpYXRlZCIsIkluaXRpYXRlZCIsInBhcnNlTGlzdEJ1Y2tldCIsIkxpc3RBbGxNeUJ1Y2tldHNSZXN1bHQiLCJCdWNrZXRzIiwiQnVja2V0IiwiYnVja2V0IiwibmFtZSIsIk5hbWUiLCJjcmVhdGlvbkRhdGUiLCJDcmVhdGlvbkRhdGUiLCJwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbiIsIlRvcGljQ29uZmlndXJhdGlvbiIsIlF1ZXVlQ29uZmlndXJhdGlvbiIsIkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uIiwiZ2VuRXZlbnRzIiwiZXZlbnRzIiwiczNldmVudCIsImdlbkZpbHRlclJ1bGVzIiwiZmlsdGVycyIsIlMzS2V5IiwiRmlsdGVyUnVsZSIsInJ1bGUiLCJWYWx1ZSIsIk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJjb25maWciLCJJZCIsIlRvcGljIiwiRXZlbnQiLCJGaWx0ZXIiLCJRdWV1ZSIsIkNsb3VkRnVuY3Rpb24iLCJwYXJzZUJ1Y2tldFJlZ2lvbiIsIkxvY2F0aW9uQ29uc3RyYWludCIsInBhcnNlTGlzdFBhcnRzIiwicGFydHMiLCJtYXJrZXIiLCJ1bmRlZmluZWQiLCJMaXN0UGFydHNSZXN1bHQiLCJOZXh0UGFydE51bWJlck1hcmtlciIsIlBhcnQiLCJwIiwicGFydCIsIlBhcnROdW1iZXIiLCJwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IiwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0IiwiQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJMb2NhdGlvbiIsImxvY2F0aW9uIiwiQ29kZSIsIk1lc3NhZ2UiLCJlcnJDb2RlIiwiZXJyTWVzc2FnZSIsImZvcm1hdE9iakluZm8iLCJjb250ZW50Iiwib3B0cyIsIlNpemUiLCJWZXJzaW9uSWQiLCJJc0xhdGVzdCIsImlzT2JqZWN0Iiwic2FuaXRpemVFVGFnIiwic2l6ZSIsInZlcnNpb25JZCIsImlzTGF0ZXN0IiwiaXNEZWxldGVNYXJrZXIiLCJJc0RlbGV0ZU1hcmtlciIsInBhcnNlTGlzdE9iamVjdHMiLCJvYmplY3RzIiwibmV4dE1hcmtlciIsIm5leHRWZXJzaW9uS2V5TWFya2VyIiwicGFyc2VDb21tb25QcmVmaXhlc0VudGl0eSIsInJlc3BvbnNlRW50aXR5IiwiY29tbW9uUHJlZml4IiwibGlzdEJ1Y2tldFJlc3VsdCIsIkxpc3RCdWNrZXRSZXN1bHQiLCJsaXN0VmVyc2lvbnNSZXN1bHQiLCJMaXN0VmVyc2lvbnNSZXN1bHQiLCJDb250ZW50cyIsIk5leHRNYXJrZXIiLCJWZXJzaW9uIiwiRGVsZXRlTWFya2VyIiwiTmV4dFZlcnNpb25JZE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsInBhcnNlTGlzdE9iamVjdHNWMiIsIk5leHRDb250aW51YXRpb25Ub2tlbiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSIsIm1ldGFkYXRhIiwiVXNlck1ldGFkYXRhIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwiVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24iLCJwYXJzZVRhZ2dpbmciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwidGFnUmVzdWx0IiwicGFyc2VMaWZlY3ljbGVDb25maWciLCJMaWZlY3ljbGVDb25maWd1cmF0aW9uIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ1Jlc3VsdCIsIk9iamVjdExvY2tDb25maWd1cmF0aW9uIiwib2JqZWN0TG9ja0VuYWJsZWQiLCJPYmplY3RMb2NrRW5hYmxlZCIsInJldGVudGlvblJlc3AiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIm1vZGUiLCJNb2RlIiwiaXNVbml0WWVhcnMiLCJZZWFycyIsInZhbGlkaXR5IiwidW5pdCIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIllFQVJTIiwiRGF5cyIsIkRBWVMiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsInJldGVudGlvbkNvbmZpZyIsIlJldGVudGlvbiIsInJldGFpblVudGlsRGF0ZSIsIlJldGFpblVudGlsRGF0ZSIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsImVuY0NvbmZpZyIsInBhcnNlUmVwbGljYXRpb25Db25maWciLCJyZXBsaWNhdGlvbkNvbmZpZyIsIlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIsInJvbGUiLCJSb2xlIiwicnVsZXMiLCJwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyIsIkxlZ2FsSG9sZCIsInVwbG9hZFBhcnRQYXJzZXIiLCJyZXNwRWwiLCJDb3B5UGFydFJlc3VsdCIsInJlbW92ZU9iamVjdHNQYXJzZXIiLCJEZWxldGVSZXN1bHQiLCJwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZSIsInJlcyIsImV4dHJhY3RIZWFkZXJUeXBlIiwic3RyZWFtIiwiaGVhZGVyTmFtZUxlbiIsIkJ1ZmZlciIsImZyb20iLCJyZWFkIiwicmVhZFVJbnQ4IiwiaGVhZGVyTmFtZVdpdGhTZXBhcmF0b3IiLCJ0b1N0cmluZyIsInNwbGl0QnlTZXBhcmF0b3IiLCJzcGxpdCIsImhlYWRlck5hbWUiLCJsZW5ndGgiLCJleHRyYWN0SGVhZGVyVmFsdWUiLCJib2R5TGVuIiwicmVhZFVJbnQxNkJFIiwiYm9keU5hbWUiLCJzZWxlY3RSZXN1bHRzIiwiU2VsZWN0UmVzdWx0cyIsInJlc3BvbnNlU3RyZWFtIiwicmVhZGFibGVTdHJlYW0iLCJfcmVhZGFibGVTdGF0ZSIsIm1zZ0NyY0FjY3VtdWxhdG9yIiwidG90YWxCeXRlTGVuZ3RoQnVmZmVyIiwiY3JjMzIiLCJoZWFkZXJCeXRlc0J1ZmZlciIsImNhbGN1bGF0ZWRQcmVsdWRlQ3JjIiwicmVhZEludDMyQkUiLCJwcmVsdWRlQ3JjQnVmZmVyIiwidG90YWxNc2dMZW5ndGgiLCJoZWFkZXJMZW5ndGgiLCJwcmVsdWRlQ3JjQnl0ZVZhbHVlIiwiaGVhZGVycyIsImhlYWRlckJ5dGVzIiwiaGVhZGVyUmVhZGVyU3RyZWFtIiwiaGVhZGVyVHlwZU5hbWUiLCJwYXlsb2FkU3RyZWFtIiwicGF5TG9hZExlbmd0aCIsInBheUxvYWRCdWZmZXIiLCJtZXNzYWdlQ3JjQnl0ZVZhbHVlIiwiY2FsY3VsYXRlZENyYyIsIm1lc3NhZ2VUeXBlIiwiZXJyb3JNZXNzYWdlIiwiY29udGVudFR5cGUiLCJldmVudFR5cGUiLCJzZXRSZXNwb25zZSIsInJlYWREYXRhIiwic2V0UmVjb3JkcyIsInByb2dyZXNzRGF0YSIsInNldFByb2dyZXNzIiwic3RhdHNEYXRhIiwic2V0U3RhdHMiLCJ3YXJuaW5nTWVzc2FnZSIsImNvbnNvbGUiLCJ3YXJuIl0sInNvdXJjZXMiOlsieG1sLXBhcnNlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IGNyYzMyIGZyb20gJ2J1ZmZlci1jcmMzMidcbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzLnRzJ1xuaW1wb3J0IHsgU2VsZWN0UmVzdWx0cyB9IGZyb20gJy4vaGVscGVycy50cydcbmltcG9ydCB7IGlzT2JqZWN0LCBwYXJzZVhtbCwgcmVhZGFibGVTdHJlYW0sIHNhbml0aXplRVRhZywgc2FuaXRpemVPYmplY3RLZXksIHRvQXJyYXkgfSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcbmltcG9ydCB7IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcblxuLy8gUGFyc2UgWE1MIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gYXMgSmF2YXNjcmlwdCB0eXBlc1xuY29uc3QgZnhwID0gbmV3IFhNTFBhcnNlcigpXG5cbi8vIHBhcnNlIGVycm9yIFhNTCByZXNwb25zZVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXJyb3IoeG1sLCBoZWFkZXJJbmZvKSB7XG4gIHZhciB4bWxFcnIgPSB7fVxuICB2YXIgeG1sT2JqID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHhtbE9iai5FcnJvcikge1xuICAgIHhtbEVyciA9IHhtbE9iai5FcnJvclxuICB9XG5cbiAgdmFyIGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IoKVxuICBfLmVhY2goeG1sRXJyLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGVba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWVcbiAgfSlcblxuICBfLmVhY2goaGVhZGVySW5mbywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICBlW2tleV0gPSB2YWx1ZVxuICB9KVxuICByZXR1cm4gZVxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGNvcHkgb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb3B5T2JqZWN0KHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIGV0YWc6ICcnLFxuICAgIGxhc3RNb2RpZmllZDogJycsXG4gIH1cblxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5Db3B5T2JqZWN0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkNvcHlPYmplY3RSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkNvcHlPYmplY3RSZXN1bHRcbiAgaWYgKHhtbG9iai5FVGFnKSB7XG4gICAgcmVzdWx0LmV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuICB9XG4gIGlmICh4bWxvYmouTGFzdE1vZGlmaWVkKSB7XG4gICAgcmVzdWx0Lmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHhtbG9iai5MYXN0TW9kaWZpZWQpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdGluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE11bHRpcGFydCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB1cGxvYWRzOiBbXSxcbiAgICBwcmVmaXhlczogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXhtbG9iai5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dEtleU1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0S2V5TWFya2VyID0geG1sb2JqLk5leHRLZXlNYXJrZXJcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRVcGxvYWRJZE1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIgPSB4bWxvYmoubmV4dFVwbG9hZElkTWFya2VyXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKHByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0LnByZWZpeGVzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkocHJlZml4LlByZWZpeClbMF0pIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouVXBsb2FkKSB7XG4gICAgdG9BcnJheSh4bWxvYmouVXBsb2FkKS5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIHZhciBrZXkgPSB1cGxvYWQuS2V5XG4gICAgICB2YXIgdXBsb2FkSWQgPSB1cGxvYWQuVXBsb2FkSWRcbiAgICAgIHZhciBpbml0aWF0b3IgPSB7IGlkOiB1cGxvYWQuSW5pdGlhdG9yLklELCBkaXNwbGF5TmFtZTogdXBsb2FkLkluaXRpYXRvci5EaXNwbGF5TmFtZSB9XG4gICAgICB2YXIgb3duZXIgPSB7IGlkOiB1cGxvYWQuT3duZXIuSUQsIGRpc3BsYXlOYW1lOiB1cGxvYWQuT3duZXIuRGlzcGxheU5hbWUgfVxuICAgICAgdmFyIHN0b3JhZ2VDbGFzcyA9IHVwbG9hZC5TdG9yYWdlQ2xhc3NcbiAgICAgIHZhciBpbml0aWF0ZWQgPSBuZXcgRGF0ZSh1cGxvYWQuSW5pdGlhdGVkKVxuICAgICAgcmVzdWx0LnVwbG9hZHMucHVzaCh7IGtleSwgdXBsb2FkSWQsIGluaXRpYXRvciwgb3duZXIsIHN0b3JhZ2VDbGFzcywgaW5pdGlhdGVkIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB0byBsaXN0IGFsbCB0aGUgb3duZWQgYnVja2V0c1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdEJ1Y2tldCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IFtdXG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouTGlzdEFsbE15QnVja2V0c1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0QWxsTXlCdWNrZXRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5CdWNrZXRzKSB7XG4gICAgaWYgKHhtbG9iai5CdWNrZXRzLkJ1Y2tldCkge1xuICAgICAgdG9BcnJheSh4bWxvYmouQnVja2V0cy5CdWNrZXQpLmZvckVhY2goKGJ1Y2tldCkgPT4ge1xuICAgICAgICB2YXIgbmFtZSA9IGJ1Y2tldC5OYW1lXG4gICAgICAgIHZhciBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZShidWNrZXQuQ3JlYXRpb25EYXRlKVxuICAgICAgICByZXN1bHQucHVzaCh7IG5hbWUsIGNyZWF0aW9uRGF0ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBUb3BpY0NvbmZpZ3VyYXRpb246IFtdLFxuICAgIFF1ZXVlQ29uZmlndXJhdGlvbjogW10sXG4gICAgQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb246IFtdLFxuICB9XG4gIC8vIFBhcnNlIHRoZSBldmVudHMgbGlzdFxuICB2YXIgZ2VuRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRvQXJyYXkoZXZlbnRzKS5mb3JFYWNoKChzM2V2ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHMzZXZlbnQpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgLy8gUGFyc2UgYWxsIGZpbHRlciBydWxlc1xuICB2YXIgZ2VuRmlsdGVyUnVsZXMgPSBmdW5jdGlvbiAoZmlsdGVycykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdG9BcnJheShmaWx0ZXJzKVxuICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXkpIHtcbiAgICAgICAgZmlsdGVyc1swXS5TM0tleSA9IHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleSlcbiAgICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXlbMF0uRmlsdGVyUnVsZSkge1xuICAgICAgICAgIHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleVswXS5GaWx0ZXJSdWxlKS5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICAgICAgICB2YXIgTmFtZSA9IHRvQXJyYXkocnVsZS5OYW1lKVswXVxuICAgICAgICAgICAgdmFyIFZhbHVlID0gdG9BcnJheShydWxlLlZhbHVlKVswXVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBOYW1lLCBWYWx1ZSB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgeG1sb2JqID0geG1sb2JqLk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cblxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBUb3BpYyA9IHRvQXJyYXkoY29uZmlnLlRvcGljKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlRvcGljQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFRvcGljLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBRdWV1ZSA9IHRvQXJyYXkoY29uZmlnLlF1ZXVlKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlF1ZXVlQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFF1ZXVlLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgUXVldWVDb25maWd1cmF0aW9uIGFycmF5c1xuICBpZiAoeG1sb2JqLkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24pLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgdmFyIElkID0gdG9BcnJheShjb25maWcuSWQpWzBdXG4gICAgICB2YXIgQ2xvdWRGdW5jdGlvbiA9IHRvQXJyYXkoY29uZmlnLkNsb3VkRnVuY3Rpb24pWzBdXG4gICAgICB2YXIgRXZlbnQgPSBnZW5FdmVudHMoY29uZmlnLkV2ZW50KVxuICAgICAgdmFyIEZpbHRlciA9IGdlbkZpbHRlclJ1bGVzKGNvbmZpZy5GaWx0ZXIpXG4gICAgICByZXN1bHQuQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24ucHVzaCh7IElkLCBDbG91ZEZ1bmN0aW9uLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIGZvciBidWNrZXQgcmVnaW9uXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCdWNrZXRSZWdpb24oeG1sKSB7XG4gIC8vIHJldHVybiByZWdpb24gaW5mb3JtYXRpb25cbiAgcmV0dXJuIHBhcnNlWG1sKHhtbCkuTG9jYXRpb25Db25zdHJhaW50XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBwYXJ0cyBvZiBhbiBpbiBwcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2FkXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0UGFydHMoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICAgIHBhcnRzOiBbXSxcbiAgICBtYXJrZXI6IHVuZGVmaW5lZCxcbiAgfVxuICBpZiAoIXhtbG9iai5MaXN0UGFydHNSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdFBhcnRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0UGFydHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpIHtcbiAgICByZXN1bHQubWFya2VyID0gK3RvQXJyYXkoeG1sb2JqLk5leHRQYXJ0TnVtYmVyTWFya2VyKVswXVxuICB9XG4gIGlmICh4bWxvYmouUGFydCkge1xuICAgIHRvQXJyYXkoeG1sb2JqLlBhcnQpLmZvckVhY2goKHApID0+IHtcbiAgICAgIHZhciBwYXJ0ID0gK3RvQXJyYXkocC5QYXJ0TnVtYmVyKVswXVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHAuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBwLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXiZxdW90Oy9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC8mIzM0OyQvZywgJycpXG4gICAgICByZXN1bHQucGFydHMucHVzaCh7IHBhcnQsIGxhc3RNb2RpZmllZCwgZXRhZyB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2Ugd2hlbiBhIG5ldyBtdWx0aXBhcnQgdXBsb2FkIGlzIGluaXRpYXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5pdGlhdGVNdWx0aXBhcnQoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5VcGxvYWRJZCkge1xuICAgIHJldHVybiB4bWxvYmouVXBsb2FkSWRcbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiVXBsb2FkSWRcIicpXG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB3aGVuIGEgbXVsdGlwYXJ0IHVwbG9hZCBpcyBjb21wbGV0ZWRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0KHhtbCkge1xuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKS5Db21wbGV0ZU11bHRpcGFydFVwbG9hZFJlc3VsdFxuICBpZiAoeG1sb2JqLkxvY2F0aW9uKSB7XG4gICAgdmFyIGxvY2F0aW9uID0gdG9BcnJheSh4bWxvYmouTG9jYXRpb24pWzBdXG4gICAgdmFyIGJ1Y2tldCA9IHRvQXJyYXkoeG1sb2JqLkJ1Y2tldClbMF1cbiAgICB2YXIga2V5ID0geG1sb2JqLktleVxuICAgIHZhciBldGFnID0geG1sb2JqLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgLnJlcGxhY2UoL1wiJC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJnF1b3Q7L2csICcnKVxuICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAucmVwbGFjZSgvXiYjMzQ7L2csICcnKVxuICAgICAgLnJlcGxhY2UoLyYjMzQ7JC9nLCAnJylcblxuICAgIHJldHVybiB7IGxvY2F0aW9uLCBidWNrZXQsIGtleSwgZXRhZyB9XG4gIH1cbiAgLy8gQ29tcGxldGUgTXVsdGlwYXJ0IGNhbiByZXR1cm4gWE1MIEVycm9yIGFmdGVyIGEgMjAwIE9LIHJlc3BvbnNlXG4gIGlmICh4bWxvYmouQ29kZSAmJiB4bWxvYmouTWVzc2FnZSkge1xuICAgIHZhciBlcnJDb2RlID0gdG9BcnJheSh4bWxvYmouQ29kZSlbMF1cbiAgICB2YXIgZXJyTWVzc2FnZSA9IHRvQXJyYXkoeG1sb2JqLk1lc3NhZ2UpWzBdXG4gICAgcmV0dXJuIHsgZXJyQ29kZSwgZXJyTWVzc2FnZSB9XG4gIH1cbn1cblxuY29uc3QgZm9ybWF0T2JqSW5mbyA9IChjb250ZW50LCBvcHRzID0ge30pID0+IHtcbiAgbGV0IHsgS2V5LCBMYXN0TW9kaWZpZWQsIEVUYWcsIFNpemUsIFZlcnNpb25JZCwgSXNMYXRlc3QgfSA9IGNvbnRlbnRcblxuICBpZiAoIWlzT2JqZWN0KG9wdHMpKSB7XG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICBjb25zdCBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShLZXkpWzBdKVxuICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSh0b0FycmF5KExhc3RNb2RpZmllZClbMF0pXG4gIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShFVGFnKVswXSlcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbGFzdE1vZGlmaWVkLFxuICAgIGV0YWcsXG4gICAgc2l6ZTogU2l6ZSxcbiAgICB2ZXJzaW9uSWQ6IFZlcnNpb25JZCxcbiAgICBpc0xhdGVzdDogSXNMYXRlc3QsXG4gICAgaXNEZWxldGVNYXJrZXI6IG9wdHMuSXNEZWxldGVNYXJrZXIgPyBvcHRzLklzRGVsZXRlTWFya2VyIDogZmFsc2UsXG4gIH1cbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIGZvciBsaXN0IG9iamVjdHMgaW4gYSBidWNrZXRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RPYmplY3RzKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICBsZXQgaXNUcnVuY2F0ZWQgPSBmYWxzZVxuICBsZXQgbmV4dE1hcmtlciwgbmV4dFZlcnNpb25LZXlNYXJrZXJcbiAgY29uc3QgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuXG4gIGNvbnN0IHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkgPSAocmVzcG9uc2VFbnRpdHkpID0+IHtcbiAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHtcbiAgICAgIHRvQXJyYXkocmVzcG9uc2VFbnRpdHkpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBsaXN0QnVja2V0UmVzdWx0ID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgY29uc3QgbGlzdFZlcnNpb25zUmVzdWx0ID0geG1sb2JqLkxpc3RWZXJzaW9uc1Jlc3VsdFxuXG4gIGlmIChsaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuSXNUcnVuY2F0ZWQpIHtcbiAgICAgIGlzVHJ1bmNhdGVkID0gbGlzdEJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5Db250ZW50cykge1xuICAgICAgdG9BcnJheShsaXN0QnVja2V0UmVzdWx0LkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbnRlbnQuS2V5KVswXSlcbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUodG9BcnJheShjb250ZW50Lkxhc3RNb2RpZmllZClbMF0pXG4gICAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShjb250ZW50LkVUYWcpWzBdKVxuICAgICAgICBjb25zdCBzaXplID0gY29udGVudC5TaXplXG4gICAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuTmV4dE1hcmtlcikge1xuICAgICAgbmV4dE1hcmtlciA9IGxpc3RCdWNrZXRSZXN1bHQuTmV4dE1hcmtlclxuICAgIH1cbiAgICBwYXJzZUNvbW1vblByZWZpeGVzRW50aXR5KGxpc3RCdWNrZXRSZXN1bHQuQ29tbW9uUHJlZml4ZXMpXG4gIH1cblxuICBpZiAobGlzdFZlcnNpb25zUmVzdWx0KSB7XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5Jc1RydW5jYXRlZCkge1xuICAgICAgaXNUcnVuY2F0ZWQgPSBsaXN0VmVyc2lvbnNSZXN1bHQuSXNUcnVuY2F0ZWRcbiAgICB9XG5cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LlZlcnNpb24pIHtcbiAgICAgIHRvQXJyYXkobGlzdFZlcnNpb25zUmVzdWx0LlZlcnNpb24pLmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaChmb3JtYXRPYmpJbmZvKGNvbnRlbnQpKVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5EZWxldGVNYXJrZXIpIHtcbiAgICAgIHRvQXJyYXkobGlzdFZlcnNpb25zUmVzdWx0LkRlbGV0ZU1hcmtlcikuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKGZvcm1hdE9iakluZm8oY29udGVudCwgeyBJc0RlbGV0ZU1hcmtlcjogdHJ1ZSB9KSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0S2V5TWFya2VyKSB7XG4gICAgICBuZXh0VmVyc2lvbktleU1hcmtlciA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0S2V5TWFya2VyXG4gICAgfVxuICAgIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQuTmV4dFZlcnNpb25JZE1hcmtlcikge1xuICAgICAgcmVzdWx0LnZlcnNpb25JZE1hcmtlciA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0VmVyc2lvbklkTWFya2VyXG4gICAgfVxuICAgIHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkobGlzdFZlcnNpb25zUmVzdWx0LkNvbW1vblByZWZpeGVzKVxuICB9XG5cbiAgcmVzdWx0LmlzVHJ1bmNhdGVkID0gaXNUcnVuY2F0ZWRcbiAgaWYgKGlzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0Lm5leHRNYXJrZXIgPSBuZXh0VmVyc2lvbktleU1hcmtlciB8fCBuZXh0TWFya2VyXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3Qgb2JqZWN0cyB2MiBpbiBhIGJ1Y2tldFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE9iamVjdHNWMih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gIH1cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgaWYgKCF4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0QnVja2V0UmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0QnVja2V0UmVzdWx0XG4gIGlmICh4bWxvYmouSXNUcnVuY2F0ZWQpIHtcbiAgICByZXN1bHQuaXNUcnVuY2F0ZWQgPSB4bWxvYmouSXNUcnVuY2F0ZWRcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlbikge1xuICAgIHJlc3VsdC5uZXh0Q29udGludWF0aW9uVG9rZW4gPSB4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuXG4gIH1cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICB2YXIgbmFtZSA9IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29udGVudC5LZXkpWzBdKVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGNvbnRlbnQuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgdmFyIHNpemUgPSBjb250ZW50LlNpemVcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUgfSlcbiAgICB9KVxuICB9XG4gIGlmICh4bWxvYmouQ29tbW9uUHJlZml4ZXMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db21tb25QcmVmaXhlcykuZm9yRWFjaCgoY29tbW9uUHJlZml4KSA9PiB7XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3Qgb2JqZWN0cyB2MiB3aXRoIG1ldGFkYXRhIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5MaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RCdWNrZXRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgcmVzdWx0Lm5leHRDb250aW51YXRpb25Ub2tlbiA9IHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW5cbiAgfVxuXG4gIGlmICh4bWxvYmouQ29udGVudHMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db250ZW50cykuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgdmFyIG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleShjb250ZW50LktleSlcbiAgICAgIHZhciBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShjb250ZW50Lkxhc3RNb2RpZmllZClcbiAgICAgIHZhciBldGFnID0gc2FuaXRpemVFVGFnKGNvbnRlbnQuRVRhZylcbiAgICAgIHZhciBzaXplID0gY29udGVudC5TaXplXG4gICAgICB2YXIgbWV0YWRhdGFcbiAgICAgIGlmIChjb250ZW50LlVzZXJNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1ldGFkYXRhID0gdG9BcnJheShjb250ZW50LlVzZXJNZXRhZGF0YSlbMF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFkYXRhID0gbnVsbFxuICAgICAgfVxuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSwgbWV0YWRhdGEgfSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHhtbG9iai5Db21tb25QcmVmaXhlcykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbW1vblByZWZpeGVzKS5mb3JFYWNoKChjb21tb25QcmVmaXgpID0+IHtcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29tbW9uUHJlZml4LlByZWZpeClbMF0pLCBzaXplOiAwIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWcoeG1sKSB7XG4gIHZhciB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIHJldHVybiB4bWxPYmouVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFnZ2luZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBsZXQgcmVzdWx0ID0gW11cbiAgaWYgKHhtbE9iai5UYWdnaW5nICYmIHhtbE9iai5UYWdnaW5nLlRhZ1NldCAmJiB4bWxPYmouVGFnZ2luZy5UYWdTZXQuVGFnKSB7XG4gICAgY29uc3QgdGFnUmVzdWx0ID0geG1sT2JqLlRhZ2dpbmcuVGFnU2V0LlRhZ1xuICAgIC8vIGlmIGl0IGlzIGEgc2luZ2xlIHRhZyBjb252ZXJ0IGludG8gYW4gYXJyYXkgc28gdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyBhbiBhcnJheS5cbiAgICBpZiAoaXNPYmplY3QodGFnUmVzdWx0KSkge1xuICAgICAgcmVzdWx0LnB1c2godGFnUmVzdWx0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0YWdSZXN1bHRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaWZlY3ljbGVDb25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIHhtbE9iai5MaWZlY3ljbGVDb25maWd1cmF0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExvY2tDb25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgbGV0IGxvY2tDb25maWdSZXN1bHQgPSB7fVxuICBpZiAoeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uKSB7XG4gICAgbG9ja0NvbmZpZ1Jlc3VsdCA9IHtcbiAgICAgIG9iamVjdExvY2tFbmFibGVkOiB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uT2JqZWN0TG9ja0VuYWJsZWQsXG4gICAgfVxuICAgIGxldCByZXRlbnRpb25SZXNwXG4gICAgaWYgKFxuICAgICAgeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uICYmXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uUnVsZSAmJlxuICAgICAgeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uLlJ1bGUuRGVmYXVsdFJldGVudGlvblxuICAgICkge1xuICAgICAgcmV0ZW50aW9uUmVzcCA9IHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5SdWxlLkRlZmF1bHRSZXRlbnRpb24gfHwge31cbiAgICAgIGxvY2tDb25maWdSZXN1bHQubW9kZSA9IHJldGVudGlvblJlc3AuTW9kZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uUmVzcCkge1xuICAgICAgY29uc3QgaXNVbml0WWVhcnMgPSByZXRlbnRpb25SZXNwLlllYXJzXG4gICAgICBpZiAoaXNVbml0WWVhcnMpIHtcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC52YWxpZGl0eSA9IGlzVW5pdFllYXJzXG4gICAgICAgIGxvY2tDb25maWdSZXN1bHQudW5pdCA9IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSU1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC52YWxpZGl0eSA9IHJldGVudGlvblJlc3AuRGF5c1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnVuaXQgPSBSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuREFZU1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9ja0NvbmZpZ1Jlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXRlbnRpb25Db25maWcgPSB4bWxPYmouUmV0ZW50aW9uXG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlOiByZXRlbnRpb25Db25maWcuTW9kZSxcbiAgICByZXRhaW5VbnRpbERhdGU6IHJldGVudGlvbkNvbmZpZy5SZXRhaW5VbnRpbERhdGUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyh4bWwpIHtcbiAgbGV0IGVuY0NvbmZpZyA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIGVuY0NvbmZpZ1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVwbGljYXRpb25Db25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgY29uc3QgcmVwbGljYXRpb25Db25maWcgPSB7XG4gICAgUmVwbGljYXRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICByb2xlOiB4bWxPYmouUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJvbGUsXG4gICAgICBydWxlczogdG9BcnJheSh4bWxPYmouUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJ1bGUpLFxuICAgIH0sXG4gIH1cbiAgcmV0dXJuIHJlcGxpY2F0aW9uQ29uZmlnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxlZ2FsSG9sZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkUGFydFBhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXNwRWwgPSB4bWxPYmouQ29weVBhcnRSZXN1bHRcbiAgcmV0dXJuIHJlc3BFbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1BhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoeG1sT2JqLkRlbGV0ZVJlc3VsdCAmJiB4bWxPYmouRGVsZXRlUmVzdWx0LkVycm9yKSB7XG4gICAgLy8gcmV0dXJuIGVycm9ycyBhcyBhcnJheSBhbHdheXMuIGFzIHRoZSByZXNwb25zZSBpcyBvYmplY3QgaW4gY2FzZSBvZiBzaW5nbGUgb2JqZWN0IHBhc3NlZCBpbiByZW1vdmVPYmplY3RzXG4gICAgcmV0dXJuIHRvQXJyYXkoeG1sT2JqLkRlbGV0ZVJlc3VsdC5FcnJvcilcbiAgfVxuICByZXR1cm4gW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKHJlcykge1xuICAvLyBleHRyYWN0SGVhZGVyVHlwZSBleHRyYWN0cyB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaGVhZGVyIG1lc3NhZ2UsIHRoZSBoZWFkZXIgdHlwZS5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclR5cGUoc3RyZWFtKSB7XG4gICAgY29uc3QgaGVhZGVyTmFtZUxlbiA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKDEpKS5yZWFkVUludDgoKVxuICAgIGNvbnN0IGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yID0gQnVmZmVyLmZyb20oc3RyZWFtLnJlYWQoaGVhZGVyTmFtZUxlbikpLnRvU3RyaW5nKClcbiAgICBjb25zdCBzcGxpdEJ5U2VwYXJhdG9yID0gKGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIHx8ICcnKS5zcGxpdCgnOicpXG4gICAgY29uc3QgaGVhZGVyTmFtZSA9IHNwbGl0QnlTZXBhcmF0b3IubGVuZ3RoID49IDEgPyBzcGxpdEJ5U2VwYXJhdG9yWzFdIDogJydcbiAgICByZXR1cm4gaGVhZGVyTmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclZhbHVlKHN0cmVhbSkge1xuICAgIGNvbnN0IGJvZHlMZW4gPSBCdWZmZXIuZnJvbShzdHJlYW0ucmVhZCgyKSkucmVhZFVJbnQxNkJFKClcbiAgICBjb25zdCBib2R5TmFtZSA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKGJvZHlMZW4pKS50b1N0cmluZygpXG4gICAgcmV0dXJuIGJvZHlOYW1lXG4gIH1cblxuICBjb25zdCBzZWxlY3RSZXN1bHRzID0gbmV3IFNlbGVjdFJlc3VsdHMoe30pIC8vIHdpbGwgYmUgcmV0dXJuZWRcblxuICBjb25zdCByZXNwb25zZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHJlcykgLy8gY29udmVydCBieXRlIGFycmF5IHRvIGEgcmVhZGFibGUgcmVzcG9uc2VTdHJlYW1cbiAgd2hpbGUgKHJlc3BvbnNlU3RyZWFtLl9yZWFkYWJsZVN0YXRlLmxlbmd0aCkge1xuICAgIC8vIFRvcCBsZXZlbCByZXNwb25zZVN0cmVhbSByZWFkIHRyYWNrZXIuXG4gICAgbGV0IG1zZ0NyY0FjY3VtdWxhdG9yIC8vIGFjY3VtdWxhdGUgZnJvbSBzdGFydCBvZiB0aGUgbWVzc2FnZSB0aWxsIHRoZSBtZXNzYWdlIGNyYyBzdGFydC5cblxuICAgIGNvbnN0IHRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMih0b3RhbEJ5dGVMZW5ndGhCdWZmZXIpXG5cbiAgICBjb25zdCBoZWFkZXJCeXRlc0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihoZWFkZXJCeXRlc0J1ZmZlciwgbXNnQ3JjQWNjdW11bGF0b3IpXG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUHJlbHVkZUNyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKCkgLy8gdXNlIGl0IHRvIGNoZWNrIGlmIGFueSBDUkMgbWlzbWF0Y2ggaW4gaGVhZGVyIGl0c2VsZi5cblxuICAgIGNvbnN0IHByZWx1ZGVDcmNCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKDQpKSAvLyByZWFkIDQgYnl0ZXMgICAgaS5lIDQrNCA9OCArIDQgPSAxMiAoIHByZWx1ZGUgKyBwcmVsdWRlIGNyYylcbiAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKHByZWx1ZGVDcmNCdWZmZXIsIG1zZ0NyY0FjY3VtdWxhdG9yKVxuXG4gICAgY29uc3QgdG90YWxNc2dMZW5ndGggPSB0b3RhbEJ5dGVMZW5ndGhCdWZmZXIucmVhZEludDMyQkUoKVxuICAgIGNvbnN0IGhlYWRlckxlbmd0aCA9IGhlYWRlckJ5dGVzQnVmZmVyLnJlYWRJbnQzMkJFKClcbiAgICBjb25zdCBwcmVsdWRlQ3JjQnl0ZVZhbHVlID0gcHJlbHVkZUNyY0J1ZmZlci5yZWFkSW50MzJCRSgpXG5cbiAgICBpZiAocHJlbHVkZUNyY0J5dGVWYWx1ZSAhPT0gY2FsY3VsYXRlZFByZWx1ZGVDcmMpIHtcbiAgICAgIC8vIEhhbmRsZSBIZWFkZXIgQ1JDIG1pc21hdGNoIEVycm9yXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBIZWFkZXIgQ2hlY2tzdW0gTWlzbWF0Y2gsIFByZWx1ZGUgQ1JDIG9mICR7cHJlbHVkZUNyY0J5dGVWYWx1ZX0gZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgQ1JDIG9mICR7Y2FsY3VsYXRlZFByZWx1ZGVDcmN9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBpZiAoaGVhZGVyTGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGVhZGVyQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKGhlYWRlckxlbmd0aCkpXG4gICAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKGhlYWRlckJ5dGVzLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIGNvbnN0IGhlYWRlclJlYWRlclN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKGhlYWRlckJ5dGVzKVxuICAgICAgd2hpbGUgKGhlYWRlclJlYWRlclN0cmVhbS5fcmVhZGFibGVTdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGhlYWRlclR5cGVOYW1lID0gZXh0cmFjdEhlYWRlclR5cGUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgICBoZWFkZXJSZWFkZXJTdHJlYW0ucmVhZCgxKSAvLyBqdXN0IHJlYWQgYW5kIGlnbm9yZSBpdC5cbiAgICAgICAgaGVhZGVyc1toZWFkZXJUeXBlTmFtZV0gPSBleHRyYWN0SGVhZGVyVmFsdWUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkU3RyZWFtXG4gICAgY29uc3QgcGF5TG9hZExlbmd0aCA9IHRvdGFsTXNnTGVuZ3RoIC0gaGVhZGVyTGVuZ3RoIC0gMTZcbiAgICBpZiAocGF5TG9hZExlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBheUxvYWRCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpKVxuICAgICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihwYXlMb2FkQnVmZmVyLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIC8vIHJlYWQgdGhlIGNoZWNrc3VtIGVhcmx5IGFuZCBkZXRlY3QgYW55IG1pc21hdGNoIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBmdXJ0aGVyIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBtZXNzYWdlQ3JjQnl0ZVZhbHVlID0gQnVmZmVyLmZyb20ocmVzcG9uc2VTdHJlYW0ucmVhZCg0KSkucmVhZEludDMyQkUoKVxuICAgICAgY29uc3QgY2FsY3VsYXRlZENyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKClcbiAgICAgIC8vIEhhbmRsZSBtZXNzYWdlIENSQyBFcnJvclxuICAgICAgaWYgKG1lc3NhZ2VDcmNCeXRlVmFsdWUgIT09IGNhbGN1bGF0ZWRDcmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIENoZWNrc3VtIE1pc21hdGNoLCBNZXNzYWdlIENSQyBvZiAke21lc3NhZ2VDcmNCeXRlVmFsdWV9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIENSQyBvZiAke2NhbGN1bGF0ZWRDcmN9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcGF5bG9hZFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheUxvYWRCdWZmZXIpXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVR5cGUgPSBoZWFkZXJzWydtZXNzYWdlLXR5cGUnXVxuXG4gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGhlYWRlcnNbJ2Vycm9yLWNvZGUnXSArICc6XCInICsgaGVhZGVyc1snZXJyb3ItbWVzc2FnZSddICsgJ1wiJ1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgfVxuICAgICAgY2FzZSAnZXZlbnQnOiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gaGVhZGVyc1snZXZlbnQtdHlwZSddXG5cbiAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdFbmQnOiB7XG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlc3BvbnNlKHJlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RSZXN1bHRzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnUmVjb3Jkcyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWREYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlY29yZHMocmVhZERhdGEpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ1Byb2dyZXNzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQveG1sJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFByb2dyZXNzKHByb2dyZXNzRGF0YS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFVuZXhwZWN0ZWQgY29udGVudC10eXBlICR7Y29udGVudFR5cGV9IHNlbnQgZm9yIGV2ZW50LXR5cGUgUHJvZ3Jlc3NgXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdTdGF0cyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0L3htbCc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzRGF0YSA9IHBheWxvYWRTdHJlYW0ucmVhZChwYXlMb2FkTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgc2VsZWN0UmVzdWx0cy5zZXRTdGF0cyhzdGF0c0RhdGEudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVbmV4cGVjdGVkIGNvbnRlbnQtdHlwZSAke2NvbnRlbnRUeXBlfSBzZW50IGZvciBldmVudC10eXBlIFN0YXRzYFxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gQ29udGludWF0aW9uIG1lc3NhZ2U6IE5vdCBzdXJlIGlmIGl0IGlzIHN1cHBvcnRlZC4gZGlkIG5vdCBmaW5kIGEgcmVmZXJlbmNlIG9yIGFueSBtZXNzYWdlIGluIHJlc3BvbnNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHBheWxvYWQuXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBVbiBpbXBsZW1lbnRlZCBldmVudCBkZXRlY3RlZCAgJHttZXNzYWdlVHlwZX0uYFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nTWVzc2FnZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gZXZlbnRUeXBlIEVuZFxuICAgICAgfSAvLyBFdmVudCBFbmRcbiAgICB9IC8vIG1lc3NhZ2VUeXBlIEVuZFxuICB9IC8vIFRvcCBMZXZlbCBTdHJlYW0gRW5kXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sS0FBQSxHQUFBUCxPQUFBO0FBQTZELFNBQUFRLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFMLHdCQUFBUyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsb0JBQUFBLEdBQUEsd0JBQUFBLEdBQUEsNEJBQUFFLE9BQUEsRUFBQUYsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLEdBQUEsSUFBQVgsR0FBQSxRQUFBVyxHQUFBLGtCQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFkLEdBQUEs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 + +/***/ }), + +/***/ 7962: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +/*! + * mime-db + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module exports. + */ + +module.exports = __nccwpck_require__(2639) + + +/***/ }), + +/***/ 7920: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; +/*! + * mime-types + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + + + +/** + * Module dependencies. + * @private + */ + +var db = __nccwpck_require__(7962) +var extname = (__nccwpck_require__(1017).extname) + +/** + * Module variables. + * @private + */ + +var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ +var TEXT_TYPE_REGEXP = /^text\//i + +/** + * Module exports. + * @public + */ + +exports.charset = charset +exports.charsets = { lookup: charset } +exports.contentType = contentType +exports.extension = extension +exports.extensions = Object.create(null) +exports.lookup = lookup +exports.types = Object.create(null) + +// Populate the extensions/types maps +populateMaps(exports.extensions, exports.types) + +/** + * Get the default charset for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function charset (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + var mime = match && db[match[1].toLowerCase()] + + if (mime && mime.charset) { + return mime.charset + } + + // default text/* to utf-8 + if (match && TEXT_TYPE_REGEXP.test(match[1])) { + return 'UTF-8' + } + + return false +} + +/** + * Create a full Content-Type header given a MIME type or extension. + * + * @param {string} str + * @return {boolean|string} + */ + +function contentType (str) { + // TODO: should this even be in this module? + if (!str || typeof str !== 'string') { + return false + } + + var mime = str.indexOf('/') === -1 + ? exports.lookup(str) + : str + + if (!mime) { + return false + } + + // TODO: use content-type or other module + if (mime.indexOf('charset') === -1) { + var charset = exports.charset(mime) + if (charset) mime += '; charset=' + charset.toLowerCase() + } + + return mime +} + +/** + * Get the default extension for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function extension (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + + // get extensions + var exts = match && exports.extensions[match[1].toLowerCase()] + + if (!exts || !exts.length) { + return false + } + + return exts[0] +} + +/** + * Lookup the MIME type for a file path/extension. + * + * @param {string} path + * @return {boolean|string} + */ + +function lookup (path) { + if (!path || typeof path !== 'string') { + return false + } + + // get the extension ("ext" or ".ext" or full path) + var extension = extname('x.' + path) + .toLowerCase() + .substr(1) + + if (!extension) { + return false + } + + return exports.types[extension] || false +} + +/** + * Populate the extensions and types maps. + * @private + */ + +function populateMaps (extensions, types) { + // source preference (least -> most) + var preference = ['nginx', 'apache', undefined, 'iana'] + + Object.keys(db).forEach(function forEachMimeType (type) { + var mime = db[type] + var exts = mime.extensions + + if (!exts || !exts.length) { + return + } + + // mime -> extensions + extensions[type] = exts + + // extension -> mime + for (var i = 0; i < exts.length; i++) { + var extension = exts[i] + + if (types[extension]) { + var from = preference.indexOf(db[types[extension]].source) + var to = preference.indexOf(mime.source) + + if (types[extension] !== 'application/octet-stream' && + (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { + // skip the remapping + continue + } + } + + // set the extension -> mime + types[extension] = type + } + }) +} + /***/ }), @@ -88743,60 +92333,48 @@ module.exports.q = codes; // 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 duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. -/**/ + +/**/ var objectKeys = Object.keys || function (obj) { var keys = []; - - for (var key in obj) { - keys.push(key); - } - + for (var key in obj) keys.push(key); return keys; }; /**/ - module.exports = Duplex; - var Readable = __nccwpck_require__(1433); - var Writable = __nccwpck_require__(2094); - __nccwpck_require__(4124)(Duplex, Readable); - { // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { var method = keys[v]; 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); this.allowHalfOpen = true; - if (options) { if (options.readable === false) this.readable = false; if (options.writable === false) this.writable = false; - if (options.allowHalfOpen === false) { this.allowHalfOpen = false; this.once('end', onend); } } } - Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -88823,20 +92401,20 @@ Object.defineProperty(Duplex.prototype, 'writableLength', { get: function get() { return this._writableState.length; } -}); // the no-half-open enforcer +}); +// the no-half-open enforcer function onend() { // If the writable side ended, then we're ok. - if (this._writableState.ended) return; // no more data can be written. - // But allow more writes to happen in this tick. + if (this._writableState.ended) return; + // no more data can be written. + // But allow more writes to happen in this tick. process.nextTick(onEndNT, this); } - function onEndNT(self) { self.end(); } - Object.defineProperty(Duplex.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -88846,7 +92424,6 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { if (this._readableState === undefined || this._writableState === undefined) { return false; } - return this._readableState.destroyed && this._writableState.destroyed; }, set: function set(value) { @@ -88854,10 +92431,10 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._readableState.destroyed = value; this._writableState.destroyed = value; } @@ -88889,22 +92466,20 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { // 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 passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. -module.exports = PassThrough; +module.exports = PassThrough; var Transform = __nccwpck_require__(4415); - __nccwpck_require__(4124)(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); }; @@ -88937,47 +92512,38 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { // USE OR OTHER DEALINGS IN THE SOFTWARE. + module.exports = Readable; -/**/ +/**/ var Duplex; /**/ Readable.ReadableState = ReadableState; -/**/ +/**/ var EE = (__nccwpck_require__(2361).EventEmitter); - var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ - - var Stream = __nccwpck_require__(2387); /**/ - var Buffer = (__nccwpck_require__(4300).Buffer); - -var OurUint8Array = global.Uint8Array || function () {}; - +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } - function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -/**/ - +/**/ var debugUtil = __nccwpck_require__(3837); - var debug; - if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { @@ -88985,60 +92551,57 @@ if (debugUtil && debugUtil.debuglog) { } /**/ - var BufferList = __nccwpck_require__(2746); - var destroyImpl = __nccwpck_require__(7049); - var _require = __nccwpck_require__(9948), - getHighWaterMark = _require.getHighWaterMark; - + getHighWaterMark = _require.getHighWaterMark; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, - ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. - + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; +// Lazy loaded to improve the startup performance. var StringDecoder; var createReadableStreamAsyncIterator; var from; - __nccwpck_require__(4124)(Readable, Stream); - var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - 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 + 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 (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } - function ReadableState(options, stream, isDuplex) { Duplex = Duplex || __nccwpck_require__(1359); - options = options || {}; // Duplex streams are both readable and writable, but share + options = options || {}; + + // 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 Duplex; - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // 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.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); - this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // 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 = null; @@ -89046,61 +92609,66 @@ function ReadableState(options, stream, isDuplex) { this.flowing = null; this.ended = false; this.endEmitted = false; - this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + this.reading = false; + + // 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; - this.sync = true; // whenever we return null, then we set a flag to say + // 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.paused = true; // Should close be emitted on destroy. Defaults to true. + this.paused = true; - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + // Should close be emitted on destroy. Defaults to true. + this.emitClose = options.emitClose !== false; - this.autoDestroy = !!options.autoDestroy; // has it been destroyed + // Should .destroy() be called after 'end' (and potentially 'finish') + this.autoDestroy = !!options.autoDestroy; - this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // has it been destroyed + this.destroyed = 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.defaultEncoding || 'utf8'; - this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s - - this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; - if (options.encoding) { if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } - function Readable(options) { Duplex = Duplex || __nccwpck_require__(1359); - 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 + 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 var isDuplex = this instanceof Duplex; - this._readableState = new ReadableState(options, this, isDuplex); // legacy + this._readableState = new ReadableState(options, this, isDuplex); + // legacy this.readable = true; - if (options) { if (typeof options.read === 'function') this._read = options.read; if (typeof options.destroy === 'function') this._destroy = options.destroy; } - Stream.call(this); } - Object.defineProperty(Readable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -89110,7 +92678,6 @@ Object.defineProperty(Readable.prototype, 'destroyed', { if (this._readableState === undefined) { return false; } - return this._readableState.destroyed; }, set: function set(value) { @@ -89118,69 +92685,60 @@ Object.defineProperty(Readable.prototype, 'destroyed', { // has not been initialized yet if (!this._readableState) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._readableState.destroyed = value; } }); Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; - Readable.prototype._destroy = function (err, cb) { cb(err); -}; // Manually shove something into the read() buffer. +}; + +// 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) { var state = this._readableState; var skipChunkCheck; - if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } - skipChunkCheck = true; } } else { skipChunkCheck = true; } - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; // Unshift should *always* be something directly out of read() - +}; +// Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; - function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { debug('readableAddChunk', chunk); var state = stream._readableState; - if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { errorOrDestroy(stream, er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = _uint8ArrayToBuffer(chunk); } - if (addToFront) { if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { @@ -89189,7 +92747,6 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { 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); @@ -89201,14 +92758,13 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { state.reading = false; maybeReadMore(stream, state); } - } // We can push more data if we are below the highWaterMark. + } + + // 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) { state.awaitDrain = 0; @@ -89219,50 +92775,42 @@ function addChunk(stream, state, chunk, addToFront) { if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } - maybeReadMore(stream, state); } - function chunkInvalid(state, chunk) { var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } - return er; } - Readable.prototype.isPaused = function () { return this._readableState.flowing === false; -}; // backwards compatibility. - +}; +// backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); var decoder = new StringDecoder(enc); - this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 - - this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + this._readableState.decoder = decoder; + // If setEncoding(null), decoder.encoding equals utf8 + this._readableState.encoding = this._readableState.decoder.encoding; + // Iterate over current buffer to convert already stored Buffers: var p = this._readableState.buffer.head; var content = ''; - while (p !== null) { content += decoder.write(p.data); p = p.next; } - this._readableState.buffer.clear(); - if (content !== '') this._readableState.buffer.push(content); this._readableState.length = content.length; return this; -}; // Don't raise the hwm > 1GB - +}; +// Don't raise the hwm > 1GB var MAX_HWM = 0x40000000; - function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. @@ -89278,55 +92826,54 @@ function computeNewHighWaterMark(n) { n |= n >>> 16; n++; } - return n; -} // This function is designed to be inlinable, so please take care when making -// changes to the function body. - +} +// 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 (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } // If we're asking for more than the current hwm, then raise the hwm. - - + } + // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; // Don't have enough - + if (n <= state.length) return n; + // Don't have enough if (!state.ended) { state.needReadable = true; return 0; } - return state.length; -} // you can override either this method, or the async _read(n) below. - +} +// you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; - if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + 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); - n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. - + // 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 + } + + // 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 @@ -89347,40 +92894,37 @@ Readable.prototype.read = function (n) { // '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. - + // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; - debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + 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, and if we're already - // reading, then it's unnecessary. - + } + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', 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 - + 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 this._read(state.highWaterMark); - - state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + 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); } - var ret; if (n > 0) ret = fromList(n, state);else ret = null; - if (ret === null) { state.needReadable = state.length <= state.highWaterMark; n = 0; @@ -89388,34 +92932,28 @@ Readable.prototype.read = function (n) { state.length -= n; state.awaitDrain = 0; } - 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 (!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) this.emit('data', ret); return ret; }; - function onEofChunk(stream, state) { debug('onEofChunk'); if (state.ended) return; - if (state.decoder) { var 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() @@ -89424,61 +92962,56 @@ function onEofChunk(stream, state) { } else { // emit 'readable' now to make sure it gets picked up. state.needReadable = false; - if (!state.emittedReadable) { state.emittedReadable = true; emitReadable_(stream); } } -} // Don't emit readable right away in sync mode, because this can trigger +} + +// 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) { var 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) { var state = stream._readableState; debug('emitReadable_', state.destroyed, state.length, state.ended); - if (!state.destroyed && (state.length || state.ended)) { stream.emit('readable'); state.emittedReadable = false; - } // The stream needs another readable event if + } + + // 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, +} + +// 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.readingMore = true; process.nextTick(maybeReadMore_, stream, state); } } - function maybeReadMore_(stream, state) { // Attempt to read more data if we should. // @@ -89507,49 +93040,42 @@ function maybeReadMore_(stream, state) { var len = state.length; debug('maybeReadMore read 0'); stream.read(0); - if (len === state.length) // didn't get any data, stop spinning. + if (len === state.length) + // didn't get any data, stop spinning. break; } - state.readingMore = false; -} // abstract method. to be overridden in specific implementation classes. +} + +// 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) { errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; - Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; - switch (state.pipesCount) { case 0: state.pipes = dest; break; - case 1: state.pipes = [state.pipes, dest]; break; - default: state.pipes.push(dest); break; } - state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var 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; @@ -89557,23 +93083,21 @@ Readable.prototype.pipe = function (dest, pipeOpts) { } } } - function onend() { debug('onend'); dest.end(); - } // when the dest drains, it reduces the awaitDrain counter + } + + // 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. - - var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; - function cleanup() { - debug('cleanup'); // cleanup event handlers once the pipe is broken - + debug('cleanup'); + // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); @@ -89582,22 +93106,20 @@ Readable.prototype.pipe = function (dest, pipeOpts) { 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 + 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } - src.on('data', ondata); - function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); debug('dest.write', ret); - if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write @@ -89607,87 +93129,84 @@ Readable.prototype.pipe = function (dest, pipeOpts) { debug('false write response, pause', state.awaitDrain); state.awaitDrain++; } - src.pause(); } - } // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - + } + // 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 (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, 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. + // 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. + // tell the dest that it's being piped to + dest.emit('pipe', src); + // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } - return dest; }; - function pipeOnDrain(src) { return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } - Readable.prototype.unpipe = function (dest) { var state = this._readableState; var unpipeInfo = { hasUnpiped: false - }; // if we're not piping anywhere, then do nothing. + }; - if (state.pipesCount === 0) return this; // just one destination. most common case. + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; - if (!dest) dest = state.pipes; // got a match. + if (!dest) dest = state.pipes; + // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; - } // slow case. multiple pipe destinations. + } + // slow case. multiple pipe destinations. if (!dest) { // remove all. @@ -89696,17 +93215,13 @@ Readable.prototype.unpipe = function (dest) { state.pipes = null; state.pipesCount = 0; state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, { - hasUnpiped: false - }); - } - + for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, { + hasUnpiped: false + }); return this; - } // try to find the right one. - + } + // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; state.pipes.splice(index, 1); @@ -89714,19 +93229,19 @@ Readable.prototype.unpipe = function (dest) { if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this, unpipeInfo); return this; -}; // set up data events if they are asked for -// Ensure readable listeners eventually get something - +}; +// set up data events if they are asked for +// Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); var 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 + 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) { @@ -89734,7 +93249,6 @@ Readable.prototype.on = function (ev, fn) { state.flowing = false; state.emittedReadable = false; debug('on readable', state.length, state.reading); - if (state.length) { emitReadable(this); } else if (!state.reading) { @@ -89742,15 +93256,11 @@ Readable.prototype.on = function (ev, fn) { } } } - return res; }; - Readable.prototype.addListener = Readable.prototype.on; - Readable.prototype.removeListener = function (ev, fn) { var 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 @@ -89760,13 +93270,10 @@ Readable.prototype.removeListener = function (ev, fn) { // effect. process.nextTick(updateReadableListening, this); } - return res; }; - Readable.prototype.removeAllListeners = function (ev) { var 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 @@ -89776,121 +93283,103 @@ Readable.prototype.removeAllListeners = function (ev) { // effect. process.nextTick(updateReadableListening, this); } - return res; }; - function updateReadableListening(self) { var state = self._readableState; state.readableListening = self.listenerCount('readable') > 0; - if (state.resumeScheduled && !state.paused) { // 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 + state.flowing = true; + + // crude way to check if we should resume } else if (self.listenerCount('data') > 0) { self.resume(); } } - 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. - +} +// 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 () { var state = this._readableState; - if (!state.flowing) { - debug('resume'); // we flow only if there is no one listening + 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.paused = 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.paused = true; return this; }; - function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); + while (state.flowing && stream.read() !== null); +} - while (state.flowing && stream.read() !== null) { - ; - } -} // wrap an old-style stream as the async data source. +// 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) { var _this = this; - var state = this._readableState; var paused = false; stream.on('end', function () { debug('wrapped end'); - if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); } - _this.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + if (state.decoder) chunk = state.decoder.write(chunk); + // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - var ret = _this.push(chunk); - if (!ret) { paused = true; stream.pause(); } - }); // proxy all the other methods. - // important when wrapping filters and duplexes. + }); + // proxy all the other methods. + // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function methodWrap(method) { @@ -89899,37 +93388,32 @@ Readable.prototype.wrap = function (stream) { }; }(i); } - } // proxy certain important events. - + } + // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } // when we try to consume some more bytes, simply unpause the - // underlying stream. - + } + // when we try to consume some more bytes, simply unpause the + // underlying stream. this._read = function (n) { debug('wrapped _read', n); - if (paused) { paused = false; stream.resume(); } }; - return this; }; - if (typeof Symbol === 'function') { Readable.prototype[Symbol.asyncIterator] = function () { if (createReadableStreamAsyncIterator === undefined) { createReadableStreamAsyncIterator = __nccwpck_require__(3306); } - return createReadableStreamAsyncIterator(this); }; } - Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -89961,8 +93445,9 @@ Object.defineProperty(Readable.prototype, 'readableFlowing', { this._readableState.flowing = state; } } -}); // exposed for testing purposes only. +}); +// exposed for testing purposes only. Readable._fromList = fromList; Object.defineProperty(Readable.prototype, 'readableLength', { // making it explicit this property is not enumerable @@ -89972,11 +93457,12 @@ Object.defineProperty(Readable.prototype, 'readableLength', { get: function get() { return this._readableState.length; } -}); // Pluck off n bytes from an array of buffers. +}); + +// 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; @@ -89991,52 +93477,44 @@ function fromList(n, state) { } return ret; } - function endReadable(stream) { var 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. + debug('endReadableNT', state.endEmitted, state.length); + // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); - if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the writable side is ready for autoDestroy as well var wState = stream._writableState; - if (!wState || wState.autoDestroy && wState.finished) { stream.destroy(); } } } } - if (typeof Symbol === 'function') { Readable.from = function (iterable, opts) { if (from === undefined) { from = __nccwpck_require__(9082); } - return from(Readable, iterable, opts); }; } - function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } - return -1; } @@ -90066,6 +93544,7 @@ function indexOf(xs, x) { // 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 transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -90109,40 +93588,34 @@ function indexOf(xs, x) { // the results of the previous transformed chunk were consumed. -module.exports = Transform; +module.exports = Transform; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, - ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, - ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; - + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; var Duplex = __nccwpck_require__(1359); - __nccwpck_require__(4124)(Transform, Duplex); - function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; var cb = ts.writecb; - if (cb === null) { return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } - ts.writechunk = null; ts.writecb = null; - if (data != null) // single equals check for both `null` and `undefined` + if (data != null) + // single equals check for both `null` and `undefined` this.push(data); cb(er); var rs = this._readableState; rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } } - function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); @@ -90153,26 +93626,25 @@ function Transform(options) { writecb: null, writechunk: null, writeencoding: null - }; // start out asking for a readable event once data is transformed. + }; - this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // 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; - 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. - + } + // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } - function prefinish() { var _this = this; - if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); @@ -90181,11 +93653,12 @@ function prefinish() { done(this, null, null); } } - Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); -}; // This is the part where you do stuff! +}; + +// This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // @@ -90195,33 +93668,27 @@ Transform.prototype.push = function (chunk, encoding) { // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. - - Transform.prototype._transform = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; - Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; - if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } -}; // Doesn't matter what the args are here. +}; + +// Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. - - Transform.prototype._read = function (n) { var ts = this._transformState; - if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in @@ -90229,20 +93696,20 @@ Transform.prototype._read = function (n) { ts.needTransform = true; } }; - Transform.prototype._destroy = function (err, cb) { Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); }); }; - function done(stream, er, data) { if (er) return stream.emit('error', er); - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + if (data != null) + // single equals check for both `null` and `undefined` + stream.push(data); + + // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided - if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); @@ -90274,29 +93741,29 @@ function done(stream, er, data) { // 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. + module.exports = Writable; -/* */ +/* */ function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; -} // It seems a linked list but it is not -// there will be only 2 of these for each stream - +} +// It seems a linked list but it is not +// there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; - this.next = null; this.entry = null; - this.finish = function () { onCorkedFinish(_this, state); }; @@ -90304,155 +93771,159 @@ function CorkedRequest(state) { /* */ /**/ - - var Duplex; /**/ Writable.WritableState = WritableState; -/**/ +/**/ var internalUtil = { deprecate: __nccwpck_require__(7127) }; /**/ /**/ - var Stream = __nccwpck_require__(2387); /**/ - var Buffer = (__nccwpck_require__(4300).Buffer); - -var OurUint8Array = global.Uint8Array || function () {}; - +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } - function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - var destroyImpl = __nccwpck_require__(7049); - var _require = __nccwpck_require__(9948), - getHighWaterMark = _require.getHighWaterMark; - + getHighWaterMark = _require.getHighWaterMark; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, - ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, - ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, - ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, - ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, - ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; - + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; var errorOrDestroy = destroyImpl.errorOrDestroy; - __nccwpck_require__(4124)(Writable, Stream); - function nop() {} - function WritableState(options, stream, isDuplex) { Duplex = Duplex || __nccwpck_require__(1359); - options = options || {}; // Duplex streams are both readable and writable, but share + options = options || {}; + + // 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 Duplex; - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // object stream flag to indicate whether or not this stream // contains buffers or objects. - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); - this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // 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 + // if _final has been called + this.finalCalled = false; - this.ended = false; // when 'finish' is emitted + // 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; - this.finished = false; // has it been destroyed + // has it been destroyed + this.destroyed = false; - this.destroyed = false; // should we decode strings into buffers before passing to _write? + // 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. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + 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.defaultEncoding || 'utf8'; - this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // 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; - this.length = 0; // a flag to see when we're in the middle of a write. + // a flag to see when we're in the middle of a write. + this.writing = false; - this.writing = false; // when true all writes will be buffered until .uncork() call + // when true all writes will be buffered until .uncork() call + this.corked = 0; - this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // 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; - this.sync = true; // a flag to know if we're processing previously buffered items, which + // 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; - this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - + // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); - }; // the callback that the user supplies to write(chunk,encoding,cb) - + }; - this.writecb = null; // the amount that is being written when _write is called. + // 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; this.bufferedRequest = null; - this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; - this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams + this.prefinished = false; - this.prefinished = false; // True if the error was already emitted and should not be thrown again + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; - this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + // Should close be emitted on destroy. Defaults to true. + this.emitClose = options.emitClose !== false; - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + // Should .destroy() be called after 'finish' (and potentially 'end') + this.autoDestroy = !!options.autoDestroy; - this.autoDestroy = !!options.autoDestroy; // count buffered requests + // count buffered requests + this.bufferedRequestCount = 0; - this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); } - WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; - while (current) { out.push(current); current = current.next; } - return out; }; - (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { @@ -90461,12 +93932,11 @@ WritableState.prototype.getBuffer = function getBuffer() { }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} -})(); // Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. - +})(); +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. var realHasInstance; - if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { @@ -90481,81 +93951,73 @@ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.protot return object instanceof this; }; } - function Writable(options) { - Duplex = Duplex || __nccwpck_require__(1359); // Writable ctor is applied to Duplexes, too. + Duplex = Duplex || __nccwpck_require__(1359); + + // 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 - var isDuplex = this instanceof Duplex; if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); - this._writableState = new WritableState(options, this, isDuplex); // legacy. + this._writableState = new WritableState(options, this, isDuplex); + // legacy. this.writable = true; - 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; } - Stream.call(this); -} // Otherwise people can pipe Writable streams, which is just wrong. - +} +// Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); }; - function writeAfterEnd(stream, cb) { - var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb - + var er = new ERR_STREAM_WRITE_AFTER_END(); + // TODO: defer error events consistently everywhere, not just the cb errorOrDestroy(stream, er); process.nextTick(cb, er); -} // Checks that a user-supplied chunk is valid, especially for the particular +} + +// Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. - - function validChunk(stream, state, chunk, cb) { var er; - if (chunk === null) { er = new ERR_STREAM_NULL_VALUES(); } else if (typeof chunk !== 'string' && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } - if (er) { errorOrDestroy(stream, er); process.nextTick(cb, er); return false; } - return true; } - Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - if (isBuf && !Buffer.isBuffer(chunk)) { chunk = _uint8ArrayToBuffer(chunk); } - if (typeof encoding === 'function') { cb = encoding; encoding = null; } - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { @@ -90564,20 +94026,16 @@ Writable.prototype.write = function (chunk, encoding, cb) { } return ret; }; - Writable.prototype.cork = function () { this._writableState.corked++; }; - Writable.prototype.uncork = function () { var state = this._writableState; - if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; - Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); @@ -90585,7 +94043,6 @@ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { this._writableState.defaultEncoding = encoding; return this; }; - Object.defineProperty(Writable.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90595,15 +94052,12 @@ Object.defineProperty(Writable.prototype, 'writableBuffer', { return this._writableState && this._writableState.getBuffer(); } }); - function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } - return chunk; } - Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90612,27 +94066,25 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { get: function get() { return this._writableState.highWaterMark; } -}); // if we're already writing something, then just put 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, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } - var len = state.objectMode ? 1 : chunk.length; state.length += len; - var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - + var 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) { var last = state.lastBufferedRequest; state.lastBufferedRequest = { @@ -90642,21 +94094,17 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { callback: cb, next: null }; - if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } - state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } - return ret; } - function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; @@ -90665,16 +94113,14 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) { 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, sync, er, cb) { --state.pendingcb; - if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - process.nextTick(cb, er); // this can emit finish, and it will always happen + process.nextTick(cb, er); + // this can emit finish, and it will always happen // after error - process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); @@ -90683,20 +94129,18 @@ function onwriteError(stream, state, sync, er, cb) { // it is async cb(er); stream._writableState.errorEmitted = true; - errorOrDestroy(stream, er); // this can emit finish, but finish must + errorOrDestroy(stream, er); + // this can emit finish, but finish must // always follow error - finishMaybe(stream, state); } } - function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } - function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; @@ -90706,11 +94150,9 @@ function onwrite(stream, er) { if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state) || stream.destroyed; - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } - if (sync) { process.nextTick(afterWrite, stream, state, finished, cb); } else { @@ -90718,29 +94160,27 @@ function onwrite(stream, er) { } } } - function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); -} // Must force callback to be called on nextTick, so that we don't +} + +// Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. - - function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } -} // if there's something in the buffer waiting, then process it - +} +// if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; - if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; @@ -90749,28 +94189,25 @@ function clearBuffer(stream, state) { holder.entry = entry; var count = 0; var allBuffers = true; - while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } - buffer.allBuffers = allBuffers; - doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; - if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } - state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one @@ -90781,32 +94218,26 @@ function clearBuffer(stream, state) { var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; - state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. - if (state.writing) { break; } } - if (entry === null) state.lastBufferedRequest = null; } - state.bufferedRequest = entry; state.bufferProcessing = false; } - Writable.prototype._write = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; - Writable.prototype._writev = null; - Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; - if (typeof chunk === 'function') { cb = chunk; chunk = null; @@ -90815,19 +94246,18 @@ Writable.prototype.end = function (chunk, encoding, cb) { cb = encoding; encoding = null; } + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - + // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); - } // ignore unnecessary end() calls. - + } + // ignore unnecessary end() calls. if (!state.ending) endWritable(this, state, cb); return this; }; - Object.defineProperty(Writable.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90837,25 +94267,20 @@ Object.defineProperty(Writable.prototype, 'writableLength', { return this._writableState.length; } }); - function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } - function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; - if (err) { errorOrDestroy(stream, err); } - state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } - function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { if (typeof stream._final === 'function' && !state.destroyed) { @@ -90868,59 +94293,47 @@ function prefinish(stream, state) { } } } - function finishMaybe(stream, state) { var need = needFinish(state); - if (need) { prefinish(stream, state); - if (state.pendingcb === 0) { state.finished = true; 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 var rState = stream._readableState; - if (!rState || rState.autoDestroy && rState.endEmitted) { stream.destroy(); } } } } - return need; } - function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); - if (cb) { if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } - state.ended = true; stream.writable = false; } - function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; - while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; - } // reuse the free corkReq. - + } + // reuse the free corkReq. state.corkedRequestsFree.next = corkReq; } - Object.defineProperty(Writable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90930,7 +94343,6 @@ Object.defineProperty(Writable.prototype, 'destroyed', { if (this._writableState === undefined) { return false; } - return this._writableState.destroyed; }, set: function set(value) { @@ -90938,16 +94350,15 @@ Object.defineProperty(Writable.prototype, 'destroyed', { // has not been initialized yet if (!this._writableState) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._writableState.destroyed = value; } }); Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; - Writable.prototype._destroy = function (err, cb) { cb(err); }; @@ -90961,11 +94372,10 @@ Writable.prototype._destroy = function (err, cb) { var _Object$setPrototypeO; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var finished = __nccwpck_require__(6080); - var kLastResolve = Symbol('lastResolve'); var kLastReject = Symbol('lastReject'); var kError = Symbol('error'); @@ -90973,22 +94383,19 @@ var kEnded = Symbol('ended'); var kLastPromise = Symbol('lastPromise'); var kHandlePromise = Symbol('handlePromise'); var kStream = Symbol('stream'); - function createIterResult(value, done) { return { value: value, done: done }; } - function readAndResolve(iter) { var resolve = iter[kLastResolve]; - if (resolve !== null) { - var data = iter[kStream].read(); // we defer if data is null + var data = iter[kStream].read(); + // we defer if data is null // we can be expecting either 'end' or // 'error' - if (data !== null) { iter[kLastPromise] = null; iter[kLastResolve] = null; @@ -90997,13 +94404,11 @@ function readAndResolve(iter) { } } } - function onReadable(iter) { // we wait for the next tick, because it might // emit an error with process.nextTick process.nextTick(readAndResolve, iter); } - function wrapForNext(lastPromise, iter) { return function (resolve, reject) { lastPromise.then(function () { @@ -91011,33 +94416,26 @@ function wrapForNext(lastPromise, iter) { resolve(createIterResult(undefined, true)); return; } - iter[kHandlePromise](resolve, reject); }, reject); }; } - var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { get stream() { return this[kStream]; }, - next: function next() { var _this = this; - // if we have detected an error in the meanwhile // reject straight away var error = this[kError]; - if (error !== null) { return Promise.reject(error); } - if (this[kEnded]) { return Promise.resolve(createIterResult(undefined, true)); } - if (this[kStream].destroyed) { // We need to defer via nextTick because if .destroy(err) is // called, the error will be emitted via nextTick, and @@ -91052,29 +94450,25 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro } }); }); - } // if we have multiple next() calls + } + + // if we have multiple next() calls // we will wait for the previous Promise to finish // this logic is optimized to support for await loops, // where next() is only called once at a time - - var lastPromise = this[kLastPromise]; var promise; - if (lastPromise) { promise = new Promise(wrapForNext(lastPromise, this)); } else { // fast path needed to support multiple this.push() // without triggering the next() queue var data = this[kStream].read(); - if (data !== null) { return Promise.resolve(createIterResult(data, false)); } - promise = new Promise(this[kHandlePromise]); } - this[kLastPromise] = promise; return promise; } @@ -91082,7 +94476,6 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro return this; }), _defineProperty(_Object$setPrototypeO, "return", function _return() { var _this2 = this; - // destroy(err, cb) is a private API // we can guarantee we have that here, because we control the // Readable class this is attached to @@ -91092,15 +94485,12 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro reject(err); return; } - resolve(createIterResult(undefined, true)); }); }); }), _Object$setPrototypeO), AsyncIteratorPrototype); - var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { var _Object$create; - var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { value: stream, writable: true @@ -91119,7 +94509,6 @@ var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterat }), _defineProperty(_Object$create, kHandlePromise, { value: function value(resolve, reject) { var data = iterator[kStream].read(); - if (data) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; @@ -91135,35 +94524,30 @@ var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterat iterator[kLastPromise] = null; finished(stream, function (err) { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { - var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + var reject = iterator[kLastReject]; + // reject if we are waiting for data in the Promise // returned by next() and store the error - if (reject !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; reject(err); } - iterator[kError] = err; return; } - var resolve = iterator[kLastResolve]; - if (resolve !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(undefined, true)); } - iterator[kEnded] = true; }); stream.on('readable', onReadable.bind(null, iterator)); return iterator; }; - module.exports = createReadableStreamAsyncIterator; /***/ }), @@ -91174,41 +94558,29 @@ module.exports = createReadableStreamAsyncIterator; "use strict"; -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var _require = __nccwpck_require__(4300), - Buffer = _require.Buffer; - + Buffer = _require.Buffer; var _require2 = __nccwpck_require__(3837), - inspect = _require2.inspect; - + inspect = _require2.inspect; var custom = inspect && inspect.custom || 'inspect'; - function copyBuffer(src, target, offset) { Buffer.prototype.copy.call(src, target, offset); } - -module.exports = -/*#__PURE__*/ -function () { +module.exports = /*#__PURE__*/function () { function BufferList() { _classCallCheck(this, BufferList); - this.head = null; this.tail = null; this.length = 0; } - _createClass(BufferList, [{ key: "push", value: function push(v) { @@ -91252,11 +94624,7 @@ function () { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; - - while (p = p.next) { - ret += s + p.data; - } - + while (p = p.next) ret += s + p.data; return ret; } }, { @@ -91266,21 +94634,19 @@ function () { var ret = Buffer.allocUnsafe(n >>> 0); var p = this.head; var i = 0; - while (p) { copyBuffer(p.data, ret, i); i += p.data.length; p = p.next; } - return ret; - } // Consumes a specified amount of bytes or characters from the buffered data. + } + // Consumes a specified amount of bytes or characters from the buffered data. }, { key: "consume", value: function consume(n, hasStrings) { var ret; - if (n < this.head.data.length) { // `slice` is the same for buffers and strings. ret = this.head.data.slice(0, n); @@ -91292,15 +94658,15 @@ function () { // Result spans more than one buffer. ret = hasStrings ? this._getString(n) : this._getBuffer(n); } - return ret; } }, { key: "first", value: function first() { return this.head.data; - } // Consumes a specified amount of characters from the buffered data. + } + // Consumes a specified amount of characters from the buffered data. }, { key: "_getString", value: function _getString(n) { @@ -91308,13 +94674,11 @@ function () { var c = 1; var ret = p.data; n -= ret.length; - while (p = p.next) { var str = p.data; var nb = n > str.length ? str.length : n; if (nb === str.length) ret += str;else ret += str.slice(0, n); n -= nb; - if (n === 0) { if (nb === str.length) { ++c; @@ -91323,17 +94687,15 @@ function () { this.head = p; p.data = str.slice(nb); } - break; } - ++c; } - this.length -= c; return ret; - } // Consumes a specified amount of bytes from the buffered data. + } + // Consumes a specified amount of bytes from the buffered data. }, { key: "_getBuffer", value: function _getBuffer(n) { @@ -91342,13 +94704,11 @@ function () { var c = 1; p.data.copy(ret); n -= p.data.length; - while (p = p.next) { var buf = p.data; var nb = n > buf.length ? buf.length : n; buf.copy(ret, ret.length - n, 0, nb); n -= nb; - if (n === 0) { if (nb === buf.length) { ++c; @@ -91357,21 +94717,19 @@ function () { this.head = p; p.data = buf.slice(nb); } - break; } - ++c; } - this.length -= c; return ret; - } // Make sure the linked list only shows the minimal necessary information. + } + // Make sure the linked list only shows the minimal necessary information. }, { key: custom, value: function value(_, options) { - return inspect(this, _objectSpread({}, options, { + return inspect(this, _objectSpread(_objectSpread({}, options), {}, { // Only inspect one level. depth: 0, // It should not recurse. @@ -91379,7 +94737,6 @@ function () { })); } }]); - return BufferList; }(); @@ -91389,14 +94746,13 @@ function () { /***/ ((module) => { "use strict"; - // undocumented cb() API, needed for core, not for public API + +// undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; - var readableDestroyed = this._readableState && this._readableState.destroyed; var writableDestroyed = this._writableState && this._writableState.destroyed; - if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); @@ -91408,21 +94764,20 @@ function destroy(err, cb) { process.nextTick(emitErrorNT, this, err); } } - 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 + } + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks if (this._readableState) { this._readableState.destroyed = true; - } // if this is a duplex stream mark the writable part as destroyed as well - + } + // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } - this._destroy(err || null, function (err) { if (!cb && err) { if (!_this._writableState) { @@ -91440,21 +94795,17 @@ function destroy(err, cb) { process.nextTick(emitCloseNT, _this); } }); - return this; } - function emitErrorAndCloseNT(self, err) { emitErrorNT(self, err); emitCloseNT(self); } - function emitCloseNT(self) { if (self._writableState && !self._writableState.emitClose) return; if (self._readableState && !self._readableState.emitClose) return; self.emit('close'); } - function undestroy() { if (this._readableState) { this._readableState.destroyed = false; @@ -91462,7 +94813,6 @@ function undestroy() { this._readableState.ended = false; this._readableState.endEmitted = false; } - if (this._writableState) { this._writableState.destroyed = false; this._writableState.ended = false; @@ -91473,22 +94823,20 @@ function undestroy() { this._writableState.errorEmitted = false; } } - function emitErrorNT(self, err) { self.emit('error', err); } - function errorOrDestroy(stream, err) { // 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. + var rState = stream._readableState; var wState = stream._writableState; if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); } - module.exports = { destroy: destroy, undestroy: undestroy, @@ -91505,77 +94853,61 @@ module.exports = { // permission from the author, Mathias Buus (@mafintosh). -var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(7214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); +var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(7214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); function once(callback) { var called = false; return function () { if (called) return; called = true; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - callback.apply(this, args); }; } - function noop() {} - function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } - function eos(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var readable = opts.readable || opts.readable !== false && stream.readable; var writable = opts.writable || opts.writable !== false && stream.writable; - var onlegacyfinish = function onlegacyfinish() { if (!stream.writable) onfinish(); }; - var writableEnded = stream._writableState && stream._writableState.finished; - var onfinish = function onfinish() { writable = false; writableEnded = true; if (!readable) callback.call(stream); }; - var readableEnded = stream._readableState && stream._readableState.endEmitted; - var onend = function onend() { readable = false; readableEnded = true; if (!writable) callback.call(stream); }; - var onerror = function onerror(err) { callback.call(stream, err); }; - var onclose = function onclose() { var err; - if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } - if (writable && !writableEnded) { if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } }; - var onrequest = function onrequest() { stream.req.on('finish', onfinish); }; - if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); @@ -91585,7 +94917,6 @@ function eos(stream, opts, callback) { stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } - stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', onerror); @@ -91603,7 +94934,6 @@ function eos(stream, opts, callback) { stream.removeListener('close', onclose); }; } - module.exports = eos; /***/ }), @@ -91615,52 +94945,42 @@ module.exports = eos; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var ERR_INVALID_ARG_TYPE = (__nccwpck_require__(7214)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE); - function from(Readable, iterable, opts) { var iterator; - if (iterable && typeof iterable.next === 'function') { iterator = iterable; } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); - var readable = new Readable(_objectSpread({ objectMode: true - }, opts)); // Reading boolean to protect against _read + }, opts)); + // Reading boolean to protect against _read // being called before last iteration completion. - var reading = false; - readable._read = function () { if (!reading) { reading = true; next(); } }; - function next() { return _next2.apply(this, arguments); } - function _next2() { _next2 = _asyncToGenerator(function* () { try { - var _ref = yield iterator.next(), - value = _ref.value, - done = _ref.done; - + var _yield$iterator$next = yield iterator.next(), + value = _yield$iterator$next.value, + done = _yield$iterator$next.done; if (done) { readable.push(null); - } else if (readable.push((yield value))) { + } else if (readable.push(yield value)) { next(); } else { reading = false; @@ -91671,12 +94991,11 @@ function from(Readable, iterable, opts) { }); return _next2.apply(this, arguments); } - return readable; } - module.exports = from; + /***/ }), /***/ 6989: @@ -91687,8 +95006,8 @@ module.exports = from; // permission from the author, Mathias Buus (@mafintosh). -var eos; +var eos; function once(callback) { var called = false; return function () { @@ -91697,20 +95016,16 @@ function once(callback) { callback.apply(void 0, arguments); }; } - var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, - ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; - + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; function noop(err) { // Rethrow the error if it exists to avoid swallowing it if (err) throw err; } - function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } - function destroyer(stream, reading, writing, callback) { callback = once(callback); var closed = false; @@ -91730,40 +95045,34 @@ function destroyer(stream, reading, writing, callback) { return function (err) { if (closed) return; if (destroyed) return; - destroyed = true; // request.destroy just do .end - .abort is what we want + destroyed = true; + // request.destroy just do .end - .abort is what we want if (isRequest(stream)) return stream.abort(); if (typeof stream.destroy === 'function') return stream.destroy(); callback(err || new ERR_STREAM_DESTROYED('pipe')); }; } - function call(fn) { fn(); } - function pipe(from, to) { return from.pipe(to); } - function popCallback(streams) { if (!streams.length) return noop; if (typeof streams[streams.length - 1] !== 'function') return noop; return streams.pop(); } - function pipeline() { for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { streams[_key] = arguments[_key]; } - var callback = popCallback(streams); if (Array.isArray(streams[0])) streams = streams[0]; - if (streams.length < 2) { throw new ERR_MISSING_ARGS('streams'); } - var error; var destroys = streams.map(function (stream, i) { var reading = i < streams.length - 1; @@ -91778,7 +95087,6 @@ function pipeline() { }); return streams.reduce(pipe); } - module.exports = pipeline; /***/ }), @@ -91790,27 +95098,22 @@ module.exports = pipeline; var ERR_INVALID_OPT_VALUE = (__nccwpck_require__(7214)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE); - function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; } - function getHighWaterMark(state, options, duplexKey, isDuplex) { var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); - if (hwm != null) { if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { var name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } - return Math.floor(hwm); - } // Default value - + } + // Default value return state.objectMode ? 16 : 16 * 1024; } - module.exports = { getHighWaterMark: getHighWaterMark }; @@ -104092,6 +107395,7 @@ function restoreCache() { const paths = (0, utils_1.getInputAsArray)("path"); const restoreKeys = (0, utils_1.getInputAsArray)("restore-keys"); const local = core.getInput("local"); + const errorOnS3Exception = (0, utils_1.getInputAsBoolean)("error-on-s3-exception"); try { const compressionMethod = yield utils.getCompressionMethod(); const cacheFileName = utils.getCacheFileName(compressionMethod); @@ -104102,14 +107406,14 @@ function restoreCache() { core.saveState(state_1.State.SecretKey, core.getInput("secretKey")); core.saveState(state_1.State.SessionToken, core.getInput("sessionToken")); if (local) { - core.info('Local cache is enabled'); + core.info("Local cache is enabled"); const localKey = path.join(local, key, cacheFileName); core.info(`Looking for exact match: ${localKey}`); if (fs.existsSync(localKey)) { - core.info('Local cache HIT! ✅'); + core.info("Local cache HIT! ✅"); yield fs.copy(localKey, archivePath); - core.info('Local cache copied!'); - core.info('Extracting cache file...'); + core.info("Local cache copied!"); + core.info("Extracting cache file..."); yield (0, tar_1.extractTar)(archivePath, compressionMethod); (0, utils_1.saveMatchedKey)(key); (0, utils_1.setCacheHitOutput)(true); @@ -104119,7 +107423,7 @@ function restoreCache() { } else { (0, utils_1.setCacheHitLocal)(false); - core.info('Local cache MISS! ❌'); + core.info("Local cache MISS! ❌"); } } const mc = (0, utils_1.newMinio)(); @@ -104139,8 +107443,13 @@ function restoreCache() { core.info("Cache restored from s3 successfully"); } catch (e) { - core.info("Restore s3 cache failed: " + e.message); (0, utils_1.setCacheHitOutput)(false); + if (errorOnS3Exception) { + core.setFailed("Restore s3 cache failed: " + e.message); + } + else { + core.info("Restore s3 cache failed: " + e.message); + } if (useFallback) { if ((0, utils_1.isGhes)()) { core.warning("Cache fallback is not supported on Github Enterpise."); @@ -104184,7 +107493,7 @@ var State; State["SecretKey"] = "secret-key"; State["SessionToken"] = "session-token"; State["LocalHit"] = "local-hit"; -})(State || (exports.State = State = {})); +})(State = exports.State || (exports.State = {})); /***/ }), @@ -104540,6 +107849,14 @@ module.exports = require("zlib"); /***/ 3765: /***/ ((module) => { +"use strict"; +module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana"},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana"},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana"},"image/avcs":{"source":"iana"},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}'); + +/***/ }), + +/***/ 2639: +/***/ ((module) => { + "use strict"; module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hl7cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/step":{"source":"iana"},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}'); diff --git a/dist/save/index.js b/dist/save/index.js index e9fa1b6..a91d65f 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -50646,75 +50646,3328 @@ function range(a, b, str) { /***/ 7124: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { Transform } = __nccwpck_require__(1642) +const { Transform } = __nccwpck_require__(2672) + +class Block extends Transform { + constructor (size, opts = {}) { + super(opts) + + if (typeof size === 'object') { + opts = size + size = opts.size + } + + this.size = size || 512 + + const { nopad, zeroPadding = true } = opts + + if (nopad) this._zeroPadding = false + else this._zeroPadding = !!zeroPadding + + this._buffered = [] + this._bufferedBytes = 0 + } + + _transform (buf, enc, next) { + this._bufferedBytes += buf.length + this._buffered.push(buf) + + while (this._bufferedBytes >= this.size) { + this._bufferedBytes -= this.size + + // Assemble the buffers that will compose the final block + const blockBufs = [] + let blockBufsBytes = 0 + while (blockBufsBytes < this.size) { + const b = this._buffered.shift() + + if (blockBufsBytes + b.length <= this.size) { + blockBufs.push(b) + blockBufsBytes += b.length + } else { + // If the last buffer is larger than needed for the block, just + // use the needed part + const neededSize = this.size - blockBufsBytes + blockBufs.push(b.slice(0, neededSize)) + blockBufsBytes += neededSize + this._buffered.unshift(b.slice(neededSize)) + } + } + + // Then concat just those buffers, leaving the rest untouched in _buffered + this.push(Buffer.concat(blockBufs, this.size)) + } + next() + } + + _flush () { + if (this._bufferedBytes && this._zeroPadding) { + const zeroes = Buffer.alloc(this.size - this._bufferedBytes) + this._buffered.push(zeroes) + this.push(Buffer.concat(this._buffered)) + this._buffered = null + } else if (this._bufferedBytes) { + this.push(Buffer.concat(this._buffered)) + this._buffered = null + } + this.push(null) + } +} + +module.exports = Block + + +/***/ }), + +/***/ 8891: +/***/ ((module) => { + +"use strict"; + + +const codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error + } + + function getMessage (arg1, arg2, arg3) { + if (typeof message === 'string') { + return message + } else { + return message(arg1, arg2, arg3) + } + } + + class NodeError extends Base { + constructor (arg1, arg2, arg3) { + super(getMessage(arg1, arg2, arg3)); + } + } + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + + codes[code] = NodeError; +} + +// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + const len = expected.length; + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"' +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + let determiner; + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + let msg; + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; + } else { + const type = includes(name, '.') ? 'property' : 'argument'; + msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; + } + + msg += `. Received type ${typeof actual}`; + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented' +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); + +module.exports.q = codes; + + +/***/ }), + +/***/ 1153: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = __nccwpck_require__(184); + +var Writable = __nccwpck_require__(4423); + +__nccwpck_require__(4124)(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + 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); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +/***/ }), + +/***/ 4896: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + + +module.exports = PassThrough; + +var Transform = __nccwpck_require__(8971); + +__nccwpck_require__(4124)(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); +}; + +/***/ }), + +/***/ 184: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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. + + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = (__nccwpck_require__(2361).EventEmitter); + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = __nccwpck_require__(8933); +/**/ + + +var Buffer = (__nccwpck_require__(4300).Buffer); + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = __nccwpck_require__(3837); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = __nccwpck_require__(6305); + +var destroyImpl = __nccwpck_require__(6138); + +var _require = __nccwpck_require__(1802), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +__nccwpck_require__(4124)(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +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 (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || __nccwpck_require__(1153); + options = options || {}; // 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 Duplex; // 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.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // 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 = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // 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.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = 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.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || __nccwpck_require__(1153); + 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 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function 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; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(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) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + 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) { + state.awaitDrain = 0; + 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); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } 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 (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = 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. + + + var 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, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', 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 + + this._read(state.highWaterMark); + + 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); + } + + var 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; + state.awaitDrain = 0; + } + + 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) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var 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; + + if (!state.emittedReadable) { + state.emittedReadable = true; + 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) { + var 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) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (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.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 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)) { + var 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) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var 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(); + } // 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. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // 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 ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.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 (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, 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 (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + 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) { + var res = Stream.prototype.on.call(this, ev, fn); + var 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) { + var 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.removeAllListeners = function (ev) { + var 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) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // 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(); + } +} + +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 () { + var 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.paused = 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.paused = true; + return this; +}; + +function flow(stream) { + var 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) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = __nccwpck_require__(3276); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // 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; + var 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) { + var 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.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = __nccwpck_require__(2173); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} + +/***/ }), + +/***/ 8971: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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 transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + + +module.exports = Transform; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = __nccwpck_require__(1153); + +__nccwpck_require__(4124)(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // 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; + + 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. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} + +/***/ }), + +/***/ 4423: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// 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. + + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: __nccwpck_require__(7127) +}; +/**/ + +/**/ + +var Stream = __nccwpck_require__(8933); +/**/ + + +var Buffer = (__nccwpck_require__(4300).Buffer); + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = __nccwpck_require__(6138); + +var _require = __nccwpck_require__(1802), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +__nccwpck_require__(4124)(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || __nccwpck_require__(1153); + options = options || {}; // 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 Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // 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. + + var noDecode = 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.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 = function (er) { + onwrite(stream, er); + }; // 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; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // 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.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || __nccwpck_require__(1153); // 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 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + 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; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // 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, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var 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) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +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, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + 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 + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; + +/***/ }), + +/***/ 3276: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = __nccwpck_require__(5927); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; + +/***/ }), + +/***/ 6305: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = __nccwpck_require__(4300), + Buffer = _require.Buffer; + +var _require2 = __nccwpck_require__(3837), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); + +/***/ }), + +/***/ 6138: +/***/ ((module) => { + +"use strict"; + // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + 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 + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // 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. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; -class Block extends Transform { - constructor (size, opts = {}) { - super(opts) +/***/ }), - if (typeof size === 'object') { - opts = size - size = opts.size +/***/ 5927: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). + + +var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(8891)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - this.size = size || 512 + callback.apply(this, args); + }; +} - const { nopad, zeroPadding = true } = opts +function noop() {} - if (nopad) this._zeroPadding = false - else this._zeroPadding = !!zeroPadding +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} - this._buffered = [] - this._bufferedBytes = 0 +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); } - _transform (buf, enc, next) { - this._bufferedBytes += buf.length - this._buffered.push(buf) + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + 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); + }; +} - while (this._bufferedBytes >= this.size) { - this._bufferedBytes -= this.size +module.exports = eos; - // Assemble the buffers that will compose the final block - const blockBufs = [] - let blockBufsBytes = 0 - while (blockBufsBytes < this.size) { - const b = this._buffered.shift() +/***/ }), - if (blockBufsBytes + b.length <= this.size) { - blockBufs.push(b) - blockBufsBytes += b.length +/***/ 2173: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ERR_INVALID_ARG_TYPE = (__nccwpck_require__(8891)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE); + +function from(Readable, iterable, opts) { + var iterator; + + if (iterable && typeof iterable.next === 'function') { + iterator = iterable; + } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); + + var readable = new Readable(_objectSpread({ + objectMode: true + }, opts)); // Reading boolean to protect against _read + // being called before last iteration completion. + + var reading = false; + + readable._read = function () { + if (!reading) { + reading = true; + next(); + } + }; + + function next() { + return _next2.apply(this, arguments); + } + + function _next2() { + _next2 = _asyncToGenerator(function* () { + try { + var _ref = yield iterator.next(), + value = _ref.value, + done = _ref.done; + + if (done) { + readable.push(null); + } else if (readable.push((yield value))) { + next(); } else { - // If the last buffer is larger than needed for the block, just - // use the needed part - const neededSize = this.size - blockBufsBytes - blockBufs.push(b.slice(0, neededSize)) - blockBufsBytes += neededSize - this._buffered.unshift(b.slice(neededSize)) + reading = false; } + } catch (err) { + readable.destroy(err); } + }); + return _next2.apply(this, arguments); + } - // Then concat just those buffers, leaving the rest untouched in _buffered - this.push(Buffer.concat(blockBufs, this.size)) - } - next() + return readable; +} + +module.exports = from; + +/***/ }), + +/***/ 2468: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). + + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = (__nccwpck_require__(8891)/* .codes */ .q), + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = __nccwpck_require__(5927); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; } - _flush () { - if (this._bufferedBytes && this._zeroPadding) { - const zeroes = Buffer.alloc(this.size - this._bufferedBytes) - this._buffered.push(zeroes) - this.push(Buffer.concat(this._buffered)) - this._buffered = null - } else if (this._bufferedBytes) { - this.push(Buffer.concat(this._buffered)) - this._buffered = null - } - this.push(null) + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); } -module.exports = Block +module.exports = pipeline; + +/***/ }), + +/***/ 1802: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var ERR_INVALID_OPT_VALUE = (__nccwpck_require__(8891)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE); + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; + +/***/ }), + +/***/ 8933: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(2781); + + +/***/ }), + +/***/ 2672: +/***/ ((module, exports, __nccwpck_require__) => { + +var Stream = __nccwpck_require__(2781); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream.Readable; + Object.assign(module.exports, Stream); + module.exports.Stream = Stream; +} else { + exports = module.exports = __nccwpck_require__(184); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = __nccwpck_require__(4423); + exports.Duplex = __nccwpck_require__(1153); + exports.Transform = __nccwpck_require__(8971); + exports.PassThrough = __nccwpck_require__(4896); + exports.finished = __nccwpck_require__(5927); + exports.pipeline = __nccwpck_require__(2468); +} /***/ }), @@ -50925,40 +54178,6 @@ function expand(str, isTop) { -/***/ }), - -/***/ 9107: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - -var isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; - -var isWebWorker = (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self.constructor && self.constructor.name === "DedicatedWorkerGlobalScope"; - -/** - * @see https://github.com/jsdom/jsdom/releases/tag/12.0.0 - * @see https://github.com/jsdom/jsdom/issues/1537 - */ -var isJsDom = typeof window !== "undefined" && window.name === "nodejs" || typeof navigator !== "undefined" && (navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom")); - -var isDeno = typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - -exports.isBrowser = isBrowser; -exports.isWebWorker = isWebWorker; -exports.isNode = isNode; -exports.isJsDom = isJsDom; -exports.isDeno = isDeno; - /***/ }), /***/ 4024: @@ -52144,21 +55363,11 @@ Builder.prototype.j2x = function(jObj, level) { let attrStr = ''; let val = ''; for (let key in jObj) { - if(!Object.prototype.hasOwnProperty.call(jObj, key)) continue; if (typeof jObj[key] === 'undefined') { - // supress undefined node only if it is not an attribute - if (this.isAttribute(key)) { - val += ''; - } + // supress undefined node } else if (jObj[key] === null) { - // null attribute should be ignored by the attribute list, but should not cause the tag closing - if (this.isAttribute(key)) { - val += ''; - } else if (key[0] === '?') { - val += this.indentate(level) + '<' + key + '?' + this.tagEndChar; - } else { - val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; - } + if(key[0] === "?") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar; + else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar; } else if (jObj[key] instanceof Date) { val += this.buildTextValNode(jObj[key], key, '', level); @@ -52251,8 +55460,7 @@ Builder.prototype.buildObjectNode = function(val, key, attrStr, level) { tagEndExp = ""; } - // attrStr is an empty string in case the attribute came as undefined or null - if ((attrStr || attrStr === '') && val.indexOf('<') === -1) { + if (attrStr && val.indexOf('<') === -1) { return ( this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp ); } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) { return this.indentate(level) + `` + this.newLine; @@ -52325,7 +55533,7 @@ function indentate(level) { } function isAttribute(name /*, options*/) { - if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) { + if (name.startsWith(this.options.attributeNamePrefix)) { return name.substr(this.attrPrefixLen); } else { return false; @@ -52363,8 +55571,6 @@ function arrToStr(arr, options, jPath, indentation) { for (let i = 0; i < arr.length; i++) { const tagObj = arr[i]; const tagName = propName(tagObj); - if(tagName === undefined) continue; - let newJPath = ""; if (jPath.length === 0) newJPath = tagName else newJPath = `${jPath}.${tagName}`; @@ -52434,7 +55640,6 @@ function propName(obj) { const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if(!obj.hasOwnProperty(key)) continue; if (key !== ":@") return key; } } @@ -52443,7 +55648,6 @@ function attr_to_str(attrMap, options) { let attrStr = ""; if (attrMap && !options.ignoreAttributes) { for (let attr in attrMap) { - if(!attrMap.hasOwnProperty(attr)) continue; let attrVal = options.attributeValueProcessor(attr, attrMap[attr]); attrVal = replaceEntitiesValue(attrVal, options); if (attrVal === true && options.suppressBooleanAttributes) { @@ -52480,9 +55684,7 @@ module.exports = toXml; /***/ }), /***/ 6072: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const util = __nccwpck_require__(8280); +/***/ ((module) => { //TODO: handle comments function readDocType(xmlData, i){ @@ -52505,7 +55707,7 @@ function readDocType(xmlData, i){ i += 7; [entityName, val,i] = readEntityExp(xmlData,i+1); if(val.indexOf("&") === -1) //Parameter entities are not supported - entities[ validateEntityName(entityName) ] = { + entities[ entityName ] = { regx : RegExp( `&${entityName};`,"g"), val: val }; @@ -52626,16 +55828,8 @@ function isNotation(xmlData, i){ return false } -function validateEntityName(name){ - if (util.isName(name)) - return name; - else - throw new Error(`Invalid entity name ${name}`); -} - module.exports = readDocType; - /***/ }), /***/ 2821: @@ -52704,9 +55898,9 @@ const xmlNode = __nccwpck_require__(7462); const readDocType = __nccwpck_require__(6072); const toNumber = __nccwpck_require__(4526); -// const regx = -// '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)' -// .replace(/NAME/g, util.nameRegexp); +const regx = + '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)' + .replace(/NAME/g, util.nameRegexp); //const tagsRegx = new RegExp("<(\\/?[\\w:\\-\._]+)([^>]*)>(\\s*"+cdataRegx+")*([^<]+)?","g"); //const tagsRegx = new RegExp("<(\\/?)((\\w*:)?([\\w:\\-\._]+))([^>]*)>([^<]*)("+cdataRegx+"([^<]*))*([^<]+)?","g"); @@ -52963,13 +56157,14 @@ const parseXml = function(xmlData) { textData = this.saveTextToParentTag(textData, currentNode, jPath); - let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true); - if(val == undefined) val = ""; - //cdata should be set even if it is 0 length string if(this.options.cdataPropName){ + // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + "." + this.options.cdataPropName, true, false, true); + // if(!val) val = ""; currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]); }else{ + let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true); + if(val == undefined) val = ""; currentNode.add(this.options.textNodeName, val); } @@ -52977,7 +56172,6 @@ const parseXml = function(xmlData) { }else {//Opening tag let result = readTagExp(xmlData,i, this.options.removeNSPrefix); let tagName= result.tagName; - const rawTagName = result.rawTagName; let tagExp = result.tagExp; let attrExpPresent = result.attrExpPresent; let closeIndex = result.closeIndex; @@ -53003,7 +56197,7 @@ const parseXml = function(xmlData) { if(tagName !== xmlObj.tagname){ jPath += jPath ? "." + tagName : tagName; } - if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { + if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace let tagContent = ""; //self-closing tag if(tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1){ @@ -53016,8 +56210,8 @@ const parseXml = function(xmlData) { //normal tag else{ //read until closing tag is found - const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1); - if(!result) throw new Error(`Unexpected end of ${rawTagName}`); + const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1); + if(!result) throw new Error(`Unexpected end of ${tagName}`); i = result.i; tagContent = result.tagContent; } @@ -53039,7 +56233,6 @@ const parseXml = function(xmlData) { if(tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1){ if(tagName[tagName.length - 1] === "/"){ //remove trailing '/' tagName = tagName.substr(0, tagName.length - 1); - jPath = jPath.substr(0, jPath.length - 1); tagExp = tagName; }else{ tagExp = tagExp.substr(0, tagExp.length - 1); @@ -53198,11 +56391,10 @@ function readTagExp(xmlData,i, removeNSPrefix, closingChar = ">"){ let tagName = tagExp; let attrExpPresent = true; if(separatorIndex !== -1){//separate tag name and attributes expression - tagName = tagExp.substring(0, separatorIndex); - tagExp = tagExp.substring(separatorIndex + 1).trimStart(); + tagName = tagExp.substr(0, separatorIndex).replace(/\s\s*$/, ''); + tagExp = tagExp.substr(separatorIndex + 1); } - const rawTagName = tagName; if(removeNSPrefix){ const colonIndex = tagName.indexOf(":"); if(colonIndex !== -1){ @@ -53216,7 +56408,6 @@ function readTagExp(xmlData,i, removeNSPrefix, closingChar = ">"){ tagExp: tagExp, closeIndex: closeIndex, attrExpPresent: attrExpPresent, - rawTagName: rawTagName, } } /** @@ -75069,7 +78260,6 @@ module.exports = { stringify, stripBom } /*! * mime-db * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -76435,35 +79625,230 @@ class InvalidDateError extends ExtendableError {} exports.InvalidDateError = InvalidDateError; class InvalidPrefixError extends ExtendableError {} -/** - * InvalidBucketPolicyError generated when the given bucket policy is invalid. - */ -exports.InvalidPrefixError = InvalidPrefixError; -class InvalidBucketPolicyError extends ExtendableError {} +/** + * InvalidBucketPolicyError generated when the given bucket policy is invalid. + */ +exports.InvalidPrefixError = InvalidPrefixError; +class InvalidBucketPolicyError extends ExtendableError {} + +/** + * IncorrectSizeError generated when total data read mismatches with + * the input size. + */ +exports.InvalidBucketPolicyError = InvalidBucketPolicyError; +class IncorrectSizeError extends ExtendableError {} + +/** + * InvalidXMLError generated when an unknown XML is found. + */ +exports.IncorrectSizeError = IncorrectSizeError; +class InvalidXMLError extends ExtendableError {} + +/** + * S3Error is generated for errors returned from S3 server. + * see getErrorTransformer for details + */ +exports.InvalidXMLError = InvalidXMLError; +class S3Error extends ExtendableError {} +exports.S3Error = S3Error; +class IsValidBucketNameError extends ExtendableError {} +exports.IsValidBucketNameError = IsValidBucketNameError; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHRlbmRhYmxlRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsIm9wdCIsIm5hbWUiLCJBbm9ueW1vdXNSZXF1ZXN0RXJyb3IiLCJleHBvcnRzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJJbnZhbGlkUG9ydEVycm9yIiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiSW52YWxpZE9iamVjdE5hbWVFcnJvciIsIkFjY2Vzc0tleVJlcXVpcmVkRXJyb3IiLCJTZWNyZXRLZXlSZXF1aXJlZEVycm9yIiwiRXhwaXJlc1BhcmFtRXJyb3IiLCJJbnZhbGlkRGF0ZUVycm9yIiwiSW52YWxpZFByZWZpeEVycm9yIiwiSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIiwiSW5jb3JyZWN0U2l6ZUVycm9yIiwiSW52YWxpZFhNTEVycm9yIiwiUzNFcnJvciIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiXSwic291cmNlcyI6WyJlcnJvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiRVMyMDIyLkVycm9yXCIgLz5cblxuY2xhc3MgRXh0ZW5kYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHQ/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAvLyBlcnJvciBPcHRpb24ge2NhdXNlPzogdW5rbm93bn0gaXMgYSAnbmljZSB0byBoYXZlJyxcbiAgICAvLyBkb24ndCB1c2UgaXQgaW50ZXJuYWxseVxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdClcbiAgICAvLyBzZXQgZXJyb3IgbmFtZSwgb3RoZXJ3aXNlIGl0J3MgYWx3YXlzICdFcnJvcidcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxufVxuXG4vKipcbiAqIEFub255bW91c1JlcXVlc3RFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFub255bW91cyBrZXlzIG9uIHNwZWNpZmljXG4gKiBBUElzLiBOT1RFOiBQcmVzaWduZWRVUkwgZ2VuZXJhdGlvbiBhbHdheXMgcmVxdWlyZXMgYWNjZXNzIGtleXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFsbCBpbnZhbGlkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFBvcnRFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhIG5vbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkXG4gKiBmb3IgcG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUG9ydEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZEVuZHBvaW50RXJyb3IgaXMgZ2VuZXJhdGVkIHdoZW4gYW4gaW52YWxpZCBlbmQgcG9pbnQgdmFsdWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBkb21haW4gc3RhbmRhcmRzLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEVuZHBvaW50RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludmFsaWQgYnVja2V0IG5hbWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBBV1MgUzMgc3BlY2lmaWNhdGlvbnMuXG4gKiBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L0J1Y2tldFJlc3RyaWN0aW9ucy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZE9iamVjdE5hbWVFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhbiBpbnZhbGlkIG9iamVjdCBuYW1lIGlzXG4gKiBwcm92aWRlZCB3aGljaCBkb2VzIG5vdCBmb2xsb3cgQVdTIFMzIHNwZWNpZmljYXRpb25zLlxuICogaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ01ldGFkYXRhLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRPYmplY3ROYW1lRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3NLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIGFjY2Vzc1xuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY2Vzc0tleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBTZWNyZXRLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIHNlY3JldFxuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBFeHBpcmVzUGFyYW1FcnJvciBnZW5lcmF0ZWQgd2hlbiBleHBpcmVzIHBhcmFtZXRlciB2YWx1ZSBpcyBub3RcbiAqIHdlbGwgd2l0aGluIHN0aXB1bGF0ZWQgbGltaXRzLlxuICovXG5leHBvcnQgY2xhc3MgRXhwaXJlc1BhcmFtRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkRGF0ZUVycm9yIGdlbmVyYXRlZCB3aGVuIGludmFsaWQgZGF0ZSBpcyBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkUHJlZml4RXJyb3IgZ2VuZXJhdGVkIHdoZW4gb2JqZWN0IHByZWZpeCBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKiBvciBkb2VzIG5vdCBjb25mb3JtIHRvIEFXUyBTMyBvYmplY3Qga2V5IHJlc3RyaWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRQcmVmaXhFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuXG4vKipcbiAqIEludmFsaWRCdWNrZXRQb2xpY3lFcnJvciBnZW5lcmF0ZWQgd2hlbiB0aGUgZ2l2ZW4gYnVja2V0IHBvbGljeSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW5jb3JyZWN0U2l6ZUVycm9yIGdlbmVyYXRlZCB3aGVuIHRvdGFsIGRhdGEgcmVhZCBtaXNtYXRjaGVzIHdpdGhcbiAqIHRoZSBpbnB1dCBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgSW5jb3JyZWN0U2l6ZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFhNTEVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIHVua25vd24gWE1MIGlzIGZvdW5kLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFhNTEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogUzNFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGVycm9ycyByZXR1cm5lZCBmcm9tIFMzIHNlcnZlci5cbiAqIHNlZSBnZXRFcnJvclRyYW5zZm9ybWVyIGZvciBkZXRhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0Vycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBJc1ZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE1BQU1BLGVBQWUsU0FBU0MsS0FBSyxDQUFDO0VBQ2xDQyxXQUFXQSxDQUFDQyxPQUFnQixFQUFFQyxHQUFrQixFQUFFO0lBQ2hEO0lBQ0E7SUFDQSxLQUFLLENB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 + +/***/ }), + +/***/ 2895: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var Stream = _interopRequireWildcard(__nccwpck_require__(2781), true); +var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); +var _helper = __nccwpck_require__(9921); +var transformers = _interopRequireWildcard(__nccwpck_require__(9237), true); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +/* + * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class extensions { + constructor(client) { + this.client = client; + } + + // List the objects in the bucket using S3 ListObjects V2 With Metadata + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `prefix` _string_: the prefix of the objects that should be listed (optional, default `''`) + // * `recursive` _bool_: `true` indicates recursive style listing and `false` indicates directory style listing delimited by '/'. (optional, default `false`) + // * `startAfter` _string_: Specifies the key to start after when listing objects in a bucket. (optional, default `''`) + // + // __Return Value__ + // * `stream` _Stream_: stream emitting the objects in the bucket, the object is of the format: + // * `obj.name` _string_: name of the object + // * `obj.prefix` _string_: name of the object prefix + // * `obj.size` _number_: size of the object + // * `obj.etag` _string_: etag of the object + // * `obj.lastModified` _Date_: modified time stamp + // * `obj.metadata` _object_: metadata of the object + + listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter) { + if (prefix === undefined) { + prefix = ''; + } + if (recursive === undefined) { + recursive = false; + } + if (startAfter === undefined) { + startAfter = ''; + } + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidPrefix)(prefix)) { + throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`); + } + if (!(0, _helper.isString)(prefix)) { + throw new TypeError('prefix should be of type "string"'); + } + if (!(0, _helper.isBoolean)(recursive)) { + throw new TypeError('recursive should be of type "boolean"'); + } + if (!(0, _helper.isString)(startAfter)) { + throw new TypeError('startAfter should be of type "string"'); + } + // if recursive is false set delimiter to '/' + var delimiter = recursive ? '' : '/'; + var continuationToken = ''; + var objects = []; + var ended = false; + var readStream = Stream.Readable({ + objectMode: true + }); + readStream._read = () => { + // push one object per _read() + if (objects.length) { + readStream.push(objects.shift()); + return; + } + if (ended) { + return readStream.push(null); + } + // if there are no objects to push do query for the next batch of objects + this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, 1000, startAfter).on('error', e => readStream.emit('error', e)).on('data', result => { + if (result.isTruncated) { + continuationToken = result.nextContinuationToken; + } else { + ended = true; + } + objects = result.objects; + readStream._read(); + }); + }; + return readStream; + } + + // listObjectsV2WithMetadataQuery - (List Objects V2 with metadata) - List some or all (up to 1000) of the objects in a bucket. + // + // You can use the request parameters as selection criteria to return a subset of the objects in a bucket. + // request parameters :- + // * `bucketName` _string_: name of the bucket + // * `prefix` _string_: Limits the response to keys that begin with the specified prefix. + // * `continuation-token` _string_: Used to continue iterating over a set of objects. + // * `delimiter` _string_: A delimiter is a character you use to group keys. + // * `max-keys` _number_: Sets the maximum number of keys returned in the response body. + // * `start-after` _string_: Specifies the key to start after when listing objects in a bucket. -/** - * IncorrectSizeError generated when total data read mismatches with - * the input size. - */ -exports.InvalidBucketPolicyError = InvalidBucketPolicyError; -class IncorrectSizeError extends ExtendableError {} + listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, maxKeys, startAfter) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isString)(prefix)) { + throw new TypeError('prefix should be of type "string"'); + } + if (!(0, _helper.isString)(continuationToken)) { + throw new TypeError('continuationToken should be of type "string"'); + } + if (!(0, _helper.isString)(delimiter)) { + throw new TypeError('delimiter should be of type "string"'); + } + if (!(0, _helper.isNumber)(maxKeys)) { + throw new TypeError('maxKeys should be of type "number"'); + } + if (!(0, _helper.isString)(startAfter)) { + throw new TypeError('startAfter should be of type "string"'); + } + var queries = []; -/** - * InvalidXMLError generated when an unknown XML is found. - */ -exports.IncorrectSizeError = IncorrectSizeError; -class InvalidXMLError extends ExtendableError {} + // Call for listing objects v2 API + queries.push(`list-type=2`); + queries.push(`encoding-type=url`); + // escape every value in query string, except maxKeys + queries.push(`prefix=${(0, _helper.uriEscape)(prefix)}`); + queries.push(`delimiter=${(0, _helper.uriEscape)(delimiter)}`); + queries.push(`metadata=true`); + if (continuationToken) { + continuationToken = (0, _helper.uriEscape)(continuationToken); + queries.push(`continuation-token=${continuationToken}`); + } + // Set start-after + if (startAfter) { + startAfter = (0, _helper.uriEscape)(startAfter); + queries.push(`start-after=${startAfter}`); + } + // no need to escape maxKeys + if (maxKeys) { + if (maxKeys >= 1000) { + maxKeys = 1000; + } + queries.push(`max-keys=${maxKeys}`); + } + queries.sort(); + var query = ''; + if (queries.length > 0) { + query = `${queries.join('&')}`; + } + var method = 'GET'; + var transformer = transformers.getListObjectsV2WithMetadataTransformer(); + this.client.makeRequest({ + method, + bucketName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return transformer.emit('error', e); + } + (0, _helper.pipesetup)(response, transformer); + }); + return transformer; + } +} -/** - * S3Error is generated for errors returned from S3 server. - * see getErrorTransformer for details - */ -exports.InvalidXMLError = InvalidXMLError; -class S3Error extends ExtendableError {} -exports.S3Error = S3Error; -class IsValidBucketNameError extends ExtendableError {} -exports.IsValidBucketNameError = IsValidBucketNameError; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHRlbmRhYmxlRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsIm9wdCIsIm5hbWUiLCJBbm9ueW1vdXNSZXF1ZXN0RXJyb3IiLCJleHBvcnRzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJJbnZhbGlkUG9ydEVycm9yIiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiSW52YWxpZE9iamVjdE5hbWVFcnJvciIsIkFjY2Vzc0tleVJlcXVpcmVkRXJyb3IiLCJTZWNyZXRLZXlSZXF1aXJlZEVycm9yIiwiRXhwaXJlc1BhcmFtRXJyb3IiLCJJbnZhbGlkRGF0ZUVycm9yIiwiSW52YWxpZFByZWZpeEVycm9yIiwiSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIiwiSW5jb3JyZWN0U2l6ZUVycm9yIiwiSW52YWxpZFhNTEVycm9yIiwiUzNFcnJvciIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiXSwic291cmNlcyI6WyJlcnJvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiRVMyMDIyLkVycm9yXCIgLz5cblxuY2xhc3MgRXh0ZW5kYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHQ/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAvLyBlcnJvciBPcHRpb24ge2NhdXNlPzogdW5rbm93bn0gaXMgYSAnbmljZSB0byBoYXZlJyxcbiAgICAvLyBkb24ndCB1c2UgaXQgaW50ZXJuYWxseVxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdClcbiAgICAvLyBzZXQgZXJyb3IgbmFtZSwgb3RoZXJ3aXNlIGl0J3MgYWx3YXlzICdFcnJvcidcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxufVxuXG4vKipcbiAqIEFub255bW91c1JlcXVlc3RFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFub255bW91cyBrZXlzIG9uIHNwZWNpZmljXG4gKiBBUElzLiBOT1RFOiBQcmVzaWduZWRVUkwgZ2VuZXJhdGlvbiBhbHdheXMgcmVxdWlyZXMgYWNjZXNzIGtleXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGFsbCBpbnZhbGlkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFBvcnRFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhIG5vbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkXG4gKiBmb3IgcG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUG9ydEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZEVuZHBvaW50RXJyb3IgaXMgZ2VuZXJhdGVkIHdoZW4gYW4gaW52YWxpZCBlbmQgcG9pbnQgdmFsdWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBkb21haW4gc3RhbmRhcmRzLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEVuZHBvaW50RXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludmFsaWQgYnVja2V0IG5hbWUgaXNcbiAqIHByb3ZpZGVkIHdoaWNoIGRvZXMgbm90IGZvbGxvdyBBV1MgUzMgc3BlY2lmaWNhdGlvbnMuXG4gKiBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L0J1Y2tldFJlc3RyaWN0aW9ucy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQnVja2V0TmFtZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZE9iamVjdE5hbWVFcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiBhbiBpbnZhbGlkIG9iamVjdCBuYW1lIGlzXG4gKiBwcm92aWRlZCB3aGljaCBkb2VzIG5vdCBmb2xsb3cgQVdTIFMzIHNwZWNpZmljYXRpb25zLlxuICogaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ01ldGFkYXRhLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRPYmplY3ROYW1lRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3NLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIGFjY2Vzc1xuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY2Vzc0tleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBTZWNyZXRLZXlSZXF1aXJlZEVycm9yIGdlbmVyYXRlZCBieSBzaWduYXR1cmUgbWV0aG9kcyB3aGVuIHNlY3JldFxuICoga2V5IGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBFeHBpcmVzUGFyYW1FcnJvciBnZW5lcmF0ZWQgd2hlbiBleHBpcmVzIHBhcmFtZXRlciB2YWx1ZSBpcyBub3RcbiAqIHdlbGwgd2l0aGluIHN0aXB1bGF0ZWQgbGltaXRzLlxuICovXG5leHBvcnQgY2xhc3MgRXhwaXJlc1BhcmFtRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkRGF0ZUVycm9yIGdlbmVyYXRlZCB3aGVuIGludmFsaWQgZGF0ZSBpcyBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlRXJyb3IgZXh0ZW5kcyBFeHRlbmRhYmxlRXJyb3Ige31cblxuLyoqXG4gKiBJbnZhbGlkUHJlZml4RXJyb3IgZ2VuZXJhdGVkIHdoZW4gb2JqZWN0IHByZWZpeCBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKiBvciBkb2VzIG5vdCBjb25mb3JtIHRvIEFXUyBTMyBvYmplY3Qga2V5IHJlc3RyaWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRQcmVmaXhFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuXG4vKipcbiAqIEludmFsaWRCdWNrZXRQb2xpY3lFcnJvciBnZW5lcmF0ZWQgd2hlbiB0aGUgZ2l2ZW4gYnVja2V0IHBvbGljeSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW5jb3JyZWN0U2l6ZUVycm9yIGdlbmVyYXRlZCB3aGVuIHRvdGFsIGRhdGEgcmVhZCBtaXNtYXRjaGVzIHdpdGhcbiAqIHRoZSBpbnB1dCBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgSW5jb3JyZWN0U2l6ZUVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogSW52YWxpZFhNTEVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIHVua25vd24gWE1MIGlzIGZvdW5kLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFhNTEVycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHt9XG5cbi8qKlxuICogUzNFcnJvciBpcyBnZW5lcmF0ZWQgZm9yIGVycm9ycyByZXR1cm5lZCBmcm9tIFMzIHNlcnZlci5cbiAqIHNlZSBnZXRFcnJvclRyYW5zZm9ybWVyIGZvciBkZXRhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBTM0Vycm9yIGV4dGVuZHMgRXh0ZW5kYWJsZUVycm9yIHtcbiAgY29kZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSXNWYWxpZEJ1Y2tldE5hbWVFcnJvciBleHRlbmRzIEV4dGVuZGFibGVFcnJvciB7fVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxNQUFNQSxlQUFlLFNBQVNDLEtBQUssQ0FBQztFQUNsQ0MsV0FBV0EsQ0FBQ0MsT0FBZ0IsRUFBRUMsR0FBa0IsRUFBRTtJQUNo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 +// deprecated default export, please use named exports. +// keep for backward compatibility. +// eslint-disable-next-line import/no-default-export +exports.extensions = extensions; +var _default = extensions; +exports["default"] = _default; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdHJlYW0iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaGVscGVyIiwidHJhbnNmb3JtZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsImV4dGVuc2lvbnMiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJidWNrZXROYW1lIiwicHJlZml4IiwicmVjdXJzaXZlIiwic3RhcnRBZnRlciIsInVuZGVmaW5lZCIsImlzVmFsaWRCdWNrZXROYW1lIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsImlzVmFsaWRQcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJpc1N0cmluZyIsIlR5cGVFcnJvciIsImlzQm9vbGVhbiIsImRlbGltaXRlciIsImNvbnRpbnVhdGlvblRva2VuIiwib2JqZWN0cyIsImVuZGVkIiwicmVhZFN0cmVhbSIsIlJlYWRhYmxlIiwib2JqZWN0TW9kZSIsIl9yZWFkIiwibGVuZ3RoIiwicHVzaCIsInNoaWZ0IiwibGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVF1ZXJ5Iiwib24iLCJlIiwiZW1pdCIsInJlc3VsdCIsImlzVHJ1bmNhdGVkIiwibmV4dENvbnRpbnVhdGlvblRva2VuIiwibWF4S2V5cyIsImlzTnVtYmVyIiwicXVlcmllcyIsInVyaUVzY2FwZSIsInNvcnQiLCJxdWVyeSIsImpvaW4iLCJtZXRob2QiLCJ0cmFuc2Zvcm1lciIsImdldExpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFUcmFuc2Zvcm1lciIsIm1ha2VSZXF1ZXN0IiwicmVzcG9uc2UiLCJwaXBlc2V0dXAiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyJleHRlbnNpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDIwIE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzLnRzJ1xuaW1wb3J0IHtcbiAgaXNCb29sZWFuLFxuICBpc051bWJlcixcbiAgaXNTdHJpbmcsXG4gIGlzVmFsaWRCdWNrZXROYW1lLFxuICBpc1ZhbGlkUHJlZml4LFxuICBwaXBlc2V0dXAsXG4gIHVyaUVzY2FwZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1lcnMgZnJvbSAnLi90cmFuc2Zvcm1lcnMuanMnXG5cbmV4cG9ydCBjbGFzcyBleHRlbnNpb25zIHtcbiAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgfVxuXG4gIC8vIExpc3QgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCB1c2luZyBTMyBMaXN0T2JqZWN0cyBWMiBXaXRoIE1ldGFkYXRhXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiB0aGUgcHJlZml4IG9mIHRoZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGB0cnVlYCBpbmRpY2F0ZXMgcmVjdXJzaXZlIHN0eWxlIGxpc3RpbmcgYW5kIGBmYWxzZWAgaW5kaWNhdGVzIGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIGRlbGltaXRlZCBieSAnLycuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvLyAqIGBzdGFydEFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoucHJlZml4YCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0IHByZWZpeFxuICAvLyAgICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoubGFzdE1vZGlmaWVkYCBfRGF0ZV86IG1vZGlmaWVkIHRpbWUgc3RhbXBcbiAgLy8gICAqIGBvYmoubWV0YWRhdGFgIF9vYmplY3RfOiBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0XG5cbiAgbGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YShidWNrZXROYW1lLCBwcmVmaXgsIHJlY3Vyc2l2ZSwgc3RhcnRBZnRlcikge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhcnRBZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydEFmdGVyID0gJydcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN0YXJ0QWZ0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdGFydEFmdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIgY29udGludWF0aW9uVG9rZW4gPSAnJ1xuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIDEwMDAsIHN0YXJ0QWZ0ZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RzID0gcmVzdWx0Lm9iamVjdHNcbiAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRTdHJlYW1cbiAgfVxuXG4gIC8vIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeSAtIChMaXN0IE9iamVjdHMgVjIgd2l0aCBtZXRhZGF0YSkgLSBMaXN0IHNvbWUgb3IgYWxsICh1cCB0byAxMDAwKSBvZiB0aGUgb2JqZWN0cyBpbiBhIGJ1Y2tldC5cbiAgLy9cbiAgLy8gWW91IGNhbiB1c2UgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBhcyBzZWxlY3Rpb24gY3JpdGVyaWEgdG8gcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvLyByZXF1ZXN0IHBhcmFtZXRlcnMgOi1cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiBMaW1pdHMgdGhlIHJlc3BvbnNlIHRvIGtleXMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LlxuICAvLyAqIGBjb250aW51YXRpb24tdG9rZW5gIF9zdHJpbmdfOiBVc2VkIHRvIGNvbnRpbnVlIGl0ZXJhdGluZyBvdmVyIGEgc2V0IG9mIG9iamVjdHMuXG4gIC8vICogYGRlbGltaXRlcmAgX3N0cmluZ186IEEgZGVsaW1pdGVyIGlzIGEgY2hhcmFjdGVyIHlvdSB1c2UgdG8gZ3JvdXAga2V5cy5cbiAgLy8gKiBgbWF4LWtleXNgIF9udW1iZXJfOiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICAvLyAqIGBzdGFydC1hZnRlcmAgX3N0cmluZ186IFNwZWNpZmllcyB0aGUga2V5IHRvIHN0YXJ0IGFmdGVyIHdoZW4gbGlzdGluZyBvYmplY3RzIGluIGEgYnVja2V0LlxuXG4gIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIG1heEtleXMsIHN0YXJ0QWZ0ZXIpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhjb250aW51YXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRpbnVhdGlvblRva2VuIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihtYXhLZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4S2V5cyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdGFydEFmdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhcnRBZnRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYG1ldGFkYXRhPXRydWVgKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIC8vIG5vIG5lZWQgdG8gZXNjYXBlIG1heEtleXNcbiAgICBpZiAobWF4S2V5cykge1xuICAgICAgaWYgKG1heEtleXMgPj0gMTAwMCkge1xuICAgICAgICBtYXhLZXlzID0gMTAwMFxuICAgICAgfVxuICAgICAgcXVlcmllcy5wdXNoKGBtYXgta2V5cz0ke21heEtleXN9YClcbiAgICB9XG4gICAgcXVlcmllcy5zb3J0KClcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVRyYW5zZm9ybWVyKClcbiAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG59XG5cbi8vIGRlcHJlY2F0ZWQgZGVmYXVsdCBleHBvcnQsIHBsZWFzZSB1c2UgbmFtZWQgZXhwb3J0cy5cbi8vIGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zXG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFF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 /***/ }), @@ -76698,34 +80083,6 @@ exports.SelectResults = SelectResults; /***/ }), -/***/ 3826: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.callbackify = callbackify; -// wrapper an async function that support callback style API. -// It will preserve 'this'. -function callbackify(fn) { - return function () { - const args = [...arguments]; - const callback = args.pop(); - - // If the last argument is a function, assume it's the callback. - if (typeof callback === 'function') { - return fn.apply(this, args).then(result => callback(null, result), err => callback(err)); - } - return fn.apply(this, arguments); - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsYmFja2lmeSIsImZuIiwiYXJncyIsImFyZ3VtZW50cyIsImNhbGxiYWNrIiwicG9wIiwiYXBwbHkiLCJ0aGVuIiwicmVzdWx0IiwiZXJyIl0sInNvdXJjZXMiOlsiY2FsbGJhY2tpZnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gd3JhcHBlciBhbiBhc3luYyBmdW5jdGlvbiB0aGF0IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUgQVBJLlxuLy8gSXQgd2lsbCBwcmVzZXJ2ZSAndGhpcycuXG5leHBvcnQgZnVuY3Rpb24gY2FsbGJhY2tpZnkoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gWy4uLmFyZ3VtZW50c11cbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKClcblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIHRoZSBjYWxsYmFjay5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncykudGhlbihcbiAgICAgICAgKHJlc3VsdCkgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0KSxcbiAgICAgICAgKGVycikgPT4gY2FsbGJhY2soZXJyKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDTyxTQUFTQSxXQUFXQSxDQUFDQyxFQUFFLEVBQUU7RUFDOUIsT0FBTyxZQUFZO0lBQ2pCLE1BQU1DLElBQUksR0FBRyxDQUFDLEdBQUdDLFNBQVMsQ0FBQztJQUMzQixNQUFNQyxRQUFRLEdBQUdGLElBQUksQ0FBQ0csR0FBRyxDQUFDLENBQUM7O0lBRTNCO0lBQ0EsSUFBSSxPQUFPRCxRQUFRLEtBQUssVUFBVSxFQUFFO01BQ2xDLE9BQU9ILEVBQUUsQ0FBQ0ssS0FBSyxDQUFDLElBQUksRUFBRUosSUFBSSxDQUFDLENBQUNLLElBQUksQ0FDN0JDLE1BQU0sSUFBS0osUUFBUSxDQUFDLElBQUksRUFBRUksTUFBTSxDQUFDLEVBQ2pDQyxHQUFHLElBQUtMLFFBQVEsQ0FBQ0ssR0FBRyxDQUN2QixDQUFDO0lBQ0g7SUFFQSxPQUFPUixFQUFFLENBQUNLLEtBQUssQ0FBQyxJQUFJLEVBQUVILFNBQVMsQ0FBQztFQUNsQyxDQUFDO0FBQ0gifQ== - -/***/ }), - /***/ 5586: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -76737,25 +80094,16 @@ Object.defineProperty(exports, "__esModule", ({ })); var http = _interopRequireWildcard(__nccwpck_require__(3685), true); var https = _interopRequireWildcard(__nccwpck_require__(5687), true); -var _browserOrNode = __nccwpck_require__(9107); var _lodash = __nccwpck_require__(250); -var qs = _interopRequireWildcard(__nccwpck_require__(293), true); -var _xml2js = __nccwpck_require__(4659); var _CredentialProvider = __nccwpck_require__(6570); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helpers = __nccwpck_require__(9455); -var _signing = __nccwpck_require__(2029); -var _extensions = __nccwpck_require__(1159); var _helper = __nccwpck_require__(9921); -var _request = __nccwpck_require__(9093); -var _response = __nccwpck_require__(2644); var _s3Endpoints = __nccwpck_require__(6314); -var xmlParsers = _interopRequireWildcard(__nccwpck_require__(4040), true); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // will be replaced by bundler. const Package = { - version: "7.1.3" || 0 + version: "7.1.1" || 0 }; const requestOptionProperties = ['agent', 'ca', 'cert', 'ciphers', 'clientCertEngine', 'crl', 'dhparam', 'ecdhCurve', 'family', 'honorCipherOrder', 'key', 'passphrase', 'pfx', 'rejectUnauthorized', 'secureOptions', 'secureProtocol', 'servername', 'sessionIdContext']; class TypedClient { @@ -76877,14 +80225,6 @@ class TypedClient { this.enableSHA256 = !this.anonymous && !params.useSSL; this.s3AccelerateEndpoint = params.s3AccelerateEndpoint || undefined; this.reqOptions = {}; - this.clientExtensions = new _extensions.Extensions(this); - } - - /** - * Minio extensions that aren't necessary present for Amazon S3 compatible storage servers - */ - get extensions() { - return this.clientExtensions; } /** @@ -77034,581 +80374,9 @@ class TypedClient { } } } - /** - * log the request, response, error - */ - logHTTP(reqOptions, response, err) { - // if no logStream available return. - if (!this.logStream) { - return; - } - if (!(0, _helper.isObject)(reqOptions)) { - throw new TypeError('reqOptions should be of type "object"'); - } - if (response && !(0, _helper.isReadableStream)(response)) { - throw new TypeError('response should be of type "Stream"'); - } - if (err && !(err instanceof Error)) { - throw new TypeError('err should be of type "Error"'); - } - const logStream = this.logStream; - const logHeaders = headers => { - Object.entries(headers).forEach(([k, v]) => { - if (k == 'authorization') { - if ((0, _helper.isString)(v)) { - const redactor = new RegExp('Signature=([0-9a-f]+)'); - v = v.replace(redactor, 'Signature=**REDACTED**'); - } - } - logStream.write(`${k}: ${v}\n`); - }); - logStream.write('\n'); - }; - logStream.write(`REQUEST: ${reqOptions.method} ${reqOptions.path}\n`); - logHeaders(reqOptions.headers); - if (response) { - this.logStream.write(`RESPONSE: ${response.statusCode}\n`); - logHeaders(response.headers); - } - if (err) { - logStream.write('ERROR BODY:\n'); - const errJSON = JSON.stringify(err, null, '\t'); - logStream.write(`${errJSON}\n`); - } - } - - /** - * Enable tracing - */ - traceOn(stream) { - if (!stream) { - stream = process.stdout; - } - this.logStream = stream; - } - - /** - * Disable tracing - */ - traceOff() { - this.logStream = undefined; - } - - /** - * makeRequest is the primitive used by the apis for making S3 requests. - * payload can be empty string in case of no payload. - * statusCode is the expected statusCode. If response.statusCode does not match - * we parse the XML error and call the callback with the error message. - * - * A valid region is passed by the calls - listBuckets, makeBucket and getBucketRegion. - * - * @internal - */ - async makeRequestAsync(options, payload = '', expectedCodes = [200], region = '') { - if (!(0, _helper.isObject)(options)) { - throw new TypeError('options should be of type "object"'); - } - if (!(0, _helper.isString)(payload) && !(0, _helper.isObject)(payload)) { - // Buffer is of type 'object' - throw new TypeError('payload should be of type "string" or "Buffer"'); - } - expectedCodes.forEach(statusCode => { - if (!(0, _helper.isNumber)(statusCode)) { - throw new TypeError('statusCode should be of type "number"'); - } - }); - if (!(0, _helper.isString)(region)) { - throw new TypeError('region should be of type "string"'); - } - if (!options.headers) { - options.headers = {}; - } - if (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE') { - options.headers['content-length'] = payload.length.toString(); - } - const sha256sum = this.enableSHA256 ? (0, _helper.toSha256)(payload) : ''; - return this.makeRequestStreamAsync(options, payload, sha256sum, expectedCodes, region); - } - - /** - * new request with promise - * - * No need to drain response, response body is not valid - */ - async makeRequestAsyncOmit(options, payload = '', statusCodes = [200], region = '') { - const res = await this.makeRequestAsync(options, payload, statusCodes, region); - await (0, _response.drainResponse)(res); - return res; - } - - /** - * makeRequestStream will be used directly instead of makeRequest in case the payload - * is available as a stream. for ex. putObject - * - * @internal - */ - async makeRequestStreamAsync(options, body, sha256sum, statusCodes, region) { - if (!(0, _helper.isObject)(options)) { - throw new TypeError('options should be of type "object"'); - } - if (!(Buffer.isBuffer(body) || typeof body === 'string' || (0, _helper.isReadableStream)(body))) { - throw new errors.InvalidArgumentError(`stream should be a Buffer, string or readable Stream, got ${typeof body} instead`); - } - if (!(0, _helper.isString)(sha256sum)) { - throw new TypeError('sha256sum should be of type "string"'); - } - statusCodes.forEach(statusCode => { - if (!(0, _helper.isNumber)(statusCode)) { - throw new TypeError('statusCode should be of type "number"'); - } - }); - if (!(0, _helper.isString)(region)) { - throw new TypeError('region should be of type "string"'); - } - // sha256sum will be empty for anonymous or https requests - if (!this.enableSHA256 && sha256sum.length !== 0) { - throw new errors.InvalidArgumentError(`sha256sum expected to be empty for anonymous or https requests`); - } - // sha256sum should be valid for non-anonymous http requests. - if (this.enableSHA256 && sha256sum.length !== 64) { - throw new errors.InvalidArgumentError(`Invalid sha256sum : ${sha256sum}`); - } - await this.checkAndRefreshCreds(); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - region = region || (await this.getBucketRegionAsync(options.bucketName)); - const reqOptions = this.getRequestOptions({ - ...options, - region - }); - if (!this.anonymous) { - // For non-anonymous https requests sha256sum is 'UNSIGNED-PAYLOAD' for signature calculation. - if (!this.enableSHA256) { - sha256sum = 'UNSIGNED-PAYLOAD'; - } - const date = new Date(); - reqOptions.headers['x-amz-date'] = (0, _helper.makeDateLong)(date); - reqOptions.headers['x-amz-content-sha256'] = sha256sum; - if (this.sessionToken) { - reqOptions.headers['x-amz-security-token'] = this.sessionToken; - } - reqOptions.headers.authorization = (0, _signing.signV4)(reqOptions, this.accessKey, this.secretKey, region, date, sha256sum); - } - const response = await (0, _request.request)(this.transport, reqOptions, body); - if (!response.statusCode) { - throw new Error("BUG: response doesn't have a statusCode"); - } - if (!statusCodes.includes(response.statusCode)) { - // For an incorrect region, S3 server always sends back 400. - // But we will do cache invalidation for all errors so that, - // in future, if AWS S3 decides to send a different status code or - // XML error code we will still work fine. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - delete this.regionMap[options.bucketName]; - const err = await xmlParsers.parseResponseError(response); - this.logHTTP(reqOptions, response, err); - throw err; - } - this.logHTTP(reqOptions, response); - return response; - } - - /** - * gets the region of the bucket - * - * @param bucketName - * - * @internal - */ - async getBucketRegionAsync(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`); - } - - // Region is set with constructor, return the region right here. - if (this.region) { - return this.region; - } - const cached = this.regionMap[bucketName]; - if (cached) { - return cached; - } - const extractRegionAsync = async response => { - const body = await (0, _response.readAsString)(response); - const region = xmlParsers.parseBucketRegion(body) || _helpers.DEFAULT_REGION; - this.regionMap[bucketName] = region; - return region; - }; - const method = 'GET'; - const query = 'location'; - // `getBucketLocation` behaves differently in following ways for - // different environments. - // - // - For nodejs env we default to path style requests. - // - For browser env path style requests on buckets yields CORS - // error. To circumvent this problem we make a virtual host - // style request signed with 'us-east-1'. This request fails - // with an error 'AuthorizationHeaderMalformed', additionally - // the error XML also provides Region of the bucket. To validate - // this region is proper we retry the same request with the newly - // obtained region. - const pathStyle = this.pathStyle && !_browserOrNode.isBrowser; - let region; - try { - const res = await this.makeRequestAsync({ - method, - bucketName, - query, - pathStyle - }, '', [200], _helpers.DEFAULT_REGION); - return extractRegionAsync(res); - } catch (e) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - if (!(e.name === 'AuthorizationHeaderMalformed')) { - throw e; - } - // @ts-expect-error we set extra properties on error object - region = e.Region; - if (!region) { - throw e; - } - } - const res = await this.makeRequestAsync({ - method, - bucketName, - query, - pathStyle - }, '', [200], region); - return await extractRegionAsync(res); - } - - /** - * makeRequest is the primitive used by the apis for making S3 requests. - * payload can be empty string in case of no payload. - * statusCode is the expected statusCode. If response.statusCode does not match - * we parse the XML error and call the callback with the error message. - * A valid region is passed by the calls - listBuckets, makeBucket and - * getBucketRegion. - * - * @deprecated use `makeRequestAsync` instead - */ - makeRequest(options, payload = '', expectedCodes = [200], region = '', returnResponse, cb) { - let prom; - if (returnResponse) { - prom = this.makeRequestAsync(options, payload, expectedCodes, region); - } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error compatible for old behaviour - prom = this.makeRequestAsyncOmit(options, payload, expectedCodes, region); - } - prom.then(result => cb(null, result), err => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - cb(err); - }); - } - - /** - * makeRequestStream will be used directly instead of makeRequest in case the payload - * is available as a stream. for ex. putObject - * - * @deprecated use `makeRequestStreamAsync` instead - */ - makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb) { - const executor = async () => { - const res = await this.makeRequestStreamAsync(options, stream, sha256sum, statusCodes, region); - if (!returnResponse) { - await (0, _response.drainResponse)(res); - } - return res; - }; - executor().then(result => cb(null, result), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - err => cb(err)); - } - - /** - * @deprecated use `getBucketRegionAsync` instead - */ - getBucketRegion(bucketName, cb) { - return this.getBucketRegionAsync(bucketName).then(result => cb(null, result), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - err => cb(err)); - } - - /** - * @deprecated use promise style API - */ - - async removeBucket(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'DELETE'; - await this.makeRequestAsyncOmit({ - method, - bucketName - }, '', [204]); - delete this.regionMap[bucketName]; - } - - /** - * Stat information of the object. - */ - async statObject(bucketName, objectName, statOpts = {}) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(statOpts)) { - throw new errors.InvalidArgumentError('statOpts should be of type "object"'); - } - const query = qs.stringify(statOpts); - const method = 'HEAD'; - const res = await this.makeRequestAsyncOmit({ - method, - bucketName, - objectName, - query - }); - return { - size: parseInt(res.headers['content-length']), - metaData: (0, _helper.extractMetadata)(res.headers), - lastModified: new Date(res.headers['last-modified']), - versionId: (0, _helper.getVersionId)(res.headers), - etag: (0, _helper.sanitizeETag)(res.headers.etag) - }; - } - - /** - * Remove the specified object. - * @deprecated use new promise style API - */ - - /** - * @deprecated use new promise style API - */ // @ts-ignore - async removeObject(bucketName, objectName, removeOpts = {}) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(removeOpts)) { - throw new errors.InvalidArgumentError('removeOpts should be of type "object"'); - } - const method = 'DELETE'; - const headers = {}; - if (removeOpts.governanceBypass) { - headers['X-Amz-Bypass-Governance-Retention'] = true; - } - if (removeOpts.forceDelete) { - headers['x-minio-force-delete'] = true; - } - const queryParams = {}; - if (removeOpts.versionId) { - queryParams.versionId = `${removeOpts.versionId}`; - } - const query = qs.stringify(queryParams); - await this.makeRequestAsyncOmit({ - method, - bucketName, - objectName, - headers, - query - }, '', [200, 204]); - } - - // Calls implemented below are related to multipart. - - /** - * Initiate a new multipart upload. - * @internal - */ - async initiateNewMultipartUpload(bucketName, objectName, headers) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isObject)(headers)) { - throw new errors.InvalidObjectNameError('contentType should be of type "object"'); - } - const method = 'POST'; - const query = 'uploads'; - const res = await this.makeRequestAsync({ - method, - bucketName, - objectName, - query, - headers - }); - const body = await (0, _response.readAsBuffer)(res); - return (0, xmlParsers.parseInitiateMultipart)(body.toString()); - } - - /** - * Internal Method to abort a multipart upload request in case of any errors. - * - * @param bucketName - Bucket Name - * @param objectName - Object Name - * @param uploadId - id of a multipart upload to cancel during compose object sequence. - */ - async abortMultipartUpload(bucketName, objectName, uploadId) { - const method = 'DELETE'; - const query = `uploadId=${uploadId}`; - const requestOptions = { - method, - bucketName, - objectName: objectName, - query - }; - await this.makeRequestAsyncOmit(requestOptions, '', [204]); - } - - /** - * Get part-info of all parts of an incomplete upload specified by uploadId. - */ - async listParts(bucketName, objectName, uploadId) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isString)(uploadId)) { - throw new TypeError('uploadId should be of type "string"'); - } - if (!uploadId) { - throw new errors.InvalidArgumentError('uploadId cannot be empty'); - } - const parts = []; - let marker = 0; - let result; - do { - result = await this.listPartsQuery(bucketName, objectName, uploadId, marker); - marker = result.marker; - parts.push(...result.parts); - } while (result.isTruncated); - return parts; - } - - /** - * Called by listParts to fetch a batch of part-info - */ - async listPartsQuery(bucketName, objectName, uploadId, marker) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidObjectName)(objectName)) { - throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); - } - if (!(0, _helper.isString)(uploadId)) { - throw new TypeError('uploadId should be of type "string"'); - } - if (!(0, _helper.isNumber)(marker)) { - throw new TypeError('marker should be of type "number"'); - } - if (!uploadId) { - throw new errors.InvalidArgumentError('uploadId cannot be empty'); - } - let query = `uploadId=${(0, _helper.uriEscape)(uploadId)}`; - if (marker) { - query += `&part-number-marker=${marker}`; - } - const method = 'GET'; - const res = await this.makeRequestAsync({ - method, - bucketName, - objectName, - query - }); - return xmlParsers.parseListParts(await (0, _response.readAsString)(res)); - } - async listBuckets() { - const method = 'GET'; - const httpRes = await this.makeRequestAsync({ - method - }, '', [200], _helpers.DEFAULT_REGION); - const xmlResult = await (0, _response.readAsString)(httpRes); - return xmlParsers.parseListBucket(xmlResult); - } - async removeBucketReplication(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'DELETE'; - const query = 'replication'; - await this.makeRequestAsyncOmit({ - method, - bucketName, - query - }, '', [200, 204], ''); - } - async setBucketReplication(bucketName, replicationConfig) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isObject)(replicationConfig)) { - throw new errors.InvalidArgumentError('replicationConfig should be of type "object"'); - } else { - if (_lodash.isEmpty(replicationConfig.role)) { - throw new errors.InvalidArgumentError('Role cannot be empty'); - } else if (replicationConfig.role && !(0, _helper.isString)(replicationConfig.role)) { - throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role); - } - if (_lodash.isEmpty(replicationConfig.rules)) { - throw new errors.InvalidArgumentError('Minimum one replication rule must be specified'); - } - } - const method = 'PUT'; - const query = 'replication'; - const headers = {}; - const replicationParamsConfig = { - ReplicationConfiguration: { - Role: replicationConfig.role, - Rule: replicationConfig.rules - } - }; - const builder = new _xml2js.Builder({ - renderOpts: { - pretty: false - }, - headless: true - }); - const payload = builder.buildObject(replicationParamsConfig); - headers['Content-MD5'] = (0, _helper.toMd5)(payload); - await this.makeRequestAsyncOmit({ - method, - bucketName, - query, - headers - }, payload); - } - async getBucketReplication(bucketName) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - const method = 'GET'; - const query = 'replication'; - const httpRes = await this.makeRequestAsync({ - method, - bucketName, - query - }, '', [200, 204]); - const xmlResult = await (0, _response.readAsString)(httpRes); - return xmlParsers.parseReplicationConfig(xmlResult); - } } exports.TypedClient = TypedClient; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiaHR0cHMiLCJfYnJvd3Nlck9yTm9kZSIsIl9sb2Rhc2giLCJxcyIsIl94bWwyanMiLCJfQ3JlZGVudGlhbFByb3ZpZGVyIiwiZXJyb3JzIiwiX2hlbHBlcnMiLCJfc2lnbmluZyIsIl9leHRlbnNpb25zIiwiX2hlbHBlciIsIl9yZXF1ZXN0IiwiX3Jlc3BvbnNlIiwiX3MzRW5kcG9pbnRzIiwieG1sUGFyc2VycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJQYWNrYWdlIiwidmVyc2lvbiIsInJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzIiwiVHlwZWRDbGllbnQiLCJwYXJ0U2l6ZSIsIm1heGltdW1QYXJ0U2l6ZSIsIm1heE9iamVjdFNpemUiLCJjb25zdHJ1Y3RvciIsInBhcmFtcyIsInNlY3VyZSIsInVuZGVmaW5lZCIsIkVycm9yIiwidXNlU1NMIiwicG9ydCIsImlzVmFsaWRFbmRwb2ludCIsImVuZFBvaW50IiwiSW52YWxpZEVuZHBvaW50RXJyb3IiLCJpc1ZhbGlkUG9ydCIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNCb29sZWFuIiwicmVnaW9uIiwiaXNTdHJpbmciLCJob3N0IiwidG9Mb3dlckNhc2UiLCJwcm90b2NvbCIsInRyYW5zcG9ydCIsInRyYW5zcG9ydEFnZW50IiwiZ2xvYmFsQWdlbnQiLCJpc09iamVjdCIsImxpYnJhcnlDb21tZW50cyIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImFyY2giLCJsaWJyYXJ5QWdlbnQiLCJ1c2VyQWdlbnQiLCJwYXRoU3R5bGUiLCJhY2Nlc3NLZXkiLCJzZWNyZXRLZXkiLCJzZXNzaW9uVG9rZW4iLCJhbm9ueW1vdXMiLCJjcmVkZW50aWFsc1Byb3ZpZGVyIiwicmVnaW9uTWFwIiwib3ZlclJpZGVQYXJ0U2l6ZSIsImVuYWJsZVNIQTI1NiIsInMzQWNjZWxlcmF0ZUVuZHBvaW50IiwicmVxT3B0aW9ucyIsImNsaWVudEV4dGVuc2lvbnMiLCJFeHRlbnNpb25zIiwiZXh0ZW5zaW9ucyIsInNldFMzVHJhbnNmZXJBY2NlbGVyYXRlIiwic2V0UmVxdWVzdE9wdGlvbnMiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwiXyIsInBpY2siLCJnZXRBY2NlbGVyYXRlRW5kUG9pbnRJZlNldCIsImJ1Y2tldE5hbWUiLCJvYmplY3ROYW1lIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwiZ2V0UmVxdWVzdE9wdGlvbnMiLCJvcHRzIiwibWV0aG9kIiwiaGVhZGVycyIsInF1ZXJ5IiwiYWdlbnQiLCJ2aXJ0dWFsSG9zdFN0eWxlIiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicGF0aCIsInVyaVJlc291cmNlRXNjYXBlIiwiaXNBbWF6b25FbmRwb2ludCIsImFjY2VsZXJhdGVFbmRQb2ludCIsImdldFMzRW5kcG9pbnQiLCJrIiwidiIsImVudHJpZXMiLCJhc3NpZ24iLCJtYXBWYWx1ZXMiLCJwaWNrQnkiLCJpc0RlZmluZWQiLCJ0b1N0cmluZyIsInNldENyZWRlbnRpYWxzUHJvdmlkZXIiLCJDcmVkZW50aWFsUHJvdmlkZXIiLCJjaGVja0FuZFJlZnJlc2hDcmVkcyIsImNyZWRlbnRpYWxzQ29uZiIsImdldENyZWRlbnRpYWxzIiwiZ2V0QWNjZXNzS2V5IiwiZ2V0U2VjcmV0S2V5IiwiZ2V0U2Vzc2lvblRva2VuIiwiZSIsImNhdXNlIiwibG9nSFRUUCIsInJlc3BvbnNlIiwiZXJyIiwibG9nU3RyZWFtIiwiaXNSZWFkYWJsZVN0cmVhbSIsImxvZ0hlYWRlcnMiLCJmb3JFYWNoIiwicmVkYWN0b3IiLCJSZWdFeHAiLCJyZXBsYWNlIiwid3JpdGUiLCJzdGF0dXNDb2RlIiwiZXJySlNPTiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZU9uIiwic3RyZWFtIiwic3Rkb3V0IiwidHJhY2VPZmYiLCJtYWtlUmVxdWVzdEFzeW5jIiwicGF5bG9hZCIsImV4cGVjdGVkQ29kZXMiLCJpc051bWJlciIsImxlbmd0aCIsInNoYTI1NnN1bSIsInRvU2hhMjU2IiwibWFrZVJlcXVlc3RTdHJlYW1Bc3luYyIsIm1ha2VSZXF1ZXN0QXN5bmNPbWl0Iiwic3RhdHVzQ29kZXMiLCJyZXMiLCJkcmFpblJlc3BvbnNlIiwiYm9keSIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZ2V0QnVja2V0UmVnaW9uQXN5bmMiLCJkYXRlIiwiRGF0ZSIsIm1ha2VEYXRlTG9uZyIsImF1dGhvcml6YXRpb24iLCJzaWduVjQiLCJyZXF1ZXN0IiwicGFyc2VSZXNwb25zZUVycm9yIiwiaXNWYWxpZEJ1Y2tldE5hbWUiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiY2FjaGVkIiwiZXh0cmFjdFJlZ2lvbkFzeW5jIiwicmVhZEFzU3RyaW5nIiwicGFyc2VCdWNrZXRSZWdpb24iLCJERUZBVUxUX1JFR0lPTiIsImlzQnJvd3NlciIsIm5hbWUiLCJSZWdpb24iLCJtYWtlUmVxdWVzdCIsInJldHVyblJlc3BvbnNlIiwiY2IiLCJwcm9tIiwidGhlbiIsInJlc3VsdCIsIm1ha2VSZXF1ZXN0U3RyZWFtIiwiZXhlY3V0b3IiLCJnZXRCdWNrZXRSZWdpb24iLCJyZW1vdmVCdWNrZXQiLCJzdGF0T2JqZWN0Iiwic3RhdE9wdHMiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJzaXplIiwicGFyc2VJbnQiLCJtZXRhRGF0YSIsImV4dHJhY3RNZXRhZGF0YSIsImxhc3RNb2RpZmllZCIsInZlcnNpb25JZCIsImdldFZlcnNpb25JZCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJyZW1vdmVPYmplY3QiLCJyZW1vdmVPcHRzIiwiZ292ZXJuYW5jZUJ5cGFzcyIsImZvcmNlRGVsZXRlIiwicXVlcnlQYXJhbXMiLCJpbml0aWF0ZU5ld011bHRpcGFydFVwbG9hZCIsInJlYWRBc0J1ZmZlciIsInBhcnNlSW5pdGlhdGVNdWx0aXBhcnQiLCJhYm9ydE11bHRpcGFydFVwbG9hZCIsInVwbG9hZElkIiwicmVxdWVzdE9wdGlvbnMiLCJsaXN0UGFydHMiLCJwYXJ0cyIsIm1hcmtlciIsImxpc3RQYXJ0c1F1ZXJ5IiwicHVzaCIsImlzVHJ1bmNhdGVkIiwidXJpRXNjYXBlIiwicGFyc2VMaXN0UGFydHMiLCJsaXN0QnVja2V0cyIsImh0dHBSZXMiLCJ4bWxSZXN1bHQiLCJwYXJzZUxpc3RCdWNrZXQiLCJyZW1vdmVCdWNrZXRSZXBsaWNhdGlvbiIsInNldEJ1Y2tldFJlcGxpY2F0aW9uIiwicmVwbGljYXRpb25Db25maWciLCJyb2xlIiwicnVsZXMiLCJyZXBsaWNhdGlvblBhcmFtc0NvbmZpZyIsIlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIsIlJvbGUiLCJSdWxlIiwiYnVpbGRlciIsInhtbDJqcyIsIkJ1aWxkZXIiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwiaGVhZGxlc3MiLCJidWlsZE9iamVjdCIsInRvTWQ1IiwiZ2V0QnVja2V0UmVwbGljYXRpb24iLCJwYXJzZVJlcGxpY2F0aW9uQ29uZmlnIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbImNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBodHRwIGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ25vZGU6aHR0cHMnXG5pbXBvcnQgdHlwZSAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnYnJvd3Nlci1vci1ub2RlJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXMgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHhtbDJqcyBmcm9tICd4bWwyanMnXG5cbmltcG9ydCB7IENyZWRlbnRpYWxQcm92aWRlciB9IGZyb20gJy4uL0NyZWRlbnRpYWxQcm92aWRlci50cydcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBERUZBVUxUX1JFR0lPTiB9IGZyb20gJy4uL2hlbHBlcnMudHMnXG5pbXBvcnQgeyBzaWduVjQgfSBmcm9tICcuLi9zaWduaW5nLnRzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy50cydcbmltcG9ydCB7XG4gIGV4dHJhY3RNZXRhZGF0YSxcbiAgZ2V0VmVyc2lvbklkLFxuICBpc0FtYXpvbkVuZHBvaW50LFxuICBpc0Jvb2xlYW4sXG4gIGlzRGVmaW5lZCxcbiAgaXNFbXB0eSxcbiAgaXNOdW1iZXIsXG4gIGlzT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1N0cmluZyxcbiAgaXNWYWxpZEJ1Y2tldE5hbWUsXG4gIGlzVmFsaWRFbmRwb2ludCxcbiAgaXNWYWxpZE9iamVjdE5hbWUsXG4gIGlzVmFsaWRQb3J0LFxuICBpc1ZpcnR1YWxIb3N0U3R5bGUsXG4gIG1ha2VEYXRlTG9uZyxcbiAgc2FuaXRpemVFVGFnLFxuICB0b01kNSxcbiAgdG9TaGEyNTYsXG4gIHVyaUVzY2FwZSxcbiAgdXJpUmVzb3VyY2VFc2NhcGUsXG59IGZyb20gJy4vaGVscGVyLnRzJ1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdC50cydcbmltcG9ydCB7IGRyYWluUmVzcG9uc2UsIHJlYWRBc0J1ZmZlciwgcmVhZEFzU3RyaW5nIH0gZnJvbSAnLi9yZXNwb25zZS50cydcbmltcG9ydCB0eXBlIHsgUmVnaW9uIH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgeyBnZXRTM0VuZHBvaW50IH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgdHlwZSB7XG4gIEJpbmFyeSxcbiAgQnVja2V0SXRlbUZyb21MaXN0LFxuICBCdWNrZXRJdGVtU3RhdCxcbiAgSVJlcXVlc3QsXG4gIFJlcGxpY2F0aW9uQ29uZmlnLFxuICBSZXBsaWNhdGlvbkNvbmZpZ09wdHMsXG4gIFJlcXVlc3RIZWFkZXJzLFxuICBSZXNwb25zZUhlYWRlcixcbiAgUmVzdWx0Q2FsbGJhY2ssXG4gIFN0YXRPYmplY3RPcHRzLFxuICBUcmFuc3BvcnQsXG59IGZyb20gJy4vdHlwZS50cydcbmltcG9ydCB0eXBlIHsgVXBsb2FkZWRQYXJ0IH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuaW1wb3J0ICogYXMgeG1sUGFyc2VycyBmcm9tICcuL3htbC1wYXJzZXIudHMnXG5pbXBvcnQgeyBwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJ1bmRsZXIuXG5jb25zdCBQYWNrYWdlID0geyB2ZXJzaW9uOiBwcm9jZXNzLmVudi5NSU5JT19KU19QQUNLQUdFX1ZFUlNJT04gfHwgJ2RldmVsb3BtZW50JyB9XG5cbmNvbnN0IHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzID0gW1xuICAnYWdlbnQnLFxuICAnY2EnLFxuICAnY2VydCcsXG4gICdjaXBoZXJzJyxcbiAgJ2NsaWVudENlcnRFbmdpbmUnLFxuICAnY3JsJyxcbiAgJ2RocGFyYW0nLFxuICAnZWNkaEN1cnZlJyxcbiAgJ2ZhbWlseScsXG4gICdob25vckNpcGhlck9yZGVyJyxcbiAgJ2tleScsXG4gICdwYXNzcGhyYXNlJyxcbiAgJ3BmeCcsXG4gICdyZWplY3RVbmF1dGhvcml6ZWQnLFxuICAnc2VjdXJlT3B0aW9ucycsXG4gICdzZWN1cmVQcm90b2NvbCcsXG4gICdzZXJ2ZXJuYW1lJyxcbiAgJ3Nlc3Npb25JZENvbnRleHQnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICBlbmRQb2ludDogc3RyaW5nXG4gIGFjY2Vzc0tleTogc3RyaW5nXG4gIHNlY3JldEtleTogc3RyaW5nXG4gIHVzZVNTTD86IGJvb2xlYW5cbiAgcG9ydD86IG51bWJlclxuICByZWdpb24/OiBSZWdpb25cbiAgdHJhbnNwb3J0PzogVHJhbnNwb3J0XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBwYXJ0U2l6ZT86IG51bWJlclxuICBwYXRoU3R5bGU/OiBib29sZWFuXG4gIGNyZWRlbnRpYWxzUHJvdmlkZXI/OiBDcmVkZW50aWFsUHJvdmlkZXJcbiAgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgdHJhbnNwb3J0QWdlbnQ/OiBodHRwLkFnZW50XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb24gPSBQYXJ0aWFsPElSZXF1ZXN0PiAmIHtcbiAgbWV0aG9kOiBzdHJpbmdcbiAgYnVja2V0TmFtZT86IHN0cmluZ1xuICBvYmplY3ROYW1lPzogc3RyaW5nXG4gIHF1ZXJ5Pzogc3RyaW5nXG4gIHBhdGhTdHlsZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgTm9SZXN1bHRDYWxsYmFjayA9IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZU9wdGlvbnMge1xuICB2ZXJzaW9uSWQ/OiBzdHJpbmdcbiAgZ292ZXJuYW5jZUJ5cGFzcz86IGJvb2xlYW5cbiAgZm9yY2VEZWxldGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlZENsaWVudCB7XG4gIHByb3RlY3RlZCB0cmFuc3BvcnQ6IFRyYW5zcG9ydFxuICBwcm90ZWN0ZWQgaG9zdDogc3RyaW5nXG4gIHByb3RlY3RlZCBwb3J0OiBudW1iZXJcbiAgcHJvdGVjdGVkIHByb3RvY29sOiBzdHJpbmdcbiAgcHJvdGVjdGVkIGFjY2Vzc0tleTogc3RyaW5nXG4gIHByb3RlY3RlZCBzZWNyZXRLZXk6IHN0cmluZ1xuICBwcm90ZWN0ZWQgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIHByb3RlY3RlZCB1c2VyQWdlbnQ6IHN0cmluZ1xuICBwcm90ZWN0ZWQgYW5vbnltb3VzOiBib29sZWFuXG4gIHByb3RlY3RlZCBwYXRoU3R5bGU6IGJvb2xlYW5cbiAgcHJvdGVjdGVkIHJlZ2lvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaWMgcmVnaW9uPzogc3RyaW5nXG4gIHByb3RlY3RlZCBjcmVkZW50aWFsc1Byb3ZpZGVyPzogQ3JlZGVudGlhbFByb3ZpZGVyXG4gIHBhcnRTaXplOiBudW1iZXIgPSA2NCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBvdmVyUmlkZVBhcnRTaXplPzogYm9vbGVhblxuXG4gIHByb3RlY3RlZCBtYXhpbXVtUGFydFNpemUgPSA1ICogMTAyNCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBtYXhPYmplY3RTaXplID0gNSAqIDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjRcbiAgcHVibGljIGVuYWJsZVNIQTI1NjogYm9vbGVhblxuICBwcm90ZWN0ZWQgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgcHJvdGVjdGVkIHJlcU9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgcHJvdGVjdGVkIHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50RXh0ZW5zaW9uczogRXh0ZW5zaW9uc1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogQ2xpZW50T3B0aW9ucykge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGVwcmVjYXRlZCBwcm9wZXJ0eVxuICAgIGlmIChwYXJhbXMuc2VjdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJzZWN1cmVcIiBvcHRpb24gZGVwcmVjYXRlZCwgXCJ1c2VTU0xcIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkJylcbiAgICB9XG4gICAgLy8gRGVmYXVsdCB2YWx1ZXMgaWYgbm90IHNwZWNpZmllZC5cbiAgICBpZiAocGFyYW1zLnVzZVNTTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudXNlU1NMID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wb3J0KSB7XG4gICAgICBwYXJhbXMucG9ydCA9IDBcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgcGFyYW1zLlxuICAgIGlmICghaXNWYWxpZEVuZHBvaW50KHBhcmFtcy5lbmRQb2ludCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEVuZHBvaW50RXJyb3IoYEludmFsaWQgZW5kUG9pbnQgOiAke3BhcmFtcy5lbmRQb2ludH1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQb3J0KHBhcmFtcy5wb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSW52YWxpZCBwb3J0IDogJHtwYXJhbXMucG9ydH1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihwYXJhbXMudXNlU1NMKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYEludmFsaWQgdXNlU1NMIGZsYWcgdHlwZSA6ICR7cGFyYW1zLnVzZVNTTH0sIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgXCJib29sZWFuXCJgLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJlZ2lvbiBvbmx5IGlmIGl0cyBzZXQuXG4gICAgaWYgKHBhcmFtcy5yZWdpb24pIHtcbiAgICAgIGlmICghaXNTdHJpbmcocGFyYW1zLnJlZ2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSW52YWxpZCByZWdpb24gOiAke3BhcmFtcy5yZWdpb259YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBob3N0ID0gcGFyYW1zLmVuZFBvaW50LnRvTG93ZXJDYXNlKClcbiAgICBsZXQgcG9ydCA9IHBhcmFtcy5wb3J0XG4gICAgbGV0IHByb3RvY29sOiBzdHJpbmdcbiAgICBsZXQgdHJhbnNwb3J0XG4gICAgbGV0IHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG4gICAgLy8gVmFsaWRhdGUgaWYgY29uZmlndXJhdGlvbiBpcyBub3QgdXNpbmcgU1NMXG4gICAgLy8gZm9yIGNvbnN0cnVjdGluZyByZWxldmFudCBlbmRwb2ludHMuXG4gICAgaWYgKHBhcmFtcy51c2VTU0wpIHtcbiAgICAgIC8vIERlZmF1bHRzIHRvIHNlY3VyZS5cbiAgICAgIHRyYW5zcG9ydCA9IGh0dHBzXG4gICAgICBwcm90b2NvbCA9ICdodHRwczonXG4gICAgICBwb3J0ID0gcG9ydCB8fCA0NDNcbiAgICAgIHRyYW5zcG9ydEFnZW50ID0gaHR0cHMuZ2xvYmFsQWdlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNwb3J0ID0gaHR0cFxuICAgICAgcHJvdG9jb2wgPSAnaHR0cDonXG4gICAgICBwb3J0ID0gcG9ydCB8fCA4MFxuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBodHRwLmdsb2JhbEFnZW50XG4gICAgfVxuXG4gICAgLy8gaWYgY3VzdG9tIHRyYW5zcG9ydCBpcyBzZXQsIHVzZSBpdC5cbiAgICBpZiAocGFyYW1zLnRyYW5zcG9ydCkge1xuICAgICAgaWYgKCFpc09iamVjdChwYXJhbXMudHJhbnNwb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHRyYW5zcG9ydCB0eXBlIDogJHtwYXJhbXMudHJhbnNwb3J0fSwgZXhwZWN0ZWQgdG8gYmUgdHlwZSBcIm9iamVjdFwiYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdHJhbnNwb3J0ID0gcGFyYW1zLnRyYW5zcG9ydFxuICAgIH1cblxuICAgIC8vIGlmIGN1c3RvbSB0cmFuc3BvcnQgYWdlbnQgaXMgc2V0LCB1c2UgaXQuXG4gICAgaWYgKHBhcmFtcy50cmFuc3BvcnRBZ2VudCkge1xuICAgICAgaWYgKCFpc09iamVjdChwYXJhbXMudHJhbnNwb3J0QWdlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdHJhbnNwb3J0QWdlbnQgdHlwZTogJHtwYXJhbXMudHJhbnNwb3J0QWdlbnR9LCBleHBlY3RlZCB0byBiZSB0eXBlIFwib2JqZWN0XCJgLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHRyYW5zcG9ydEFnZW50ID0gcGFyYW1zLnRyYW5zcG9ydEFnZW50XG4gICAgfVxuXG4gICAgLy8gVXNlciBBZ2VudCBzaG91bGQgYWx3YXlzIGZvbGxvd2luZyB0aGUgYmVsb3cgc3R5bGUuXG4gICAgLy8gUGxlYXNlIG9wZW4gYW4gaXNzdWUgdG8gZGlzY3VzcyBhbnkgbmV3IGNoYW5nZXMgaGVyZS5cbiAgICAvL1xuICAgIC8vICAgICAgIE1pbklPIChPUzsgQVJDSCkgTElCL1ZFUiBBUFAvVkVSXG4gICAgLy9cbiAgICBjb25zdCBsaWJyYXJ5Q29tbWVudHMgPSBgKCR7cHJvY2Vzcy5wbGF0Zm9ybX07ICR7cHJvY2Vzcy5hcmNofSlgXG4gICAgY29uc3QgbGlicmFyeUFnZW50ID0gYE1pbklPICR7bGlicmFyeUNvbW1lbnRzfSBtaW5pby1qcy8ke1BhY2thZ2UudmVyc2lvbn1gXG4gICAgLy8gVXNlciBhZ2VudCBibG9jayBlbmRzLlxuXG4gICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnRcbiAgICB0aGlzLnRyYW5zcG9ydEFnZW50ID0gdHJhbnNwb3J0QWdlbnRcbiAgICB0aGlzLmhvc3QgPSBob3N0XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbFxuICAgIHRoaXMudXNlckFnZW50ID0gYCR7bGlicmFyeUFnZW50fWBcblxuICAgIC8vIERlZmF1bHQgcGF0aCBzdHlsZSBpcyB0cnVlXG4gICAgaWYgKHBhcmFtcy5wYXRoU3R5bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYXRoU3R5bGUgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGF0aFN0eWxlID0gcGFyYW1zLnBhdGhTdHlsZVxuICAgIH1cblxuICAgIHRoaXMuYWNjZXNzS2V5ID0gcGFyYW1zLmFjY2Vzc0tleSA/PyAnJ1xuICAgIHRoaXMuc2VjcmV0S2V5ID0gcGFyYW1zLnNlY3JldEtleSA/PyAnJ1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gcGFyYW1zLnNlc3Npb25Ub2tlblxuICAgIHRoaXMuYW5vbnltb3VzID0gIXRoaXMuYWNjZXNzS2V5IHx8ICF0aGlzLnNlY3JldEtleVxuXG4gICAgaWYgKHBhcmFtcy5jcmVkZW50aWFsc1Byb3ZpZGVyKSB7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIgPSBwYXJhbXMuY3JlZGVudGlhbHNQcm92aWRlclxuICAgIH1cblxuICAgIHRoaXMucmVnaW9uTWFwID0ge31cbiAgICBpZiAocGFyYW1zLnJlZ2lvbikge1xuICAgICAgdGhpcy5yZWdpb24gPSBwYXJhbXMucmVnaW9uXG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wYXJ0U2l6ZSkge1xuICAgICAgdGhpcy5wYXJ0U2l6ZSA9IHBhcmFtcy5wYXJ0U2l6ZVxuICAgICAgdGhpcy5vdmVyUmlkZVBhcnRTaXplID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0U2l6ZSA8IDUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgUGFydCBzaXplIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gNU1CYClcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydFNpemUgPiA1ICogMTAyNCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBQYXJ0IHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiA1R0JgKVxuICAgIH1cblxuICAgIC8vIFNIQTI1NiBpcyBlbmFibGVkIG9ubHkgZm9yIGF1dGhlbnRpY2F0ZWQgaHR0cCByZXF1ZXN0cy4gSWYgdGhlIHJlcXVlc3QgaXMgYXV0aGVudGljYXRlZFxuICAgIC8vIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBodHRwcyB3ZSB1c2UgeC1hbXotY29udGVudC1zaGEyNTY9VU5TSUdORUQtUEFZTE9BRFxuICAgIC8vIGhlYWRlciBmb3Igc2lnbmF0dXJlIGNhbGN1bGF0aW9uLlxuICAgIHRoaXMuZW5hYmxlU0hBMjU2ID0gIXRoaXMuYW5vbnltb3VzICYmICFwYXJhbXMudXNlU1NMXG5cbiAgICB0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50ID0gcGFyYW1zLnMzQWNjZWxlcmF0ZUVuZHBvaW50IHx8IHVuZGVmaW5lZFxuICAgIHRoaXMucmVxT3B0aW9ucyA9IHt9XG4gICAgdGhpcy5jbGllbnRFeHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnModGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW5pbyBleHRlbnNpb25zIHRoYXQgYXJlbid0IG5lY2Vzc2FyeSBwcmVzZW50IGZvciBBbWF6b24gUzMgY29tcGF0aWJsZSBzdG9yYWdlIHNlcnZlcnNcbiAgICovXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudEV4dGVuc2lvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZW5kUG9pbnQgLSB2YWxpZCBTMyBhY2NlbGVyYXRpb24gZW5kIHBvaW50XG4gICAqL1xuICBzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZShlbmRQb2ludDogc3RyaW5nKSB7XG4gICAgdGhpcy5zM0FjY2VsZXJhdGVFbmRwb2ludCA9IGVuZFBvaW50XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3VwcG9ydGVkIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zOiBQaWNrPGh0dHBzLlJlcXVlc3RPcHRpb25zLCAodHlwZW9mIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVtudW1iZXJdPikge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcXVlc3Qgb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgdGhpcy5yZXFPcHRpb25zID0gXy5waWNrKG9wdGlvbnMsIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVxuICB9XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIHMzIFNwZWNpZmljIGFuZCBkb2VzIG5vdCBob2xkIHZhbGlkaXR5IGluIGFueSBvdGhlciBPYmplY3Qgc3RvcmFnZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZT86IHN0cmluZywgb2JqZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmICghaXNFbXB0eSh0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50KSAmJiAhaXNFbXB0eShidWNrZXROYW1lKSAmJiAhaXNFbXB0eShvYmplY3ROYW1lKSkge1xuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2ZlciBhY2NlbGVyYXRpb24gZm9yIG5vbi1jb21wbGlhbnQgYnVja2V0IG5hbWVzLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBub24gY29tcGxpYW50IGJ1Y2tldDoke2J1Y2tldE5hbWV9YClcbiAgICAgIH1cbiAgICAgIC8vIElmIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBpcyByZXF1ZXN0ZWQgc2V0IG5ldyBob3N0LlxuICAgICAgLy8gRm9yIG1vcmUgZGV0YWlscyBhYm91dCBlbmFibGluZyB0cmFuc2ZlciBhY2NlbGVyYXRpb24gcmVhZCBoZXJlLlxuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgcmV0dXJuIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnRcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggaHR0cC5yZXF1ZXN0KClcbiAgICogVGFrZXMgY2FyZSBvZiBjb25zdHJ1Y3RpbmcgdmlydHVhbC1ob3N0LXN0eWxlIG9yIHBhdGgtc3R5bGUgaG9zdG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0T3B0aW9ucyhcbiAgICBvcHRzOiBSZXF1ZXN0T3B0aW9uICYgeyByZWdpb246IHN0cmluZyB9LFxuICApOiBJUmVxdWVzdCAmIHsgaG9zdDogc3RyaW5nOyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0ge1xuICAgIGNvbnN0IG1ldGhvZCA9IG9wdHMubWV0aG9kXG4gICAgY29uc3QgcmVnaW9uID0gb3B0cy5yZWdpb25cbiAgICBjb25zdCBidWNrZXROYW1lID0gb3B0cy5idWNrZXROYW1lXG4gICAgbGV0IG9iamVjdE5hbWUgPSBvcHRzLm9iamVjdE5hbWVcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgcXVlcnkgPSBvcHRzLnF1ZXJ5XG5cbiAgICBsZXQgcmVxT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHt9IGFzIFJlcXVlc3RIZWFkZXJzLFxuICAgICAgcHJvdG9jb2w6IHRoaXMucHJvdG9jb2wsXG4gICAgICAvLyBJZiBjdXN0b20gdHJhbnNwb3J0QWdlbnQgd2FzIHN1cHBsaWVkIGVhcmxpZXIsIHdlJ2xsIGluamVjdCBpdCBoZXJlXG4gICAgICBhZ2VudDogdGhpcy50cmFuc3BvcnRBZ2VudCxcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgaWYgdmlydHVhbCBob3N0IHN1cHBvcnRlZC5cbiAgICBsZXQgdmlydHVhbEhvc3RTdHlsZVxuICAgIGlmIChidWNrZXROYW1lKSB7XG4gICAgICB2aXJ0dWFsSG9zdFN0eWxlID0gaXNWaXJ0dWFsSG9zdFN0eWxlKHRoaXMuaG9zdCwgdGhpcy5wcm90b2NvbCwgYnVja2V0TmFtZSwgdGhpcy5wYXRoU3R5bGUpXG4gICAgfVxuXG4gICAgbGV0IHBhdGggPSAnLydcbiAgICBsZXQgaG9zdCA9IHRoaXMuaG9zdFxuXG4gICAgbGV0IHBvcnQ6IHVuZGVmaW5lZCB8IG51bWJlclxuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIHBvcnQgPSB0aGlzLnBvcnRcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgb2JqZWN0TmFtZSA9IHVyaVJlc291cmNlRXNjYXBlKG9iamVjdE5hbWUpXG4gICAgfVxuXG4gICAgLy8gRm9yIEFtYXpvbiBTMyBlbmRwb2ludCwgZ2V0IGVuZHBvaW50IGJhc2VkIG9uIHJlZ2lvbi5cbiAgICBpZiAoaXNBbWF6b25FbmRwb2ludChob3N0KSkge1xuICAgICAgY29uc3QgYWNjZWxlcmF0ZUVuZFBvaW50ID0gdGhpcy5nZXRBY2NlbGVyYXRlRW5kUG9pbnRJZlNldChidWNrZXROYW1lLCBvYmplY3ROYW1lKVxuICAgICAgaWYgKGFjY2VsZXJhdGVFbmRQb2ludCkge1xuICAgICAgICBob3N0ID0gYCR7YWNjZWxlcmF0ZUVuZFBvaW50fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvc3QgPSBnZXRTM0VuZHBvaW50KHJlZ2lvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlydHVhbEhvc3RTdHlsZSAmJiAhb3B0cy5wYXRoU3R5bGUpIHtcbiAgICAgIC8vIEZvciBhbGwgaG9zdHMgd2hpY2ggc3VwcG9ydCB2aXJ0dWFsIGhvc3Qgc3R5bGUsIGBidWNrZXROYW1lYFxuICAgICAgLy8gaXMgcGFydCBvZiB0aGUgaG9zdG5hbWUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICAvL1xuICAgICAgLy8gIHZhciBob3N0ID0gJ2J1Y2tldE5hbWUuZXhhbXBsZS5jb20nXG4gICAgICAvL1xuICAgICAgaWYgKGJ1Y2tldE5hbWUpIHtcbiAgICAgICAgaG9zdCA9IGAke2J1Y2tldE5hbWV9LiR7aG9zdH1gXG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgICBwYXRoID0gYC8ke29iamVjdE5hbWV9YFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIFMzIGNvbXBhdGlibGUgc3RvcmFnZSBzZXJ2aWNlcyB3ZSB3aWxsIGZhbGxiYWNrIHRvXG4gICAgICAvLyBwYXRoIHN0eWxlIHJlcXVlc3RzLCB3aGVyZSBgYnVja2V0TmFtZWAgaXMgcGFydCBvZiB0aGUgVVJJXG4gICAgICAvLyBwYXRoLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtidWNrZXROYW1lfWBcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICAgIHBhdGggPSBgLyR7YnVja2V0TmFtZX0vJHtvYmplY3ROYW1lfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHBhdGggKz0gYD8ke3F1ZXJ5fWBcbiAgICB9XG4gICAgcmVxT3B0aW9ucy5oZWFkZXJzLmhvc3QgPSBob3N0XG4gICAgaWYgKChyZXFPcHRpb25zLnByb3RvY29sID09PSAnaHR0cDonICYmIHBvcnQgIT09IDgwKSB8fCAocmVxT3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgcG9ydCAhPT0gNDQzKSkge1xuICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzLmhvc3QgPSBgJHtob3N0fToke3BvcnR9YFxuICAgIH1cbiAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9IHRoaXMudXNlckFnZW50XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIC8vIGhhdmUgYWxsIGhlYWRlciBrZXlzIGluIGxvd2VyIGNhc2UgLSB0byBtYWtlIHNpZ25pbmcgZWFzeVxuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzW2sudG9Mb3dlckNhc2UoKV0gPSB2XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIGFueSByZXF1ZXN0IG9wdGlvbiBzcGVjaWZpZWQgaW4gbWluaW9DbGllbnQuc2V0UmVxdWVzdE9wdGlvbnMoKVxuICAgIHJlcU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnJlcU9wdGlvbnMsIHJlcU9wdGlvbnMpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVxT3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IF8ubWFwVmFsdWVzKF8ucGlja0J5KHJlcU9wdGlvbnMuaGVhZGVycywgaXNEZWZpbmVkKSwgKHYpID0+IHYudG9TdHJpbmcoKSksXG4gICAgICBob3N0LFxuICAgICAgcG9ydCxcbiAgICAgIHBhdGgsXG4gICAgfSBzYXRpc2ZpZXMgaHR0cHMuUmVxdWVzdE9wdGlvbnNcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRDcmVkZW50aWFsc1Byb3ZpZGVyKGNyZWRlbnRpYWxzUHJvdmlkZXI6IENyZWRlbnRpYWxQcm92aWRlcikge1xuICAgIGlmICghKGNyZWRlbnRpYWxzUHJvdmlkZXIgaW5zdGFuY2VvZiBDcmVkZW50aWFsUHJvdmlkZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgY3JlZGVudGlhbHMuIEV4cGVjdGVkIGluc3RhbmNlIG9mIENyZWRlbnRpYWxQcm92aWRlcicpXG4gICAgfVxuICAgIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciA9IGNyZWRlbnRpYWxzUHJvdmlkZXJcbiAgICBhd2FpdCB0aGlzLmNoZWNrQW5kUmVmcmVzaENyZWRzKClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKSB7XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHNQcm92aWRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbHNDb25mID0gYXdhaXQgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyLmdldENyZWRlbnRpYWxzKClcbiAgICAgICAgdGhpcy5hY2Nlc3NLZXkgPSBjcmVkZW50aWFsc0NvbmYuZ2V0QWNjZXNzS2V5KClcbiAgICAgICAgdGhpcy5zZWNyZXRLZXkgPSBjcmVkZW50aWFsc0NvbmYuZ2V0U2VjcmV0S2V5KClcbiAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBjcmVkZW50aWFsc0NvbmYuZ2V0U2Vzc2lvblRva2VuKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZ2V0IGNyZWRlbnRpYWxzOiAke2V9YCwgeyBjYXVzZTogZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nU3RyZWFtPzogc3RyZWFtLldyaXRhYmxlXG5cbiAgLyoqXG4gICAqIGxvZyB0aGUgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yXG4gICAqL1xuICBwcml2YXRlIGxvZ0hUVFAocmVxT3B0aW9uczogSVJlcXVlc3QsIHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSB8IG51bGwsIGVycj86IHVua25vd24pIHtcbiAgICAvLyBpZiBubyBsb2dTdHJlYW0gYXZhaWxhYmxlIHJldHVybi5cbiAgICBpZiAoIXRoaXMubG9nU3RyZWFtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChyZXFPcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxT3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlICYmICFpc1JlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzcG9uc2Ugc2hvdWxkIGJlIG9mIHR5cGUgXCJTdHJlYW1cIicpXG4gICAgfVxuICAgIGlmIChlcnIgJiYgIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VyciBzaG91bGQgYmUgb2YgdHlwZSBcIkVycm9yXCInKVxuICAgIH1cbiAgICBjb25zdCBsb2dTdHJlYW0gPSB0aGlzLmxvZ1N0cmVhbVxuICAgIGNvbnN0IGxvZ0hlYWRlcnMgPSAoaGVhZGVyczogUmVxdWVzdEhlYWRlcnMpID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBpZiAoayA9PSAnYXV0aG9yaXphdGlvbicpIHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmcodikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGFjdG9yID0gbmV3IFJlZ0V4cCgnU2lnbmF0dXJlPShbMC05YS1mXSspJylcbiAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocmVkYWN0b3IsICdTaWduYXR1cmU9KipSRURBQ1RFRCoqJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9nU3RyZWFtLndyaXRlKGAke2t9OiAke3Z9XFxuYClcbiAgICAgIH0pXG4gICAgICBsb2dTdHJlYW0ud3JpdGUoJ1xcbicpXG4gICAgfVxuICAgIGxvZ1N0cmVhbS53cml0ZShgUkVRVUVTVDogJHtyZXFPcHRpb25zLm1ldGhvZH0gJHtyZXFPcHRpb25zLnBhdGh9XFxuYClcbiAgICBsb2dIZWFkZXJzKHJlcU9wdGlvbnMuaGVhZGVycylcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMubG9nU3RyZWFtLndyaXRlKGBSRVNQT05TRTogJHtyZXNwb25zZS5zdGF0dXNDb2RlfVxcbmApXG4gICAgICBsb2dIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMgYXMgUmVxdWVzdEhlYWRlcnMpXG4gICAgfVxuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ1N0cmVhbS53cml0ZSgnRVJST1IgQk9EWTpcXG4nKVxuICAgICAgY29uc3QgZXJySlNPTiA9IEpTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgJ1xcdCcpXG4gICAgICBsb2dTdHJlYW0ud3JpdGUoYCR7ZXJySlNPTn1cXG5gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdHJhY2luZ1xuICAgKi9cbiAgcHVibGljIHRyYWNlT24oc3RyZWFtPzogc3RyZWFtLldyaXRhYmxlKSB7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHN0cmVhbSA9IHByb2Nlc3Muc3Rkb3V0XG4gICAgfVxuICAgIHRoaXMubG9nU3RyZWFtID0gc3RyZWFtXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSB0cmFjaW5nXG4gICAqL1xuICBwdWJsaWMgdHJhY2VPZmYoKSB7XG4gICAgdGhpcy5sb2dTdHJlYW0gPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlUmVxdWVzdCBpcyB0aGUgcHJpbWl0aXZlIHVzZWQgYnkgdGhlIGFwaXMgZm9yIG1ha2luZyBTMyByZXF1ZXN0cy5cbiAgICogcGF5bG9hZCBjYW4gYmUgZW1wdHkgc3RyaW5nIGluIGNhc2Ugb2Ygbm8gcGF5bG9hZC5cbiAgICogc3RhdHVzQ29kZSBpcyB0aGUgZXhwZWN0ZWQgc3RhdHVzQ29kZS4gSWYgcmVzcG9uc2Uuc3RhdHVzQ29kZSBkb2VzIG5vdCBtYXRjaFxuICAgKiB3ZSBwYXJzZSB0aGUgWE1MIGVycm9yIGFuZCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiBBIHZhbGlkIHJlZ2lvbiBpcyBwYXNzZWQgYnkgdGhlIGNhbGxzIC0gbGlzdEJ1Y2tldHMsIG1ha2VCdWNrZXQgYW5kIGdldEJ1Y2tldFJlZ2lvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBtYWtlUmVxdWVzdEFzeW5jKFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgcGF5bG9hZDogQmluYXJ5ID0gJycsXG4gICAgZXhwZWN0ZWRDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocGF5bG9hZCkgJiYgIWlzT2JqZWN0KHBheWxvYWQpKSB7XG4gICAgICAvLyBCdWZmZXIgaXMgb2YgdHlwZSAnb2JqZWN0J1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF5bG9hZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiIG9yIFwiQnVmZmVyXCInKVxuICAgIH1cbiAgICBleHBlY3RlZENvZGVzLmZvckVhY2goKHN0YXR1c0NvZGUpID0+IHtcbiAgICAgIGlmICghaXNOdW1iZXIoc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhdHVzQ29kZSBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICghaXNTdHJpbmcocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVnaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge31cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubWV0aG9kID09PSAnUE9TVCcgfHwgb3B0aW9ucy5tZXRob2QgPT09ICdQVVQnIHx8IG9wdGlvbnMubWV0aG9kID09PSAnREVMRVRFJykge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gcGF5bG9hZC5sZW5ndGgudG9TdHJpbmcoKVxuICAgIH1cbiAgICBjb25zdCBzaGEyNTZzdW0gPSB0aGlzLmVuYWJsZVNIQTI1NiA/IHRvU2hhMjU2KHBheWxvYWQpIDogJydcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdFN0cmVhbUFzeW5jKG9wdGlvbnMsIHBheWxvYWQsIHNoYTI1NnN1bSwgZXhwZWN0ZWRDb2RlcywgcmVnaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIG5ldyByZXF1ZXN0IHdpdGggcHJvbWlzZVxuICAgKlxuICAgKiBObyBuZWVkIHRvIGRyYWluIHJlc3BvbnNlLCByZXNwb25zZSBib2R5IGlzIG5vdCB2YWxpZFxuICAgKi9cbiAgYXN5bmMgbWFrZVJlcXVlc3RBc3luY09taXQoXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbixcbiAgICBwYXlsb2FkOiBCaW5hcnkgPSAnJyxcbiAgICBzdGF0dXNDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgKTogUHJvbWlzZTxPbWl0PGh0dHAuSW5jb21pbmdNZXNzYWdlLCAnb24nPj4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luYyhvcHRpb25zLCBwYXlsb2FkLCBzdGF0dXNDb2RlcywgcmVnaW9uKVxuICAgIGF3YWl0IGRyYWluUmVzcG9uc2UocmVzKVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlUmVxdWVzdFN0cmVhbSB3aWxsIGJlIHVzZWQgZGlyZWN0bHkgaW5zdGVhZCBvZiBtYWtlUmVxdWVzdCBpbiBjYXNlIHRoZSBwYXlsb2FkXG4gICAqIGlzIGF2YWlsYWJsZSBhcyBhIHN0cmVhbS4gZm9yIGV4LiBwdXRPYmplY3RcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBtYWtlUmVxdWVzdFN0cmVhbUFzeW5jKFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgYm9keTogc3RyZWFtLlJlYWRhYmxlIHwgQmluYXJ5LFxuICAgIHNoYTI1NnN1bTogc3RyaW5nLFxuICAgIHN0YXR1c0NvZGVzOiBudW1iZXJbXSxcbiAgICByZWdpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSB8fCB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHwgaXNSZWFkYWJsZVN0cmVhbShib2R5KSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBzdHJlYW0gc2hvdWxkIGJlIGEgQnVmZmVyLCBzdHJpbmcgb3IgcmVhZGFibGUgU3RyZWFtLCBnb3QgJHt0eXBlb2YgYm9keX0gaW5zdGVhZGAsXG4gICAgICApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc2hhMjU2c3VtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBzdGF0dXNDb2Rlcy5mb3JFYWNoKChzdGF0dXNDb2RlKSA9PiB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHN0YXR1c0NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXR1c0NvZGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoIWlzU3RyaW5nKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lvbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgLy8gc2hhMjU2c3VtIHdpbGwgYmUgZW1wdHkgZm9yIGFub255bW91cyBvciBodHRwcyByZXF1ZXN0c1xuICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYgJiYgc2hhMjU2c3VtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgc2hhMjU2c3VtIGV4cGVjdGVkIHRvIGJlIGVtcHR5IGZvciBhbm9ueW1vdXMgb3IgaHR0cHMgcmVxdWVzdHNgKVxuICAgIH1cbiAgICAvLyBzaGEyNTZzdW0gc2hvdWxkIGJlIHZhbGlkIGZvciBub24tYW5vbnltb3VzIGh0dHAgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU0hBMjU2ICYmIHNoYTI1NnN1bS5sZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHNoYTI1NnN1bSA6ICR7c2hhMjU2c3VtfWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIHJlZ2lvbiA9IHJlZ2lvbiB8fCAoYXdhaXQgdGhpcy5nZXRCdWNrZXRSZWdpb25Bc3luYyhvcHRpb25zLmJ1Y2tldE5hbWUhKSlcblxuICAgIGNvbnN0IHJlcU9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKHsgLi4ub3B0aW9ucywgcmVnaW9uIH0pXG4gICAgaWYgKCF0aGlzLmFub255bW91cykge1xuICAgICAgLy8gRm9yIG5vbi1hbm9ueW1vdXMgaHR0cHMgcmVxdWVzdHMgc2hhMjU2c3VtIGlzICdVTlNJR05FRC1QQVlMT0FEJyBmb3Igc2lnbmF0dXJlIGNhbGN1bGF0aW9uLlxuICAgICAgaWYgKCF0aGlzLmVuYWJsZVNIQTI1Nikge1xuICAgICAgICBzaGEyNTZzdW0gPSAnVU5TSUdORUQtUEFZTE9BRCdcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3gtYW16LWRhdGUnXSA9IG1ha2VEYXRlTG9uZyhkYXRlKVxuICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzWyd4LWFtei1jb250ZW50LXNoYTI1NiddID0gc2hhMjU2c3VtXG4gICAgICBpZiAodGhpcy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgcmVxT3B0aW9ucy5oZWFkZXJzWyd4LWFtei1zZWN1cml0eS10b2tlbiddID0gdGhpcy5zZXNzaW9uVG9rZW5cbiAgICAgIH1cbiAgICAgIHJlcU9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID0gc2lnblY0KHJlcU9wdGlvbnMsIHRoaXMuYWNjZXNzS2V5LCB0aGlzLnNlY3JldEtleSwgcmVnaW9uLCBkYXRlLCBzaGEyNTZzdW0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHRoaXMudHJhbnNwb3J0LCByZXFPcHRpb25zLCBib2R5KVxuICAgIGlmICghcmVzcG9uc2Uuc3RhdHVzQ29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQlVHOiByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBzdGF0dXNDb2RlXCIpXG4gICAgfVxuXG4gICAgaWYgKCFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXNDb2RlKSkge1xuICAgICAgLy8gRm9yIGFuIGluY29ycmVjdCByZWdpb24sIFMzIHNlcnZlciBhbHdheXMgc2VuZHMgYmFjayA0MDAuXG4gICAgICAvLyBCdXQgd2Ugd2lsbCBkbyBjYWNoZSBpbnZhbGlkYXRpb24gZm9yIGFsbCBlcnJvcnMgc28gdGhhdCxcbiAgICAgIC8vIGluIGZ1dHVyZSwgaWYgQVdTIFMzIGRlY2lkZXMgdG8gc2VuZCBhIGRpZmZlcmVudCBzdGF0dXMgY29kZSBvclxuICAgICAgLy8gWE1MIGVycm9yIGNvZGUgd2Ugd2lsbCBzdGlsbCB3b3JrIGZpbmUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgZGVsZXRlIHRoaXMucmVnaW9uTWFwW29wdGlvbnMuYnVja2V0TmFtZSFdXG5cbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHhtbFBhcnNlcnMucGFyc2VSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgICAgdGhpcy5sb2dIVFRQKHJlcU9wdGlvbnMsIHJlc3BvbnNlLCBlcnIpXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0hUVFAocmVxT3B0aW9ucywgcmVzcG9uc2UpXG5cbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRzIHRoZSByZWdpb24gb2YgdGhlIGJ1Y2tldFxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0TmFtZVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRCdWNrZXRSZWdpb25Bc3luYyhidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZSA6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cblxuICAgIC8vIFJlZ2lvbiBpcyBzZXQgd2l0aCBjb25zdHJ1Y3RvciwgcmV0dXJuIHRoZSByZWdpb24gcmlnaHQgaGVyZS5cbiAgICBpZiAodGhpcy5yZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lvblxuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhY3RSZWdpb25Bc3luYyA9IGFzeW5jIChyZXNwb25zZTogaHR0cC5JbmNvbWluZ01lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkQXNTdHJpbmcocmVzcG9uc2UpXG4gICAgICBjb25zdCByZWdpb24gPSB4bWxQYXJzZXJzLnBhcnNlQnVja2V0UmVnaW9uKGJvZHkpIHx8IERFRkFVTFRfUkVHSU9OXG4gICAgICB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSA9IHJlZ2lvblxuICAgICAgcmV0dXJuIHJlZ2lvblxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbG9jYXRpb24nXG4gICAgLy8gYGdldEJ1Y2tldExvY2F0aW9uYCBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGZvbGxvd2luZyB3YXlzIGZvclxuICAgIC8vIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4gICAgLy9cbiAgICAvLyAtIEZvciBub2RlanMgZW52IHdlIGRlZmF1bHQgdG8gcGF0aCBzdHlsZSByZXF1ZXN0cy5cbiAgICAvLyAtIEZvciBicm93c2VyIGVudiBwYXRoIHN0eWxlIHJlcXVlc3RzIG9uIGJ1Y2tldHMgeWllbGRzIENPUlNcbiAgICAvLyAgIGVycm9yLiBUbyBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSB3ZSBtYWtlIGEgdmlydHVhbCBob3N0XG4gICAgLy8gICBzdHlsZSByZXF1ZXN0IHNpZ25lZCB3aXRoICd1cy1lYXN0LTEnLiBUaGlzIHJlcXVlc3QgZmFpbHNcbiAgICAvLyAgIHdpdGggYW4gZXJyb3IgJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnLCBhZGRpdGlvbmFsbHlcbiAgICAvLyAgIHRoZSBlcnJvciBYTUwgYWxzbyBwcm92aWRlcyBSZWdpb24gb2YgdGhlIGJ1Y2tldC4gVG8gdmFsaWRhdGVcbiAgICAvLyAgIHRoaXMgcmVnaW9uIGlzIHByb3BlciB3ZSByZXRyeSB0aGUgc2FtZSByZXF1ZXN0IHdpdGggdGhlIG5ld2x5XG4gICAgLy8gICBvYnRhaW5lZCByZWdpb24uXG4gICAgY29uc3QgcGF0aFN0eWxlID0gdGhpcy5wYXRoU3R5bGUgJiYgIWlzQnJvd3NlclxuICAgIGxldCByZWdpb246IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBwYXRoU3R5bGUgfSwgJycsIFsyMDBdLCBERUZBVUxUX1JFR0lPTilcbiAgICAgIHJldHVybiBleHRyYWN0UmVnaW9uQXN5bmMocmVzKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICghKGUubmFtZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnKSkge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHdlIHNldCBleHRyYSBwcm9wZXJ0aWVzIG9uIGVycm9yIG9iamVjdFxuICAgICAgcmVnaW9uID0gZS5SZWdpb24gYXMgc3RyaW5nXG4gICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgcGF0aFN0eWxlIH0sICcnLCBbMjAwXSwgcmVnaW9uKVxuICAgIHJldHVybiBhd2FpdCBleHRyYWN0UmVnaW9uQXN5bmMocmVzKVxuICB9XG5cbiAgLyoqXG4gICAqIG1ha2VSZXF1ZXN0IGlzIHRoZSBwcmltaXRpdmUgdXNlZCBieSB0aGUgYXBpcyBmb3IgbWFraW5nIFMzIHJlcXVlc3RzLlxuICAgKiBwYXlsb2FkIGNhbiBiZSBlbXB0eSBzdHJpbmcgaW4gY2FzZSBvZiBubyBwYXlsb2FkLlxuICAgKiBzdGF0dXNDb2RlIGlzIHRoZSBleHBlY3RlZCBzdGF0dXNDb2RlLiBJZiByZXNwb25zZS5zdGF0dXNDb2RlIGRvZXMgbm90IG1hdGNoXG4gICAqIHdlIHBhcnNlIHRoZSBYTUwgZXJyb3IgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqIEEgdmFsaWQgcmVnaW9uIGlzIHBhc3NlZCBieSB0aGUgY2FsbHMgLSBsaXN0QnVja2V0cywgbWFrZUJ1Y2tldCBhbmRcbiAgICogZ2V0QnVja2V0UmVnaW9uLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYG1ha2VSZXF1ZXN0QXN5bmNgIGluc3RlYWRcbiAgICovXG4gIG1ha2VSZXF1ZXN0KFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb24sXG4gICAgcGF5bG9hZDogQmluYXJ5ID0gJycsXG4gICAgZXhwZWN0ZWRDb2RlczogbnVtYmVyW10gPSBbMjAwXSxcbiAgICByZWdpb24gPSAnJyxcbiAgICByZXR1cm5SZXNwb25zZTogYm9vbGVhbixcbiAgICBjYjogKGNiOiB1bmtub3duLCByZXN1bHQ6IGh0dHAuSW5jb21pbmdNZXNzYWdlKSA9PiB2b2lkLFxuICApIHtcbiAgICBsZXQgcHJvbTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT5cbiAgICBpZiAocmV0dXJuUmVzcG9uc2UpIHtcbiAgICAgIHByb20gPSB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMob3B0aW9ucywgcGF5bG9hZCwgZXhwZWN0ZWRDb2RlcywgcmVnaW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNvbXBhdGlibGUgZm9yIG9sZCBiZWhhdmlvdXJcbiAgICAgIHByb20gPSB0aGlzLm1ha2VSZXF1ZXN0QXN5bmNPbWl0KG9wdGlvbnMsIHBheWxvYWQsIGV4cGVjdGVkQ29kZXMsIHJlZ2lvbilcbiAgICB9XG5cbiAgICBwcm9tLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiBjYihudWxsLCByZXN1bHQpLFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2IoZXJyKVxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogbWFrZVJlcXVlc3RTdHJlYW0gd2lsbCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFrZVJlcXVlc3QgaW4gY2FzZSB0aGUgcGF5bG9hZFxuICAgKiBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0uIGZvciBleC4gcHV0T2JqZWN0XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgbWFrZVJlcXVlc3RTdHJlYW1Bc3luY2AgaW5zdGVhZFxuICAgKi9cbiAgbWFrZVJlcXVlc3RTdHJlYW0oXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbixcbiAgICBzdHJlYW06IHN0cmVhbS5SZWFkYWJsZSB8IEJ1ZmZlcixcbiAgICBzaGEyNTZzdW06IHN0cmluZyxcbiAgICBzdGF0dXNDb2RlczogbnVtYmVyW10sXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcmV0dXJuUmVzcG9uc2U6IGJvb2xlYW4sXG4gICAgY2I6IChjYjogdW5rbm93biwgcmVzdWx0OiBodHRwLkluY29taW5nTWVzc2FnZSkgPT4gdm9pZCxcbiAgKSB7XG4gICAgY29uc3QgZXhlY3V0b3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0U3RyZWFtQXN5bmMob3B0aW9ucywgc3RyZWFtLCBzaGEyNTZzdW0sIHN0YXR1c0NvZGVzLCByZWdpb24pXG4gICAgICBpZiAoIXJldHVyblJlc3BvbnNlKSB7XG4gICAgICAgIGF3YWl0IGRyYWluUmVzcG9uc2UocmVzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgZXhlY3V0b3IoKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4gY2IobnVsbCwgcmVzdWx0KSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChlcnIpID0+IGNiKGVyciksXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0QnVja2V0UmVnaW9uQXN5bmNgIGluc3RlYWRcbiAgICovXG4gIGdldEJ1Y2tldFJlZ2lvbihidWNrZXROYW1lOiBzdHJpbmcsIGNiOiAoZXJyOiB1bmtub3duLCByZWdpb246IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHJldHVybiB0aGlzLmdldEJ1Y2tldFJlZ2lvbkFzeW5jKGJ1Y2tldE5hbWUpLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiBjYihudWxsLCByZXN1bHQpLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKGVycikgPT4gY2IoZXJyKSxcbiAgICApXG4gIH1cblxuICBhc3luYyByZW1vdmVCdWNrZXQoYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcHJvbWlzZSBzdHlsZSBBUElcbiAgICovXG4gIHJlbW92ZUJ1Y2tldChidWNrZXROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBOb1Jlc3VsdENhbGxiYWNrKTogdm9pZFxuXG4gIGFzeW5jIHJlbW92ZUJ1Y2tldChidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUgfSwgJycsIFsyMDRdKVxuICAgIGRlbGV0ZSB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXQgaW5mb3JtYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIHN0YXRPYmplY3QoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHN0YXRPcHRzOiBTdGF0T2JqZWN0T3B0cyA9IHt9KTogUHJvbWlzZTxCdWNrZXRJdGVtU3RhdD4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChzdGF0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3N0YXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXMuc3RyaW5naWZ5KHN0YXRPcHRzKVxuICAgIGNvbnN0IG1ldGhvZCA9ICdIRUFEJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogcGFyc2VJbnQocmVzLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gYXMgc3RyaW5nKSxcbiAgICAgIG1ldGFEYXRhOiBleHRyYWN0TWV0YWRhdGEocmVzLmhlYWRlcnMgYXMgUmVzcG9uc2VIZWFkZXIpLFxuICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZShyZXMuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddIGFzIHN0cmluZyksXG4gICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXMuaGVhZGVycyBhcyBSZXNwb25zZUhlYWRlciksXG4gICAgICBldGFnOiBzYW5pdGl6ZUVUYWcocmVzLmhlYWRlcnMuZXRhZyksXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIG5ldyBwcm9taXNlIHN0eWxlIEFQSVxuICAgKi9cbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCByZW1vdmVPcHRzOiBSZW1vdmVPcHRpb25zLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBuZXcgcHJvbWlzZSBzdHlsZSBBUElcbiAgICovXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgYXN5bmMgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCByZW1vdmVPcHRzPzogUmVtb3ZlT3B0aW9ucyk6IFByb21pc2U8dm9pZD5cblxuICBhc3luYyByZW1vdmVPYmplY3QoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHJlbW92ZU9wdHM6IFJlbW92ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChyZW1vdmVPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncmVtb3ZlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuXG4gICAgY29uc3QgaGVhZGVyczogUmVxdWVzdEhlYWRlcnMgPSB7fVxuICAgIGlmIChyZW1vdmVPcHRzLmdvdmVybmFuY2VCeXBhc3MpIHtcbiAgICAgIGhlYWRlcnNbJ1gtQW16LUJ5cGFzcy1Hb3Zlcm5hbmNlLVJldGVudGlvbiddID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocmVtb3ZlT3B0cy5mb3JjZURlbGV0ZSkge1xuICAgICAgaGVhZGVyc1sneC1taW5pby1mb3JjZS1kZWxldGUnXSA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgaWYgKHJlbW92ZU9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeVBhcmFtcy52ZXJzaW9uSWQgPSBgJHtyZW1vdmVPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5ID0gcXMuc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gICAgYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jT21pdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycywgcXVlcnkgfSwgJycsIFsyMDAsIDIwNF0pXG4gIH1cblxuICAvLyBDYWxscyBpbXBsZW1lbnRlZCBiZWxvdyBhcmUgcmVsYXRlZCB0byBtdWx0aXBhcnQuXG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIGEgbmV3IG11bHRpcGFydCB1cGxvYWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGhlYWRlcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoJ2NvbnRlbnRUeXBlIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnUE9TVCdcbiAgICBjb25zdCBxdWVyeSA9ICd1cGxvYWRzJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luYyh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSlcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEFzQnVmZmVyKHJlcylcbiAgICByZXR1cm4gcGFyc2VJbml0aWF0ZU11bHRpcGFydChib2R5LnRvU3RyaW5nKCkpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgTWV0aG9kIHRvIGFib3J0IGEgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IGluIGNhc2Ugb2YgYW55IGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgLSBCdWNrZXQgTmFtZVxuICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIE9iamVjdCBOYW1lXG4gICAqIEBwYXJhbSB1cGxvYWRJZCAtIGlkIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCB0byBjYW5jZWwgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgYWJvcnRNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXBsb2FkSWR9YFxuXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZTogb2JqZWN0TmFtZSwgcXVlcnkgfVxuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQocmVxdWVzdE9wdGlvbnMsICcnLCBbMjA0XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFydC1pbmZvIG9mIGFsbCBwYXJ0cyBvZiBhbiBpbmNvbXBsZXRlIHVwbG9hZCBzcGVjaWZpZWQgYnkgdXBsb2FkSWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbGlzdFBhcnRzKGJ1Y2tldE5hbWU6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nKTogUHJvbWlzZTxVcGxvYWRlZFBhcnRbXT4ge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0czogVXBsb2FkZWRQYXJ0W10gPSBbXVxuICAgIGxldCBtYXJrZXIgPSAwXG4gICAgbGV0IHJlc3VsdFxuICAgIGRvIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIG1hcmtlcilcbiAgICAgIG1hcmtlciA9IHJlc3VsdC5tYXJrZXJcbiAgICAgIHBhcnRzLnB1c2goLi4ucmVzdWx0LnBhcnRzKVxuICAgIH0gd2hpbGUgKHJlc3VsdC5pc1RydW5jYXRlZClcblxuICAgIHJldHVybiBwYXJ0c1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSBsaXN0UGFydHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBwYXJ0LWluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZTogc3RyaW5nLCBvYmplY3ROYW1lOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcsIG1hcmtlcjogbnVtYmVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyh1cGxvYWRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKG1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hcmtlciBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICBsZXQgcXVlcnkgPSBgdXBsb2FkSWQ9JHt1cmlFc2NhcGUodXBsb2FkSWQpfWBcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBxdWVyeSArPSBgJnBhcnQtbnVtYmVyLW1hcmtlcj0ke21hcmtlcn1gXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG4gICAgcmV0dXJuIHhtbFBhcnNlcnMucGFyc2VMaXN0UGFydHMoYXdhaXQgcmVhZEFzU3RyaW5nKHJlcykpXG4gIH1cblxuICBhc3luYyBsaXN0QnVja2V0cygpOiBQcm9taXNlPEJ1Y2tldEl0ZW1Gcm9tTGlzdFtdPiB7XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBodHRwUmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kIH0sICcnLCBbMjAwXSwgREVGQVVMVF9SRUdJT04pXG4gICAgY29uc3QgeG1sUmVzdWx0ID0gYXdhaXQgcmVhZEFzU3RyaW5nKGh0dHBSZXMpXG4gICAgcmV0dXJuIHhtbFBhcnNlcnMucGFyc2VMaXN0QnVja2V0KHhtbFJlc3VsdClcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cbiAgcmVtb3ZlQnVja2V0UmVwbGljYXRpb24oYnVja2V0TmFtZTogc3RyaW5nLCBjYWxsYmFjazogTm9SZXN1bHRDYWxsYmFjayk6IHZvaWRcbiAgYXN5bmMgcmVtb3ZlQnVja2V0UmVwbGljYXRpb24oYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBjb25zdCBxdWVyeSA9ICdyZXBsaWNhdGlvbidcbiAgICBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0QXN5bmNPbWl0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMCwgMjA0XSwgJycpXG4gIH1cblxuICBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIHJlcGxpY2F0aW9uQ29uZmlnOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHMsIGNhbGxiYWNrOiBOb1Jlc3VsdENhbGxiYWNrKTogdm9pZFxuICBhc3luYyBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIHJlcGxpY2F0aW9uQ29uZmlnOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHMpOiBQcm9taXNlPHZvaWQ+XG4gIGFzeW5jIHNldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZywgcmVwbGljYXRpb25Db25maWc6IFJlcGxpY2F0aW9uQ29uZmlnT3B0cykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVwbGljYXRpb25Db25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXBsaWNhdGlvbkNvbmZpZyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5yb2xlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdSb2xlIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgICB9IGVsc2UgaWYgKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUgJiYgIWlzU3RyaW5nKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJvbGUnLCByZXBsaWNhdGlvbkNvbmZpZy5yb2xlKVxuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5ydWxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWluaW11bSBvbmUgcmVwbGljYXRpb24gcnVsZSBtdXN0IGJlIHNwZWNpZmllZCcpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByZXBsaWNhdGlvblBhcmFtc0NvbmZpZyA9IHtcbiAgICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBSb2xlOiByZXBsaWNhdGlvbkNvbmZpZy5yb2xlLFxuICAgICAgICBSdWxlOiByZXBsaWNhdGlvbkNvbmZpZy5ydWxlcyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuICAgIGNvbnN0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnKVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIGF3YWl0IHRoaXMubWFrZVJlcXVlc3RBc3luY09taXQoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQpXG4gIH1cblxuICBnZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBSZXN1bHRDYWxsYmFjazxSZXBsaWNhdGlvbkNvbmZpZz4pOiB2b2lkXG4gIGFzeW5jIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVwbGljYXRpb25Db25maWc+XG4gIGFzeW5jIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG5cbiAgICBjb25zdCBodHRwUmVzID0gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdEFzeW5jKHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMCwgMjA0XSlcbiAgICBjb25zdCB4bWxSZXN1bHQgPSBhd2FpdCByZWFkQXNTdHJpbmcoaHR0cFJlcylcbiAgICByZXR1cm4geG1sUGFyc2Vycy5wYXJzZVJlcGxpY2F0aW9uQ29uZmlnKHhtbFJlc3VsdClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEVBQUEsR0FBQUwsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLG1CQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFSLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxRQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxRQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxXQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxPQUFBLEdBQUFYLE9BQUE7QUF1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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiaHR0cHMiLCJfbG9kYXNoIiwiX0NyZWRlbnRpYWxQcm92aWRlciIsImVycm9ycyIsIl9oZWxwZXIiLCJfczNFbmRwb2ludHMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiUGFja2FnZSIsInZlcnNpb24iLCJyZXF1ZXN0T3B0aW9uUHJvcGVydGllcyIsIlR5cGVkQ2xpZW50IiwicGFydFNpemUiLCJtYXhpbXVtUGFydFNpemUiLCJtYXhPYmplY3RTaXplIiwiY29uc3RydWN0b3IiLCJwYXJhbXMiLCJzZWN1cmUiLCJ1bmRlZmluZWQiLCJFcnJvciIsInVzZVNTTCIsInBvcnQiLCJpc1ZhbGlkRW5kcG9pbnQiLCJlbmRQb2ludCIsIkludmFsaWRFbmRwb2ludEVycm9yIiwiaXNWYWxpZFBvcnQiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImlzQm9vbGVhbiIsInJlZ2lvbiIsImlzU3RyaW5nIiwiaG9zdCIsInRvTG93ZXJDYXNlIiwicHJvdG9jb2wiLCJ0cmFuc3BvcnQiLCJ0cmFuc3BvcnRBZ2VudCIsImdsb2JhbEFnZW50IiwiaXNPYmplY3QiLCJsaWJyYXJ5Q29tbWVudHMiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJhcmNoIiwibGlicmFyeUFnZW50IiwidXNlckFnZW50IiwicGF0aFN0eWxlIiwiYWNjZXNzS2V5Iiwic2VjcmV0S2V5Iiwic2Vzc2lvblRva2VuIiwiYW5vbnltb3VzIiwiY3JlZGVudGlhbHNQcm92aWRlciIsInJlZ2lvbk1hcCIsIm92ZXJSaWRlUGFydFNpemUiLCJlbmFibGVTSEEyNTYiLCJzM0FjY2VsZXJhdGVFbmRwb2ludCIsInJlcU9wdGlvbnMiLCJzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZSIsInNldFJlcXVlc3RPcHRpb25zIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJwaWNrIiwiZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsImlzRW1wdHkiLCJpbmNsdWRlcyIsImdldFJlcXVlc3RPcHRpb25zIiwib3B0cyIsIm1ldGhvZCIsImhlYWRlcnMiLCJxdWVyeSIsImFnZW50IiwidmlydHVhbEhvc3RTdHlsZSIsImlzVmlydHVhbEhvc3RTdHlsZSIsInBhdGgiLCJ1cmlSZXNvdXJjZUVzY2FwZSIsImlzQW1hem9uRW5kcG9pbnQiLCJhY2NlbGVyYXRlRW5kUG9pbnQiLCJnZXRTM0VuZHBvaW50IiwiayIsInYiLCJlbnRyaWVzIiwiYXNzaWduIiwibWFwVmFsdWVzIiwicGlja0J5IiwiaXNEZWZpbmVkIiwidG9TdHJpbmciLCJzZXRDcmVkZW50aWFsc1Byb3ZpZGVyIiwiQ3JlZGVudGlhbFByb3ZpZGVyIiwiY2hlY2tBbmRSZWZyZXNoQ3JlZHMiLCJjcmVkZW50aWFsc0NvbmYiLCJnZXRDcmVkZW50aWFscyIsImdldEFjY2Vzc0tleSIsImdldFNlY3JldEtleSIsImdldFNlc3Npb25Ub2tlbiIsImUiLCJjYXVzZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyJjbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdub2RlOmh0dHBzJ1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5cbmltcG9ydCB7IENyZWRlbnRpYWxQcm92aWRlciB9IGZyb20gJy4uL0NyZWRlbnRpYWxQcm92aWRlci50cydcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuLi9lcnJvcnMudHMnXG5pbXBvcnQge1xuICBpc0FtYXpvbkVuZHBvaW50LFxuICBpc0Jvb2xlYW4sXG4gIGlzRGVmaW5lZCxcbiAgaXNFbXB0eSxcbiAgaXNPYmplY3QsXG4gIGlzU3RyaW5nLFxuICBpc1ZhbGlkRW5kcG9pbnQsXG4gIGlzVmFsaWRQb3J0LFxuICBpc1ZpcnR1YWxIb3N0U3R5bGUsXG4gIHVyaVJlc291cmNlRXNjYXBlLFxufSBmcm9tICcuL2hlbHBlci50cydcbmltcG9ydCB0eXBlIHsgUmVnaW9uIH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgeyBnZXRTM0VuZHBvaW50IH0gZnJvbSAnLi9zMy1lbmRwb2ludHMudHMnXG5pbXBvcnQgdHlwZSB7IElSZXF1ZXN0LCBSZXF1ZXN0SGVhZGVycywgVHJhbnNwb3J0IH0gZnJvbSAnLi90eXBlLnRzJ1xuXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJ1bmRsZXIuXG5jb25zdCBQYWNrYWdlID0geyB2ZXJzaW9uOiBwcm9jZXNzLmVudi5NSU5JT19KU19QQUNLQUdFX1ZFUlNJT04gfHwgJ2RldmVsb3BtZW50JyB9XG5cbmNvbnN0IHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzID0gW1xuICAnYWdlbnQnLFxuICAnY2EnLFxuICAnY2VydCcsXG4gICdjaXBoZXJzJyxcbiAgJ2NsaWVudENlcnRFbmdpbmUnLFxuICAnY3JsJyxcbiAgJ2RocGFyYW0nLFxuICAnZWNkaEN1cnZlJyxcbiAgJ2ZhbWlseScsXG4gICdob25vckNpcGhlck9yZGVyJyxcbiAgJ2tleScsXG4gICdwYXNzcGhyYXNlJyxcbiAgJ3BmeCcsXG4gICdyZWplY3RVbmF1dGhvcml6ZWQnLFxuICAnc2VjdXJlT3B0aW9ucycsXG4gICdzZWN1cmVQcm90b2NvbCcsXG4gICdzZXJ2ZXJuYW1lJyxcbiAgJ3Nlc3Npb25JZENvbnRleHQnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICBlbmRQb2ludDogc3RyaW5nXG4gIGFjY2Vzc0tleTogc3RyaW5nXG4gIHNlY3JldEtleTogc3RyaW5nXG4gIHVzZVNTTD86IGJvb2xlYW5cbiAgcG9ydD86IG51bWJlclxuICByZWdpb24/OiBSZWdpb25cbiAgdHJhbnNwb3J0PzogVHJhbnNwb3J0XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBwYXJ0U2l6ZT86IG51bWJlclxuICBwYXRoU3R5bGU/OiBib29sZWFuXG4gIGNyZWRlbnRpYWxzUHJvdmlkZXI/OiBDcmVkZW50aWFsUHJvdmlkZXJcbiAgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgdHJhbnNwb3J0QWdlbnQ/OiBodHRwLkFnZW50XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb24gPSBQYXJ0aWFsPElSZXF1ZXN0PiAmIHtcbiAgbWV0aG9kOiBzdHJpbmdcbiAgYnVja2V0TmFtZT86IHN0cmluZ1xuICBvYmplY3ROYW1lPzogc3RyaW5nXG4gIHJlZ2lvbj86IHN0cmluZ1xuICBxdWVyeT86IHN0cmluZ1xuICBwYXRoU3R5bGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUeXBlZENsaWVudCB7XG4gIHByb3RlY3RlZCB0cmFuc3BvcnQ6IFRyYW5zcG9ydFxuICBwcm90ZWN0ZWQgaG9zdDogc3RyaW5nXG4gIHByb3RlY3RlZCBwb3J0OiBudW1iZXJcbiAgcHJvdGVjdGVkIHByb3RvY29sOiBzdHJpbmdcbiAgcHJvdGVjdGVkIGFjY2Vzc0tleTogc3RyaW5nXG4gIHByb3RlY3RlZCBzZWNyZXRLZXk6IHN0cmluZ1xuICBwcm90ZWN0ZWQgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIHByb3RlY3RlZCB1c2VyQWdlbnQ6IHN0cmluZ1xuICBwcm90ZWN0ZWQgYW5vbnltb3VzOiBib29sZWFuXG4gIHByb3RlY3RlZCBwYXRoU3R5bGU6IGJvb2xlYW5cbiAgcHJvdGVjdGVkIHJlZ2lvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaWMgcmVnaW9uPzogc3RyaW5nXG4gIHByb3RlY3RlZCBjcmVkZW50aWFsc1Byb3ZpZGVyPzogQ3JlZGVudGlhbFByb3ZpZGVyXG4gIHBhcnRTaXplOiBudW1iZXIgPSA2NCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBvdmVyUmlkZVBhcnRTaXplPzogYm9vbGVhblxuXG4gIHByb3RlY3RlZCBtYXhpbXVtUGFydFNpemUgPSA1ICogMTAyNCAqIDEwMjQgKiAxMDI0XG4gIHByb3RlY3RlZCBtYXhPYmplY3RTaXplID0gNSAqIDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjRcbiAgcHVibGljIGVuYWJsZVNIQTI1NjogYm9vbGVhblxuICBwcm90ZWN0ZWQgczNBY2NlbGVyYXRlRW5kcG9pbnQ/OiBzdHJpbmdcbiAgcHJvdGVjdGVkIHJlcU9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgcHJvdGVjdGVkIHRyYW5zcG9ydEFnZW50OiBodHRwLkFnZW50XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBDbGllbnRPcHRpb25zKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZXByZWNhdGVkIHByb3BlcnR5XG4gICAgaWYgKHBhcmFtcy5zZWN1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcInNlY3VyZVwiIG9wdGlvbiBkZXByZWNhdGVkLCBcInVzZVNTTFwiIHNob3VsZCBiZSB1c2VkIGluc3RlYWQnKVxuICAgIH1cbiAgICAvLyBEZWZhdWx0IHZhbHVlcyBpZiBub3Qgc3BlY2lmaWVkLlxuICAgIGlmIChwYXJhbXMudXNlU1NMID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VTU0wgPSB0cnVlXG4gICAgfVxuICAgIGlmICghcGFyYW1zLnBvcnQpIHtcbiAgICAgIHBhcmFtcy5wb3J0ID0gMFxuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBpbnB1dCBwYXJhbXMuXG4gICAgaWYgKCFpc1ZhbGlkRW5kcG9pbnQocGFyYW1zLmVuZFBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkRW5kcG9pbnRFcnJvcihgSW52YWxpZCBlbmRQb2ludCA6ICR7cGFyYW1zLmVuZFBvaW50fWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFBvcnQocGFyYW1zLnBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHBvcnQgOiAke3BhcmFtcy5wb3J0fWApXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHBhcmFtcy51c2VTU0wpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgSW52YWxpZCB1c2VTU0wgZmxhZyB0eXBlIDogJHtwYXJhbXMudXNlU1NMfSwgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBcImJvb2xlYW5cImAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmVnaW9uIG9ubHkgaWYgaXRzIHNldC5cbiAgICBpZiAocGFyYW1zLnJlZ2lvbikge1xuICAgICAgaWYgKCFpc1N0cmluZyhwYXJhbXMucmVnaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHJlZ2lvbiA6ICR7cGFyYW1zLnJlZ2lvbn1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZW5kUG9pbnQudG9Mb3dlckNhc2UoKVxuICAgIGxldCBwb3J0ID0gcGFyYW1zLnBvcnRcbiAgICBsZXQgcHJvdG9jb2w6IHN0cmluZ1xuICAgIGxldCB0cmFuc3BvcnRcbiAgICBsZXQgdHJhbnNwb3J0QWdlbnQ6IGh0dHAuQWdlbnRcbiAgICAvLyBWYWxpZGF0ZSBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCB1c2luZyBTU0xcbiAgICAvLyBmb3IgY29uc3RydWN0aW5nIHJlbGV2YW50IGVuZHBvaW50cy5cbiAgICBpZiAocGFyYW1zLnVzZVNTTCkge1xuICAgICAgLy8gRGVmYXVsdHMgdG8gc2VjdXJlLlxuICAgICAgdHJhbnNwb3J0ID0gaHR0cHNcbiAgICAgIHByb3RvY29sID0gJ2h0dHBzOidcbiAgICAgIHBvcnQgPSBwb3J0IHx8IDQ0M1xuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBodHRwcy5nbG9iYWxBZ2VudFxuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc3BvcnQgPSBodHRwXG4gICAgICBwcm90b2NvbCA9ICdodHRwOidcbiAgICAgIHBvcnQgPSBwb3J0IHx8IDgwXG4gICAgICB0cmFuc3BvcnRBZ2VudCA9IGh0dHAuZ2xvYmFsQWdlbnRcbiAgICB9XG5cbiAgICAvLyBpZiBjdXN0b20gdHJhbnNwb3J0IGlzIHNldCwgdXNlIGl0LlxuICAgIGlmIChwYXJhbXMudHJhbnNwb3J0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHBhcmFtcy50cmFuc3BvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdHJhbnNwb3J0IHR5cGUgOiAke3BhcmFtcy50cmFuc3BvcnR9LCBleHBlY3RlZCB0byBiZSB0eXBlIFwib2JqZWN0XCJgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0cmFuc3BvcnQgPSBwYXJhbXMudHJhbnNwb3J0XG4gICAgfVxuXG4gICAgLy8gaWYgY3VzdG9tIHRyYW5zcG9ydCBhZ2VudCBpcyBzZXQsIHVzZSBpdC5cbiAgICBpZiAocGFyYW1zLnRyYW5zcG9ydEFnZW50KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHBhcmFtcy50cmFuc3BvcnRBZ2VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB0cmFuc3BvcnRBZ2VudCB0eXBlOiAke3BhcmFtcy50cmFuc3BvcnRBZ2VudH0sIGV4cGVjdGVkIHRvIGJlIHR5cGUgXCJvYmplY3RcImAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdHJhbnNwb3J0QWdlbnQgPSBwYXJhbXMudHJhbnNwb3J0QWdlbnRcbiAgICB9XG5cbiAgICAvLyBVc2VyIEFnZW50IHNob3VsZCBhbHdheXMgZm9sbG93aW5nIHRoZSBiZWxvdyBzdHlsZS5cbiAgICAvLyBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSB0byBkaXNjdXNzIGFueSBuZXcgY2hhbmdlcyBoZXJlLlxuICAgIC8vXG4gICAgLy8gICAgICAgTWluSU8gKE9TOyBBUkNIKSBMSUIvVkVSIEFQUC9WRVJcbiAgICAvL1xuICAgIGNvbnN0IGxpYnJhcnlDb21tZW50cyA9IGAoJHtwcm9jZXNzLnBsYXRmb3JtfTsgJHtwcm9jZXNzLmFyY2h9KWBcbiAgICBjb25zdCBsaWJyYXJ5QWdlbnQgPSBgTWluSU8gJHtsaWJyYXJ5Q29tbWVudHN9IG1pbmlvLWpzLyR7UGFja2FnZS52ZXJzaW9ufWBcbiAgICAvLyBVc2VyIGFnZW50IGJsb2NrIGVuZHMuXG5cbiAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydFxuICAgIHRoaXMudHJhbnNwb3J0QWdlbnQgPSB0cmFuc3BvcnRBZ2VudFxuICAgIHRoaXMuaG9zdCA9IGhvc3RcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sXG4gICAgdGhpcy51c2VyQWdlbnQgPSBgJHtsaWJyYXJ5QWdlbnR9YFxuXG4gICAgLy8gRGVmYXVsdCBwYXRoIHN0eWxlIGlzIHRydWVcbiAgICBpZiAocGFyYW1zLnBhdGhTdHlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGhTdHlsZSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXRoU3R5bGUgPSBwYXJhbXMucGF0aFN0eWxlXG4gICAgfVxuXG4gICAgdGhpcy5hY2Nlc3NLZXkgPSBwYXJhbXMuYWNjZXNzS2V5ID8/ICcnXG4gICAgdGhpcy5zZWNyZXRLZXkgPSBwYXJhbXMuc2VjcmV0S2V5ID8/ICcnXG4gICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBwYXJhbXMuc2Vzc2lvblRva2VuXG4gICAgdGhpcy5hbm9ueW1vdXMgPSAhdGhpcy5hY2Nlc3NLZXkgfHwgIXRoaXMuc2VjcmV0S2V5XG5cbiAgICBpZiAocGFyYW1zLmNyZWRlbnRpYWxzUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbHNQcm92aWRlciA9IHBhcmFtcy5jcmVkZW50aWFsc1Byb3ZpZGVyXG4gICAgfVxuXG4gICAgdGhpcy5yZWdpb25NYXAgPSB7fVxuICAgIGlmIChwYXJhbXMucmVnaW9uKSB7XG4gICAgICB0aGlzLnJlZ2lvbiA9IHBhcmFtcy5yZWdpb25cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBhcnRTaXplKSB7XG4gICAgICB0aGlzLnBhcnRTaXplID0gcGFyYW1zLnBhcnRTaXplXG4gICAgICB0aGlzLm92ZXJSaWRlUGFydFNpemUgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnRTaXplIDwgNSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBQYXJ0IHNpemUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiA1TUJgKVxuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0U2l6ZSA+IDUgKiAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFBhcnQgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDVHQmApXG4gICAgfVxuXG4gICAgLy8gU0hBMjU2IGlzIGVuYWJsZWQgb25seSBmb3IgYXV0aGVudGljYXRlZCBodHRwIHJlcXVlc3RzLiBJZiB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIGlzIGh0dHBzIHdlIHVzZSB4LWFtei1jb250ZW50LXNoYTI1Nj1VTlNJR05FRC1QQVlMT0FEXG4gICAgLy8gaGVhZGVyIGZvciBzaWduYXR1cmUgY2FsY3VsYXRpb24uXG4gICAgdGhpcy5lbmFibGVTSEEyNTYgPSAhdGhpcy5hbm9ueW1vdXMgJiYgIXBhcmFtcy51c2VTU0xcblxuICAgIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnQgPSBwYXJhbXMuczNBY2NlbGVyYXRlRW5kcG9pbnQgfHwgdW5kZWZpbmVkXG4gICAgdGhpcy5yZXFPcHRpb25zID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZW5kUG9pbnQgLSB2YWxpZCBTMyBhY2NlbGVyYXRpb24gZW5kIHBvaW50XG4gICAqL1xuICBzZXRTM1RyYW5zZmVyQWNjZWxlcmF0ZShlbmRQb2ludDogc3RyaW5nKSB7XG4gICAgdGhpcy5zM0FjY2VsZXJhdGVFbmRwb2ludCA9IGVuZFBvaW50XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3VwcG9ydGVkIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zOiBQaWNrPGh0dHBzLlJlcXVlc3RPcHRpb25zLCAodHlwZW9mIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVtudW1iZXJdPikge1xuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcXVlc3Qgb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgdGhpcy5yZXFPcHRpb25zID0gXy5waWNrKG9wdGlvbnMsIHJlcXVlc3RPcHRpb25Qcm9wZXJ0aWVzKVxuICB9XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIHMzIFNwZWNpZmljIGFuZCBkb2VzIG5vdCBob2xkIHZhbGlkaXR5IGluIGFueSBvdGhlciBPYmplY3Qgc3RvcmFnZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZT86IHN0cmluZywgb2JqZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmICghaXNFbXB0eSh0aGlzLnMzQWNjZWxlcmF0ZUVuZHBvaW50KSAmJiAhaXNFbXB0eShidWNrZXROYW1lKSAmJiAhaXNFbXB0eShvYmplY3ROYW1lKSkge1xuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2ZlciBhY2NlbGVyYXRpb24gZm9yIG5vbi1jb21wbGlhbnQgYnVja2V0IG5hbWVzLlxuICAgICAgaWYgKGJ1Y2tldE5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBub24gY29tcGxpYW50IGJ1Y2tldDoke2J1Y2tldE5hbWV9YClcbiAgICAgIH1cbiAgICAgIC8vIElmIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBpcyByZXF1ZXN0ZWQgc2V0IG5ldyBob3N0LlxuICAgICAgLy8gRm9yIG1vcmUgZGV0YWlscyBhYm91dCBlbmFibGluZyB0cmFuc2ZlciBhY2NlbGVyYXRpb24gcmVhZCBoZXJlLlxuICAgICAgLy8gaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxuICAgICAgcmV0dXJuIHRoaXMuczNBY2NlbGVyYXRlRW5kcG9pbnRcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggaHR0cC5yZXF1ZXN0KClcbiAgICogVGFrZXMgY2FyZSBvZiBjb25zdHJ1Y3RpbmcgdmlydHVhbC1ob3N0LXN0eWxlIG9yIHBhdGgtc3R5bGUgaG9zdG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0T3B0aW9ucyhvcHRzOiBSZXF1ZXN0T3B0aW9uKTogSVJlcXVlc3QgJiB7IGhvc3Q6IHN0cmluZzsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgICBjb25zdCBtZXRob2QgPSBvcHRzLm1ldGhvZFxuICAgIGNvbnN0IHJlZ2lvbiA9IG9wdHMucmVnaW9uXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IG9wdHMuYnVja2V0TmFtZVxuICAgIGxldCBvYmplY3ROYW1lID0gb3B0cy5vYmplY3ROYW1lXG4gICAgY29uc3QgaGVhZGVycyA9IG9wdHMuaGVhZGVyc1xuICAgIGNvbnN0IHF1ZXJ5ID0gb3B0cy5xdWVyeVxuXG4gICAgbGV0IHJlcU9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBoZWFkZXJzOiB7fSBhcyBSZXF1ZXN0SGVhZGVycyxcbiAgICAgIHByb3RvY29sOiB0aGlzLnByb3RvY29sLFxuICAgICAgLy8gSWYgY3VzdG9tIHRyYW5zcG9ydEFnZW50IHdhcyBzdXBwbGllZCBlYXJsaWVyLCB3ZSdsbCBpbmplY3QgaXQgaGVyZVxuICAgICAgYWdlbnQ6IHRoaXMudHJhbnNwb3J0QWdlbnQsXG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IGlmIHZpcnR1YWwgaG9zdCBzdXBwb3J0ZWQuXG4gICAgbGV0IHZpcnR1YWxIb3N0U3R5bGVcbiAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgdmlydHVhbEhvc3RTdHlsZSA9IGlzVmlydHVhbEhvc3RTdHlsZSh0aGlzLmhvc3QsIHRoaXMucHJvdG9jb2wsIGJ1Y2tldE5hbWUsIHRoaXMucGF0aFN0eWxlKVxuICAgIH1cblxuICAgIGxldCBwYXRoID0gJy8nXG4gICAgbGV0IGhvc3QgPSB0aGlzLmhvc3RcblxuICAgIGxldCBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXJcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBwb3J0ID0gdGhpcy5wb3J0XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIG9iamVjdE5hbWUgPSB1cmlSZXNvdXJjZUVzY2FwZShvYmplY3ROYW1lKVxuICAgIH1cblxuICAgIC8vIEZvciBBbWF6b24gUzMgZW5kcG9pbnQsIGdldCBlbmRwb2ludCBiYXNlZCBvbiByZWdpb24uXG4gICAgaWYgKGlzQW1hem9uRW5kcG9pbnQoaG9zdCkpIHtcbiAgICAgIGNvbnN0IGFjY2VsZXJhdGVFbmRQb2ludCA9IHRoaXMuZ2V0QWNjZWxlcmF0ZUVuZFBvaW50SWZTZXQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSlcbiAgICAgIGlmIChhY2NlbGVyYXRlRW5kUG9pbnQpIHtcbiAgICAgICAgaG9zdCA9IGAke2FjY2VsZXJhdGVFbmRQb2ludH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBob3N0ID0gZ2V0UzNFbmRwb2ludChyZWdpb24hKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aXJ0dWFsSG9zdFN0eWxlICYmICFvcHRzLnBhdGhTdHlsZSkge1xuICAgICAgLy8gRm9yIGFsbCBob3N0cyB3aGljaCBzdXBwb3J0IHZpcnR1YWwgaG9zdCBzdHlsZSwgYGJ1Y2tldE5hbWVgXG4gICAgICAvLyBpcyBwYXJ0IG9mIHRoZSBob3N0bmFtZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICAgIC8vXG4gICAgICAvLyAgdmFyIGhvc3QgPSAnYnVja2V0TmFtZS5leGFtcGxlLmNvbSdcbiAgICAgIC8vXG4gICAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgICBob3N0ID0gYCR7YnVja2V0TmFtZX0uJHtob3N0fWBcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICAgIHBhdGggPSBgLyR7b2JqZWN0TmFtZX1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgUzMgY29tcGF0aWJsZSBzdG9yYWdlIHNlcnZpY2VzIHdlIHdpbGwgZmFsbGJhY2sgdG9cbiAgICAgIC8vIHBhdGggc3R5bGUgcmVxdWVzdHMsIHdoZXJlIGBidWNrZXROYW1lYCBpcyBwYXJ0IG9mIHRoZSBVUklcbiAgICAgIC8vIHBhdGguXG4gICAgICBpZiAoYnVja2V0TmFtZSkge1xuICAgICAgICBwYXRoID0gYC8ke2J1Y2tldE5hbWV9YFxuICAgICAgfVxuICAgICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtidWNrZXROYW1lfS8ke29iamVjdE5hbWV9YFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcGF0aCArPSBgPyR7cXVlcnl9YFxuICAgIH1cbiAgICByZXFPcHRpb25zLmhlYWRlcnMuaG9zdCA9IGhvc3RcbiAgICBpZiAoKHJlcU9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwOicgJiYgcG9ydCAhPT0gODApIHx8IChyZXFPcHRpb25zLnByb3RvY29sID09PSAnaHR0cHM6JyAmJiBwb3J0ICE9PSA0NDMpKSB7XG4gICAgICByZXFPcHRpb25zLmhlYWRlcnMuaG9zdCA9IGAke2hvc3R9OiR7cG9ydH1gXG4gICAgfVxuICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sndXNlci1hZ2VudCddID0gdGhpcy51c2VyQWdlbnRcbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgLy8gaGF2ZSBhbGwgaGVhZGVyIGtleXMgaW4gbG93ZXIgY2FzZSAtIHRvIG1ha2Ugc2lnbmluZyBlYXN5XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgICAgICByZXFPcHRpb25zLmhlYWRlcnNbay50b0xvd2VyQ2FzZSgpXSA9IHZcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgYW55IHJlcXVlc3Qgb3B0aW9uIHNwZWNpZmllZCBpbiBtaW5pb0NsaWVudC5zZXRSZXF1ZXN0T3B0aW9ucygpXG4gICAgcmVxT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVxT3B0aW9ucywgcmVxT3B0aW9ucylcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXFPcHRpb25zLFxuICAgICAgaGVhZGVyczogXy5tYXBWYWx1ZXMoXy5waWNrQnkocmVxT3B0aW9ucy5oZWFkZXJzLCBpc0RlZmluZWQpLCAodikgPT4gdi50b1N0cmluZygpKSxcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgcGF0aCxcbiAgICB9IHNhdGlzZmllcyBodHRwcy5SZXF1ZXN0T3B0aW9uc1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzUHJvdmlkZXIoY3JlZGVudGlhbHNQcm92aWRlcjogQ3JlZGVudGlhbFByb3ZpZGVyKSB7XG4gICAgaWYgKCEoY3JlZGVudGlhbHNQcm92aWRlciBpbnN0YW5jZW9mIENyZWRlbnRpYWxQcm92aWRlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBjcmVkZW50aWFscy4gRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgQ3JlZGVudGlhbFByb3ZpZGVyJylcbiAgICB9XG4gICAgdGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyID0gY3JlZGVudGlhbHNQcm92aWRlclxuICAgIGF3YWl0IHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0FuZFJlZnJlc2hDcmVkcygpIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFsc1Byb3ZpZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVkZW50aWFsc0NvbmYgPSBhd2FpdCB0aGlzLmNyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgICB0aGlzLmFjY2Vzc0tleSA9IGNyZWRlbnRpYWxzQ29uZi5nZXRBY2Nlc3NLZXkoKVxuICAgICAgICB0aGlzLnNlY3JldEtleSA9IGNyZWRlbnRpYWxzQ29uZi5nZXRTZWNyZXRLZXkoKVxuICAgICAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IGNyZWRlbnRpYWxzQ29uZi5nZXRTZXNzaW9uVG9rZW4oKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgY3Jl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 /***/ }), @@ -77650,135 +80418,6 @@ exports.CopyConditions = CopyConditions; /***/ }), -/***/ 1159: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var stream = _interopRequireWildcard(__nccwpck_require__(2781), true); -var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helper = __nccwpck_require__(9921); -var _response = __nccwpck_require__(2644); -var _xmlParser = __nccwpck_require__(4040); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -/* - * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class Extensions { - constructor(client) { - this.client = client; - } - - /** - * List the objects in the bucket using S3 ListObjects V2 With Metadata - * - * @param bucketName - name of the bucket - * @param prefix - the prefix of the objects that should be listed (optional, default `''`) - * @param recursive - `true` indicates recursive style listing and `false` indicates directory style listing delimited by '/'. (optional, default `false`) - * @param startAfter - Specifies the key to start after when listing objects in a bucket. (optional, default `''`) - * @returns stream emitting the objects in the bucket, the object is of the format: - */ - listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter) { - if (prefix === undefined) { - prefix = ''; - } - if (recursive === undefined) { - recursive = false; - } - if (startAfter === undefined) { - startAfter = ''; - } - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); - } - if (!(0, _helper.isValidPrefix)(prefix)) { - throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`); - } - if (!(0, _helper.isString)(prefix)) { - throw new TypeError('prefix should be of type "string"'); - } - if (!(0, _helper.isBoolean)(recursive)) { - throw new TypeError('recursive should be of type "boolean"'); - } - if (!(0, _helper.isString)(startAfter)) { - throw new TypeError('startAfter should be of type "string"'); - } - - // if recursive is false set delimiter to '/' - const delimiter = recursive ? '' : '/'; - return stream.Readable.from(this.listObjectsV2WithMetadataGen(bucketName, prefix, delimiter, startAfter), { - objectMode: true - }); - } - async *listObjectsV2WithMetadataGen(bucketName, prefix, delimiter, startAfter) { - let ended = false; - let continuationToken = ''; - do { - const result = await this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, startAfter); - ended = !result.isTruncated; - continuationToken = result.nextContinuationToken; - for (const obj of result.objects) { - yield obj; - } - } while (!ended); - } - async listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, startAfter) { - const queries = []; - - // Call for listing objects v2 API - queries.push(`list-type=2`); - queries.push(`encoding-type=url`); - // escape every value in query string, except maxKeys - queries.push(`prefix=${(0, _helper.uriEscape)(prefix)}`); - queries.push(`delimiter=${(0, _helper.uriEscape)(delimiter)}`); - queries.push(`metadata=true`); - if (continuationToken) { - continuationToken = (0, _helper.uriEscape)(continuationToken); - queries.push(`continuation-token=${continuationToken}`); - } - // Set start-after - if (startAfter) { - startAfter = (0, _helper.uriEscape)(startAfter); - queries.push(`start-after=${startAfter}`); - } - queries.push(`max-keys=1000`); - queries.sort(); - let query = ''; - if (queries.length > 0) { - query = `${queries.join('&')}`; - } - const method = 'GET'; - const res = await this.client.makeRequestAsync({ - method, - bucketName, - query - }); - return (0, _xmlParser.parseListObjectsV2WithMetadata)(await (0, _response.readAsString)(res)); - } -} -exports.Extensions = Extensions; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHJlYW0iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaGVscGVyIiwiX3Jlc3BvbnNlIiwiX3htbFBhcnNlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJFeHRlbnNpb25zIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIiwiYnVja2V0TmFtZSIsInByZWZpeCIsInJlY3Vyc2l2ZSIsInN0YXJ0QWZ0ZXIiLCJ1bmRlZmluZWQiLCJpc1ZhbGlkQnVja2V0TmFtZSIsIkludmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkUHJlZml4IiwiSW52YWxpZFByZWZpeEVycm9yIiwiaXNTdHJpbmciLCJUeXBlRXJyb3IiLCJpc0Jvb2xlYW4iLCJkZWxpbWl0ZXIiLCJSZWFkYWJsZSIsImZyb20iLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhR2VuIiwib2JqZWN0TW9kZSIsImVuZGVkIiwiY29udGludWF0aW9uVG9rZW4iLCJyZXN1bHQiLCJsaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhUXVlcnkiLCJpc1RydW5jYXRlZCIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsIm9iamVjdHMiLCJxdWVyaWVzIiwicHVzaCIsInVyaUVzY2FwZSIsInNvcnQiLCJxdWVyeSIsImxlbmd0aCIsImpvaW4iLCJtZXRob2QiLCJyZXMiLCJtYWtlUmVxdWVzdEFzeW5jIiwicGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIiwicmVhZEFzU3RyaW5nIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbImV4dGVuc2lvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMjAgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgc3RyZWFtIGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi4vZXJyb3JzLnRzJ1xuaW1wb3J0IHR5cGUgeyBUeXBlZENsaWVudCB9IGZyb20gJy4vY2xpZW50LnRzJ1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc1N0cmluZywgaXNWYWxpZEJ1Y2tldE5hbWUsIGlzVmFsaWRQcmVmaXgsIHVyaUVzY2FwZSB9IGZyb20gJy4vaGVscGVyLnRzJ1xuaW1wb3J0IHsgcmVhZEFzU3RyaW5nIH0gZnJvbSAnLi9yZXNwb25zZS50cydcbmltcG9ydCB0eXBlIHsgQnVja2V0SXRlbVdpdGhNZXRhZGF0YSwgQnVja2V0U3RyZWFtIH0gZnJvbSAnLi90eXBlLnRzJ1xuaW1wb3J0IHsgcGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhIH0gZnJvbSAnLi94bWwtcGFyc2VyLnRzJ1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBUeXBlZENsaWVudCkge31cblxuICAvKipcbiAgICogTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHVzaW5nIFMzIExpc3RPYmplY3RzIFYyIFdpdGggTWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgLSBuYW1lIG9mIHRoZSBidWNrZXRcbiAgICogQHBhcmFtIHByZWZpeCAtIHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAgKiBAcGFyYW0gcmVjdXJzaXZlIC0gYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gICAqIEBwYXJhbSBzdGFydEFmdGVyIC0gU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAgKiBAcmV0dXJucyBzdHJlYW0gZW1pdHRpbmcgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCwgdGhlIG9iamVjdCBpcyBvZiB0aGUgZm9ybWF0OlxuICAgKi9cbiAgcHVibGljIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEoXG4gICAgYnVja2V0TmFtZTogc3RyaW5nLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgICByZWN1cnNpdmU/OiBib29sZWFuLFxuICAgIHN0YXJ0QWZ0ZXI/OiBzdHJpbmcsXG4gICk6IEJ1Y2tldFN0cmVhbTxCdWNrZXRJdGVtV2l0aE1ldGFkYXRhPiB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGFydEFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSAnJ1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkUHJlZml4RXJyb3IoYEludmFsaWQgcHJlZml4IDogJHtwcmVmaXh9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuXG4gICAgLy8gaWYgcmVjdXJzaXZlIGlzIGZhbHNlIHNldCBkZWxpbWl0ZXIgdG8gJy8nXG4gICAgY29uc3QgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICByZXR1cm4gc3RyZWFtLlJlYWRhYmxlLmZyb20odGhpcy5saXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhR2VuKGJ1Y2tldE5hbWUsIHByZWZpeCwgZGVsaW1pdGVyLCBzdGFydEFmdGVyKSwge1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyAqbGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YUdlbihcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyOiBzdHJpbmcsXG4gICAgc3RhcnRBZnRlcjogc3RyaW5nLFxuICApOiBBc3luY0l0ZXJhYmxlPEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGE+IHtcbiAgICBsZXQgZW5kZWQgPSBmYWxzZVxuICAgIGxldCBjb250aW51YXRpb25Ub2tlbiA9ICcnXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhUXVlcnkoXG4gICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgY29udGludWF0aW9uVG9rZW4sXG4gICAgICAgIGRlbGltaXRlcixcbiAgICAgICAgc3RhcnRBZnRlcixcbiAgICAgIClcbiAgICAgIGVuZGVkID0gIXJlc3VsdC5pc1RydW5jYXRlZFxuICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICBmb3IgKGNvbnN0IG9iaiBvZiByZXN1bHQub2JqZWN0cykge1xuICAgICAgICB5aWVsZCBvYmpcbiAgICAgIH1cbiAgICB9IHdoaWxlICghZW5kZWQpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFRdWVyeShcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgY29udGludWF0aW9uVG9rZW46IHN0cmluZyxcbiAgICBkZWxpbWl0ZXI6IHN0cmluZyxcbiAgICBzdGFydEFmdGVyOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYG1ldGFkYXRhPXRydWVgKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9MTAwMGApXG4gICAgcXVlcmllcy5zb3J0KClcbiAgICBsZXQgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0QXN5bmMoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0pXG4gICAgcmV0dXJuIHBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YShhd2FpdCByZWFkQXNTdHJpbmcocmVzKSlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxNQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFBZ0UsU0FBQUsseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQVAsd0JBQUFXLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FBQVIsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBTyxL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 - -/***/ }), - /***/ 9921: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -77827,7 +80466,6 @@ exports.probeContentType = probeContentType; exports.readableStream = readableStream; exports.sanitizeETag = sanitizeETag; exports.sanitizeObjectKey = sanitizeObjectKey; -exports.sanitizeSize = sanitizeSize; exports.toArray = toArray; exports.toMd5 = toMd5; exports.toSha256 = toSha256; @@ -77838,7 +80476,7 @@ var stream = _interopRequireWildcard(__nccwpck_require__(2781), true); var _fastXmlParser = __nccwpck_require__(2603); var _ipaddr = __nccwpck_require__(7263); var _lodash = __nccwpck_require__(250); -var mime = _interopRequireWildcard(__nccwpck_require__(3583), true); +var mime = _interopRequireWildcard(__nccwpck_require__(7920), true); var _type = __nccwpck_require__(7293); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -78249,9 +80887,6 @@ function sanitizeObjectKey(objectName) { const asStrName = (objectName ? objectName.toString() : '').replace(/\+/g, ' '); return decodeURIComponent(asStrName); } -function sanitizeSize(size) { - return size ? Number.parseInt(size) : undefined; -} const PART_CONSTRAINTS = { // absMinPartSize - absolute minimum part size (5 MiB) ABS_MIN_PART_SIZE: 1024 * 1024 * 5, @@ -78356,7 +80991,7 @@ function parseXml(xml) { } return result; } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJzdHJlYW0iLCJfZmFzdFhtbFBhcnNlciIsIl9pcGFkZHIiLCJfbG9kYXNoIiwibWltZSIsIl90eXBlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk1ldGFEYXRhSGVhZGVyUHJlZml4IiwidXJpRXNjYXBlIiwic3RyaW5nIiwic3BsaXQiLCJyZWR1Y2UiLCJhY2MiLCJlbGVtIiwiYnVmIiwiQnVmZmVyIiwiZnJvbSIsImxlbmd0aCIsImNoYXIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwidXJpUmVzb3VyY2VFc2NhcGUiLCJyZXBsYWNlIiwiZ2V0U2NvcGUiLCJyZWdpb24iLCJkYXRlIiwic2VydmljZU5hbWUiLCJtYWtlRGF0ZVNob3J0IiwiaXNBbWF6b25FbmRwb2ludCIsImVuZHBvaW50IiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicHJvdG9jb2wiLCJidWNrZXQiLCJwYXRoU3R5bGUiLCJpbmNsdWRlcyIsImlzVmFsaWRJUCIsImlwIiwiaXBhZGRyIiwiaXNWYWxpZCIsImlzVmFsaWRFbmRwb2ludCIsImlzVmFsaWREb21haW4iLCJob3N0IiwiaXNTdHJpbmciLCJzbGljZSIsImFscGhhTnVtZXJpY3MiLCJwcm9iZUNvbnRlbnRUeXBlIiwicGF0aCIsImNvbnRlbnRUeXBlIiwibG9va3VwIiwiaXNWYWxpZFBvcnQiLCJwb3J0IiwiaXNOdW1iZXIiLCJpc1ZhbGlkQnVja2V0TmFtZSIsInRlc3QiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIm9iamVjdE5hbWUiLCJpc1ZhbGlkUHJlZml4IiwicHJlZml4IiwiYXJnIiwiaXNGdW5jdGlvbiIsImlzT2JqZWN0IiwiaXNSZWFkYWJsZVN0cmVhbSIsIl9yZWFkIiwiaXNCb29sZWFuIiwiaXNFbXB0eSIsIm8iLCJfIiwiaXNFbXB0eU9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsIngiLCJ1bmRlZmluZWQiLCJpc0RlZmluZWQiLCJpc1ZhbGlkRGF0ZSIsIkRhdGUiLCJpc05hTiIsIm1ha2VEYXRlTG9uZyIsInMiLCJ0b0lTT1N0cmluZyIsInBpcGVzZXR1cCIsInN0cmVhbXMiLCJzcmMiLCJkc3QiLCJvbiIsImVyciIsImVtaXQiLCJwaXBlIiwicmVhZGFibGVTdHJlYW0iLCJkYXRhIiwiUmVhZGFibGUiLCJwdXNoIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJtZXRhRGF0YSIsImZpbGVQYXRoIiwidG9Mb3dlckNhc2UiLCJwcmVwZW5kWEFNWk1ldGEiLCJtYXBLZXlzIiwidmFsdWUiLCJpc0FtekhlYWRlciIsImlzU3VwcG9ydGVkSGVhZGVyIiwiaXNTdG9yYWdlQ2xhc3NIZWFkZXIiLCJ0ZW1wIiwic3RhcnRzV2l0aCIsInN1cHBvcnRlZF9oZWFkZXJzIiwiZXh0cmFjdE1ldGFkYXRhIiwiaGVhZGVycyIsInBpY2tCeSIsImxvd2VyIiwiZ2V0VmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwic2FuaXRpemVFVGFnIiwiZXRhZyIsInJlcGxhY2VDaGFycyIsIm0iLCJ0b01kNSIsInBheWxvYWQiLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiZGlnZXN0IiwidG9TaGEyNTYiLCJ0b0FycmF5IiwicGFyYW0iLCJBcnJheSIsImlzQXJyYXkiLCJzYW5pdGl6ZU9iamVjdEtleSIsImFzU3RyTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsInNhbml0aXplU2l6ZSIsInNpemUiLCJOdW1iZXIiLCJwYXJzZUludCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJBQlNfTUlOX1BBUlRfU0laRSIsIk1JTl9QQVJUX1NJWkUiLCJNQVhfUEFSVFNfQ09VTlQiLCJNQVhfUEFSVF9TSVpFIiwiTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsImV4cG9ydHMiLCJHRU5FUklDX1NTRV9IRUFERVIiLCJFTkNSWVBUSU9OX0hFQURFUlMiLCJzc2VHZW5lcmljSGVhZGVyIiwic3NlS21zS2V5SUQiLCJnZXRFbmNyeXB0aW9uSGVhZGVycyIsImVuY0NvbmZpZyIsImVuY1R5cGUiLCJ0eXBlIiwiRU5DUllQVElPTl9UWVBFUyIsIlNTRUMiLCJLTVMiLCJTU0VBbGdvcml0aG0iLCJLTVNNYXN0ZXJLZXlJRCIsInBhcnRzUmVxdWlyZWQiLCJtYXhQYXJ0U2l6ZSIsInJlcXVpcmVkUGFydFNpemUiLCJNYXRoIiwidHJ1bmMiLCJjYWxjdWxhdGVFdmVuU3BsaXRzIiwib2JqSW5mbyIsInJlcVBhcnRzIiwic3RhcnRJbmRleFBhcnRzIiwiZW5kSW5kZXhQYXJ0cyIsInN0YXJ0IiwiU3RhcnQiLCJkaXZpc29yVmFsdWUiLCJyZW1pbmRlclZhbHVlIiwibmV4dFN0YXJ0IiwiaSIsImN1clBhcnRTaXplIiwiY3VycmVudFN0YXJ0IiwiY3VycmVudEVuZCIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsImZ4cCIsIlhNTFBhcnNlciIsInBhcnNlWG1sIiwieG1sIiwicmVzdWx0IiwicGFyc2UiLCJFcnJvciJdLCJzb3VyY2VzIjpbImhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgKiBhcyBzdHJlYW0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcbmltcG9ydCBpcGFkZHIgZnJvbSAnaXBhZGRyLmpzJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xuXG5pbXBvcnQgdHlwZSB7IEJpbmFyeSwgRW5jcnlwdGlvbiwgT2JqZWN0TWV0YURhdGEsIFJlcXVlc3RIZWFkZXJzLCBSZXNwb25zZUhlYWRlciB9IGZyb20gJy4vdHlwZS50cydcbmltcG9ydCB7IEVOQ1JZUFRJT05fVFlQRVMgfSBmcm9tICcuL3R5cGUudHMnXG5cbmNvbnN0IE1ldGFEYXRhSGVhZGVyUHJlZml4ID0gJ3gtYW16LW1ldGEtJ1xuXG4vKipcbiAqIEFsbCBjaGFyYWN0ZXJzIGluIHN0cmluZyB3aGljaCBhcmUgTk9UIHVucmVzZXJ2ZWQgc2hvdWxkIGJlIHBlcmNlbnQgZW5jb2RlZC5cbiAqIFVucmVzZXJ2ZWQgY2hhcmFjdGVycyBhcmUgOiBBTFBIQSAvIERJR0lUIC8gXCItXCIgLyBcIi5cIiAvIFwiX1wiIC8gXCJ+XCJcbiAqIFJlZmVyZW5jZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJpRXNjYXBlKHN0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuc3BsaXQoJycpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGVsZW06IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGVsZW0pXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGxlbmd0aCAxIGluZGljYXRlcyB0aGF0IGVsZW0gaXMgbm90IGEgdW5pY29kZSBjaGFyYWN0ZXIuXG4gICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbiB1bnJlc2VydmVkIGNoYXJhY2VyLlxuICAgICAgaWYgKFxuICAgICAgICAoJ0EnIDw9IGVsZW0gJiYgZWxlbSA8PSAnWicpIHx8XG4gICAgICAgICgnYScgPD0gZWxlbSAmJiBlbGVtIDw9ICd6JykgfHxcbiAgICAgICAgKCcwJyA8PSBlbGVtICYmIGVsZW0gPD0gJzknKSB8fFxuICAgICAgICBlbGVtID09PSAnXycgfHxcbiAgICAgICAgZWxlbSA9PT0gJy4nIHx8XG4gICAgICAgIGVsZW0gPT09ICd+JyB8fFxuICAgICAgICBlbGVtID09PSAnLSdcbiAgICAgICkge1xuICAgICAgICAvLyBVbnJlc2VydmVkIGNoYXJhY2VyIHNob3VsZCBub3QgYmUgZW5jb2RlZC5cbiAgICAgICAgYWNjID0gYWNjICsgZWxlbVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG4gICAgfVxuICAgIC8vIGVsZW0gbmVlZHMgZW5jb2RpbmcgLSBpLmUgZWxlbSBzaG91bGQgYmUgZW5jb2RlZCBpZiBpdCdzIG5vdCB1bnJlc2VydmVkXG4gICAgLy8gY2hhcmFjdGVyIG9yIGlmIGl0J3MgYSB1bmljb2RlIGNoYXJhY3Rlci5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYnVmKSB7XG4gICAgICBhY2MgPSBhY2MgKyAnJScgKyBjaGFyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgfVxuICAgIHJldHVybiBhY2NcbiAgfSwgJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmlSZXNvdXJjZUVzY2FwZShzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gdXJpRXNjYXBlKHN0cmluZykucmVwbGFjZSgvJTJGL2csICcvJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjb3BlKHJlZ2lvbjogc3RyaW5nLCBkYXRlOiBEYXRlLCBzZXJ2aWNlTmFtZSA9ICdzMycpIHtcbiAgcmV0dXJuIGAke21ha2VEYXRlU2hvcnQoZGF0ZSl9LyR7cmVnaW9ufS8ke3NlcnZpY2VOYW1lfS9hd3M0X3JlcXVlc3RgXG59XG5cbi8qKlxuICogaXNBbWF6b25FbmRwb2ludCAtIHRydWUgaWYgZW5kcG9pbnQgaXMgJ3MzLmFtYXpvbmF3cy5jb20nIG9yICdzMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FtYXpvbkVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGVuZHBvaW50ID09PSAnczMuYW1hem9uYXdzLmNvbScgfHwgZW5kcG9pbnQgPT09ICdzMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24nXG59XG5cbi8qKlxuICogaXNWaXJ0dWFsSG9zdFN0eWxlIC0gdmVyaWZ5IGlmIGJ1Y2tldCBuYW1lIGlzIHN1cHBvcnQgd2l0aCB2aXJ0dWFsXG4gKiBob3N0cy4gYnVja2V0TmFtZXMgd2l0aCBwZXJpb2RzIHNob3VsZCBiZSBhbHdheXMgdHJlYXRlZCBhcyBwYXRoXG4gKiBzdHlsZSBpZiB0aGUgcHJvdG9jb2wgaXMgJ2h0dHBzOicsIHRoaXMgaXMgZHVlIHRvIFNTTCB3aWxkY2FyZFxuICogbGltaXRhdGlvbi4gRm9yIGFsbCBvdGhlciBidWNrZXRzIGFuZCBBbWF6b24gUzMgZW5kcG9pbnQgd2Ugd2lsbFxuICogZGVmYXVsdCB0byB2aXJ0dWFsIGhvc3Qgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpcnR1YWxIb3N0U3R5bGUoZW5kcG9pbnQ6IHN0cmluZywgcHJvdG9jb2w6IHN0cmluZywgYnVja2V0OiBzdHJpbmcsIHBhdGhTdHlsZTogYm9vbGVhbikge1xuICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonICYmIGJ1Y2tldC5pbmNsdWRlcygnLicpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGlzQW1hem9uRW5kcG9pbnQoZW5kcG9pbnQpIHx8ICFwYXRoU3R5bGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRJUChpcDogc3RyaW5nKSB7XG4gIHJldHVybiBpcGFkZHIuaXNWYWxpZChpcClcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBpZiBlbmRwb2ludCBpcyB2YWxpZCBkb21haW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xuICByZXR1cm4gaXNWYWxpZERvbWFpbihlbmRwb2ludCkgfHwgaXNWYWxpZElQKGVuZHBvaW50KVxufVxuXG4vKipcbiAqIEByZXR1cm5zIGlmIGlucHV0IGhvc3QgaXMgYSB2YWxpZCBkb21haW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRG9tYWluKGhvc3Q6IHN0cmluZykge1xuICBpZiAoIWlzU3RyaW5nKGhvc3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gU2VlIFJGQyAxMDM1LCBSRkMgMzY5Ni5cbiAgaWYgKGhvc3QubGVuZ3RoID09PSAwIHx8IGhvc3QubGVuZ3RoID4gMjU1KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSAnLSdcbiAgaWYgKGhvc3RbMF0gPT09ICctJyB8fCBob3N0LnNsaWNlKC0xKSA9PT0gJy0nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSAnXydcbiAgaWYgKGhvc3RbMF0gPT09ICdfJyB8fCBob3N0LnNsaWNlKC0xKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gSG9zdCBjYW5ub3Qgc3RhcnQgd2l0aCBhICcuJ1xuICBpZiAoaG9zdFswXSA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBhbHBoYU51bWVyaWNzID0gJ2B+IUAjJCVeJiooKSs9e31bXXxcXFxcXCJcXCc7Oj48Py8nXG4gIC8vIEFsbCBub24gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIGludmFsaWQuXG4gIGZvciAoY29uc3QgY2hhciBvZiBhbHBoYU51bWVyaWNzKSB7XG4gICAgaWYgKGhvc3QuaW5jbHVkZXMoY2hhcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICAvLyBObyBuZWVkIHRvIHJlZ2V4cCBtYXRjaCwgc2luY2UgdGhlIGxpc3QgaXMgbm9uLWV4aGF1c3RpdmUuXG4gIC8vIFdlIGxldCBpdCBiZSB2YWxpZCBhbmQgZmFpbCBsYXRlci5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBQcm9iZXMgY29udGVudFR5cGUgdXNpbmcgZmlsZSBleHRlbnNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIC8vIHJldHVybiAnaW1hZ2UvcG5nJ1xuICogcHJvYmVDb250ZW50VHlwZSgnZmlsZS5wbmcnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9iZUNvbnRlbnRUeXBlKHBhdGg6IHN0cmluZykge1xuICBsZXQgY29udGVudFR5cGUgPSBtaW1lLmxvb2t1cChwYXRoKVxuICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICB9XG4gIHJldHVybiBjb250ZW50VHlwZVxufVxuXG4vKipcbiAqIGlzIGlucHV0IHBvcnQgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUG9ydChwb3J0OiB1bmtub3duKTogcG9ydCBpcyBudW1iZXIge1xuICAvLyB2ZXJpZnkgaWYgcG9ydCBpcyBhIG51bWJlci5cbiAgaWYgKCFpc051bWJlcihwb3J0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gcG9ydCBgMGAgaXMgdmFsaWQgYW5kIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gMCA8PSBwb3J0ICYmIHBvcnQgPD0gNjU1MzVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldDogdW5rbm93bikge1xuICBpZiAoIWlzU3RyaW5nKGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGJ1Y2tldCBsZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiBhbmQgbm8gbW9yZSB0aGFuIDYzXG4gIC8vIGNoYXJhY3RlcnMgbG9uZy5cbiAgaWYgKGJ1Y2tldC5sZW5ndGggPCAzIHx8IGJ1Y2tldC5sZW5ndGggPiA2Mykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIGJ1Y2tldCB3aXRoIHN1Y2Nlc3NpdmUgcGVyaW9kcyBpcyBpbnZhbGlkLlxuICBpZiAoYnVja2V0LmluY2x1ZGVzKCcuLicpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gYnVja2V0IGNhbm5vdCBoYXZlIGlwIGFkZHJlc3Mgc3R5bGUuXG4gIGlmICgvWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rLy50ZXN0KGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBidWNrZXQgc2hvdWxkIGJlZ2luIHdpdGggYWxwaGFiZXQvbnVtYmVyIGFuZCBlbmQgd2l0aCBhbHBoYWJldC9udW1iZXIsXG4gIC8vIHdpdGggYWxwaGFiZXQvbnVtYmVyLy4tIGluIHRoZSBtaWRkbGUuXG4gIGlmICgvXlthLXowLTldW2EtejAtOS4tXStbYS16MC05XSQvLnRlc3QoYnVja2V0KSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogY2hlY2sgaWYgb2JqZWN0TmFtZSBpcyBhIHZhbGlkIG9iamVjdCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lOiB1bmtub3duKSB7XG4gIGlmICghaXNWYWxpZFByZWZpeChvYmplY3ROYW1lKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdE5hbWUubGVuZ3RoICE9PSAwXG59XG5cbi8qKlxuICogY2hlY2sgaWYgcHJlZml4IGlzIHZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJlZml4KHByZWZpeDogdW5rbm93bik6IHByZWZpeCBpcyBzdHJpbmcge1xuICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAocHJlZml4Lmxlbmd0aCA+IDEwMjQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihhcmc6IHVua25vd24pOiBhcmcgaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBBbnlGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5cbi8qKlxuICogY2hlY2sgaWYgdHlwZW9mIGFyZyBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihhcmc6IHVua25vd24pOiBhcmcgaXMgQW55RnVuY3Rpb24ge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhhcmc6IHVua25vd24pOiBhcmcgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnXG59XG5cbi8qKlxuICogY2hlY2sgaWYgdHlwZW9mIGFyZyBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGFyZzogdW5rbm93bik6IGFyZyBpcyBvYmplY3Qge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsXG59XG5cbi8qKlxuICogY2hlY2sgaWYgb2JqZWN0IGlzIHJlYWRhYmxlIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbShhcmc6IHVua25vd24pOiBhcmcgaXMgc3RyZWFtLlJlYWRhYmxlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICByZXR1cm4gaXNPYmplY3QoYXJnKSAmJiBpc0Z1bmN0aW9uKChhcmcgYXMgc3RyZWFtLlJlYWRhYmxlKS5fcmVhZClcbn1cblxuLyoqXG4gKiBjaGVjayBpZiBhcmcgaXMgYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKGFyZzogdW5rbm93bik6IGFyZyBpcyBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvOiB1bmtub3duKTogbyBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIF8uaXNFbXB0eShvKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvKS5maWx0ZXIoKHgpID0+IHggIT09IHVuZGVmaW5lZCkubGVuZ3RoICE9PSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQ8VD4obzogVCk6IG8gaXMgRXhjbHVkZTxULCBudWxsIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBvICE9PSBudWxsICYmIG8gIT09IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIGFyZyBpcyBhIHZhbGlkIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKGFyZzogdW5rbm93bik6IGFyZyBpcyBEYXRlIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBjaGVja25ldyBEYXRlKE1hdGguTmFOKVxuICByZXR1cm4gYXJnIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oYXJnKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIERhdGUgc3RyaW5nIHdpdGggZm9ybWF0OiAnWVlZWU1NRERUSEhtbXNzJyArIFpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEYXRlTG9uZyhkYXRlPzogRGF0ZSk6IHN0cmluZyB7XG4gIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlKClcblxuICAvLyBHaXZlcyBmb3JtYXQgbGlrZTogJzIwMTctMDgtMDdUMTY6Mjg6NTkuODg5WidcbiAgY29uc3QgcyA9IGRhdGUudG9JU09TdHJpbmcoKVxuXG4gIHJldHVybiBzLnNsaWNlKDAsIDQpICsgcy5zbGljZSg1LCA3KSArIHMuc2xpY2UoOCwgMTMpICsgcy5zbGljZSgxNCwgMTYpICsgcy5zbGljZSgxNywgMTkpICsgJ1onXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgRGF0ZSBzdHJpbmcgd2l0aCBmb3JtYXQ6ICdZWVlZTU1ERCdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEYXRlU2hvcnQoZGF0ZT86IERhdGUpIHtcbiAgZGF0ZSA9IGRhdGUgfHwgbmV3IERhdGUoKVxuXG4gIC8vIEdpdmVzIGZvcm1hdCBsaWtlOiAnMjAxNy0wOC0wN1QxNjoyODo1OS44ODlaJ1xuICBjb25zdCBzID0gZGF0ZS50b0lTT1N0cmluZygpXG5cbiAgcmV0dXJuIHMuc2xpY2UoMCwgNCkgKyBzLnNsaWNlKDUsIDcpICsgcy5zbGljZSg4LCAxMClcbn1cblxuLyoqXG4gKiBwaXBlc2V0dXAgc2V0cyB1cCBwaXBlKCkgZnJvbSBsZWZ0IHRvIHJpZ2h0IG9zIHN0cmVhbXMgYXJyYXlcbiAqIHBpcGVzZXR1cCB3aWxsIGFsc28gbWFrZSBzdXJlIHRoYXQgZXJyb3IgZW1pdHRlZCBhdCBhbnkgb2YgdGhlIHVwc3RyZWFtIFN0cmVhbVxuICogd2lsbCBiZSBlbWl0dGVkIGF0IHRoZSBsYXN0IHN0cmVhbS4gVGhpcyBtYWtlcyBlcnJvciBoYW5kbGluZyBzaW1wbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGVzZXR1cCguLi5zdHJlYW1zOiBbc3RyZWFtLlJlYWRhYmxlLCAuLi5zdHJlYW0uRHVwbGV4W10sIHN0cmVhbS5Xcml0YWJsZV0pIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cyBjYW4ndCBuYXJyb3cgdGhpc1xuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UoKHNyYzogc3RyZWFtLlJlYWRhYmxlLCBkc3Q6IHN0cmVhbS5Xcml0YWJsZSkgPT4ge1xuICAgIHNyYy5vbignZXJyb3InLCAoZXJyKSA9PiBkc3QuZW1pdCgnZXJyb3InLCBlcnIpKVxuICAgIHJldHVybiBzcmMucGlwZShkc3QpXG4gIH0pXG59XG5cbi8qKlxuICogcmV0dXJuIGEgUmVhZGFibGUgc3RyZWFtIHRoYXQgZW1pdHMgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZGFibGVTdHJlYW0oZGF0YTogdW5rbm93bik6IHN0cmVhbS5SZWFkYWJsZSB7XG4gIGNvbnN0IHMgPSBuZXcgc3RyZWFtLlJlYWRhYmxlKClcbiAgcy5fcmVhZCA9ICgpID0+IHt9XG4gIHMucHVzaChkYXRhKVxuICBzLnB1c2gobnVsbClcbiAgcmV0dXJuIHNcbn1cblxuLyoqXG4gKiBQcm9jZXNzIG1ldGFkYXRhIHRvIGluc2VydCBhcHByb3ByaWF0ZSB2YWx1ZSB0byBgY29udGVudC10eXBlYCBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydENvbnRlbnRUeXBlKG1ldGFEYXRhOiBPYmplY3RNZXRhRGF0YSwgZmlsZVBhdGg6IHN0cmluZyk6IE9iamVjdE1ldGFEYXRhIHtcbiAgLy8gY2hlY2sgaWYgY29udGVudC10eXBlIGF0dHJpYnV0ZSBwcmVzZW50IGluIG1ldGFEYXRhXG4gIGZvciAoY29uc3Qga2V5IGluIG1ldGFEYXRhKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgcmV0dXJuIG1ldGFEYXRhXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGluIG1ldGFkYXRhLCB0aGVuIGluZmVyIGl0IGZyb20gdGhlIGV4dGVuc2lvbiBpbiBmaWxlUGF0aFxuICByZXR1cm4ge1xuICAgIC4uLm1ldGFEYXRhLFxuICAgICdjb250ZW50LXR5cGUnOiBwcm9iZUNvbnRlbnRUeXBlKGZpbGVQYXRoKSxcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHByZXBlbmRzIG1ldGFkYXRhIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByZWZpeCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZFhBTVpNZXRhKG1ldGFEYXRhPzogT2JqZWN0TWV0YURhdGEpOiBSZXF1ZXN0SGVhZGVycyB7XG4gIGlmICghbWV0YURhdGEpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHJldHVybiBfLm1hcEtleXMobWV0YURhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKGlzQW16SGVhZGVyKGtleSkgfHwgaXNTdXBwb3J0ZWRIZWFkZXIoa2V5KSB8fCBpc1N0b3JhZ2VDbGFzc0hlYWRlcihrZXkpKSB7XG4gICAgICByZXR1cm4ga2V5XG4gICAgfVxuXG4gICAgcmV0dXJuIE1ldGFEYXRhSGVhZGVyUHJlZml4ICsga2V5XG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgaGVhZGVyIGFjY29yZGluZyB0byB0aGUgQW1hem9uUzMgQVBJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FtekhlYWRlcihrZXk6IHN0cmluZykge1xuICBjb25zdCB0ZW1wID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIChcbiAgICB0ZW1wLnN0YXJ0c1dpdGgoTWV0YURhdGFIZWFkZXJQcmVmaXgpIHx8XG4gICAgdGVtcCA9PT0gJ3gtYW16LWFjbCcgfHxcbiAgICB0ZW1wLnN0YXJ0c1dpdGgoJ3gtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24tJykgfHxcbiAgICB0ZW1wID09PSAneC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbidcbiAgKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHN1cHBvcnRlZCBIZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydGVkSGVhZGVyKGtleTogc3RyaW5nKSB7XG4gIGNvbnN0IHN1cHBvcnRlZF9oZWFkZXJzID0gW1xuICAgICdjb250ZW50LXR5cGUnLFxuICAgICdjYWNoZS1jb250cm9sJyxcbiAgICAnY29udGVudC1lbmNvZGluZycsXG4gICAgJ2NvbnRlbnQtZGlzcG9zaXRpb24nLFxuICAgICdjb250ZW50LWxhbmd1YWdlJyxcbiAgICAneC1hbXotd2Vic2l0ZS1yZWRpcmVjdC1sb2NhdGlvbicsXG4gIF1cbiAgcmV0dXJuIHN1cHBvcnRlZF9oZWFkZXJzLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHN0b3JhZ2UgaGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0b3JhZ2VDbGFzc0hlYWRlcihrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd4LWFtei1zdG9yYWdlLWNsYXNzJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1ldGFkYXRhKGhlYWRlcnM6IFJlc3BvbnNlSGVhZGVyKSB7XG4gIHJldHVybiBfLm1hcEtleXMoXG4gICAgXy5waWNrQnkoaGVhZGVycywgKHZhbHVlLCBrZXkpID0+IGlzU3VwcG9ydGVkSGVhZGVyKGtleSkgfHwgaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5KSB8fCBpc0FtekhlYWRlcihrZXkpKSxcbiAgICAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgY29uc3QgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgoTWV0YURhdGFIZWFkZXJQcmVmaXgpKSB7XG4gICAgICAgIHJldHVybiBsb3dlci5zbGljZShNZXRhRGF0YUhlYWRlclByZWZpeC5sZW5ndGgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXlcbiAgICB9LFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uSWQoaGVhZGVyczogUmVzcG9uc2VIZWFkZXIgPSB7fSkge1xuICByZXR1cm4gaGVhZGVyc1sneC1hbXotdmVyc2lvbi1pZCddIHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZVZlcnNpb25JZChoZWFkZXJzOiBSZXNwb25zZUhlYWRlciA9IHt9KSB7XG4gIHJldHVybiBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS12ZXJzaW9uLWlkJ10gfHwgbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVFVGFnKGV0YWcgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcGxhY2VDaGFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnXCInOiAnJyxcbiAgICAnJnF1b3Q7JzogJycsXG4gICAgJyYjMzQ7JzogJycsXG4gICAgJyZRVU9UOyc6ICcnLFxuICAgICcmI3gwMDAyMic6ICcnLFxuICB9XG4gIHJldHVybiBldGFnLnJlcGxhY2UoL14oXCJ8JnF1b3Q7fCYjMzQ7KXwoXCJ8JnF1b3Q7fCYjMzQ7KSQvZywgKG0pID0+IHJlcGxhY2VDaGFyc1ttXSBhcyBzdHJpbmcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01kNShwYXlsb2FkOiBCaW5hcnkpOiBzdHJpbmcge1xuICAvLyB1c2Ugc3RyaW5nIGZyb20gYnJvd3NlciBhbmQgYnVmZmVyIGZyb20gbm9kZWpzXG4gIC8vIGJyb3dzZXIgc3VwcG9ydCBpcyB0ZXN0ZWQgb25seSBhZ2FpbnN0IG1pbmlvIHNlcnZlclxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShCdWZmZXIuZnJvbShwYXlsb2FkKSkuZGlnZXN0KCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NoYTI1NihwYXlsb2FkOiBCaW5hcnkpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwYXlsb2FkKS5kaWdlc3QoJ2hleCcpXG59XG5cbi8qKlxuICogdG9BcnJheSByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQgYXJyYXkgd2l0aCBwYXJhbSBiZWluZyB0aGUgZWxlbWVudCxcbiAqIGlmIHBhcmFtIGlzIGp1c3QgYSBzdHJpbmcsIGFuZCByZXR1cm5zICdwYXJhbScgYmFjayBpZiBpdCBpcyBhbiBhcnJheVxuICogU28sIGl0IG1ha2VzIHN1cmUgcGFyYW0gaXMgYWx3YXlzIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQgPSB1bmtub3duPihwYXJhbTogVCB8IFRbXSk6IEFycmF5PFQ+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgIHJldHVybiBbcGFyYW1dIGFzIFRbXVxuICB9XG4gIHJldHVybiBwYXJhbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPYmplY3RLZXkob2JqZWN0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gKyBzeW1ib2wgY2hhcmFjdGVycyBhcmUgbm90IGRlY29kZWQgYXMgc3BhY2VzIGluIEpTLiBzbyByZXBsYWNlIHRoZW0gZmlyc3QgYW5kIGRlY29kZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LlxuICBjb25zdCBhc1N0ck5hbWUgPSAob2JqZWN0TmFtZSA/IG9iamVjdE5hbWUudG9TdHJpbmcoKSA6ICcnKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGFzU3RyTmFtZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplU2l6ZShzaXplPzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNpemUgPyBOdW1iZXIucGFyc2VJbnQoc2l6ZSkgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IFBBUlRfQ09OU1RSQUlOVFMgPSB7XG4gIC8vIGFic01pblBhcnRTaXplIC0gYWJzb2x1dGUgbWluaW11bSBwYXJ0IHNpemUgKDUgTWlCKVxuICBBQlNfTUlOX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiA1LFxuICAvLyBNSU5fUEFSVF9TSVpFIC0gbWluaW11bSBwYXJ0IHNpemUgMTZNaUIgcGVyIG9iamVjdCBhZnRlciB3aGljaFxuICBNSU5fUEFSVF9TSVpFOiAxMDI0ICogMTAyNCAqIDE2LFxuICAvLyBNQVhfUEFSVFNfQ09VTlQgLSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0cyBmb3IgYSBzaW5nbGUgbXVsdGlwYXJ0IHNlc3Npb24uXG4gIE1BWF9QQVJUU19DT1VOVDogMTAwMDAsXG4gIC8vIE1BWF9QQVJUX1NJWkUgLSBtYXhpbXVtIHBhcnQgc2l6ZSA1R2lCIGZvciBhIHNpbmdsZSBtdWx0aXBhcnQgdXBsb2FkXG4gIC8vIG9wZXJhdGlvbi5cbiAgTUFYX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUgLSBtYXhpbXVtIHNpemUgNUdpQiBvZiBvYmplY3QgcGVyIFBVVFxuICAvLyBvcGVyYXRpb24uXG4gIE1BWF9TSU5HTEVfUFVUX09CSkVDVF9TSVpFOiAxMDI0ICogMTAyNCAqIDEwMjQgKiA1LFxuICAvLyBNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSAtIG1heGltdW0gc2l6ZSA1VGlCIG9mIG9iamVjdCBmb3JcbiAgLy8gTXVsdGlwYXJ0IG9wZXJhdGlvbi5cbiAgTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkU6IDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjQgKiA1LFxufVxuXG5jb25zdCBHRU5FUklDX1NTRV9IRUFERVIgPSAnWC1BbXotU2VydmVyLVNpZGUtRW5jcnlwdGlvbidcblxuY29uc3QgRU5DUllQVElPTl9IRUFERVJTID0ge1xuICAvLyBzc2VHZW5lcmljSGVhZGVyIGlzIHRoZSBBV1MgU1NFIGhlYWRlciB1c2VkIGZvciBTU0UtUzMgYW5kIFNTRS1LTVMuXG4gIHNzZUdlbmVyaWNIZWFkZXI6IEdFTkVSSUNfU1NFX0hFQURFUixcbiAgLy8gc3NlS21zS2V5SUQgaXMgdGhlIEFXUyBTU0UtS01TIGtleSBpZC5cbiAgc3NlS21zS2V5SUQ6IEdFTkVSSUNfU1NFX0hFQURFUiArICctQXdzLUttcy1LZXktSWQnLFxufSBhcyBjb25zdFxuXG4vKipcbiAqIFJldHVybiBFbmNyeXB0aW9uIGhlYWRlcnNcbiAqIEBwYXJhbSBlbmNDb25maWdcbiAqIEByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGtleSB2YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSB1c2VkIGluIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmNyeXB0aW9uSGVhZGVycyhlbmNDb25maWc6IEVuY3J5cHRpb24pOiBSZXF1ZXN0SGVhZGVycyB7XG4gIGNvbnN0IGVuY1R5cGUgPSBlbmNDb25maWcudHlwZVxuXG4gIGlmICghaXNFbXB0eShlbmNUeXBlKSkge1xuICAgIGlmIChlbmNUeXBlID09PSBFTkNSWVBUSU9OX1RZUEVTLlNTRUMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlR2VuZXJpY0hlYWRlcl06ICdBRVMyNTYnLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jVHlwZSA9PT0gRU5DUllQVElPTl9UWVBFUy5LTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlR2VuZXJpY0hlYWRlcl06IGVuY0NvbmZpZy5TU0VBbGdvcml0aG0sXG4gICAgICAgIFtFTkNSWVBUSU9OX0hFQURFUlMuc3NlS21zS2V5SURdOiBlbmNDb25maWcuS01TTWFzdGVyS2V5SUQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0c1JlcXVpcmVkKHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG1heFBhcnRTaXplID0gUEFSVF9DT05TVFJBSU5UUy5NQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSAvIChQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVCAtIDEpXG4gIGxldCByZXF1aXJlZFBhcnRTaXplID0gc2l6ZSAvIG1heFBhcnRTaXplXG4gIGlmIChzaXplICUgbWF4UGFydFNpemUgPiAwKSB7XG4gICAgcmVxdWlyZWRQYXJ0U2l6ZSsrXG4gIH1cbiAgcmVxdWlyZWRQYXJ0U2l6ZSA9IE1hdGgudHJ1bmMocmVxdWlyZWRQYXJ0U2l6ZSlcbiAgcmV0dXJuIHJlcXVpcmVkUGFydFNpemVcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGVFdmVuU3BsaXRzIC0gY29tcHV0ZXMgc3BsaXRzIGZvciBhIHNvdXJjZSBhbmQgcmV0dXJuc1xuICogc3RhcnQgYW5kIGVuZCBpbmRleCBzbGljZXMuIFNwbGl0cyBoYXBwZW4gZXZlbmx5IHRvIGJlIHN1cmUgdGhhdCBub1xuICogcGFydCBpcyBsZXNzIHRoYW4gNU1pQiwgYXMgdGhhdCBjb3VsZCBmYWlsIHRoZSBtdWx0aXBhcnQgcmVxdWVzdCBpZlxuICogaXQgaXMgbm90IHRoZSBsYXN0IHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVFdmVuU3BsaXRzPFQgZXh0ZW5kcyB7IFN0YXJ0PzogbnVtYmVyIH0+KFxuICBzaXplOiBudW1iZXIsXG4gIG9iakluZm86IFQsXG4pOiB7XG4gIHN0YXJ0SW5kZXg6IG51bWJlcltdXG4gIG9iakluZm86IFRcbiAgZW5kSW5kZXg6IG51bWJlcltdXG59IHwgbnVsbCB7XG4gIGlmIChzaXplID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZXFQYXJ0cyA9IHBhcnRzUmVxdWlyZWQoc2l6ZSlcbiAgY29uc3Qgc3RhcnRJbmRleFBhcnRzOiBudW1iZXJbXSA9IFtdXG4gIGNvbnN0IGVuZEluZGV4UGFydHM6IG51bWJlcltdID0gW11cblxuICBsZXQgc3RhcnQgPSBvYmpJbmZvLlN0YXJ0XG4gIGlmIChpc0VtcHR5KHN0YXJ0KSB8fCBzdGFydCA9PT0gLTEpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBjb25zdCBkaXZpc29yVmFsdWUgPSBNYXRoLnRydW5jKHNpemUgLyByZXFQYXJ0cylcblxuICBjb25zdCByZW1pbmRlclZhbHVlID0gc2l6ZSAlIHJlcVBhcnRzXG5cbiAgbGV0IG5leHRTdGFydCA9IHN0YXJ0XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXFQYXJ0czsgaSsrKSB7XG4gICAgbGV0IGN1clBhcnRTaXplID0gZGl2aXNvclZhbHVlXG4gICAgaWYgKGkgPCByZW1pbmRlclZhbHVlKSB7XG4gICAgICBjdXJQYXJ0U2l6ZSsrXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gbmV4dFN0YXJ0XG4gICAgY29uc3QgY3VycmVudEVuZCA9IGN1cnJlbnRTdGFydCArIGN1clBhcnRTaXplIC0gMVxuICAgIG5leHRTdGFydCA9IGN1cnJlbnRFbmQgKyAxXG5cbiAgICBzdGFydEluZGV4UGFydHMucHVzaChjdXJyZW50U3RhcnQpXG4gICAgZW5kSW5kZXhQYXJ0cy5wdXNoKGN1cnJlbnRFbmQpXG4gIH1cblxuICByZXR1cm4geyBzdGFydEluZGV4OiBzdGFydEluZGV4UGFydHMsIGVuZEluZGV4OiBlbmRJbmRleFBhcnRzLCBvYmpJbmZvOiBvYmpJbmZvIH1cbn1cblxuY29uc3QgZnhwID0gbmV3IFhNTFBhcnNlcigpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYbWwoeG1sOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCByZXN1bHQgPSBmeHAucGFyc2UoeG1sKVxuICBpZiAocmVzdWx0LkVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0LkVycm9yXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQU4sdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUE0QyxTQUFBTyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMs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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJzdHJlYW0iLCJfZmFzdFhtbFBhcnNlciIsIl9pcGFkZHIiLCJfbG9kYXNoIiwibWltZSIsIl90eXBlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk1ldGFEYXRhSGVhZGVyUHJlZml4IiwidXJpRXNjYXBlIiwic3RyaW5nIiwic3BsaXQiLCJyZWR1Y2UiLCJhY2MiLCJlbGVtIiwiYnVmIiwiQnVmZmVyIiwiZnJvbSIsImxlbmd0aCIsImNoYXIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwidXJpUmVzb3VyY2VFc2NhcGUiLCJyZXBsYWNlIiwiZ2V0U2NvcGUiLCJyZWdpb24iLCJkYXRlIiwic2VydmljZU5hbWUiLCJtYWtlRGF0ZVNob3J0IiwiaXNBbWF6b25FbmRwb2ludCIsImVuZHBvaW50IiwiaXNWaXJ0dWFsSG9zdFN0eWxlIiwicHJvdG9jb2wiLCJidWNrZXQiLCJwYXRoU3R5bGUiLCJpbmNsdWRlcyIsImlzVmFsaWRJUCIsImlwIiwiaXBhZGRyIiwiaXNWYWxpZCIsImlzVmFsaWRFbmRwb2ludCIsImlzVmFsaWREb21haW4iLCJob3N0IiwiaXNTdHJpbmciLCJzbGljZSIsImFscGhhTnVtZXJpY3MiLCJwcm9iZUNvbnRlbnRUeXBlIiwicGF0aCIsImNvbnRlbnRUeXBlIiwibG9va3VwIiwiaXNWYWxpZFBvcnQiLCJwb3J0IiwiaXNOdW1iZXIiLCJpc1ZhbGlkQnVja2V0TmFtZSIsInRlc3QiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIm9iamVjdE5hbWUiLCJpc1ZhbGlkUHJlZml4IiwicHJlZml4IiwiYXJnIiwiaXNGdW5jdGlvbiIsImlzT2JqZWN0IiwiaXNSZWFkYWJsZVN0cmVhbSIsIl9yZWFkIiwiaXNCb29sZWFuIiwiaXNFbXB0eSIsIm8iLCJfIiwiaXNFbXB0eU9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsIngiLCJ1bmRlZmluZWQiLCJpc0RlZmluZWQiLCJpc1ZhbGlkRGF0ZSIsIkRhdGUiLCJpc05hTiIsIm1ha2VEYXRlTG9uZyIsInMiLCJ0b0lTT1N0cmluZyIsInBpcGVzZXR1cCIsInN0cmVhbXMiLCJzcmMiLCJkc3QiLCJvbiIsImVyciIsImVtaXQiLCJwaXBlIiwicmVhZGFibGVTdHJlYW0iLCJkYXRhIiwiUmVhZGFibGUiLCJwdXNoIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJtZXRhRGF0YSIsImZpbGVQYXRoIiwidG9Mb3dlckNhc2UiLCJwcmVwZW5kWEFNWk1ldGEiLCJtYXBLZXlzIiwidmFsdWUiLCJpc0FtekhlYWRlciIsImlzU3VwcG9ydGVkSGVhZGVyIiwiaXNTdG9yYWdlQ2xhc3NIZWFkZXIiLCJ0ZW1wIiwic3RhcnRzV2l0aCIsInN1cHBvcnRlZF9oZWFkZXJzIiwiZXh0cmFjdE1ldGFkYXRhIiwiaGVhZGVycyIsInBpY2tCeSIsImxvd2VyIiwiZ2V0VmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwic2FuaXRpemVFVGFnIiwiZXRhZyIsInJlcGxhY2VDaGFycyIsIm0iLCJ0b01kNSIsInBheWxvYWQiLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiZGlnZXN0IiwidG9TaGEyNTYiLCJ0b0FycmF5IiwicGFyYW0iLCJBcnJheSIsImlzQXJyYXkiLCJzYW5pdGl6ZU9iamVjdEtleSIsImFzU3RyTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJBQlNfTUlOX1BBUlRfU0laRSIsIk1JTl9QQVJUX1NJWkUiLCJNQVhfUEFSVFNfQ09VTlQiLCJNQVhfUEFSVF9TSVpFIiwiTUFYX1NJTkdMRV9QVVRfT0JKRUNUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsImV4cG9ydHMiLCJHRU5FUklDX1NTRV9IRUFERVIiLCJFTkNSWVBUSU9OX0hFQURFUlMiLCJzc2VHZW5lcmljSGVhZGVyIiwic3NlS21zS2V5SUQiLCJnZXRFbmNyeXB0aW9uSGVhZGVycyIsImVuY0NvbmZpZyIsImVuY1R5cGUiLCJ0eXBlIiwiRU5DUllQVElPTl9UWVBFUyIsIlNTRUMiLCJLTVMiLCJTU0VBbGdvcml0aG0iLCJLTVNNYXN0ZXJLZXlJRCIsInBhcnRzUmVxdWlyZWQiLCJzaXplIiwibWF4UGFydFNpemUiLCJyZXF1aXJlZFBhcnRTaXplIiwiTWF0aCIsInRydW5jIiwiY2FsY3VsYXRlRXZlblNwbGl0cyIsIm9iakluZm8iLCJyZXFQYXJ0cyIsInN0YXJ0SW5kZXhQYXJ0cyIsImVuZEluZGV4UGFydHMiLCJzdGFydCIsIlN0YXJ0IiwiZGl2aXNvclZhbHVlIiwicmVtaW5kZXJWYWx1ZSIsIm5leHRTdGFydCIsImkiLCJjdXJQYXJ0U2l6ZSIsImN1cnJlbnRTdGFydCIsImN1cnJlbnRFbmQiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJmeHAiLCJYTUxQYXJzZXIiLCJwYXJzZVhtbCIsInhtbCIsInJlc3VsdCIsInBhcnNlIiwiRXJyb3IiXSwic291cmNlcyI6WyJoZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0ICogYXMgc3RyZWFtIGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInXG5pbXBvcnQgaXBhZGRyIGZyb20gJ2lwYWRkci5qcydcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCAqIGFzIG1pbWUgZnJvbSAnbWltZS10eXBlcydcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnksIEVuY3J5cHRpb24sIE9iamVjdE1ldGFEYXRhLCBSZXF1ZXN0SGVhZGVycywgUmVzcG9uc2VIZWFkZXIgfSBmcm9tICcuL3R5cGUudHMnXG5pbXBvcnQgeyBFTkNSWVBUSU9OX1RZUEVTIH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5jb25zdCBNZXRhRGF0YUhlYWRlclByZWZpeCA9ICd4LWFtei1tZXRhLSdcblxuLyoqXG4gKiBBbGwgY2hhcmFjdGVycyBpbiBzdHJpbmcgd2hpY2ggYXJlIE5PVCB1bnJlc2VydmVkIHNob3VsZCBiZSBwZXJjZW50IGVuY29kZWQuXG4gKiBVbnJlc2VydmVkIGNoYXJhY3RlcnMgYXJlIDogQUxQSEEgLyBESUdJVCAvIFwiLVwiIC8gXCIuXCIgLyBcIl9cIiAvIFwiflwiXG4gKiBSZWZlcmVuY2UgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVyaUVzY2FwZShzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKS5yZWR1Y2UoKGFjYzogc3RyaW5nLCBlbGVtOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShlbGVtKVxuICAgIGlmIChidWYubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBsZW5ndGggMSBpbmRpY2F0ZXMgdGhhdCBlbGVtIGlzIG5vdCBhIHVuaWNvZGUgY2hhcmFjdGVyLlxuICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYW4gdW5yZXNlcnZlZCBjaGFyYWNlci5cbiAgICAgIGlmIChcbiAgICAgICAgKCdBJyA8PSBlbGVtICYmIGVsZW0gPD0gJ1onKSB8fFxuICAgICAgICAoJ2EnIDw9IGVsZW0gJiYgZWxlbSA8PSAneicpIHx8XG4gICAgICAgICgnMCcgPD0gZWxlbSAmJiBlbGVtIDw9ICc5JykgfHxcbiAgICAgICAgZWxlbSA9PT0gJ18nIHx8XG4gICAgICAgIGVsZW0gPT09ICcuJyB8fFxuICAgICAgICBlbGVtID09PSAnficgfHxcbiAgICAgICAgZWxlbSA9PT0gJy0nXG4gICAgICApIHtcbiAgICAgICAgLy8gVW5yZXNlcnZlZCBjaGFyYWNlciBzaG91bGQgbm90IGJlIGVuY29kZWQuXG4gICAgICAgIGFjYyA9IGFjYyArIGVsZW1cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBlbGVtIG5lZWRzIGVuY29kaW5nIC0gaS5lIGVsZW0gc2hvdWxkIGJlIGVuY29kZWQgaWYgaXQncyBub3QgdW5yZXNlcnZlZFxuICAgIC8vIGNoYXJhY3RlciBvciBpZiBpdCdzIGEgdW5pY29kZSBjaGFyYWN0ZXIuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGJ1Zikge1xuICAgICAgYWNjID0gYWNjICsgJyUnICsgY2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICAgIH1cbiAgICByZXR1cm4gYWNjXG4gIH0sICcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXJpUmVzb3VyY2VFc2NhcGUoc3RyaW5nOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHVyaUVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyUyRi9nLCAnLycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY29wZShyZWdpb246IHN0cmluZywgZGF0ZTogRGF0ZSwgc2VydmljZU5hbWUgPSAnczMnKSB7XG4gIHJldHVybiBgJHttYWtlRGF0ZVNob3J0KGRhdGUpfS8ke3JlZ2lvbn0vJHtzZXJ2aWNlTmFtZX0vYXdzNF9yZXF1ZXN0YFxufVxuXG4vKipcbiAqIGlzQW1hem9uRW5kcG9pbnQgLSB0cnVlIGlmIGVuZHBvaW50IGlzICdzMy5hbWF6b25hd3MuY29tJyBvciAnczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbWF6b25FbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XG4gIHJldHVybiBlbmRwb2ludCA9PT0gJ3MzLmFtYXpvbmF3cy5jb20nIHx8IGVuZHBvaW50ID09PSAnczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuJ1xufVxuXG4vKipcbiAqIGlzVmlydHVhbEhvc3RTdHlsZSAtIHZlcmlmeSBpZiBidWNrZXQgbmFtZSBpcyBzdXBwb3J0IHdpdGggdmlydHVhbFxuICogaG9zdHMuIGJ1Y2tldE5hbWVzIHdpdGggcGVyaW9kcyBzaG91bGQgYmUgYWx3YXlzIHRyZWF0ZWQgYXMgcGF0aFxuICogc3R5bGUgaWYgdGhlIHByb3RvY29sIGlzICdodHRwczonLCB0aGlzIGlzIGR1ZSB0byBTU0wgd2lsZGNhcmRcbiAqIGxpbWl0YXRpb24uIEZvciBhbGwgb3RoZXIgYnVja2V0cyBhbmQgQW1hem9uIFMzIGVuZHBvaW50IHdlIHdpbGxcbiAqIGRlZmF1bHQgdG8gdmlydHVhbCBob3N0IHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWaXJ0dWFsSG9zdFN0eWxlKGVuZHBvaW50OiBzdHJpbmcsIHByb3RvY29sOiBzdHJpbmcsIGJ1Y2tldDogc3RyaW5nLCBwYXRoU3R5bGU6IGJvb2xlYW4pIHtcbiAgaWYgKHByb3RvY29sID09PSAnaHR0cHM6JyAmJiBidWNrZXQuaW5jbHVkZXMoJy4nKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBpc0FtYXpvbkVuZHBvaW50KGVuZHBvaW50KSB8fCAhcGF0aFN0eWxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSVAoaXA6IHN0cmluZykge1xuICByZXR1cm4gaXBhZGRyLmlzVmFsaWQoaXApXG59XG5cbi8qKlxuICogQHJldHVybnMgaWYgZW5kcG9pbnQgaXMgdmFsaWQgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWREb21haW4oZW5kcG9pbnQpIHx8IGlzVmFsaWRJUChlbmRwb2ludClcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBpZiBpbnB1dCBob3N0IGlzIGEgdmFsaWQgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERvbWFpbihob3N0OiBzdHJpbmcpIHtcbiAgaWYgKCFpc1N0cmluZyhob3N0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIFNlZSBSRkMgMTAzNSwgUkZDIDM2OTYuXG4gIGlmIChob3N0Lmxlbmd0aCA9PT0gMCB8fCBob3N0Lmxlbmd0aCA+IDI1NSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgJy0nXG4gIGlmIChob3N0WzBdID09PSAnLScgfHwgaG9zdC5zbGljZSgtMSkgPT09ICctJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgJ18nXG4gIGlmIChob3N0WzBdID09PSAnXycgfHwgaG9zdC5zbGljZSgtMSkgPT09ICdfJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEhvc3QgY2Fubm90IHN0YXJ0IHdpdGggYSAnLidcbiAgaWYgKGhvc3RbMF0gPT09ICcuJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgYWxwaGFOdW1lcmljcyA9ICdgfiFAIyQlXiYqKCkrPXt9W118XFxcXFwiXFwnOzo+PD8vJ1xuICAvLyBBbGwgbm9uIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBpbnZhbGlkLlxuICBmb3IgKGNvbnN0IGNoYXIgb2YgYWxwaGFOdW1lcmljcykge1xuICAgIGlmIChob3N0LmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgLy8gTm8gbmVlZCB0byByZWdleHAgbWF0Y2gsIHNpbmNlIHRoZSBsaXN0IGlzIG5vbi1leGhhdXN0aXZlLlxuICAvLyBXZSBsZXQgaXQgYmUgdmFsaWQgYW5kIGZhaWwgbGF0ZXIuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogUHJvYmVzIGNvbnRlbnRUeXBlIHVzaW5nIGZpbGUgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiAvLyByZXR1cm4gJ2ltYWdlL3BuZydcbiAqIHByb2JlQ29udGVudFR5cGUoJ2ZpbGUucG5nJylcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvYmVDb250ZW50VHlwZShwYXRoOiBzdHJpbmcpIHtcbiAgbGV0IGNvbnRlbnRUeXBlID0gbWltZS5sb29rdXAocGF0aClcbiAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgfVxuICByZXR1cm4gY29udGVudFR5cGVcbn1cblxuLyoqXG4gKiBpcyBpbnB1dCBwb3J0IHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBvcnQocG9ydDogdW5rbm93bik6IHBvcnQgaXMgbnVtYmVyIHtcbiAgLy8gdmVyaWZ5IGlmIHBvcnQgaXMgYSBudW1iZXIuXG4gIGlmICghaXNOdW1iZXIocG9ydCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHBvcnQgYDBgIGlzIHZhbGlkIGFuZCBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIDAgPD0gcG9ydCAmJiBwb3J0IDw9IDY1NTM1XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQnVja2V0TmFtZShidWNrZXQ6IHVua25vd24pIHtcbiAgaWYgKCFpc1N0cmluZyhidWNrZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBidWNrZXQgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gYW5kIG5vIG1vcmUgdGhhbiA2M1xuICAvLyBjaGFyYWN0ZXJzIGxvbmcuXG4gIGlmIChidWNrZXQubGVuZ3RoIDwgMyB8fCBidWNrZXQubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBidWNrZXQgd2l0aCBzdWNjZXNzaXZlIHBlcmlvZHMgaXMgaW52YWxpZC5cbiAgaWYgKGJ1Y2tldC5pbmNsdWRlcygnLi4nKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIGJ1Y2tldCBjYW5ub3QgaGF2ZSBpcCBhZGRyZXNzIHN0eWxlLlxuICBpZiAoL1swLTldK1xcLlswLTldK1xcLlswLTldK1xcLlswLTldKy8udGVzdChidWNrZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgLy8gYnVja2V0IHNob3VsZCBiZWdpbiB3aXRoIGFscGhhYmV0L251bWJlciBhbmQgZW5kIHdpdGggYWxwaGFiZXQvbnVtYmVyLFxuICAvLyB3aXRoIGFscGhhYmV0L251bWJlci8uLSBpbiB0aGUgbWlkZGxlLlxuICBpZiAoL15bYS16MC05XVthLXowLTkuLV0rW2EtejAtOV0kLy50ZXN0KGJ1Y2tldCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIGNoZWNrIGlmIG9iamVjdE5hbWUgaXMgYSB2YWxpZCBvYmplY3QgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZTogdW5rbm93bikge1xuICBpZiAoIWlzVmFsaWRQcmVmaXgob2JqZWN0TmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBvYmplY3ROYW1lLmxlbmd0aCAhPT0gMFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIHByZWZpeCBpcyB2YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByZWZpeChwcmVmaXg6IHVua25vd24pOiBwcmVmaXggaXMgc3RyaW5nIHtcbiAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKHByZWZpeC5sZW5ndGggPiAxMDI0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0eXBlb2YgYXJnIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIoYXJnOiB1bmtub3duKTogYXJnIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJ1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgQW55RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGFueVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnOiB1bmtub3duKTogYXJnIGlzIEFueUZ1bmN0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0eXBlb2YgYXJnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoYXJnOiB1bmtub3duKTogYXJnIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJ1xufVxuXG4vKipcbiAqIGNoZWNrIGlmIHR5cGVvZiBhcmcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChhcmc6IHVua25vd24pOiBhcmcgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbFxufVxuXG4vKipcbiAqIGNoZWNrIGlmIG9iamVjdCBpcyByZWFkYWJsZSBzdHJlYW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0oYXJnOiB1bmtub3duKTogYXJnIGlzIHN0cmVhbS5SZWFkYWJsZSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgcmV0dXJuIGlzT2JqZWN0KGFyZykgJiYgaXNGdW5jdGlvbigoYXJnIGFzIHN0cmVhbS5SZWFkYWJsZSkuX3JlYWQpXG59XG5cbi8qKlxuICogY2hlY2sgaWYgYXJnIGlzIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihhcmc6IHVua25vd24pOiBhcmcgaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkobzogdW5rbm93bik6IG8gaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBfLmlzRW1wdHkobylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmplY3QobzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMobykuZmlsdGVyKCh4KSA9PiB4ICE9PSB1bmRlZmluZWQpLmxlbmd0aCAhPT0gMFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkPFQ+KG86IFQpOiBvIGlzIEV4Y2x1ZGU8VCwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiBvICE9PSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBjaGVjayBpZiBhcmcgaXMgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShhcmc6IHVua25vd24pOiBhcmcgaXMgRGF0ZSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tuZXcgRGF0ZShNYXRoLk5hTilcbiAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGFyZylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBEYXRlIHN0cmluZyB3aXRoIGZvcm1hdDogJ1lZWVlNTUREVEhIbW1zcycgKyBaXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGF0ZUxvbmcoZGF0ZT86IERhdGUpOiBzdHJpbmcge1xuICBkYXRlID0gZGF0ZSB8fCBuZXcgRGF0ZSgpXG5cbiAgLy8gR2l2ZXMgZm9ybWF0IGxpa2U6ICcyMDE3LTA4LTA3VDE2OjI4OjU5Ljg4OVonXG4gIGNvbnN0IHMgPSBkYXRlLnRvSVNPU3RyaW5nKClcblxuICByZXR1cm4gcy5zbGljZSgwLCA0KSArIHMuc2xpY2UoNSwgNykgKyBzLnNsaWNlKDgsIDEzKSArIHMuc2xpY2UoMTQsIDE2KSArIHMuc2xpY2UoMTcsIDE5KSArICdaJ1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIERhdGUgc3RyaW5nIHdpdGggZm9ybWF0OiAnWVlZWU1NREQnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGF0ZVNob3J0KGRhdGU/OiBEYXRlKSB7XG4gIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlKClcblxuICAvLyBHaXZlcyBmb3JtYXQgbGlrZTogJzIwMTctMDgtMDdUMTY6Mjg6NTkuODg5WidcbiAgY29uc3QgcyA9IGRhdGUudG9JU09TdHJpbmcoKVxuXG4gIHJldHVybiBzLnNsaWNlKDAsIDQpICsgcy5zbGljZSg1LCA3KSArIHMuc2xpY2UoOCwgMTApXG59XG5cbi8qKlxuICogcGlwZXNldHVwIHNldHMgdXAgcGlwZSgpIGZyb20gbGVmdCB0byByaWdodCBvcyBzdHJlYW1zIGFycmF5XG4gKiBwaXBlc2V0dXAgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGF0IGVycm9yIGVtaXR0ZWQgYXQgYW55IG9mIHRoZSB1cHN0cmVhbSBTdHJlYW1cbiAqIHdpbGwgYmUgZW1pdHRlZCBhdCB0aGUgbGFzdCBzdHJlYW0uIFRoaXMgbWFrZXMgZXJyb3IgaGFuZGxpbmcgc2ltcGxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlc2V0dXAoLi4uc3RyZWFtczogW3N0cmVhbS5SZWFkYWJsZSwgLi4uc3RyZWFtLkR1cGxleFtdLCBzdHJlYW0uV3JpdGFibGVdKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHMgY2FuJ3QgbmFycm93IHRoaXNcbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKChzcmM6IHN0cmVhbS5SZWFkYWJsZSwgZHN0OiBzdHJlYW0uV3JpdGFibGUpID0+IHtcbiAgICBzcmMub24oJ2Vycm9yJywgKGVycikgPT4gZHN0LmVtaXQoJ2Vycm9yJywgZXJyKSlcbiAgICByZXR1cm4gc3JjLnBpcGUoZHN0KVxuICB9KVxufVxuXG4vKipcbiAqIHJldHVybiBhIFJlYWRhYmxlIHN0cmVhbSB0aGF0IGVtaXRzIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtKGRhdGE6IHVua25vd24pOiBzdHJlYW0uUmVhZGFibGUge1xuICBjb25zdCBzID0gbmV3IHN0cmVhbS5SZWFkYWJsZSgpXG4gIHMuX3JlYWQgPSAoKSA9PiB7fVxuICBzLnB1c2goZGF0YSlcbiAgcy5wdXNoKG51bGwpXG4gIHJldHVybiBzXG59XG5cbi8qKlxuICogUHJvY2VzcyBtZXRhZGF0YSB0byBpbnNlcnQgYXBwcm9wcmlhdGUgdmFsdWUgdG8gYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRDb250ZW50VHlwZShtZXRhRGF0YTogT2JqZWN0TWV0YURhdGEsIGZpbGVQYXRoOiBzdHJpbmcpOiBPYmplY3RNZXRhRGF0YSB7XG4gIC8vIGNoZWNrIGlmIGNvbnRlbnQtdHlwZSBhdHRyaWJ1dGUgcHJlc2VudCBpbiBtZXRhRGF0YVxuICBmb3IgKGNvbnN0IGtleSBpbiBtZXRhRGF0YSkge1xuICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgIHJldHVybiBtZXRhRGF0YVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIGBjb250ZW50LXR5cGVgIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudCBpbiBtZXRhZGF0YSwgdGhlbiBpbmZlciBpdCBmcm9tIHRoZSBleHRlbnNpb24gaW4gZmlsZVBhdGhcbiAgcmV0dXJuIHtcbiAgICAuLi5tZXRhRGF0YSxcbiAgICAnY29udGVudC10eXBlJzogcHJvYmVDb250ZW50VHlwZShmaWxlUGF0aCksXG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBwcmVwZW5kcyBtZXRhZGF0YSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXggaWYgaXQgaXMgbm90IGFscmVhZHkgb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YT86IE9iamVjdE1ldGFEYXRhKTogUmVxdWVzdEhlYWRlcnMge1xuICBpZiAoIW1ldGFEYXRhKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICByZXR1cm4gXy5tYXBLZXlzKG1ldGFEYXRhLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChpc0FtekhlYWRlcihrZXkpIHx8IGlzU3VwcG9ydGVkSGVhZGVyKGtleSkgfHwgaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5KSkge1xuICAgICAgcmV0dXJuIGtleVxuICAgIH1cblxuICAgIHJldHVybiBNZXRhRGF0YUhlYWRlclByZWZpeCArIGtleVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBpdCBpcyBhIHZhbGlkIGhlYWRlciBhY2NvcmRpbmcgdG8gdGhlIEFtYXpvblMzIEFQSVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbXpIZWFkZXIoa2V5OiBzdHJpbmcpIHtcbiAgY29uc3QgdGVtcCA9IGtleS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiAoXG4gICAgdGVtcC5zdGFydHNXaXRoKE1ldGFEYXRhSGVhZGVyUHJlZml4KSB8fFxuICAgIHRlbXAgPT09ICd4LWFtei1hY2wnIHx8XG4gICAgdGVtcC5zdGFydHNXaXRoKCd4LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uLScpIHx8XG4gICAgdGVtcCA9PT0gJ3gtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgaXQgaXMgYSBzdXBwb3J0ZWQgSGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRlZEhlYWRlcihrZXk6IHN0cmluZykge1xuICBjb25zdCBzdXBwb3J0ZWRfaGVhZGVycyA9IFtcbiAgICAnY29udGVudC10eXBlJyxcbiAgICAnY2FjaGUtY29udHJvbCcsXG4gICAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAgICdjb250ZW50LWRpc3Bvc2l0aW9uJyxcbiAgICAnY29udGVudC1sYW5ndWFnZScsXG4gICAgJ3gtYW16LXdlYnNpdGUtcmVkaXJlY3QtbG9jYXRpb24nLFxuICBdXG4gIHJldHVybiBzdXBwb3J0ZWRfaGVhZGVycy5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgaXQgaXMgYSBzdG9yYWdlIGhlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yYWdlQ2xhc3NIZWFkZXIoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGtleS50b0xvd2VyQ2FzZSgpID09PSAneC1hbXotc3RvcmFnZS1jbGFzcydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNZXRhZGF0YShoZWFkZXJzOiBSZXNwb25zZUhlYWRlcikge1xuICByZXR1cm4gXy5tYXBLZXlzKFxuICAgIF8ucGlja0J5KGhlYWRlcnMsICh2YWx1ZSwga2V5KSA9PiBpc1N1cHBvcnRlZEhlYWRlcihrZXkpIHx8IGlzU3RvcmFnZUNsYXNzSGVhZGVyKGtleSkgfHwgaXNBbXpIZWFkZXIoa2V5KSksXG4gICAgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGxvd2VyID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgICAgIGlmIChsb3dlci5zdGFydHNXaXRoKE1ldGFEYXRhSGVhZGVyUHJlZml4KSkge1xuICAgICAgICByZXR1cm4gbG93ZXIuc2xpY2UoTWV0YURhdGFIZWFkZXJQcmVmaXgubGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5XG4gICAgfSxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVyc2lvbklkKGhlYWRlcnM6IFJlc3BvbnNlSGVhZGVyID0ge30pIHtcbiAgcmV0dXJuIGhlYWRlcnNbJ3gtYW16LXZlcnNpb24taWQnXSB8fCBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VWZXJzaW9uSWQoaGVhZGVyczogUmVzcG9uc2VIZWFkZXIgPSB7fSkge1xuICByZXR1cm4gaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtdmVyc2lvbi1pZCddIHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplRVRhZyhldGFnID0gJycpOiBzdHJpbmcge1xuICBjb25zdCByZXBsYWNlQ2hhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ1wiJzogJycsXG4gICAgJyZxdW90Oyc6ICcnLFxuICAgICcmIzM0Oyc6ICcnLFxuICAgICcmUVVPVDsnOiAnJyxcbiAgICAnJiN4MDAwMjInOiAnJyxcbiAgfVxuICByZXR1cm4gZXRhZy5yZXBsYWNlKC9eKFwifCZxdW90O3wmIzM0Oyl8KFwifCZxdW90O3wmIzM0OykkL2csIChtKSA9PiByZXBsYWNlQ2hhcnNbbV0gYXMgc3RyaW5nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9NZDUocGF5bG9hZDogQmluYXJ5KTogc3RyaW5nIHtcbiAgLy8gdXNlIHN0cmluZyBmcm9tIGJyb3dzZXIgYW5kIGJ1ZmZlciBmcm9tIG5vZGVqc1xuICAvLyBicm93c2VyIHN1cHBvcnQgaXMgdGVzdGVkIG9ubHkgYWdhaW5zdCBtaW5pbyBzZXJ2ZXJcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoQnVmZmVyLmZyb20ocGF5bG9hZCkpLmRpZ2VzdCgpLnRvU3RyaW5nKCdiYXNlNjQnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TaGEyNTYocGF5bG9hZDogQmluYXJ5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocGF5bG9hZCkuZGlnZXN0KCdoZXgnKVxufVxuXG4vKipcbiAqIHRvQXJyYXkgcmV0dXJucyBhIHNpbmdsZSBlbGVtZW50IGFycmF5IHdpdGggcGFyYW0gYmVpbmcgdGhlIGVsZW1lbnQsXG4gKiBpZiBwYXJhbSBpcyBqdXN0IGEgc3RyaW5nLCBhbmQgcmV0dXJucyAncGFyYW0nIGJhY2sgaWYgaXQgaXMgYW4gYXJyYXlcbiAqIFNvLCBpdCBtYWtlcyBzdXJlIHBhcmFtIGlzIGFsd2F5cyBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUID0gdW5rbm93bj4ocGFyYW06IFQgfCBUW10pOiBBcnJheTxUPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICByZXR1cm4gW3BhcmFtXSBhcyBUW11cbiAgfVxuICByZXR1cm4gcGFyYW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT2JqZWN0S2V5KG9iamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vICsgc3ltYm9sIGNoYXJhY3RlcnMgYXJlIG5vdCBkZWNvZGVkIGFzIHNwYWNlcyBpbiBKUy4gc28gcmVwbGFjZSB0aGVtIGZpcnN0IGFuZCBkZWNvZGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdC5cbiAgY29uc3QgYXNTdHJOYW1lID0gKG9iamVjdE5hbWUgPyBvYmplY3ROYW1lLnRvU3RyaW5nKCkgOiAnJykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhc1N0ck5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBQQVJUX0NPTlNUUkFJTlRTID0ge1xuICAvLyBhYnNNaW5QYXJ0U2l6ZSAtIGFic29sdXRlIG1pbmltdW0gcGFydCBzaXplICg1IE1pQilcbiAgQUJTX01JTl9QQVJUX1NJWkU6IDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUlOX1BBUlRfU0laRSAtIG1pbmltdW0gcGFydCBzaXplIDE2TWlCIHBlciBvYmplY3QgYWZ0ZXIgd2hpY2hcbiAgTUlOX1BBUlRfU0laRTogMTAyNCAqIDEwMjQgKiAxNixcbiAgLy8gTUFYX1BBUlRTX0NPVU5UIC0gbWF4aW11bSBudW1iZXIgb2YgcGFydHMgZm9yIGEgc2luZ2xlIG11bHRpcGFydCBzZXNzaW9uLlxuICBNQVhfUEFSVFNfQ09VTlQ6IDEwMDAwLFxuICAvLyBNQVhfUEFSVF9TSVpFIC0gbWF4aW11bSBwYXJ0IHNpemUgNUdpQiBmb3IgYSBzaW5nbGUgbXVsdGlwYXJ0IHVwbG9hZFxuICAvLyBvcGVyYXRpb24uXG4gIE1BWF9QQVJUX1NJWkU6IDEwMjQgKiAxMDI0ICogMTAyNCAqIDUsXG4gIC8vIE1BWF9TSU5HTEVfUFVUX09CSkVDVF9TSVpFIC0gbWF4aW11bSBzaXplIDVHaUIgb2Ygb2JqZWN0IHBlciBQVVRcbiAgLy8gb3BlcmF0aW9uLlxuICBNQVhfU0lOR0xFX1BVVF9PQkpFQ1RfU0laRTogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbiAgLy8gTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUgLSBtYXhpbXVtIHNpemUgNVRpQiBvZiBvYmplY3QgZm9yXG4gIC8vIE11bHRpcGFydCBvcGVyYXRpb24uXG4gIE1BWF9NVUxUSVBBUlRfUFVUX09CSkVDVF9TSVpFOiAxMDI0ICogMTAyNCAqIDEwMjQgKiAxMDI0ICogNSxcbn1cblxuY29uc3QgR0VORVJJQ19TU0VfSEVBREVSID0gJ1gtQW16LVNlcnZlci1TaWRlLUVuY3J5cHRpb24nXG5cbmNvbnN0IEVOQ1JZUFRJT05fSEVBREVSUyA9IHtcbiAgLy8gc3NlR2VuZXJpY0hlYWRlciBpcyB0aGUgQVdTIFNTRSBoZWFkZXIgdXNlZCBmb3IgU1NFLVMzIGFuZCBTU0UtS01TLlxuICBzc2VHZW5lcmljSGVhZGVyOiBHRU5FUklDX1NTRV9IRUFERVIsXG4gIC8vIHNzZUttc0tleUlEIGlzIHRoZSBBV1MgU1NFLUtNUyBrZXkgaWQuXG4gIHNzZUttc0tleUlEOiBHRU5FUklDX1NTRV9IRUFERVIgKyAnLUF3cy1LbXMtS2V5LUlkJyxcbn0gYXMgY29uc3RcblxuLyoqXG4gKiBSZXR1cm4gRW5jcnlwdGlvbiBoZWFkZXJzXG4gKiBAcGFyYW0gZW5jQ29uZmlnXG4gKiBAcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBrZXkgdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBoZWFkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5jcnlwdGlvbkhlYWRlcnMoZW5jQ29uZmlnOiBFbmNyeXB0aW9uKTogUmVxdWVzdEhlYWRlcnMge1xuICBjb25zdCBlbmNUeXBlID0gZW5jQ29uZmlnLnR5cGVcblxuICBpZiAoIWlzRW1wdHkoZW5jVHlwZSkpIHtcbiAgICBpZiAoZW5jVHlwZSA9PT0gRU5DUllQVElPTl9UWVBFUy5TU0VDKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUdlbmVyaWNIZWFkZXJdOiAnQUVTMjU2JyxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuY1R5cGUgPT09IEVOQ1JZUFRJT05fVFlQRVMuS01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUdlbmVyaWNIZWFkZXJdOiBlbmNDb25maWcuU1NFQWxnb3JpdGhtLFxuICAgICAgICBbRU5DUllQVElPTl9IRUFERVJTLnNzZUttc0tleUlEXTogZW5jQ29uZmlnLktNU01hc3RlcktleUlELFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFydHNSZXF1aXJlZChzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBtYXhQYXJ0U2l6ZSA9IFBBUlRfQ09OU1RSQUlOVFMuTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUgLyAoUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQgLSAxKVxuICBsZXQgcmVxdWlyZWRQYXJ0U2l6ZSA9IHNpemUgLyBtYXhQYXJ0U2l6ZVxuICBpZiAoc2l6ZSAlIG1heFBhcnRTaXplID4gMCkge1xuICAgIHJlcXVpcmVkUGFydFNpemUrK1xuICB9XG4gIHJlcXVpcmVkUGFydFNpemUgPSBNYXRoLnRydW5jKHJlcXVpcmVkUGFydFNpemUpXG4gIHJldHVybiByZXF1aXJlZFBhcnRTaXplXG59XG5cbi8qKlxuICogY2FsY3VsYXRlRXZlblNwbGl0cyAtIGNvbXB1dGVzIHNwbGl0cyBmb3IgYSBzb3VyY2UgYW5kIHJldHVybnNcbiAqIHN0YXJ0IGFuZCBlbmQgaW5kZXggc2xpY2VzLiBTcGxpdHMgaGFwcGVuIGV2ZW5seSB0byBiZSBzdXJlIHRoYXQgbm9cbiAqIHBhcnQgaXMgbGVzcyB0aGFuIDVNaUIsIGFzIHRoYXQgY291bGQgZmFpbCB0aGUgbXVsdGlwYXJ0IHJlcXVlc3QgaWZcbiAqIGl0IGlzIG5vdCB0aGUgbGFzdCBwYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXZlblNwbGl0czxUIGV4dGVuZHMgeyBTdGFydD86IG51bWJlciB9PihcbiAgc2l6ZTogbnVtYmVyLFxuICBvYmpJbmZvOiBULFxuKToge1xuICBzdGFydEluZGV4OiBudW1iZXJbXVxuICBvYmpJbmZvOiBUXG4gIGVuZEluZGV4OiBudW1iZXJbXVxufSB8IG51bGwge1xuICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVxUGFydHMgPSBwYXJ0c1JlcXVpcmVkKHNpemUpXG4gIGNvbnN0IHN0YXJ0SW5kZXhQYXJ0czogbnVtYmVyW10gPSBbXVxuICBjb25zdCBlbmRJbmRleFBhcnRzOiBudW1iZXJbXSA9IFtdXG5cbiAgbGV0IHN0YXJ0ID0gb2JqSW5mby5TdGFydFxuICBpZiAoaXNFbXB0eShzdGFydCkgfHwgc3RhcnQgPT09IC0xKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgY29uc3QgZGl2aXNvclZhbHVlID0gTWF0aC50cnVuYyhzaXplIC8gcmVxUGFydHMpXG5cbiAgY29uc3QgcmVtaW5kZXJWYWx1ZSA9IHNpemUgJSByZXFQYXJ0c1xuXG4gIGxldCBuZXh0U3RhcnQgPSBzdGFydFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxUGFydHM7IGkrKykge1xuICAgIGxldCBjdXJQYXJ0U2l6ZSA9IGRpdmlzb3JWYWx1ZVxuICAgIGlmIChpIDwgcmVtaW5kZXJWYWx1ZSkge1xuICAgICAgY3VyUGFydFNpemUrK1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IG5leHRTdGFydFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSBjdXJyZW50U3RhcnQgKyBjdXJQYXJ0U2l6ZSAtIDFcbiAgICBuZXh0U3RhcnQgPSBjdXJyZW50RW5kICsgMVxuXG4gICAgc3RhcnRJbmRleFBhcnRzLnB1c2goY3VycmVudFN0YXJ0KVxuICAgIGVuZEluZGV4UGFydHMucHVzaChjdXJyZW50RW5kKVxuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnRJbmRleDogc3RhcnRJbmRleFBhcnRzLCBlbmRJbmRleDogZW5kSW5kZXhQYXJ0cywgb2JqSW5mbzogb2JqSW5mbyB9XG59XG5cbmNvbnN0IGZ4cCA9IG5ldyBYTUxQYXJzZXIoKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWG1sKHhtbDogc3RyaW5nKTogYW55IHtcbiAgY29uc3QgcmVzdWx0ID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHJlc3VsdC5FcnJvcikge1xuICAgIHRocm93IHJlc3VsdC5FcnJvclxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQU4sdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUE0QyxTQUFBTyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBVCx3QkFBQWEsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxH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 /***/ }), @@ -78474,72 +81109,6 @@ exports.PostPolicy = PostPolicy; /***/ }), -/***/ 9093: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.request = request; -var _stream = __nccwpck_require__(2781); -async function request(transport, opt, body = null) { - return new Promise((resolve, reject) => { - const requestObj = transport.request(opt, resp => { - resolve(resp); - }); - if (!body || Buffer.isBuffer(body) || typeof body === 'string') { - requestObj.on('error', e => { - reject(e); - }).end(body); - return; - } - - // pump readable stream - (0, _stream.pipeline)(body, requestObj, err => { - if (err) { - reject(err); - } - }); - }); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RyZWFtIiwicmVxdWlyZSIsInJlcXVlc3QiLCJ0cmFuc3BvcnQiLCJvcHQiLCJib2R5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXF1ZXN0T2JqIiwicmVzcCIsIkJ1ZmZlciIsImlzQnVmZmVyIiwib24iLCJlIiwiZW5kIiwicGlwZWxpbmUiLCJlcnIiXSwic291cmNlcyI6WyJyZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgdHlwZSAqIGFzIGh0dHBzIGZyb20gJ25vZGU6aHR0cHMnXG5pbXBvcnQgdHlwZSAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNwb3J0IH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gIG9wdDogaHR0cHMuUmVxdWVzdE9wdGlvbnMsXG4gIGJvZHk6IEJ1ZmZlciB8IHN0cmluZyB8IHN0cmVhbS5SZWFkYWJsZSB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0gdHJhbnNwb3J0LnJlcXVlc3Qob3B0LCAocmVzcCkgPT4ge1xuICAgICAgcmVzb2x2ZShyZXNwKVxuICAgIH0pXG5cbiAgICBpZiAoIWJvZHkgfHwgQnVmZmVyLmlzQnVmZmVyKGJvZHkpIHx8IHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdE9ialxuICAgICAgICAub24oJ2Vycm9yJywgKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgfSlcbiAgICAgICAgLmVuZChib2R5KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBwdW1wIHJlYWRhYmxlIHN0cmVhbVxuICAgIHBpcGVsaW5lKGJvZHksIHJlcXVlc3RPYmosIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9KVxuICB9KVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFJTyxlQUFlQyxPQUFPQSxDQUMzQkMsU0FBb0IsRUFDcEJDLEdBQXlCLEVBQ3pCQyxJQUE4QyxHQUFHLElBQUksRUFDdEI7RUFDL0IsT0FBTyxJQUFJQyxPQUFPLENBQXVCLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO0lBQzVELE1BQU1DLFVBQVUsR0FBR04sU0FBUyxDQUFDRCxPQUFPLENBQUNFLEdBQUcsRUFBR00sSUFBSSxJQUFLO01BQ2xESCxPQUFPLENBQUNHLElBQUksQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ0wsSUFBSSxJQUFJTSxNQUFNLENBQUNDLFFBQVEsQ0FBQ1AsSUFBSSxDQUFDLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM5REksVUFBVSxDQUNQSSxFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFVLElBQUs7UUFDM0JOLE1BQU0sQ0FBQ00sQ0FBQyxDQUFDO01BQ1gsQ0FBQyxDQUFDLENBQ0RDLEdBQUcsQ0FBQ1YsSUFBSSxDQUFDO01BRVo7SUFDRjs7SUFFQTtJQUNBLElBQUFXLGdCQUFRLEVBQUNYLElBQUksRUFBRUksVUFBVSxFQUFHUSxHQUFHLElBQUs7TUFDbEMsSUFBSUEsR0FBRyxFQUFFO1FBQ1BULE1BQU0sQ0FBQ1MsR0FBRyxDQUFDO01BQ2I7SUFDRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSiJ9 - -/***/ }), - -/***/ 2644: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.drainResponse = drainResponse; -exports.readAsBuffer = readAsBuffer; -exports.readAsString = readAsString; -async function readAsBuffer(res) { - return new Promise((resolve, reject) => { - const body = []; - res.on('data', chunk => body.push(chunk)).on('error', e => reject(e)).on('end', () => resolve(Buffer.concat(body))); - }); -} -async function readAsString(res) { - const body = await readAsBuffer(res); - return body.toString(); -} -async function drainResponse(res) { - return new Promise((resolve, reject) => { - res.on('data', () => {}).on('error', e => reject(e)).on('end', () => resolve()); - }); -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkQXNCdWZmZXIiLCJyZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImJvZHkiLCJvbiIsImNodW5rIiwicHVzaCIsImUiLCJCdWZmZXIiLCJjb25jYXQiLCJyZWFkQXNTdHJpbmciLCJ0b1N0cmluZyIsImRyYWluUmVzcG9uc2UiXSwic291cmNlcyI6WyJyZXNwb25zZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBodHRwIGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCB0eXBlIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc0J1ZmZlcihyZXM6IHN0cmVhbS5SZWFkYWJsZSk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgYm9keTogQnVmZmVyW10gPSBbXVxuICAgIHJlc1xuICAgICAgLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IGJvZHkucHVzaChjaHVuaykpXG4gICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlamVjdChlKSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc1N0cmluZyhyZXM6IGh0dHAuSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRBc0J1ZmZlcihyZXMpXG4gIHJldHVybiBib2R5LnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyYWluUmVzcG9uc2UocmVzOiBzdHJlYW0uUmVhZGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXNcbiAgICAgIC5vbignZGF0YScsICgpID0+IHt9KVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWplY3QoZSkpXG4gICAgICAub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSlcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHTyxlQUFlQSxZQUFZQSxDQUFDQyxHQUFvQixFQUFtQjtFQUN4RSxPQUFPLElBQUlDLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUN0QyxNQUFNQyxJQUFjLEdBQUcsRUFBRTtJQUN6QkosR0FBRyxDQUNBSyxFQUFFLENBQUMsTUFBTSxFQUFHQyxLQUFhLElBQUtGLElBQUksQ0FBQ0csSUFBSSxDQUFDRCxLQUFLLENBQUMsQ0FBQyxDQUMvQ0QsRUFBRSxDQUFDLE9BQU8sRUFBR0csQ0FBQyxJQUFLTCxNQUFNLENBQUNLLENBQUMsQ0FBQyxDQUFDLENBQzdCSCxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU1ILE9BQU8sQ0FBQ08sTUFBTSxDQUFDQyxNQUFNLENBQUNOLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDbEQsQ0FBQyxDQUFDO0FBQ0o7QUFFTyxlQUFlTyxZQUFZQSxDQUFDWCxHQUF5QixFQUFtQjtFQUM3RSxNQUFNSSxJQUFJLEdBQUcsTUFBTUwsWUFBWSxDQUFDQyxHQUFHLENBQUM7RUFDcEMsT0FBT0ksSUFBSSxDQUFDUSxRQUFRLENBQUMsQ0FBQztBQUN4QjtBQUVPLGVBQWVDLGFBQWFBLENBQUNiLEdBQW9CLEVBQWlCO0VBQ3ZFLE9BQU8sSUFBSUMsT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO0lBQ3RDSCxHQUFHLENBQ0FLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNwQkEsRUFBRSxDQUFDLE9BQU8sRUFBR0csQ0FBQyxJQUFLTCxNQUFNLENBQUNLLENBQUMsQ0FBQyxDQUFDLENBQzdCSCxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU1ILE9BQU8sQ0FBQyxDQUFDLENBQUM7RUFDL0IsQ0FBQyxDQUFDO0FBQ0oifQ== - -/***/ }), - /***/ 6314: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { @@ -78636,249 +81205,8 @@ let LEGAL_HOLD_STATUS = /*#__PURE__*/function (LEGAL_HOLD_STATUS) { LEGAL_HOLD_STATUS["DISABLED"] = "OFF"; return LEGAL_HOLD_STATUS; }({}); -/* Replication Config types */ -/* Replication Config types */ exports.LEGAL_HOLD_STATUS = LEGAL_HOLD_STATUS; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTkNSWVBUSU9OX1RZUEVTIiwiZXhwb3J0cyIsIlJFVEVOVElPTl9NT0RFUyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkxFR0FMX0hPTERfU1RBVFVTIl0sInNvdXJjZXMiOlsidHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGh0dHAgZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSBhcyBSZWFkYWJsZVN0cmVhbSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuXG5leHBvcnQgdHlwZSBCaW5hcnkgPSBzdHJpbmcgfCBCdWZmZXJcblxuLy8gbm9kZWpzIEluY29taW5nSHR0cEhlYWRlcnMgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LCBidXQgaXQncyBhY3R1YWxseSB0aGlzOlxuZXhwb3J0IHR5cGUgUmVzcG9uc2VIZWFkZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbmV4cG9ydCB0eXBlIE9iamVjdE1ldGFEYXRhID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCB1bmRlZmluZWQ+XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb24gPVxuICB8IHtcbiAgICAgIHR5cGU6IEVOQ1JZUFRJT05fVFlQRVMuU1NFQ1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBFTkNSWVBUSU9OX1RZUEVTLktNU1xuICAgICAgU1NFQWxnb3JpdGhtPzogc3RyaW5nXG4gICAgICBLTVNNYXN0ZXJLZXlJRD86IHN0cmluZ1xuICAgIH1cblxuZXhwb3J0IGVudW0gRU5DUllQVElPTl9UWVBFUyB7XG4gIC8qKlxuICAgKiBTU0VDIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIGN1c3RvbWVyIHByb3ZpZGVkIGtleXNcbiAgICovXG4gIFNTRUMgPSAnU1NFLUMnLFxuICAvKipcbiAgICogS01TIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIG1hbmFnZWQga2V5c1xuICAgKi9cbiAgS01TID0gJ0tNUycsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9NT0RFUyB7XG4gIEdPVkVSTkFOQ0UgPSAnR09WRVJOQU5DRScsXG4gIENPTVBMSUFOQ0UgPSAnQ09NUExJQU5DRScsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB7XG4gIERBWVMgPSAnRGF5cycsXG4gIFlFQVJTID0gJ1llYXJzJyxcbn1cblxuZXhwb3J0IGVudW0gTEVHQUxfSE9MRF9TVEFUVVMge1xuICBFTkFCTEVEID0gJ09OJyxcbiAgRElTQUJMRUQgPSAnT0ZGJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0ID0gUGljazx0eXBlb2YgaHR0cCwgJ3JlcXVlc3QnPlxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXF1ZXN0IHtcbiAgcHJvdG9jb2w6IHN0cmluZ1xuICBwb3J0PzogbnVtYmVyIHwgc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVyc1xufVxuXG5leHBvcnQgdHlwZSBJQ2Fub25pY2FsUmVxdWVzdCA9IHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEluY29tcGxldGVVcGxvYWRlZEJ1Y2tldEl0ZW0ge1xuICBrZXk6IHN0cmluZ1xuICB1cGxvYWRJZDogc3RyaW5nXG4gIHNpemU6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhSXRlbSB7XG4gIEtleTogc3RyaW5nXG4gIFZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVtQnVja2V0TWV0YWRhdGFMaXN0IHtcbiAgSXRlbXM6IE1ldGFkYXRhSXRlbVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUJ1Y2tldE1ldGFkYXRhIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0SXRlbUZyb21MaXN0IHtcbiAgbmFtZTogc3RyaW5nXG4gIGNyZWF0aW9uRGF0ZTogRGF0ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldEl0ZW1Db3B5IHtcbiAgZXRhZzogc3RyaW5nXG4gIGxhc3RNb2RpZmllZDogRGF0ZVxufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRJdGVtID1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHNpemU6IG51bWJlclxuICAgICAgZXRhZzogc3RyaW5nXG4gICAgICBwcmVmaXg/OiBuZXZlclxuICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlXG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU/OiBuZXZlclxuICAgICAgZXRhZz86IG5ldmVyXG4gICAgICBsYXN0TW9kaWZpZWQ/OiBuZXZlclxuICAgICAgcHJlZml4OiBzdHJpbmdcbiAgICAgIHNpemU6IDBcbiAgICB9XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGEgPSBCdWNrZXRJdGVtICYge1xuICBtZXRhZGF0YT86IEl0ZW1CdWNrZXRNZXRhZGF0YSB8IEl0ZW1CdWNrZXRNZXRhZGF0YUxpc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTdHJlYW08VD4gZXh0ZW5kcyBSZWFkYWJsZVN0cmVhbSB7XG4gIG9uKGV2ZW50OiAnZGF0YScsIGxpc3RlbmVyOiAoaXRlbTogVCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogJ2VuZCcgfCAncGF1c2UnIHwgJ3JlYWRhYmxlJyB8ICdyZXN1bWUnIHwgJ2Nsb3NlJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgb24oZXZlbnQ6ICdlcnJvcicsIGxpc3RlbmVyOiAoZXJyOiBFcnJvcikgPT4gdm9pZCk6IHRoaXNcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBvbihldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldEl0ZW1TdGF0IHtcbiAgc2l6ZTogbnVtYmVyXG4gIGV0YWc6IHN0cmluZ1xuICBsYXN0TW9kaWZpZWQ6IERhdGVcbiAgbWV0YURhdGE6IEl0ZW1CdWNrZXRNZXRhZGF0YVxuICB2ZXJzaW9uSWQ/OiBzdHJpbmcgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFN0YXRPYmplY3RPcHRzID0ge1xuICB2ZXJzaW9uSWQ/OiBzdHJpbmdcbn1cblxuLyogUmVwbGljYXRpb24gQ29uZmlnIHR5cGVzICovXG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvblJ1bGVTdGF0dXMgPSB7XG4gIFN0YXR1czogJ0VuYWJsZWQnIHwgJ0Rpc2FibGVkJ1xufVxuXG5leHBvcnQgdHlwZSBUYWcgPSB7XG4gIEtleTogc3RyaW5nXG4gIFZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYXRpb25SdWxlRGVzdGluYXRpb24gPSB7XG4gIEJ1Y2tldDogc3RyaW5nXG4gIFN0b3JhZ2VDbGFzczogc3RyaW5nXG59XG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvblJ1bGVBbmQgPSB7XG4gIFByZWZpeDogc3RyaW5nXG4gIFRhZ3M6IFRhZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxpY2F0aW9uUnVsZUZpbHRlciA9IHtcbiAgUHJlZml4OiBzdHJpbmdcbiAgQW5kOiBSZXBsaWNhdGlvblJ1bGVBbmRcbiAgVGFnOiBUYWdcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYU1vZGlmaWNhdGlvbnMgPSB7XG4gIFN0YXR1czogUmVwbGljYXRpb25SdWxlU3RhdHVzXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZVNlbGVjdGlvbkNyaXRlcmlhID0ge1xuICBSZXBsaWNhTW9kaWZpY2F0aW9uczogUmVwbGljYU1vZGlmaWNhdGlvbnNcbn1cblxuZXhwb3J0IHR5cGUgRXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvbiA9IHtcbiAgU3RhdHVzOiBSZXBsaWNhdGlvblJ1bGVTdGF0dXNcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGljYXRpb25SdWxlID0ge1xuICBJRDogc3RyaW5nXG4gIFN0YXR1czogUmVwbGljYXRpb25SdWxlU3RhdHVzXG4gIFByaW9yaXR5OiBudW1iZXJcbiAgRGVsZXRlTWFya2VyUmVwbGljYXRpb246IFJlcGxpY2F0aW9uUnVsZVN0YXR1cyAvLyBzaG91bGQgYmUgc2V0IHRvIFwiRGlzYWJsZWRcIiBieSBkZWZhdWx0XG4gIERlbGV0ZVJlcGxpY2F0aW9uOiBSZXBsaWNhdGlvblJ1bGVTdGF0dXNcbiAgRGVzdGluYXRpb246IFJlcGxpY2F0aW9uUnVsZURlc3RpbmF0aW9uXG4gIEZpbHRlcjogUmVwbGljYXRpb25SdWxlRmlsdGVyXG4gIFNvdXJjZVNlbGVjdGlvbkNyaXRlcmlhOiBTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVxuICBFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uOiBFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxpY2F0aW9uQ29uZmlnT3B0cyA9IHtcbiAgcm9sZTogc3RyaW5nXG4gIHJ1bGVzOiBSZXBsaWNhdGlvblJ1bGVbXVxufVxuXG5leHBvcnQgdHlwZSBSZXBsaWNhdGlvbkNvbmZpZyA9IHtcbiAgUmVwbGljYXRpb25Db25maWd1cmF0aW9uOiBSZXBsaWNhdGlvbkNvbmZpZ09wdHNcbn1cbi8qIFJlcGxpY2F0aW9uIENvbmZpZyB0eXBlcyAqL1xuXG5leHBvcnQgdHlwZSBSZXN1bHRDYWxsYmFjazxUPiA9IChlcnJvcjogRXJyb3IgfCBudWxsLCByZXN1bHQ6IFQpID0+IHZvaWRcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQTtBQUFBLElBaUJZQSxnQkFBZ0IsMEJBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQUEsT0FBaEJBLGdCQUFnQjtBQUFBO0FBQUFDLE9BQUEsQ0FBQUQsZ0JBQUEsR0FBQUEsZ0JBQUE7QUFBQSxJQVdoQkUsZUFBZSwwQkFBZkEsZUFBZTtFQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBQSxPQUFmQSxlQUFlO0FBQUE7QUFBQUQsT0FBQSxDQUFBQyxlQUFBLEdBQUFBLGVBQUE7QUFBQSxJQUtmQyx3QkFBd0IsMEJBQXhCQSx3QkFBd0I7RUFBeEJBLHdCQUF3QjtFQUF4QkEsd0JBQXdCO0VBQUEsT0FBeEJBLHdCQUF3QjtBQUFBO0FBQUFGLE9BQUEsQ0FBQUUsd0JBQUEsR0FBQUEsd0JBQUE7QUFBQSxJQUt4QkMsaUJBQWlCLDBCQUFqQkEsaUJBQWlCO0VBQWpCQSxpQkFBaUI7RUFBakJBLGlCQUFpQjtFQUFBLE9BQWpCQSxpQkFBaUI7QUFBQTtBQTBGN0I7QUF5REE7QUFBQUgsT0FBQSxDQUFBRyxpQkFBQSxHQUFBQSxpQkFBQSJ9 - -/***/ }), - -/***/ 4040: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.parseBucketRegion = parseBucketRegion; -exports.parseError = parseError; -exports.parseInitiateMultipart = parseInitiateMultipart; -exports.parseListBucket = parseListBucket; -exports.parseListObjectsV2WithMetadata = parseListObjectsV2WithMetadata; -exports.parseListParts = parseListParts; -exports.parseReplicationConfig = parseReplicationConfig; -exports.parseResponseError = parseResponseError; -var _fastXmlParser = __nccwpck_require__(2603); -var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); -var _helper = __nccwpck_require__(9921); -var _response = __nccwpck_require__(2644); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -// parse XML response for bucket region -function parseBucketRegion(xml) { - // return region information - return (0, _helper.parseXml)(xml).LocationConstraint; -} -const fxp = new _fastXmlParser.XMLParser(); - -// Parse XML and return information as Javascript types -// parse error XML response -function parseError(xml, headerInfo) { - let xmlErr = {}; - const xmlObj = fxp.parse(xml); - if (xmlObj.Error) { - xmlErr = xmlObj.Error; - } - const e = new errors.S3Error(); - Object.entries(xmlErr).forEach(([key, value]) => { - e[key.toLowerCase()] = value; - }); - Object.entries(headerInfo).forEach(([key, value]) => { - e[key] = value; - }); - return e; -} - -// Generates an Error object depending on http statusCode and XML body -async function parseResponseError(response) { - const statusCode = response.statusCode; - let code, message; - if (statusCode === 301) { - code = 'MovedPermanently'; - message = 'Moved Permanently'; - } else if (statusCode === 307) { - code = 'TemporaryRedirect'; - message = 'Are you using the correct endpoint URL?'; - } else if (statusCode === 403) { - code = 'AccessDenied'; - message = 'Valid and authorized credentials required'; - } else if (statusCode === 404) { - code = 'NotFound'; - message = 'Not Found'; - } else if (statusCode === 405) { - code = 'MethodNotAllowed'; - message = 'Method Not Allowed'; - } else if (statusCode === 501) { - code = 'MethodNotAllowed'; - message = 'Method Not Allowed'; - } else { - code = 'UnknownError'; - message = `${statusCode}`; - } - const headerInfo = {}; - // A value created by S3 compatible server that uniquely identifies the request. - headerInfo.amzRequestid = response.headers['x-amz-request-id']; - // A special token that helps troubleshoot API replies and issues. - headerInfo.amzId2 = response.headers['x-amz-id-2']; - - // Region where the bucket is located. This header is returned only - // in HEAD bucket and ListObjects response. - headerInfo.amzBucketRegion = response.headers['x-amz-bucket-region']; - const xmlString = await (0, _response.readAsString)(response); - if (xmlString) { - throw parseError(xmlString, headerInfo); - } - - // Message should be instantiated for each S3Errors. - const e = new errors.S3Error(message, { - cause: headerInfo - }); - // S3 Error code. - e.code = code; - Object.entries(headerInfo).forEach(([key, value]) => { - // @ts-expect-error force set error properties - e[key] = value; - }); - throw e; -} - -/** - * parse XML response for list objects v2 with metadata in a bucket - */ -function parseListObjectsV2WithMetadata(xml) { - const result = { - objects: [], - isTruncated: false, - nextContinuationToken: '' - }; - let xmlobj = (0, _helper.parseXml)(xml); - if (!xmlobj.ListBucketResult) { - throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"'); - } - xmlobj = xmlobj.ListBucketResult; - if (xmlobj.IsTruncated) { - result.isTruncated = xmlobj.IsTruncated; - } - if (xmlobj.NextContinuationToken) { - result.nextContinuationToken = xmlobj.NextContinuationToken; - } - if (xmlobj.Contents) { - (0, _helper.toArray)(xmlobj.Contents).forEach(content => { - const name = (0, _helper.sanitizeObjectKey)(content.Key); - const lastModified = new Date(content.LastModified); - const etag = (0, _helper.sanitizeETag)(content.ETag); - const size = content.Size; - let metadata; - if (content.UserMetadata != null) { - metadata = (0, _helper.toArray)(content.UserMetadata)[0]; - } else { - metadata = null; - } - result.objects.push({ - name, - lastModified, - etag, - size, - metadata - }); - }); - } - if (xmlobj.CommonPrefixes) { - (0, _helper.toArray)(xmlobj.CommonPrefixes).forEach(commonPrefix => { - result.objects.push({ - prefix: (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(commonPrefix.Prefix)[0]), - size: 0 - }); - }); - } - return result; -} -// parse XML response for list parts of an in progress multipart upload -function parseListParts(xml) { - let xmlobj = (0, _helper.parseXml)(xml); - const result = { - isTruncated: false, - parts: [], - marker: 0 - }; - if (!xmlobj.ListPartsResult) { - throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"'); - } - xmlobj = xmlobj.ListPartsResult; - if (xmlobj.IsTruncated) { - result.isTruncated = xmlobj.IsTruncated; - } - if (xmlobj.NextPartNumberMarker) { - result.marker = (0, _helper.toArray)(xmlobj.NextPartNumberMarker)[0] || ''; - } - if (xmlobj.Part) { - (0, _helper.toArray)(xmlobj.Part).forEach(p => { - const part = parseInt((0, _helper.toArray)(p.PartNumber)[0], 10); - const lastModified = new Date(p.LastModified); - const etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, ''); - result.parts.push({ - part, - lastModified, - etag, - size: parseInt(p.Size, 10) - }); - }); - } - return result; -} -function parseListBucket(xml) { - let result = []; - const parsedXmlRes = (0, _helper.parseXml)(xml); - if (!parsedXmlRes.ListAllMyBucketsResult) { - throw new errors.InvalidXMLError('Missing tag: "ListAllMyBucketsResult"'); - } - const { - ListAllMyBucketsResult: { - Buckets = {} - } = {} - } = parsedXmlRes; - if (Buckets.Bucket) { - result = (0, _helper.toArray)(Buckets.Bucket).map((bucket = {}) => { - const { - Name: bucketName, - CreationDate - } = bucket; - const creationDate = new Date(CreationDate); - return { - name: bucketName, - creationDate: creationDate - }; - }); - } - return result; -} -function parseInitiateMultipart(xml) { - let xmlobj = (0, _helper.parseXml)(xml); - if (!xmlobj.InitiateMultipartUploadResult) { - throw new errors.InvalidXMLError('Missing tag: "InitiateMultipartUploadResult"'); - } - xmlobj = xmlobj.InitiateMultipartUploadResult; - if (xmlobj.UploadId) { - return xmlobj.UploadId; - } - throw new errors.InvalidXMLError('Missing tag: "UploadId"'); -} -function parseReplicationConfig(xml) { - const xmlObj = (0, _helper.parseXml)(xml); - const { - Role, - Rule - } = xmlObj.ReplicationConfiguration; - return { - ReplicationConfiguration: { - role: Role, - rules: (0, _helper.toArray)(Rule) - } - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmFzdFhtbFBhcnNlciIsInJlcXVpcmUiLCJlcnJvcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9oZWxwZXIiLCJfcmVzcG9uc2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwicGFyc2VCdWNrZXRSZWdpb24iLCJ4bWwiLCJwYXJzZVhtbCIsIkxvY2F0aW9uQ29uc3RyYWludCIsImZ4cCIsIlhNTFBhcnNlciIsInBhcnNlRXJyb3IiLCJoZWFkZXJJbmZvIiwieG1sRXJyIiwieG1sT2JqIiwicGFyc2UiLCJFcnJvciIsImUiLCJTM0Vycm9yIiwiZW50cmllcyIsImZvckVhY2giLCJ2YWx1ZSIsInRvTG93ZXJDYXNlIiwicGFyc2VSZXNwb25zZUVycm9yIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiY29kZSIsIm1lc3NhZ2UiLCJhbXpSZXF1ZXN0aWQiLCJoZWFkZXJzIiwiYW16SWQyIiwiYW16QnVja2V0UmVnaW9uIiwieG1sU3RyaW5nIiwicmVhZEFzU3RyaW5nIiwiY2F1c2UiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJyZXN1bHQiLCJvYmplY3RzIiwiaXNUcnVuY2F0ZWQiLCJuZXh0Q29udGludWF0aW9uVG9rZW4iLCJ4bWxvYmoiLCJMaXN0QnVja2V0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiSXNUcnVuY2F0ZWQiLCJOZXh0Q29udGludWF0aW9uVG9rZW4iLCJDb250ZW50cyIsInRvQXJyYXkiLCJjb250ZW50IiwibmFtZSIsInNhbml0aXplT2JqZWN0S2V5IiwiS2V5IiwibGFzdE1vZGlmaWVkIiwiRGF0ZSIsIkxhc3RNb2RpZmllZCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJFVGFnIiwic2l6ZSIsIlNpemUiLCJtZXRhZGF0YSIsIlVzZXJNZXRhZGF0YSIsInB1c2giLCJDb21tb25QcmVmaXhlcyIsImNvbW1vblByZWZpeCIsInByZWZpeCIsIlByZWZpeCIsInBhcnNlTGlzdFBhcnRzIiwicGFydHMiLCJtYXJrZXIiLCJMaXN0UGFydHNSZXN1bHQiLCJOZXh0UGFydE51bWJlck1hcmtlciIsIlBhcnQiLCJwIiwicGFydCIsInBhcnNlSW50IiwiUGFydE51bWJlciIsInJlcGxhY2UiLCJwYXJzZUxpc3RCdWNrZXQiLCJwYXJzZWRYbWxSZXMiLCJMaXN0QWxsTXlCdWNrZXRzUmVzdWx0IiwiQnVja2V0cyIsIkJ1Y2tldCIsIm1hcCIsImJ1Y2tldCIsIk5hbWUiLCJidWNrZXROYW1lIiwiQ3JlYXRpb25EYXRlIiwiY3JlYXRpb25EYXRlIiwicGFyc2VJbml0aWF0ZU11bHRpcGFydCIsIkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0IiwiVXBsb2FkSWQiLCJwYXJzZVJlcGxpY2F0aW9uQ29uZmlnIiwiUm9sZSIsIlJ1bGUiLCJSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJyb2xlIiwicnVsZXMiXSwic291cmNlcyI6WyJ4bWwtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5cbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4uL2Vycm9ycy50cydcbmltcG9ydCB7IHBhcnNlWG1sLCBzYW5pdGl6ZUVUYWcsIHNhbml0aXplT2JqZWN0S2V5LCB0b0FycmF5IH0gZnJvbSAnLi9oZWxwZXIudHMnXG5pbXBvcnQgeyByZWFkQXNTdHJpbmcgfSBmcm9tICcuL3Jlc3BvbnNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBCdWNrZXRJdGVtRnJvbUxpc3QsIEJ1Y2tldEl0ZW1XaXRoTWV0YWRhdGEsIFJlcGxpY2F0aW9uQ29uZmlnIH0gZnJvbSAnLi90eXBlLnRzJ1xuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCByZWdpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldFJlZ2lvbih4bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIHJldHVybiByZWdpb24gaW5mb3JtYXRpb25cbiAgcmV0dXJuIHBhcnNlWG1sKHhtbCkuTG9jYXRpb25Db25zdHJhaW50XG59XG5cbmNvbnN0IGZ4cCA9IG5ldyBYTUxQYXJzZXIoKVxuXG4vLyBQYXJzZSBYTUwgYW5kIHJldHVybiBpbmZvcm1hdGlvbiBhcyBKYXZhc2NyaXB0IHR5cGVzXG4vLyBwYXJzZSBlcnJvciBYTUwgcmVzcG9uc2VcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVycm9yKHhtbDogc3RyaW5nLCBoZWFkZXJJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBsZXQgeG1sRXJyID0ge31cbiAgY29uc3QgeG1sT2JqID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHhtbE9iai5FcnJvcikge1xuICAgIHhtbEVyciA9IHhtbE9iai5FcnJvclxuICB9XG4gIGNvbnN0IGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IoKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIE9iamVjdC5lbnRyaWVzKHhtbEVycikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgZVtrZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZVxuICB9KVxuICBPYmplY3QuZW50cmllcyhoZWFkZXJJbmZvKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlW2tleV0gPSB2YWx1ZVxuICB9KVxuICByZXR1cm4gZVxufVxuXG4vLyBHZW5lcmF0ZXMgYW4gRXJyb3Igb2JqZWN0IGRlcGVuZGluZyBvbiBodHRwIHN0YXR1c0NvZGUgYW5kIFhNTCBib2R5XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VSZXNwb25zZUVycm9yKHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSkge1xuICBjb25zdCBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZVxuICBsZXQgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmdcbiAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMSkge1xuICAgIGNvZGUgPSAnTW92ZWRQZXJtYW5lbnRseSdcbiAgICBtZXNzYWdlID0gJ01vdmVkIFBlcm1hbmVudGx5J1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDMwNykge1xuICAgIGNvZGUgPSAnVGVtcG9yYXJ5UmVkaXJlY3QnXG4gICAgbWVzc2FnZSA9ICdBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IGVuZHBvaW50IFVSTD8nXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgY29kZSA9ICdBY2Nlc3NEZW5pZWQnXG4gICAgbWVzc2FnZSA9ICdWYWxpZCBhbmQgYXV0aG9yaXplZCBjcmVkZW50aWFscyByZXF1aXJlZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICBjb2RlID0gJ05vdEZvdW5kJ1xuICAgIG1lc3NhZ2UgPSAnTm90IEZvdW5kJ1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwNSkge1xuICAgIGNvZGUgPSAnTWV0aG9kTm90QWxsb3dlZCdcbiAgICBtZXNzYWdlID0gJ01ldGhvZCBOb3QgQWxsb3dlZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA1MDEpIHtcbiAgICBjb2RlID0gJ01ldGhvZE5vdEFsbG93ZWQnXG4gICAgbWVzc2FnZSA9ICdNZXRob2QgTm90IEFsbG93ZWQnXG4gIH0gZWxzZSB7XG4gICAgY29kZSA9ICdVbmtub3duRXJyb3InXG4gICAgbWVzc2FnZSA9IGAke3N0YXR1c0NvZGV9YFxuICB9XG4gIGNvbnN0IGhlYWRlckluZm86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw+ID0ge31cbiAgLy8gQSB2YWx1ZSBjcmVhdGVkIGJ5IFMzIGNvbXBhdGlibGUgc2VydmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVxdWVzdC5cbiAgaGVhZGVySW5mby5hbXpSZXF1ZXN0aWQgPSByZXNwb25zZS5oZWFkZXJzWyd4LWFtei1yZXF1ZXN0LWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gIC8vIEEgc3BlY2lhbCB0b2tlbiB0aGF0IGhlbHBzIHRyb3VibGVzaG9vdCBBUEkgcmVwbGllcyBhbmQgaXNzdWVzLlxuICBoZWFkZXJJbmZvLmFteklkMiA9IHJlc3BvbnNlLmhlYWRlcnNbJ3gtYW16LWlkLTInXSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvLyBSZWdpb24gd2hlcmUgdGhlIGJ1Y2tldCBpcyBsb2NhdGVkLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5XG4gIC8vIGluIEhFQUQgYnVja2V0IGFuZCBMaXN0T2JqZWN0cyByZXNwb25zZS5cbiAgaGVhZGVySW5mby5hbXpCdWNrZXRSZWdpb24gPSByZXNwb25zZS5oZWFkZXJzWyd4LWFtei1idWNrZXQtcmVnaW9uJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgeG1sU3RyaW5nID0gYXdhaXQgcmVhZEFzU3RyaW5nKHJlc3BvbnNlKVxuXG4gIGlmICh4bWxTdHJpbmcpIHtcbiAgICB0aHJvdyBwYXJzZUVycm9yKHhtbFN0cmluZywgaGVhZGVySW5mbylcbiAgfVxuXG4gIC8vIE1lc3NhZ2Ugc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCBTM0Vycm9ycy5cbiAgY29uc3QgZSA9IG5ldyBlcnJvcnMuUzNFcnJvcihtZXNzYWdlLCB7IGNhdXNlOiBoZWFkZXJJbmZvIH0pXG4gIC8vIFMzIEVycm9yIGNvZGUuXG4gIGUuY29kZSA9IGNvZGVcbiAgT2JqZWN0LmVudHJpZXMoaGVhZGVySW5mbykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmb3JjZSBzZXQgZXJyb3IgcHJvcGVydGllc1xuICAgIGVba2V5XSA9IHZhbHVlXG4gIH0pXG5cbiAgdGhyb3cgZVxufVxuXG4vKipcbiAqIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIHdpdGggbWV0YWRhdGEgaW4gYSBidWNrZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSh4bWw6IHN0cmluZykge1xuICBjb25zdCByZXN1bHQ6IHtcbiAgICBvYmplY3RzOiBBcnJheTxCdWNrZXRJdGVtV2l0aE1ldGFkYXRhPlxuICAgIGlzVHJ1bmNhdGVkOiBib29sZWFuXG4gICAgbmV4dENvbnRpbnVhdGlvblRva2VuOiBzdHJpbmdcbiAgfSA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgbmV4dENvbnRpbnVhdGlvblRva2VuOiAnJyxcbiAgfVxuXG4gIGxldCB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIGlmICgheG1sb2JqLkxpc3RCdWNrZXRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdEJ1Y2tldFJlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdFxuICBpZiAoeG1sb2JqLklzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0LmlzVHJ1bmNhdGVkID0geG1sb2JqLklzVHJ1bmNhdGVkXG4gIH1cbiAgaWYgKHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW4pIHtcbiAgICByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuID0geG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlblxuICB9XG5cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkoY29udGVudC5LZXkpXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShjb250ZW50Lkxhc3RNb2RpZmllZClcbiAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgY29uc3Qgc2l6ZSA9IGNvbnRlbnQuU2l6ZVxuICAgICAgbGV0IG1ldGFkYXRhXG4gICAgICBpZiAoY29udGVudC5Vc2VyTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgICBtZXRhZGF0YSA9IHRvQXJyYXkoY29udGVudC5Vc2VyTWV0YWRhdGEpWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUsIG1ldGFkYXRhIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouQ29tbW9uUHJlZml4ZXMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db21tb25QcmVmaXhlcykuZm9yRWFjaCgoY29tbW9uUHJlZml4KSA9PiB7XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBNdWx0aXBhcnQgPSB7XG4gIHVwbG9hZHM6IEFycmF5PHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHVwbG9hZElkOiBzdHJpbmdcbiAgICBpbml0aWF0b3I6IHVua25vd25cbiAgICBvd25lcjogdW5rbm93blxuICAgIHN0b3JhZ2VDbGFzczogdW5rbm93blxuICAgIGluaXRpYXRlZDogdW5rbm93blxuICB9PlxuICBwcmVmaXhlczogeyBwcmVmaXg6IHN0cmluZyB9W11cbiAgaXNUcnVuY2F0ZWQ6IGJvb2xlYW5cbiAgbmV4dEtleU1hcmtlcjogdW5kZWZpbmVkXG4gIG5leHRVcGxvYWRJZE1hcmtlcjogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCB0eXBlIFVwbG9hZGVkUGFydCA9IHtcbiAgcGFydDogbnVtYmVyXG4gIGxhc3RNb2RpZmllZD86IERhdGVcbiAgZXRhZzogc3RyaW5nXG4gIHNpemU6IG51bWJlclxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3QgcGFydHMgb2YgYW4gaW4gcHJvZ3Jlc3MgbXVsdGlwYXJ0IHVwbG9hZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdFBhcnRzKHhtbDogc3RyaW5nKToge1xuICBpc1RydW5jYXRlZDogYm9vbGVhblxuICBtYXJrZXI6IG51bWJlclxuICBwYXJ0czogVXBsb2FkZWRQYXJ0W11cbn0ge1xuICBsZXQgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXN1bHQ6IHsgaXNUcnVuY2F0ZWQ6IGJvb2xlYW47IG1hcmtlcjogbnVtYmVyOyBwYXJ0czogVXBsb2FkZWRQYXJ0W10gfSA9IHtcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgcGFydHM6IFtdLFxuICAgIG1hcmtlcjogMCxcbiAgfVxuICBpZiAoIXhtbG9iai5MaXN0UGFydHNSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdFBhcnRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0UGFydHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpIHtcbiAgICByZXN1bHQubWFya2VyID0gdG9BcnJheSh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpWzBdIHx8ICcnXG4gIH1cbiAgaWYgKHhtbG9iai5QYXJ0KSB7XG4gICAgdG9BcnJheSh4bWxvYmouUGFydCkuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgY29uc3QgcGFydCA9IHBhcnNlSW50KHRvQXJyYXkocC5QYXJ0TnVtYmVyKVswXSwgMTApXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShwLkxhc3RNb2RpZmllZClcbiAgICAgIGNvbnN0IGV0YWcgPSBwLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXiZxdW90Oy9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC8mIzM0OyQvZywgJycpXG4gICAgICByZXN1bHQucGFydHMucHVzaCh7IHBhcnQsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZTogcGFyc2VJbnQocC5TaXplLCAxMCkgfSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdEJ1Y2tldCh4bWw6IHN0cmluZykge1xuICBsZXQgcmVzdWx0OiBCdWNrZXRJdGVtRnJvbUxpc3RbXSA9IFtdXG4gIGNvbnN0IHBhcnNlZFhtbFJlcyA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXBhcnNlZFhtbFJlcy5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RBbGxNeUJ1Y2tldHNSZXN1bHRcIicpXG4gIH1cbiAgY29uc3QgeyBMaXN0QWxsTXlCdWNrZXRzUmVzdWx0OiB7IEJ1Y2tldHMgPSB7fSB9ID0ge30gfSA9IHBhcnNlZFhtbFJlc1xuXG4gIGlmIChCdWNrZXRzLkJ1Y2tldCkge1xuICAgIHJlc3VsdCA9IHRvQXJyYXkoQnVja2V0cy5CdWNrZXQpLm1hcCgoYnVja2V0ID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHsgTmFtZTogYnVja2V0TmFtZSwgQ3JlYXRpb25EYXRlIH0gPSBidWNrZXRcbiAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKENyZWF0aW9uRGF0ZSlcblxuICAgICAgcmV0dXJuIHsgbmFtZTogYnVja2V0TmFtZSwgY3JlYXRpb25EYXRlOiBjcmVhdGlvbkRhdGUgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbml0aWF0ZU11bHRpcGFydCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5VcGxvYWRJZCkge1xuICAgIHJldHVybiB4bWxvYmouVXBsb2FkSWRcbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiVXBsb2FkSWRcIicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlcGxpY2F0aW9uQ29uZmlnKHhtbDogc3RyaW5nKTogUmVwbGljYXRpb25Db25maWcge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGNvbnN0IHsgUm9sZSwgUnVsZSB9ID0geG1sT2JqLlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICByZXR1cm4ge1xuICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgcm9sZTogUm9sZSxcbiAgICAgIHJ1bGVzOiB0b0FycmF5KFJ1bGUpLFxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUVBLElBQUFBLGNBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUE0QyxTQUFBSyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBSix3QkFBQVEsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcs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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTkNSWVBUSU9OX1RZUEVTIiwiZXhwb3J0cyIsIlJFVEVOVElPTl9NT0RFUyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkxFR0FMX0hPTERfU1RBVFVTIl0sInNvdXJjZXMiOlsidHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGh0dHAgZnJvbSAnbm9kZTpodHRwJ1xuXG5leHBvcnQgdHlwZSBCaW5hcnkgPSBzdHJpbmcgfCBCdWZmZXJcblxuLy8gbm9kZWpzIEluY29taW5nSHR0cEhlYWRlcnMgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+LCBidXQgaXQncyBhY3R1YWxseSB0aGlzOlxuZXhwb3J0IHR5cGUgUmVzcG9uc2VIZWFkZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbmV4cG9ydCB0eXBlIE9iamVjdE1ldGFEYXRhID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCB1bmRlZmluZWQ+XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb24gPVxuICB8IHtcbiAgICAgIHR5cGU6IEVOQ1JZUFRJT05fVFlQRVMuU1NFQ1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBFTkNSWVBUSU9OX1RZUEVTLktNU1xuICAgICAgU1NFQWxnb3JpdGhtPzogc3RyaW5nXG4gICAgICBLTVNNYXN0ZXJLZXlJRD86IHN0cmluZ1xuICAgIH1cblxuZXhwb3J0IGVudW0gRU5DUllQVElPTl9UWVBFUyB7XG4gIC8qKlxuICAgKiBTU0VDIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIGN1c3RvbWVyIHByb3ZpZGVkIGtleXNcbiAgICovXG4gIFNTRUMgPSAnU1NFLUMnLFxuICAvKipcbiAgICogS01TIHJlcHJlc2VudHMgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiB3aXRoIG1hbmFnZWQga2V5c1xuICAgKi9cbiAgS01TID0gJ0tNUycsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9NT0RFUyB7XG4gIEdPVkVSTkFOQ0UgPSAnR09WRVJOQU5DRScsXG4gIENPTVBMSUFOQ0UgPSAnQ09NUExJQU5DRScsXG59XG5cbmV4cG9ydCBlbnVtIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB7XG4gIERBWVMgPSAnRGF5cycsXG4gIFlFQVJTID0gJ1llYXJzJyxcbn1cblxuZXhwb3J0IGVudW0gTEVHQUxfSE9MRF9TVEFUVVMge1xuICBFTkFCTEVEID0gJ09OJyxcbiAgRElTQUJMRUQgPSAnT0ZGJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0ID0gUGljazx0eXBlb2YgaHR0cCwgJ3JlcXVlc3QnPlxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXF1ZXN0IHtcbiAgcHJvdG9jb2w6IHN0cmluZ1xuICBwb3J0PzogbnVtYmVyIHwgc3RyaW5nXG4gIG1ldGhvZDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVyc1xufVxuXG5leHBvcnQgdHlwZSBJQ2Fub25pY2FsUmVxdWVzdCA9IHN0cmluZ1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUlBO0FBQUEsSUFpQllBLGdCQUFnQiwwQkFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBQSxPQUFoQkEsZ0JBQWdCO0FBQUE7QUFBQUMsT0FBQSxDQUFBRCxnQkFBQSxHQUFBQSxnQkFBQTtBQUFBLElBV2hCRSxlQUFlLDBCQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBZkEsZUFBZTtFQUFBLE9BQWZBLGVBQWU7QUFBQTtBQUFBRCxPQUFBLENBQUFDLGVBQUEsR0FBQUEsZUFBQTtBQUFBLElBS2ZDLHdCQUF3QiwwQkFBeEJBLHdCQUF3QjtFQUF4QkEsd0JBQXdCO0VBQXhCQSx3QkFBd0I7RUFBQSxPQUF4QkEsd0JBQXdCO0FBQUE7QUFBQUYsT0FBQSxDQUFBRSx3QkFBQSxHQUFBQSx3QkFBQTtBQUFBLElBS3hCQyxpQkFBaUIsMEJBQWpCQSxpQkFBaUI7RUFBakJBLGlCQUFpQjtFQUFqQkEsaUJBQWlCO0VBQUEsT0FBakJBLGlCQUFpQjtBQUFBO0FBQUFILE9BQUEsQ0FBQUcsaUJBQUEsR0FBQUEsaUJBQUEifQ== /***/ }), @@ -78907,6 +81235,7 @@ var _webEncoding = __nccwpck_require__(1430); var _xml = __nccwpck_require__(7578); var _xml2js = __nccwpck_require__(4659); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); +var _extensions = __nccwpck_require__(2895); var _helpers = __nccwpck_require__(9455); Object.keys(_helpers).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -78914,7 +81243,6 @@ Object.keys(_helpers).forEach(function (key) { if (key in exports && exports[key] === _helpers[key]) return; exports[key] = _helpers[key]; }); -var _callbackify = __nccwpck_require__(3826); var _client = __nccwpck_require__(5586); var _copyConditions = __nccwpck_require__(3250); exports.CopyConditions = _copyConditions.CopyConditions; @@ -79001,6 +81329,263 @@ class Client extends _client.TypedClient { } } + // log the request, response, error + logHTTP(reqOptions, response, err) { + // if no logstreamer available return. + if (!this.logStream) { + return; + } + if (!(0, _helper.isObject)(reqOptions)) { + throw new TypeError('reqOptions should be of type "object"'); + } + if (response && !(0, _helper.isReadableStream)(response)) { + throw new TypeError('response should be of type "Stream"'); + } + if (err && !(err instanceof Error)) { + throw new TypeError('err should be of type "Error"'); + } + var logHeaders = headers => { + _lodash.forEach(headers, (v, k) => { + if (k == 'authorization') { + var redacter = new RegExp('Signature=([0-9a-f]+)'); + v = v.replace(redacter, 'Signature=**REDACTED**'); + } + this.logStream.write(`${k}: ${v}\n`); + }); + this.logStream.write('\n'); + }; + this.logStream.write(`REQUEST: ${reqOptions.method} ${reqOptions.path}\n`); + logHeaders(reqOptions.headers); + if (response) { + this.logStream.write(`RESPONSE: ${response.statusCode}\n`); + logHeaders(response.headers); + } + if (err) { + this.logStream.write('ERROR BODY:\n'); + var errJSON = JSON.stringify(err, null, '\t'); + this.logStream.write(`${errJSON}\n`); + } + } + + // Enable tracing + traceOn(stream) { + if (!stream) { + stream = process.stdout; + } + this.logStream = stream; + } + + // Disable tracing + traceOff() { + this.logStream = null; + } + + // makeRequest is the primitive used by the apis for making S3 requests. + // payload can be empty string in case of no payload. + // statusCode is the expected statusCode. If response.statusCode does not match + // we parse the XML error and call the callback with the error message. + // A valid region is passed by the calls - listBuckets, makeBucket and + // getBucketRegion. + makeRequest(options, payload, statusCodes, region, returnResponse, cb) { + if (!(0, _helper.isObject)(options)) { + throw new TypeError('options should be of type "object"'); + } + if (!(0, _helper.isString)(payload) && !(0, _helper.isObject)(payload)) { + // Buffer is of type 'object' + throw new TypeError('payload should be of type "string" or "Buffer"'); + } + statusCodes.forEach(statusCode => { + if (!(0, _helper.isNumber)(statusCode)) { + throw new TypeError('statusCode should be of type "number"'); + } + }); + if (!(0, _helper.isString)(region)) { + throw new TypeError('region should be of type "string"'); + } + if (!(0, _helper.isBoolean)(returnResponse)) { + throw new TypeError('returnResponse should be of type "boolean"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + if (!options.headers) { + options.headers = {}; + } + if (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE') { + options.headers['content-length'] = payload.length; + } + var sha256sum = ''; + if (this.enableSHA256) { + sha256sum = (0, _helper.toSha256)(payload); + } + var stream = (0, _helper.readableStream)(payload); + this.makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb); + } + + // makeRequestStream will be used directly instead of makeRequest in case the payload + // is available as a stream. for ex. putObject + makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb) { + if (!(0, _helper.isObject)(options)) { + throw new TypeError('options should be of type "object"'); + } + if (!(0, _helper.isReadableStream)(stream)) { + throw new errors.InvalidArgumentError('stream should be a readable Stream'); + } + if (!(0, _helper.isString)(sha256sum)) { + throw new TypeError('sha256sum should be of type "string"'); + } + statusCodes.forEach(statusCode => { + if (!(0, _helper.isNumber)(statusCode)) { + throw new TypeError('statusCode should be of type "number"'); + } + }); + if (!(0, _helper.isString)(region)) { + throw new TypeError('region should be of type "string"'); + } + if (!(0, _helper.isBoolean)(returnResponse)) { + throw new TypeError('returnResponse should be of type "boolean"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + + // sha256sum will be empty for anonymous or https requests + if (!this.enableSHA256 && sha256sum.length !== 0) { + throw new errors.InvalidArgumentError(`sha256sum expected to be empty for anonymous or https requests`); + } + // sha256sum should be valid for non-anonymous http requests. + if (this.enableSHA256 && sha256sum.length !== 64) { + throw new errors.InvalidArgumentError(`Invalid sha256sum : ${sha256sum}`); + } + var _makeRequest = (e, region) => { + if (e) { + return cb(e); + } + options.region = region; + var reqOptions = this.getRequestOptions(options); + if (!this.anonymous) { + // For non-anonymous https requests sha256sum is 'UNSIGNED-PAYLOAD' for signature calculation. + if (!this.enableSHA256) { + sha256sum = 'UNSIGNED-PAYLOAD'; + } + let date = new Date(); + reqOptions.headers['x-amz-date'] = (0, _helper.makeDateLong)(date); + reqOptions.headers['x-amz-content-sha256'] = sha256sum; + if (this.sessionToken) { + reqOptions.headers['x-amz-security-token'] = this.sessionToken; + } + this.checkAndRefreshCreds(); + var authorization = (0, _signing.signV4)(reqOptions, this.accessKey, this.secretKey, region, date, sha256sum); + reqOptions.headers.authorization = authorization; + } + var req = this.transport.request(reqOptions, response => { + if (!statusCodes.includes(response.statusCode)) { + // For an incorrect region, S3 server always sends back 400. + // But we will do cache invalidation for all errors so that, + // in future, if AWS S3 decides to send a different status code or + // XML error code we will still work fine. + delete this.regionMap[options.bucketName]; + var errorTransformer = transformers.getErrorTransformer(response); + (0, _helper.pipesetup)(response, errorTransformer).on('error', e => { + this.logHTTP(reqOptions, response, e); + cb(e); + }); + return; + } + this.logHTTP(reqOptions, response); + if (returnResponse) { + return cb(null, response); + } + // We drain the socket so that the connection gets closed. Note that this + // is not expensive as the socket will not have any data. + response.on('data', () => {}); + cb(null); + }); + let pipe = (0, _helper.pipesetup)(stream, req); + pipe.on('error', e => { + this.logHTTP(reqOptions, null, e); + cb(e); + }); + }; + if (region) { + return _makeRequest(null, region); + } + this.getBucketRegion(options.bucketName, _makeRequest); + } + + // gets the region of the bucket + getBucketRegion(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('cb should be of type "function"'); + } + + // Region is set with constructor, return the region right here. + if (this.region) { + return cb(null, this.region); + } + if (this.regionMap[bucketName]) { + return cb(null, this.regionMap[bucketName]); + } + var extractRegion = response => { + var transformer = transformers.getBucketRegionTransformer(); + var region = _helpers.DEFAULT_REGION; + (0, _helper.pipesetup)(response, transformer).on('error', cb).on('data', data => { + if (data) { + region = data; + } + }).on('end', () => { + this.regionMap[bucketName] = region; + cb(null, region); + }); + }; + var method = 'GET'; + var query = 'location'; + + // `getBucketLocation` behaves differently in following ways for + // different environments. + // + // - For nodejs env we default to path style requests. + // - For browser env path style requests on buckets yields CORS + // error. To circumvent this problem we make a virtual host + // style request signed with 'us-east-1'. This request fails + // with an error 'AuthorizationHeaderMalformed', additionally + // the error XML also provides Region of the bucket. To validate + // this region is proper we retry the same request with the newly + // obtained region. + var pathStyle = this.pathStyle && typeof window === 'undefined'; + this.makeRequest({ + method, + bucketName, + query, + pathStyle + }, '', [200], _helpers.DEFAULT_REGION, true, (e, response) => { + if (e) { + if (e.name === 'AuthorizationHeaderMalformed') { + var region = e.Region; + if (!region) { + return cb(e); + } + this.makeRequest({ + method, + bucketName, + query + }, '', [200], region, true, (e, response) => { + if (e) { + return cb(e); + } + extractRegion(response); + }); + return; + } + return cb(e); + } + extractRegion(response); + }); + } + // Creates the bucket `bucketName`. // // __Arguments__ @@ -79092,6 +81677,31 @@ class Client extends _client.TypedClient { }, payload, [200], region, false, processWithRetry); } + // List of buckets created. + // + // __Arguments__ + // * `callback(err, buckets)` _function_ - callback function with error as the first argument. `buckets` is an array of bucket information + // + // `buckets` array element: + // * `bucket.name` _string_ : bucket name + // * `bucket.creationDate` _Date_: date when bucket was created + listBuckets(cb) { + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var method = 'GET'; + this.makeRequest({ + method + }, '', [200], _helpers.DEFAULT_REGION, true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getListBucketTransformer(); + var buckets; + (0, _helper.pipesetup)(response, transformer).on('data', result => buckets = result).on('error', e => cb(e)).on('end', () => cb(null, buckets)); + }); + } + // Returns a stream that emits objects that are partially uploaded. // // __Arguments__ @@ -79140,11 +81750,14 @@ class Client extends _client.TypedClient { result.prefixes.forEach(prefix => uploads.push(prefix)); _async.eachSeries(result.uploads, (upload, cb) => { // for each incomplete upload add the sizes of its uploaded parts - this.listParts(bucket, upload.key, upload.uploadId).then(parts => { + this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { + if (err) { + return cb(err); + } upload.size = parts.reduce((acc, item) => acc + item.size, 0); uploads.push(upload); cb(); - }, cb); + }); }, err => { if (err) { readStream.emit('error', err); @@ -79190,6 +81803,31 @@ class Client extends _client.TypedClient { }); } + // Remove a bucket. + // + // __Arguments__ + // * `bucketName` _string_ : name of the bucket + // * `callback(err)` _function_ : `err` is `null` if the bucket is removed successfully. + removeBucket(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var method = 'DELETE'; + this.makeRequest({ + method, + bucketName + }, '', [204], '', false, e => { + // If the bucket was successfully removed, remove the region map entry. + if (!e) { + delete this.regionMap[bucketName]; + } + cb(e); + }); + } + // Remove the partially uploaded object. // // __Arguments__ @@ -79421,11 +82059,150 @@ class Client extends _client.TypedClient { // Inserts correct `content-type` attribute based on metaData and filePath metaData = (0, _helper.insertContentType)(metaData, filePath); - fs.lstat(filePath, (err, stat) => { - if (err) { - return callback(err); + + // Updates metaData to have the correct prefix if needed + metaData = (0, _helper.prependXAMZMeta)(metaData); + var size; + var partSize; + _async.waterfall([cb => fs.stat(filePath, cb), (stats, cb) => { + size = stats.size; + var stream; + var cbTriggered = false; + var origCb = cb; + cb = function () { + if (cbTriggered) { + return; + } + cbTriggered = true; + if (stream) { + stream.destroy(); + } + return origCb.apply(this, arguments); + }; + if (size > this.maxObjectSize) { + return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)); + } + if (size <= this.partSize) { + // simple PUT request, no multipart + var multipart = false; + var uploader = this.getUploader(bucketName, objectName, metaData, multipart); + var hash = transformers.getHashSummer(this.enableSHA256); + var start = 0; + var end = size - 1; + var autoClose = true; + if (size === 0) { + end = 0; + } + var options = { + start, + end, + autoClose + }; + (0, _helper.pipesetup)(fs.createReadStream(filePath, options), hash).on('data', data => { + var md5sum = data.md5sum; + var sha256sum = data.sha256sum; + stream = fs.createReadStream(filePath, options); + uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { + callback(err, objInfo); + cb(true); + }); + }).on('error', e => cb(e)); + return; } - return this.putObject(bucketName, objectName, fs.createReadStream(filePath), stat.size, metaData, callback); + this.findUploadId(bucketName, objectName, cb); + }, (uploadId, cb) => { + // if there was a previous incomplete upload, fetch all its uploaded parts info + if (uploadId) { + return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)); + } + // there was no previous upload, initiate a new one + this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])); + }, (uploadId, etags, cb) => { + partSize = this.calculatePartSize(size); + var multipart = true; + var uploader = this.getUploader(bucketName, objectName, metaData, multipart); + + // convert array to object to make things easy + var parts = etags.reduce(function (acc, item) { + if (!acc[item.part]) { + acc[item.part] = item; + } + return acc; + }, {}); + var partsDone = []; + var partNumber = 1; + var uploadedSize = 0; + _async.whilst(cb => { + cb(null, uploadedSize < size); + }, cb => { + var stream; + var cbTriggered = false; + var origCb = cb; + cb = function () { + if (cbTriggered) { + return; + } + cbTriggered = true; + if (stream) { + stream.destroy(); + } + return origCb.apply(this, arguments); + }; + var part = parts[partNumber]; + var hash = transformers.getHashSummer(this.enableSHA256); + var length = partSize; + if (length > size - uploadedSize) { + length = size - uploadedSize; + } + var start = uploadedSize; + var end = uploadedSize + length - 1; + var autoClose = true; + var options = { + autoClose, + start, + end + }; + // verify md5sum of each part + (0, _helper.pipesetup)(fs.createReadStream(filePath, options), hash).on('data', data => { + var md5sumHex = Buffer.from(data.md5sum, 'base64').toString('hex'); + if (part && md5sumHex === part.etag) { + // md5 matches, chunk already uploaded + partsDone.push({ + part: partNumber, + etag: part.etag + }); + partNumber++; + uploadedSize += length; + return cb(); + } + // part is not uploaded yet, or md5 mismatch + stream = fs.createReadStream(filePath, options); + uploader(uploadId, partNumber, stream, length, data.sha256sum, data.md5sum, (e, objInfo) => { + if (e) { + return cb(e); + } + partsDone.push({ + part: partNumber, + etag: objInfo.etag + }); + partNumber++; + uploadedSize += length; + return cb(); + }); + }).on('error', e => cb(e)); + }, e => { + if (e) { + return cb(e); + } + cb(null, partsDone, uploadId); + }); + }, + // all parts uploaded, complete the multipart upload + (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb)], (err, ...rest) => { + if (err === true) { + return; + } + callback(err, ...rest); }); } @@ -79925,6 +82702,112 @@ class Client extends _client.TypedClient { return readStream; } + // Stat information of the object. + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `objectName` _string_: name of the object + // * `statOpts` _object_ : Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional). + // * `callback(err, stat)` _function_: `err` is not `null` in case of error, `stat` contains the object information: + // * `stat.size` _number_: size of the object + // * `stat.etag` _string_: etag of the object + // * `stat.metaData` _string_: MetaData of the object + // * `stat.lastModified` _Date_: modified time stamp + // * `stat.versionId` _string_: version id of the object if available + statObject(bucketName, objectName, statOpts = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + // backward compatibility + if ((0, _helper.isFunction)(statOpts)) { + cb = statOpts; + statOpts = {}; + } + if (!(0, _helper.isObject)(statOpts)) { + throw new errors.InvalidArgumentError('statOpts should be of type "object"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + var query = querystring.stringify(statOpts); + var method = 'HEAD'; + this.makeRequest({ + method, + bucketName, + objectName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + + // We drain the socket so that the connection gets closed. Note that this + // is not expensive as the socket will not have any data. + response.on('data', () => {}); + const result = { + size: +response.headers['content-length'], + metaData: (0, _helper.extractMetadata)(response.headers), + lastModified: new Date(response.headers['last-modified']), + versionId: (0, _helper.getVersionId)(response.headers), + etag: (0, _helper.sanitizeETag)(response.headers.etag) + }; + cb(null, result); + }); + } + + // Remove the specified object. + // + // __Arguments__ + // * `bucketName` _string_: name of the bucket + // * `objectName` _string_: name of the object + // * `removeOpts` _object_: Version of the object in the form `{versionId:'my-uuid', governanceBypass:true|false, forceDelete:true|false}`. Default is `{}`. (optional) + // * `callback(err)` _function_: callback function is called with non `null` value in case of error + removeObject(bucketName, objectName, removeOpts = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + // backward compatibility + if ((0, _helper.isFunction)(removeOpts)) { + cb = removeOpts; + removeOpts = {}; + } + if (!(0, _helper.isObject)(removeOpts)) { + throw new errors.InvalidArgumentError('removeOpts should be of type "object"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + const method = 'DELETE'; + const queryParams = {}; + if (removeOpts.versionId) { + queryParams.versionId = `${removeOpts.versionId}`; + } + const headers = {}; + if (removeOpts.governanceBypass) { + headers['X-Amz-Bypass-Governance-Retention'] = true; + } + if (removeOpts.forceDelete) { + headers['x-minio-force-delete'] = true; + } + const query = querystring.stringify(queryParams); + let requestOptions = { + method, + bucketName, + objectName, + headers + }; + if (query) { + requestOptions['query'] = query; + } + this.makeRequest(requestOptions, '', [200, 204], '', false, cb); + } + // Remove all the objects residing in the objectsList. // // __Arguments__ @@ -79986,7 +82869,7 @@ class Client extends _client.TypedClient { headless: true }); let payload = builder.buildObject(deleteObjects); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); const headers = {}; headers['Content-MD5'] = (0, _helper.toMd5)(payload); let removeObjectsResult; @@ -80242,6 +83125,37 @@ class Client extends _client.TypedClient { }); } + // Calls implemented below are related to multipart. + + // Initiate a new multipart upload. + initiateNewMultipartUpload(bucketName, objectName, metaData, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isObject)(metaData)) { + throw new errors.InvalidObjectNameError('contentType should be of type "object"'); + } + var method = 'POST'; + let headers = Object.assign({}, metaData); + var query = 'uploads'; + this.makeRequest({ + method, + bucketName, + objectName, + query, + headers + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getInitiateMultipartTransformer(); + (0, _helper.pipesetup)(response, transformer).on('error', e => cb(e)).on('data', uploadId => cb(null, uploadId)); + }); + } + // Complete the multipart upload. After all the parts are uploaded issuing // this call will aggregate the parts on the server into a single object. completeMultipartUpload(bucketName, objectName, uploadId, etags, cb) { @@ -80304,6 +83218,78 @@ class Client extends _client.TypedClient { }); } + // Get part-info of all parts of an incomplete upload specified by uploadId. + listParts(bucketName, objectName, uploadId, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('uploadId cannot be empty'); + } + var parts = []; + var listNext = marker => { + this.listPartsQuery(bucketName, objectName, uploadId, marker, (e, result) => { + if (e) { + cb(e); + return; + } + parts = parts.concat(result.parts); + if (result.isTruncated) { + listNext(result.marker); + return; + } + cb(null, parts); + }); + }; + listNext(0); + } + + // Called by listParts to fetch a batch of part-info + listPartsQuery(bucketName, objectName, uploadId, marker, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!(0, _helper.isNumber)(marker)) { + throw new TypeError('marker should be of type "number"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('uploadId cannot be empty'); + } + var query = ''; + if (marker && marker !== 0) { + query += `part-number-marker=${marker}&`; + } + query += `uploadId=${(0, _helper.uriEscape)(uploadId)}`; + var method = 'GET'; + this.makeRequest({ + method, + bucketName, + objectName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + var transformer = transformers.getListPartsTransformer(); + (0, _helper.pipesetup)(response, transformer).on('error', e => cb(e)).on('data', data => cb(null, data)); + }); + } + // Called by listIncompleteUploads to fetch a batch of incomplete uploads. listIncompleteUploadsQuery(bucketName, prefix, keyMarker, uploadIdMarker, delimiter) { if (!(0, _helper.isValidBucketName)(bucketName)) { @@ -80389,6 +83375,97 @@ class Client extends _client.TypedClient { listNext('', ''); } + // Returns a function that can be used for uploading objects. + // If multipart === true, it returns function that is used to upload + // a part of the multipart. + getUploader(bucketName, objectName, metaData, multipart) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isValidObjectName)(objectName)) { + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`); + } + if (!(0, _helper.isBoolean)(multipart)) { + throw new TypeError('multipart should be of type "boolean"'); + } + if (!(0, _helper.isObject)(metaData)) { + throw new TypeError('metadata should be of type "object"'); + } + var validate = (stream, length, sha256sum, md5sum, cb) => { + if (!(0, _helper.isReadableStream)(stream)) { + throw new TypeError('stream should be of type "Stream"'); + } + if (!(0, _helper.isNumber)(length)) { + throw new TypeError('length should be of type "number"'); + } + if (!(0, _helper.isString)(sha256sum)) { + throw new TypeError('sha256sum should be of type "string"'); + } + if (!(0, _helper.isString)(md5sum)) { + throw new TypeError('md5sum should be of type "string"'); + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + }; + var simpleUploader = (...args) => { + validate(...args); + var query = ''; + upload(query, ...args); + }; + var multipartUploader = (uploadId, partNumber, ...rest) => { + if (!(0, _helper.isString)(uploadId)) { + throw new TypeError('uploadId should be of type "string"'); + } + if (!(0, _helper.isNumber)(partNumber)) { + throw new TypeError('partNumber should be of type "number"'); + } + if (!uploadId) { + throw new errors.InvalidArgumentError('Empty uploadId'); + } + if (!partNumber) { + throw new errors.InvalidArgumentError('partNumber cannot be 0'); + } + validate(...rest); + var query = `partNumber=${partNumber}&uploadId=${(0, _helper.uriEscape)(uploadId)}`; + upload(query, ...rest); + }; + var upload = (query, stream, length, sha256sum, md5sum, cb) => { + var method = 'PUT'; + let headers = { + 'Content-Length': length + }; + if (!multipart) { + headers = Object.assign({}, metaData, headers); + } + if (!this.enableSHA256) { + headers['Content-MD5'] = md5sum; + } + this.makeRequestStream({ + method, + bucketName, + objectName, + query, + headers + }, stream, sha256sum, [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + const result = { + etag: (0, _helper.sanitizeETag)(response.headers.etag), + versionId: (0, _helper.getVersionId)(response.headers) + }; + // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) + response.on('data', () => {}); + cb(null, result); + }); + }; + if (multipart) { + return multipartUploader; + } + return simpleUploader; + } + // Remove all the notification configurations in the S3 provider setBucketNotification(bucketName, config, cb) { if (!(0, _helper.isValidBucketName)(bucketName)) { @@ -80560,7 +83637,7 @@ class Client extends _client.TypedClient { } }); let payload = builder.buildObject(taggingConfig); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); headers['Content-MD5'] = (0, _helper.toMd5)(payload); const requestOptions = { method, @@ -80724,9 +83801,6 @@ class Client extends _client.TypedClient { * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ getBucketTagging(bucketName, cb) { - if (!(0, _helper.isValidBucketName)(bucketName)) { - throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`); - } const method = 'GET'; const query = 'tagging'; const requestOptions = { @@ -80809,7 +83883,7 @@ class Client extends _client.TypedClient { } }); let payload = builder.buildObject(policyConfig); - payload = Buffer.from(encoder.encode(payload)); + payload = encoder.encode(payload); const requestOptions = { method, bucketName, @@ -81138,6 +84212,86 @@ class Client extends _client.TypedClient { query }, '', [204], '', false, cb); } + setBucketReplication(bucketName, replicationConfig = {}, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isObject)(replicationConfig)) { + throw new errors.InvalidArgumentError('replicationConfig should be of type "object"'); + } else { + if (_lodash.isEmpty(replicationConfig.role)) { + throw new errors.InvalidArgumentError('Role cannot be empty'); + } else if (replicationConfig.role && !(0, _helper.isString)(replicationConfig.role)) { + throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role); + } + if (_lodash.isEmpty(replicationConfig.rules)) { + throw new errors.InvalidArgumentError('Minimum one replication rule must be specified'); + } + } + if (!(0, _helper.isFunction)(cb)) { + throw new TypeError('callback should be of type "function"'); + } + const method = 'PUT'; + let query = 'replication'; + const headers = {}; + const replicationParamsConfig = { + ReplicationConfiguration: { + Role: replicationConfig.role, + Rule: replicationConfig.rules + } + }; + const builder = new _xml2js.Builder({ + renderOpts: { + pretty: false + }, + headless: true + }); + let payload = builder.buildObject(replicationParamsConfig); + headers['Content-MD5'] = (0, _helper.toMd5)(payload); + this.makeRequest({ + method, + bucketName, + query, + headers + }, payload, [200], '', false, cb); + } + getBucketReplication(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + if (!(0, _helper.isFunction)(cb)) { + throw new errors.InvalidArgumentError('callback should be of type "function"'); + } + const method = 'GET'; + const query = 'replication'; + this.makeRequest({ + method, + bucketName, + query + }, '', [200], '', true, (e, response) => { + if (e) { + return cb(e); + } + let replicationConfig = Buffer.from(''); + (0, _helper.pipesetup)(response, transformers.replicationConfigTransformer()).on('data', data => { + replicationConfig = data; + }).on('error', cb).on('end', () => { + cb(null, replicationConfig); + }); + }); + } + removeBucketReplication(bucketName, cb) { + if (!(0, _helper.isValidBucketName)(bucketName)) { + throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); + } + const method = 'DELETE'; + const query = 'replication'; + this.makeRequest({ + method, + bucketName, + query + }, '', [200, 204], '', false, cb); + } getObjectLegalHold(bucketName, objectName, getOpts = {}, cb) { if (!(0, _helper.isValidBucketName)(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName); @@ -81238,6 +84392,25 @@ class Client extends _client.TypedClient { }, payload, [200], '', false, cb); } + /** + * Internal Method to abort a multipart upload request in case of any errors. + * @param bucketName __string__ Bucket Name + * @param objectName __string__ Object Name + * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. + * @param cb __function__ callback function + */ + abortMultipartUpload(bucketName, objectName, uploadId, cb) { + const method = 'DELETE'; + let query = `uploadId=${uploadId}`; + const requestOptions = { + method, + bucketName, + objectName: objectName, + query + }; + this.makeRequest(requestOptions, '', [204], '', false, cb); + } + /** * Internal method to upload a part during compose object. * @param partConfig __object__ contains the following. @@ -81403,8 +84576,7 @@ class Client extends _client.TypedClient { const uploadList = getUploadPartConfigList(uploadId); _async.map(uploadList, me.uploadPartCopy.bind(me), (err, res) => { if (err) { - this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId).then(() => cb(), err => cb(err)); - return; + return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb); } const partsDone = res.map(partCopy => ({ etag: partCopy.etag, @@ -81414,10 +84586,11 @@ class Client extends _client.TypedClient { }); }; const newUploadHeaders = destObjConfig.getHeaders(); - me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders).then(uploadId => { + me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId) => { + if (err) { + return cb(err, null); + } performUploadParts(uploadId); - }, err => { - cb(err, null); }); }).catch(error => { cb(error, null); @@ -81504,18 +84677,28 @@ class Client extends _client.TypedClient { }); }); } + get extensions() { + if (!this.clientExtensions) { + this.clientExtensions = new _extensions.extensions(this); + } + return this.clientExtensions; + } } // Promisify various public-facing APIs on the Client module. exports.Client = Client; Client.prototype.makeBucket = (0, _promisify.promisify)(Client.prototype.makeBucket); +Client.prototype.listBuckets = (0, _promisify.promisify)(Client.prototype.listBuckets); Client.prototype.bucketExists = (0, _promisify.promisify)(Client.prototype.bucketExists); +Client.prototype.removeBucket = (0, _promisify.promisify)(Client.prototype.removeBucket); Client.prototype.getObject = (0, _promisify.promisify)(Client.prototype.getObject); Client.prototype.getPartialObject = (0, _promisify.promisify)(Client.prototype.getPartialObject); Client.prototype.fGetObject = (0, _promisify.promisify)(Client.prototype.fGetObject); Client.prototype.putObject = (0, _promisify.promisify)(Client.prototype.putObject); Client.prototype.fPutObject = (0, _promisify.promisify)(Client.prototype.fPutObject); Client.prototype.copyObject = (0, _promisify.promisify)(Client.prototype.copyObject); +Client.prototype.statObject = (0, _promisify.promisify)(Client.prototype.statObject); +Client.prototype.removeObject = (0, _promisify.promisify)(Client.prototype.removeObject); Client.prototype.removeObjects = (0, _promisify.promisify)(Client.prototype.removeObjects); Client.prototype.presignedUrl = (0, _promisify.promisify)(Client.prototype.presignedUrl); Client.prototype.presignedGetObject = (0, _promisify.promisify)(Client.prototype.presignedGetObject); @@ -81545,20 +84728,14 @@ Client.prototype.getObjectRetention = (0, _promisify.promisify)(Client.prototype Client.prototype.setBucketEncryption = (0, _promisify.promisify)(Client.prototype.setBucketEncryption); Client.prototype.getBucketEncryption = (0, _promisify.promisify)(Client.prototype.getBucketEncryption); Client.prototype.removeBucketEncryption = (0, _promisify.promisify)(Client.prototype.removeBucketEncryption); +Client.prototype.setBucketReplication = (0, _promisify.promisify)(Client.prototype.setBucketReplication); +Client.prototype.getBucketReplication = (0, _promisify.promisify)(Client.prototype.getBucketReplication); +Client.prototype.removeBucketReplication = (0, _promisify.promisify)(Client.prototype.removeBucketReplication); Client.prototype.setObjectLegalHold = (0, _promisify.promisify)(Client.prototype.setObjectLegalHold); Client.prototype.getObjectLegalHold = (0, _promisify.promisify)(Client.prototype.getObjectLegalHold); Client.prototype.composeObject = (0, _promisify.promisify)(Client.prototype.composeObject); Client.prototype.selectObjectContent = (0, _promisify.promisify)(Client.prototype.selectObjectContent); - -// refactored API use promise internally -Client.prototype.removeObject = (0, _callbackify.callbackify)(Client.prototype.removeObject); -Client.prototype.statObject = (0, _callbackify.callbackify)(Client.prototype.statObject); -Client.prototype.removeBucket = (0, _callbackify.callbackify)(Client.prototype.removeBucket); -Client.prototype.listBuckets = (0, _callbackify.callbackify)(Client.prototype.listBuckets); -Client.prototype.removeBucketReplication = (0, _callbackify.callbackify)(Client.prototype.removeBucketReplication); -Client.prototype.setBucketReplication = (0, _callbackify.callbackify)(Client.prototype.setBucketReplication); -Client.prototype.getBucketReplication = (0, _callbackify.callbackify)(Client.prototype.getBucketReplication); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInBhdGgiLCJTdHJlYW0iLCJfYXN5bmMiLCJfYmxvY2tTdHJlYW0iLCJfbG9kYXNoIiwicXVlcnlzdHJpbmciLCJfd2ViRW5jb2RpbmciLCJfeG1sIiwiX3htbDJqcyIsImVycm9ycyIsIl9oZWxwZXJzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfZXhwb3J0TmFtZXMiLCJleHBvcnRzIiwiX2NhbGxiYWNraWZ5IiwiX2NsaWVudCIsIl9jb3B5Q29uZGl0aW9ucyIsIkNvcHlDb25kaXRpb25zIiwiX2hlbHBlciIsIl9wb3N0UG9saWN5IiwiUG9zdFBvbGljeSIsIl90eXBlIiwiX25vdGlmaWNhdGlvbiIsIl9vYmplY3RVcGxvYWRlciIsIl9wcm9taXNpZnkiLCJfc2lnbmluZyIsInRyYW5zZm9ybWVycyIsIl94bWxQYXJzZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVzYyIsInNldCIsIkNsaWVudCIsIlR5cGVkQ2xpZW50Iiwic2V0QXBwSW5mbyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwiaXNTdHJpbmciLCJUeXBlRXJyb3IiLCJ0cmltIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJ1c2VyQWdlbnQiLCJjYWxjdWxhdGVQYXJ0U2l6ZSIsInNpemUiLCJpc051bWJlciIsIm1heE9iamVjdFNpemUiLCJvdmVyUmlkZVBhcnRTaXplIiwicGFydFNpemUiLCJtYWtlQnVja2V0IiwiYnVja2V0TmFtZSIsInJlZ2lvbiIsIm1ha2VPcHRzIiwiY2IiLCJpc1ZhbGlkQnVja2V0TmFtZSIsIkludmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJwYXlsb2FkIiwiREVGQVVMVF9SRUdJT04iLCJjcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uIiwicHVzaCIsIl9hdHRyIiwieG1sbnMiLCJMb2NhdGlvbkNvbnN0cmFpbnQiLCJwYXlsb2FkT2JqZWN0IiwiQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiIsIlhtbCIsIm1ldGhvZCIsImhlYWRlcnMiLCJPYmplY3RMb2NraW5nIiwicHJvY2Vzc1dpdGhSZXRyeSIsImVyciIsImNvZGUiLCJtYWtlUmVxdWVzdCIsImxpc3RJbmNvbXBsZXRlVXBsb2FkcyIsImJ1Y2tldCIsInByZWZpeCIsInJlY3Vyc2l2ZSIsInVuZGVmaW5lZCIsImlzVmFsaWRQcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJpc0Jvb2xlYW4iLCJkZWxpbWl0ZXIiLCJrZXlNYXJrZXIiLCJ1cGxvYWRJZE1hcmtlciIsInVwbG9hZHMiLCJlbmRlZCIsInJlYWRTdHJlYW0iLCJSZWFkYWJsZSIsIm9iamVjdE1vZGUiLCJfcmVhZCIsImxlbmd0aCIsInNoaWZ0IiwibGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkiLCJvbiIsImUiLCJlbWl0IiwicmVzdWx0IiwicHJlZml4ZXMiLCJhc3luYyIsImVhY2hTZXJpZXMiLCJ1cGxvYWQiLCJsaXN0UGFydHMiLCJ1cGxvYWRJZCIsInRoZW4iLCJwYXJ0cyIsInJlZHVjZSIsImFjYyIsIml0ZW0iLCJpc1RydW5jYXRlZCIsIm5leHRLZXlNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJidWNrZXRFeGlzdHMiLCJyZW1vdmVJbmNvbXBsZXRlVXBsb2FkIiwib2JqZWN0TmFtZSIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJyZW1vdmVVcGxvYWRJZCIsImR1cmluZyIsImZpbmRVcGxvYWRJZCIsInF1ZXJ5IiwiZkdldE9iamVjdCIsImZpbGVQYXRoIiwiZ2V0T3B0cyIsInBhcnRGaWxlIiwicGFydEZpbGVTdHJlYW0iLCJvYmpTdGF0IiwicmVuYW1lIiwid2F0ZXJmYWxsIiwic3RhdE9iamVjdCIsIm1rZGlyIiwiZGlybmFtZSIsImV0YWciLCJzdGF0Iiwic3RhdHMiLCJvZmZzZXQiLCJjcmVhdGVXcml0ZVN0cmVhbSIsImZsYWdzIiwiZ2V0UGFydGlhbE9iamVjdCIsImRvd25sb2FkU3RyZWFtIiwicGlwZXNldHVwIiwiRXJyb3IiLCJnZXRPYmplY3QiLCJyYW5nZSIsImV4cGVjdGVkU3RhdHVzQ29kZXMiLCJzdHJpbmdpZnkiLCJmUHV0T2JqZWN0IiwibWV0YURhdGEiLCJjYWxsYmFjayIsImluc2VydENvbnRlbnRUeXBlIiwibHN0YXQiLCJwdXRPYmplY3QiLCJjcmVhdGVSZWFkU3RyZWFtIiwic3RyZWFtIiwicHJlcGVuZFhBTVpNZXRhIiwiQnVmZmVyIiwicmVhZGFibGVTdHJlYW0iLCJpc1JlYWRhYmxlU3RyZWFtIiwiY2h1bmtlciIsIkJsb2NrU3RyZWFtMiIsInplcm9QYWRkaW5nIiwidXBsb2FkZXIiLCJPYmplY3RVcGxvYWRlciIsImNvcHlPYmplY3RWMSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1Iiwic3JjT2JqZWN0IiwiY29uZGl0aW9ucyIsInVyaVJlc291cmNlRXNjYXBlIiwibW9kaWZpZWQiLCJ1bm1vZGlmaWVkIiwibWF0Y2hFVGFnIiwibWF0Y2hFdGFnRXhjZXB0IiwibWF0Y2hFVGFnRXhjZXB0IiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1lciIsImdldENvcHlPYmplY3RUcmFuc2Zvcm1lciIsImRhdGEiLCJjb3B5T2JqZWN0VjIiLCJzb3VyY2VDb25maWciLCJkZXN0Q29uZmlnIiwiQ29weVNvdXJjZU9wdGlvbnMiLCJDb3B5RGVzdGluYXRpb25PcHRpb25zIiwidmFsaWRhdGUiLCJhc3NpZ24iLCJnZXRIZWFkZXJzIiwiQnVja2V0IiwicmVzSGVhZGVycyIsImNvcHlPYmpSZXNwb25zZSIsIktleSIsIkxhc3RNb2RpZmllZCIsIk1ldGFEYXRhIiwiZXh0cmFjdE1ldGFkYXRhIiwiVmVyc2lvbklkIiwiZ2V0VmVyc2lvbklkIiwiU291cmNlVmVyc2lvbklkIiwiZ2V0U291cmNlVmVyc2lvbklkIiwiRXRhZyIsInNhbml0aXplRVRhZyIsIlNpemUiLCJjb3B5T2JqZWN0IiwiYWxsQXJncyIsImFyZ3VtZW50cyIsImxpc3RPYmplY3RzUXVlcnkiLCJtYXJrZXIiLCJsaXN0UXVlcnlPcHRzIiwiRGVsaW1pdGVyIiwiTWF4S2V5cyIsIkluY2x1ZGVWZXJzaW9uIiwicXVlcmllcyIsInVyaUVzY2FwZSIsInNvcnQiLCJqb2luIiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsImxpc3RPYmplY3RzIiwibGlzdE9wdHMiLCJvYmplY3RzIiwibmV4dE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsImxpc3RPYmplY3RzVjJRdWVyeSIsImNvbnRpbnVhdGlvblRva2VuIiwibWF4S2V5cyIsInN0YXJ0QWZ0ZXIiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJsaXN0T2JqZWN0c1YyIiwibmV4dENvbnRpbnVhdGlvblRva2VuIiwicmVtb3ZlT2JqZWN0cyIsIm9iamVjdHNMaXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibWF4RW50cmllcyIsImVudHJ5IiwibGlzdCIsImxpc3RPZkxpc3QiLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJiYXRjaFJlc3VsdHMiLCJiYXRjaENiIiwidmFsdWUiLCJuYW1lIiwidmVyc2lvbklkIiwiZGVsZXRlT2JqZWN0cyIsIkRlbGV0ZSIsIlF1aWV0IiwiYnVpbGRlciIsInhtbDJqcyIsIkJ1aWxkZXIiLCJoZWFkbGVzcyIsImJ1aWxkT2JqZWN0IiwiZnJvbSIsImVuY29kZSIsInRvTWQ1IiwicmVtb3ZlT2JqZWN0c1Jlc3VsdCIsInJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lciIsIl8iLCJmbGF0dGVuIiwiZ2V0QnVja2V0UG9saWN5IiwicG9saWN5IiwiZ2V0Q29uY2F0ZXIiLCJ0b1N0cmluZyIsInNldEJ1Y2tldFBvbGljeSIsIkludmFsaWRCdWNrZXRQb2xpY3lFcnJvciIsInByZXNpZ25lZFVybCIsImV4cGlyZXMiLCJyZXFQYXJhbXMiLCJyZXF1ZXN0RGF0ZSIsImFub255bW91cyIsIkFub255bW91c1JlcXVlc3RFcnJvciIsIkRhdGUiLCJpc1ZhbGlkRGF0ZSIsImdldEJ1Y2tldFJlZ2lvbiIsInVybCIsInJlcU9wdGlvbnMiLCJnZXRSZXF1ZXN0T3B0aW9ucyIsImNoZWNrQW5kUmVmcmVzaENyZWRzIiwicHJlc2lnblNpZ25hdHVyZVY0IiwiYWNjZXNzS2V5Iiwic2VjcmV0S2V5Iiwic2Vzc2lvblRva2VuIiwicGUiLCJwcmVzaWduZWRHZXRPYmplY3QiLCJyZXNwSGVhZGVycyIsInZhbGlkUmVzcEhlYWRlcnMiLCJoZWFkZXIiLCJwcmVzaWduZWRQdXRPYmplY3QiLCJuZXdQb3N0UG9saWN5IiwicHJlc2lnbmVkUG9zdFBvbGljeSIsInBvc3RQb2xpY3kiLCJmb3JtRGF0YSIsImRhdGUiLCJkYXRlU3RyIiwibWFrZURhdGVMb25nIiwiZXhwaXJhdGlvbiIsInNldFNlY29uZHMiLCJzZXRFeHBpcmVzIiwiZ2V0U2NvcGUiLCJwb2xpY3lCYXNlNjQiLCJKU09OIiwic2lnbmF0dXJlIiwicG9zdFByZXNpZ25TaWduYXR1cmVWNCIsIm9wdHMiLCJwb3J0U3RyIiwicG9ydCIsInVybFN0ciIsInByb3RvY29sIiwiaG9zdCIsInBvc3RVUkwiLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImV0YWdzIiwiZWxlbWVudCIsIlBhcnQiLCJQYXJ0TnVtYmVyIiwicGFydCIsIkVUYWciLCJDb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImdldENvbXBsZXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJlcnJDb2RlIiwiUzNFcnJvciIsImVyck1lc3NhZ2UiLCJjb21wbGV0ZU11bHRpcGFydFJlc3VsdCIsIm1heFVwbG9hZHMiLCJ1bnNoaWZ0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwibGF0ZXN0VXBsb2FkIiwibGlzdE5leHQiLCJpbml0aWF0ZWQiLCJnZXRUaW1lIiwic2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiY29uZmlnIiwicm9vdE5hbWUiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwicmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uIiwiTm90aWZpY2F0aW9uQ29uZmlnIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJidWNrZXROb3RpZmljYXRpb24iLCJsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24iLCJzdWZmaXgiLCJldmVudHMiLCJsaXN0ZW5lciIsIk5vdGlmaWNhdGlvblBvbGxlciIsInN0YXJ0IiwiZ2V0QnVja2V0VmVyc2lvbmluZyIsInZlcnNpb25Db25maWciLCJidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIiLCJzZXRCdWNrZXRWZXJzaW9uaW5nIiwic2V0VGFnZ2luZyIsInRhZ2dpbmdQYXJhbXMiLCJ0YWdzIiwicHV0T3B0cyIsInRhZ3NMaXN0IiwiZW50cmllcyIsIlZhbHVlIiwidGFnZ2luZ0NvbmZpZyIsIlRhZ2dpbmciLCJUYWdTZXQiLCJUYWciLCJyZXF1ZXN0T3B0aW9ucyIsInNldEJ1Y2tldFRhZ2dpbmciLCJzZXRPYmplY3RUYWdnaW5nIiwicmVtb3ZlVGFnZ2luZyIsInJlbW92ZU9wdHMiLCJyZW1vdmVCdWNrZXRUYWdnaW5nIiwicmVtb3ZlT2JqZWN0VGFnZ2luZyIsImdldEJ1Y2tldFRhZ2dpbmciLCJnZXRUYWdzVHJhbnNmb3JtZXIiLCJnZXRPYmplY3RUYWdnaW5nIiwiYXBwbHlCdWNrZXRMaWZlY3ljbGUiLCJwb2xpY3lDb25maWciLCJyZW1vdmVCdWNrZXRMaWZlY3ljbGUiLCJzZXRCdWNrZXRMaWZlY3ljbGUiLCJsaWZlQ3ljbGVDb25maWciLCJpc0VtcHR5IiwiZ2V0QnVja2V0TGlmZWN5Y2xlIiwibGlmZWN5Y2xlVHJhbnNmb3JtZXIiLCJsaWZlY3ljbGVDb25maWciLCJzZXRPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ09wdHMiLCJyZXRlbnRpb25Nb2RlcyIsIlJFVEVOVElPTl9NT0RFUyIsIkNPTVBMSUFOQ0UiLCJHT1ZFUk5BTkNFIiwidmFsaWRVbml0cyIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIkRBWVMiLCJZRUFSUyIsIm1vZGUiLCJpbmNsdWRlcyIsInVuaXQiLCJ2YWxpZGl0eSIsIk9iamVjdExvY2tFbmFibGVkIiwiY29uZmlnS2V5cyIsImRpZmZlcmVuY2UiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIk1vZGUiLCJEYXlzIiwiWWVhcnMiLCJnZXRPYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0TG9ja0NvbmZpZyIsIm9iamVjdExvY2tUcmFuc2Zvcm1lciIsInB1dE9iamVjdFJldGVudGlvbiIsInJldGVudGlvbk9wdHMiLCJnb3Zlcm5hbmNlQnlwYXNzIiwicmV0YWluVW50aWxEYXRlIiwicGFyYW1zIiwiUmV0YWluVW50aWxEYXRlIiwiZ2V0T2JqZWN0UmV0ZW50aW9uIiwicmV0ZW50aW9uQ29uZmlnIiwib2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIiLCJzZXRCdWNrZXRFbmNyeXB0aW9uIiwiZW5jcnlwdGlvbkNvbmZpZyIsImVuY3J5cHRpb25PYmoiLCJBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0IiwiU1NFQWxnb3JpdGhtIiwiZ2V0QnVja2V0RW5jcnlwdGlvbiIsImJ1Y2tldEVuY0NvbmZpZyIsImJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lciIsInJlbW92ZUJ1Y2tldEVuY3J5cHRpb24iLCJnZXRPYmplY3RMZWdhbEhvbGQiLCJsZWdhbEhvbGRDb25maWciLCJvYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lciIsInNldE9iamVjdExlZ2FsSG9sZCIsInNldE9wdHMiLCJkZWZhdWx0T3B0cyIsInN0YXR1cyIsIkxFR0FMX0hPTERfU1RBVFVTIiwiRU5BQkxFRCIsIkRJU0FCTEVEIiwiU3RhdHVzIiwidXBsb2FkUGFydENvcHkiLCJwYXJ0Q29uZmlnIiwidXBsb2FkSUQiLCJwYXJ0TnVtYmVyIiwicGFydENvcHlSZXN1bHQiLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0Q29weVJlcyIsImNvbXBvc2VPYmplY3QiLCJkZXN0T2JqQ29uZmlnIiwic291cmNlT2JqTGlzdCIsIm1lIiwic291cmNlRmlsZXNMZW5ndGgiLCJQQVJUX0NPTlNUUkFJTlRTIiwiTUFYX1BBUlRTX0NPVU5UIiwiaSIsImdldFN0YXRPcHRpb25zIiwic3JjQ29uZmlnIiwic3RhdE9wdHMiLCJWZXJzaW9uSUQiLCJzcmNPYmplY3RTaXplcyIsInRvdGFsU2l6ZSIsInRvdGFsUGFydHMiLCJzb3VyY2VPYmpTdGF0cyIsIm1hcCIsInNyY0l0ZW0iLCJQcm9taXNlIiwiYWxsIiwic3JjT2JqZWN0SW5mb3MiLCJ2YWxpZGF0ZWRTdGF0cyIsInJlc0l0ZW1TdGF0IiwiaW5kZXgiLCJzcmNDb3B5U2l6ZSIsIk1hdGNoUmFuZ2UiLCJzcmNTdGFydCIsIlN0YXJ0Iiwic3JjRW5kIiwiRW5kIiwiQUJTX01JTl9QQVJUX1NJWkUiLCJNQVhfTVVMVElQQVJUX1BVVF9PQkpFQ1RfU0laRSIsInBhcnRzUmVxdWlyZWQiLCJNQVhfUEFSVF9TSVpFIiwiTWF0Y2hFVGFnIiwic3BsaXRQYXJ0U2l6ZUxpc3QiLCJpZHgiLCJjYWxTaXplIiwiY2FsY3VsYXRlRXZlblNwbGl0cyIsImdldFVwbG9hZFBhcnRDb25maWdMaXN0IiwidXBsb2FkUGFydENvbmZpZ0xpc3QiLCJzcGxpdFNpemUiLCJzcGxpdEluZGV4Iiwic3RhcnRJbmRleCIsInN0YXJ0SWR4IiwiZW5kSW5kZXgiLCJlbmRJZHgiLCJvYmpJbmZvIiwib2JqQ29uZmlnIiwicGFydEluZGV4IiwidG90YWxVcGxvYWRzIiwic3BsaXRTdGFydCIsInVwbGRDdHJJZHgiLCJzcGxpdEVuZCIsInNvdXJjZU9iaiIsInVwbG9hZFBhcnRDb25maWciLCJwZXJmb3JtVXBsb2FkUGFydHMiLCJ1cGxvYWRMaXN0IiwiYmluZCIsInJlcyIsImFib3J0TXVsdGlwYXJ0VXBsb2FkIiwicGFydHNEb25lIiwicGFydENvcHkiLCJuZXdVcGxvYWRIZWFkZXJzIiwiaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQiLCJjYXRjaCIsImVycm9yIiwic2VsZWN0T2JqZWN0Q29udGVudCIsInNlbGVjdE9wdHMiLCJleHByZXNzaW9uIiwiaW5wdXRTZXJpYWxpemF0aW9uIiwib3V0cHV0U2VyaWFsaXphdGlvbiIsIkV4cHJlc3Npb24iLCJFeHByZXNzaW9uVHlwZSIsImV4cHJlc3Npb25UeXBlIiwiSW5wdXRTZXJpYWxpemF0aW9uIiwiT3V0cHV0U2VyaWFsaXphdGlvbiIsInJlcXVlc3RQcm9ncmVzcyIsIlJlcXVlc3RQcm9ncmVzcyIsInNjYW5SYW5nZSIsIlNjYW5SYW5nZSIsInNlbGVjdFJlc3VsdCIsInNlbGVjdE9iamVjdENvbnRlbnRUcmFuc2Zvcm1lciIsInBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlIiwicHJvbWlzaWZ5IiwicmVtb3ZlT2JqZWN0IiwiY2FsbGJhY2tpZnkiLCJyZW1vdmVCdWNrZXQiLCJsaXN0QnVja2V0cyIsInJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uIiwic2V0QnVja2V0UmVwbGljYXRpb24iLCJnZXRCdWNrZXRSZXBsaWNhdGlvbiJdLCJzb3VyY2VzIjpbIm1pbmlvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IGFzeW5jIGZyb20gJ2FzeW5jJ1xuaW1wb3J0IEJsb2NrU3RyZWFtMiBmcm9tICdibG9jay1zdHJlYW0yJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHsgVGV4dEVuY29kZXIgfSBmcm9tICd3ZWItZW5jb2RpbmcnXG5pbXBvcnQgWG1sIGZyb20gJ3htbCdcbmltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBDb3B5RGVzdGluYXRpb25PcHRpb25zLCBDb3B5U291cmNlT3B0aW9ucywgREVGQVVMVF9SRUdJT04gfSBmcm9tICcuL2hlbHBlcnMudHMnXG5pbXBvcnQgeyBjYWxsYmFja2lmeSB9IGZyb20gJy4vaW50ZXJuYWwvY2FsbGJhY2tpZnkuanMnXG5pbXBvcnQgeyBUeXBlZENsaWVudCB9IGZyb20gJy4vaW50ZXJuYWwvY2xpZW50LnRzJ1xuaW1wb3J0IHsgQ29weUNvbmRpdGlvbnMgfSBmcm9tICcuL2ludGVybmFsL2NvcHktY29uZGl0aW9ucy50cydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUV2ZW5TcGxpdHMsXG4gIGV4dHJhY3RNZXRhZGF0YSxcbiAgZ2V0U2NvcGUsXG4gIGdldFNvdXJjZVZlcnNpb25JZCxcbiAgZ2V0VmVyc2lvbklkLFxuICBpbnNlcnRDb250ZW50VHlwZSxcbiAgaXNCb29sZWFuLFxuICBpc0Z1bmN0aW9uLFxuICBpc051bWJlcixcbiAgaXNPYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzU3RyaW5nLFxuICBpc1ZhbGlkQnVja2V0TmFtZSxcbiAgaXNWYWxpZERhdGUsXG4gIGlzVmFsaWRPYmplY3ROYW1lLFxuICBpc1ZhbGlkUHJlZml4LFxuICBtYWtlRGF0ZUxvbmcsXG4gIFBBUlRfQ09OU1RSQUlOVFMsXG4gIHBhcnRzUmVxdWlyZWQsXG4gIHBpcGVzZXR1cCxcbiAgcHJlcGVuZFhBTVpNZXRhLFxuICByZWFkYWJsZVN0cmVhbSxcbiAgc2FuaXRpemVFVGFnLFxuICB0b01kNSxcbiAgdXJpRXNjYXBlLFxuICB1cmlSZXNvdXJjZUVzY2FwZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgeyBQb3N0UG9saWN5IH0gZnJvbSAnLi9pbnRlcm5hbC9wb3N0LXBvbGljeS50cydcbmltcG9ydCB7IExFR0FMX0hPTERfU1RBVFVTLCBSRVRFTlRJT05fTU9ERVMsIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkNvbmZpZywgTm90aWZpY2F0aW9uUG9sbGVyIH0gZnJvbSAnLi9ub3RpZmljYXRpb24uanMnXG5pbXBvcnQgeyBPYmplY3RVcGxvYWRlciB9IGZyb20gJy4vb2JqZWN0LXVwbG9hZGVyLmpzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnLi9wcm9taXNpZnkuanMnXG5pbXBvcnQgeyBwb3N0UHJlc2lnblNpZ25hdHVyZVY0LCBwcmVzaWduU2lnbmF0dXJlVjQgfSBmcm9tICcuL3NpZ25pbmcudHMnXG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1lcnMgZnJvbSAnLi90cmFuc2Zvcm1lcnMuanMnXG5pbXBvcnQgeyBwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZSB9IGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycy50cydcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLmpzJ1xuZXhwb3J0IHsgQ29weUNvbmRpdGlvbnMsIFBvc3RQb2xpY3kgfVxuXG5leHBvcnQgY2xhc3MgQ2xpZW50IGV4dGVuZHMgVHlwZWRDbGllbnQge1xuICAvLyBTZXQgYXBwbGljYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uXG4gIC8vXG4gIC8vIEdlbmVyYXRlcyBVc2VyLUFnZW50IGluIHRoZSBmb2xsb3dpbmcgc3R5bGUuXG4gIC8vXG4gIC8vICAgICAgIE1pbklPIChPUzsgQVJDSCkgTElCL1ZFUiBBUFAvVkVSXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYXBwTmFtZWAgX3N0cmluZ18gLSBBcHBsaWNhdGlvbiBuYW1lLlxuICAvLyAqIGBhcHBWZXJzaW9uYCBfc3RyaW5nXyAtIEFwcGxpY2F0aW9uIHZlcnNpb24uXG4gIHNldEFwcEluZm8oYXBwTmFtZSwgYXBwVmVyc2lvbikge1xuICAgIGlmICghaXNTdHJpbmcoYXBwTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXBwTmFtZTogJHthcHBOYW1lfWApXG4gICAgfVxuICAgIGlmIChhcHBOYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0lucHV0IGFwcE5hbWUgY2Fubm90IGJlIGVtcHR5LicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoYXBwVmVyc2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXBwVmVyc2lvbjogJHthcHBWZXJzaW9ufWApXG4gICAgfVxuICAgIGlmIChhcHBWZXJzaW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0lucHV0IGFwcFZlcnNpb24gY2Fubm90IGJlIGVtcHR5LicpXG4gICAgfVxuICAgIHRoaXMudXNlckFnZW50ID0gYCR7dGhpcy51c2VyQWdlbnR9ICR7YXBwTmFtZX0vJHthcHBWZXJzaW9ufWBcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBwYXJ0IHNpemUgZ2l2ZW4gdGhlIG9iamVjdCBzaXplLiBQYXJ0IHNpemUgd2lsbCBiZSBhdGxlYXN0IHRoaXMucGFydFNpemVcbiAgY2FsY3VsYXRlUGFydFNpemUoc2l6ZSkge1xuICAgIGlmICghaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmIChzaXplID4gdGhpcy5tYXhPYmplY3RTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBzaXplIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuICR7dGhpcy5tYXhPYmplY3RTaXplfWApXG4gICAgfVxuICAgIGlmICh0aGlzLm92ZXJSaWRlUGFydFNpemUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRTaXplXG4gICAgfVxuICAgIHZhciBwYXJ0U2l6ZSA9IHRoaXMucGFydFNpemVcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyB3aGlsZSh0cnVlKSB7Li4ufSB0aHJvd3MgbGludGluZyBlcnJvci5cbiAgICAgIC8vIElmIHBhcnRTaXplIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgb2JqZWN0IHNpemUsIHRoZW4gdXNlIGl0LlxuICAgICAgaWYgKHBhcnRTaXplICogMTAwMDAgPiBzaXplKSB7XG4gICAgICAgIHJldHVybiBwYXJ0U2l6ZVxuICAgICAgfVxuICAgICAgLy8gVHJ5IHBhcnQgc2l6ZXMgYXMgNjRNQiwgODBNQiwgOTZNQiBldGMuXG4gICAgICBwYXJ0U2l6ZSArPSAxNiAqIDEwMjQgKiAxMDI0XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlcyB0aGUgYnVja2V0IGBidWNrZXROYW1lYC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXyAtIE5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGByZWdpb25gIF9zdHJpbmdfIC0gcmVnaW9uIHZhbGlkIHZhbHVlcyBhcmUgX3VzLXdlc3QtMV8sIF91cy13ZXN0LTJfLCAgX2V1LXdlc3QtMV8sIF9ldS1jZW50cmFsLTFfLCBfYXAtc291dGhlYXN0LTFfLCBfYXAtbm9ydGhlYXN0LTFfLCBfYXAtc291dGhlYXN0LTJfLCBfc2EtZWFzdC0xXy5cbiAgLy8gKiBgbWFrZU9wdHNgIF9vYmplY3RfIC0gT3B0aW9ucyB0byBjcmVhdGUgYSBidWNrZXQuIGUuZyB7T2JqZWN0TG9ja2luZzp0cnVlfSAoT3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgYnVja2V0IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLlxuICBtYWtlQnVja2V0KGJ1Y2tldE5hbWUsIHJlZ2lvbiwgbWFrZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzT2JqZWN0KHJlZ2lvbikpIHtcbiAgICAgIGNiID0gbWFrZU9wdHNcbiAgICAgIG1ha2VPcHRzID0gcmVnaW9uXG4gICAgICByZWdpb24gPSAnJ1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihyZWdpb24pKSB7XG4gICAgICBjYiA9IHJlZ2lvblxuICAgICAgcmVnaW9uID0gJydcbiAgICAgIG1ha2VPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24obWFrZU9wdHMpKSB7XG4gICAgICBjYiA9IG1ha2VPcHRzXG4gICAgICBtYWtlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWFrZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWtlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcGF5bG9hZCA9ICcnXG5cbiAgICAvLyBSZWdpb24gYWxyZWFkeSBzZXQgaW4gY29uc3RydWN0b3IsIHZhbGlkYXRlIGlmXG4gICAgLy8gY2FsbGVyIHJlcXVlc3RlZCBidWNrZXQgbG9jYXRpb24gaXMgc2FtZS5cbiAgICBpZiAocmVnaW9uICYmIHRoaXMucmVnaW9uKSB7XG4gICAgICBpZiAocmVnaW9uICE9PSB0aGlzLnJlZ2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDb25maWd1cmVkIHJlZ2lvbiAke3RoaXMucmVnaW9ufSwgcmVxdWVzdGVkICR7cmVnaW9ufWApXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlbmRpbmcgbWFrZUJ1Y2tldCByZXF1ZXN0IHdpdGggWE1MIGNvbnRhaW5pbmcgJ3VzLWVhc3QtMScgZmFpbHMuIEZvclxuICAgIC8vIGRlZmF1bHQgcmVnaW9uIHNlcnZlciBleHBlY3RzIHRoZSByZXF1ZXN0IHdpdGhvdXQgYm9keVxuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSBERUZBVUxUX1JFR0lPTikge1xuICAgICAgdmFyIGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24gPSBbXVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgX2F0dHI6IHtcbiAgICAgICAgICB4bWxuczogJ2h0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgTG9jYXRpb25Db25zdHJhaW50OiByZWdpb24sXG4gICAgICB9KVxuICAgICAgdmFyIHBheWxvYWRPYmplY3QgPSB7XG4gICAgICAgIENyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb246IGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24sXG4gICAgICB9XG4gICAgICBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBoZWFkZXJzID0ge31cblxuICAgIGlmIChtYWtlT3B0cy5PYmplY3RMb2NraW5nKSB7XG4gICAgICBoZWFkZXJzWyd4LWFtei1idWNrZXQtb2JqZWN0LWxvY2stZW5hYmxlZCddID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghcmVnaW9uKSB7XG4gICAgICByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NXaXRoUmV0cnkgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyICYmIChyZWdpb24gPT09ICcnIHx8IHJlZ2lvbiA9PT0gREVGQVVMVF9SRUdJT04pKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnICYmIGVyci5yZWdpb24gIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmV0cnkgd2l0aCByZWdpb24gcmV0dXJuZWQgYXMgcGFydCBvZiBlcnJvclxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sIGVyci5yZWdpb24sIGZhbHNlLCBjYilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgIH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCByZWdpb24sIGZhbHNlLCBwcm9jZXNzV2l0aFJldHJ5KVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIG9iamVjdHMgdGhhdCBhcmUgcGFydGlhbGx5IHVwbG9hZGVkLlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgcHJlZml4YCBfc3RyaW5nXzogcHJlZml4IG9mIHRoZSBvYmplY3QgbmFtZXMgdGhhdCBhcmUgcGFydGlhbGx5IHVwbG9hZGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogZGlyZWN0b3J5IHN0eWxlIGxpc3Rpbmcgd2hlbiBmYWxzZSwgcmVjdXJzaXZlIGxpc3Rpbmcgd2hlbiB0cnVlIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV8gOiBlbWl0cyBvYmplY3RzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqZWN0LmtleWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iamVjdC51cGxvYWRJZGAgX3N0cmluZ186IHVwbG9hZCBJRCBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqZWN0LnNpemVgIF9JbnRlZ2VyXzogc2l6ZSBvZiB0aGUgcGFydGlhbGx5IHVwbG9hZGVkIG9iamVjdFxuICBsaXN0SW5jb21wbGV0ZVVwbG9hZHMoYnVja2V0LCBwcmVmaXgsIHJlY3Vyc2l2ZSkge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldClcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIHZhciBkZWxpbWl0ZXIgPSByZWN1cnNpdmUgPyAnJyA6ICcvJ1xuICAgIHZhciBrZXlNYXJrZXIgPSAnJ1xuICAgIHZhciB1cGxvYWRJZE1hcmtlciA9ICcnXG4gICAgdmFyIHVwbG9hZHMgPSBbXVxuICAgIHZhciBlbmRlZCA9IGZhbHNlXG4gICAgdmFyIHJlYWRTdHJlYW0gPSBTdHJlYW0uUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlIH0pXG4gICAgcmVhZFN0cmVhbS5fcmVhZCA9ICgpID0+IHtcbiAgICAgIC8vIHB1c2ggb25lIHVwbG9hZCBpbmZvIHBlciBfcmVhZCgpXG4gICAgICBpZiAodXBsb2Fkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaCh1cGxvYWRzLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaChudWxsKVxuICAgICAgfVxuICAgICAgdGhpcy5saXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXQsIHByZWZpeCwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgZGVsaW1pdGVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wcmVmaXhlcy5mb3JFYWNoKChwcmVmaXgpID0+IHVwbG9hZHMucHVzaChwcmVmaXgpKVxuICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoXG4gICAgICAgICAgICByZXN1bHQudXBsb2FkcyxcbiAgICAgICAgICAgICh1cGxvYWQsIGNiKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGZvciBlYWNoIGluY29tcGxldGUgdXBsb2FkIGFkZCB0aGUgc2l6ZXMgb2YgaXRzIHVwbG9hZGVkIHBhcnRzXG4gICAgICAgICAgICAgIHRoaXMubGlzdFBhcnRzKGJ1Y2tldCwgdXBsb2FkLmtleSwgdXBsb2FkLnVwbG9hZElkKS50aGVuKChwYXJ0cykgPT4ge1xuICAgICAgICAgICAgICAgIHVwbG9hZC5zaXplID0gcGFydHMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0uc2l6ZSwgMClcbiAgICAgICAgICAgICAgICB1cGxvYWRzLnB1c2godXBsb2FkKVxuICAgICAgICAgICAgICAgIGNiKClcbiAgICAgICAgICAgICAgfSwgY2IpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICAgICAga2V5TWFya2VyID0gcmVzdWx0Lm5leHRLZXlNYXJrZXJcbiAgICAgICAgICAgICAgICB1cGxvYWRJZE1hcmtlciA9IHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gVG8gY2hlY2sgaWYgYSBidWNrZXQgYWxyZWFkeSBleGlzdHMuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ18gOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXyA6IGBlcnJgIGlzIGBudWxsYCBpZiB0aGUgYnVja2V0IGV4aXN0c1xuICBidWNrZXRFeGlzdHMoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0hFQUQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwMF0sICcnLCBmYWxzZSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT0gJ05vU3VjaEJ1Y2tldCcgfHwgZXJyLmNvZGUgPT0gJ05vdEZvdW5kJykge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdHJ1ZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBwYXJ0aWFsbHkgdXBsb2FkZWQgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBub24gYG51bGxgIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3JcbiAgcmVtb3ZlSW5jb21wbGV0ZVVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSXNWYWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciByZW1vdmVVcGxvYWRJZFxuICAgIGFzeW5jLmR1cmluZyhcbiAgICAgIChjYikgPT4ge1xuICAgICAgICB0aGlzLmZpbmRVcGxvYWRJZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCAoZSwgdXBsb2FkSWQpID0+IHtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbW92ZVVwbG9hZElkID0gdXBsb2FkSWRcbiAgICAgICAgICBjYihudWxsLCB1cGxvYWRJZClcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICAoY2IpID0+IHtcbiAgICAgICAgdmFyIG1ldGhvZCA9ICdERUxFVEUnXG4gICAgICAgIHZhciBxdWVyeSA9IGB1cGxvYWRJZD0ke3JlbW92ZVVwbG9hZElkfWBcbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDRdLCAnJywgZmFsc2UsIChlKSA9PiBjYihlKSlcbiAgICAgIH0sXG4gICAgICBjYixcbiAgICApXG4gIH1cblxuICAvLyBDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyb3JgIGluIGNhc2Ugb2YgZXJyb3Igb3IgYG51bGxgIGluIGNhc2Ugb2Ygc3VjY2Vzc1xuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBmaWxlUGF0aGAgX3N0cmluZ186IHBhdGggdG8gd2hpY2ggdGhlIG9iamVjdCBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0b1xuICAvLyAqIGBnZXRPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJ31gLiBEZWZhdWx0IGlzIGB7fWAuIChvcHRpb25hbClcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci5cbiAgZkdldE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBmaWxlUGF0aCwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24uXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGVQYXRoIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICAvLyBJbnRlcm5hbCBkYXRhLlxuICAgIHZhciBwYXJ0RmlsZVxuICAgIHZhciBwYXJ0RmlsZVN0cmVhbVxuICAgIHZhciBvYmpTdGF0XG5cbiAgICAvLyBSZW5hbWUgd3JhcHBlci5cbiAgICB2YXIgcmVuYW1lID0gKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgZnMucmVuYW1lKHBhcnRGaWxlLCBmaWxlUGF0aCwgY2IpXG4gICAgfVxuXG4gICAgYXN5bmMud2F0ZXJmYWxsKFxuICAgICAgW1xuICAgICAgICAoY2IpID0+IHRoaXMuc3RhdE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzLCBjYiksXG4gICAgICAgIChyZXN1bHQsIGNiKSA9PiB7XG4gICAgICAgICAgb2JqU3RhdCA9IHJlc3VsdFxuICAgICAgICAgIC8vIENyZWF0ZSBhbnkgbWlzc2luZyB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMuXG4gICAgICAgICAgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSwgKGVycikgPT4gY2IoZXJyKSlcbiAgICAgICAgfSxcbiAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgcGFydEZpbGUgPSBgJHtmaWxlUGF0aH0uJHtvYmpTdGF0LmV0YWd9LnBhcnQubWluaW9gXG4gICAgICAgICAgZnMuc3RhdChwYXJ0RmlsZSwgKGUsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMFxuICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgcGFydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShwYXJ0RmlsZSwgeyBmbGFnczogJ3cnIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAob2JqU3RhdC5zaXplID09PSBzdGF0cy5zaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmFtZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb2Zmc2V0ID0gc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICBwYXJ0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBhcnRGaWxlLCB7IGZsYWdzOiAnYScgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBvZmZzZXQsIDAsIGdldE9wdHMsIGNiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIChkb3dubG9hZFN0cmVhbSwgY2IpID0+IHtcbiAgICAgICAgICBwaXBlc2V0dXAoZG93bmxvYWRTdHJlYW0sIHBhcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgICAgIC5vbignZmluaXNoJywgY2IpXG4gICAgICAgIH0sXG4gICAgICAgIChjYikgPT4gZnMuc3RhdChwYXJ0RmlsZSwgY2IpLFxuICAgICAgICAoc3RhdHMsIGNiKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXRzLnNpemUgPT09IG9ialN0YXQuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IobmV3IEVycm9yKCdTaXplIG1pc21hdGNoIGJldHdlZW4gZG93bmxvYWRlZCBmaWxlIGFuZCB0aGUgb2JqZWN0JykpXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmVuYW1lLFxuICAgIClcbiAgfVxuXG4gIC8vIENhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgb2JqZWN0IGNvbnRlbnQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGdldE9wdHNgIF9vYmplY3RfOiBWZXJzaW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIGZvcm0gYHt2ZXJzaW9uSWQ6J215LXV1aWQnfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHN0cmVhbSlgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGBlcnJgIGluIGNhc2Ugb2YgZXJyb3IuIGBzdHJlYW1gIGlzIHRoZSBvYmplY3QgY29udGVudCBzdHJlYW1cbiAgZ2V0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdGhpcy5nZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIDAsIDAsIGdldE9wdHMsIGNiKVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggcmVhZGFibGUgc3RyZWFtIG9mIHRoZSBwYXJ0aWFsIG9iamVjdCBjb250ZW50LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBvZmZzZXRgIF9udW1iZXJfOiBvZmZzZXQgb2YgdGhlIG9iamVjdCBmcm9tIHdoZXJlIHRoZSBzdHJlYW0gd2lsbCBzdGFydFxuICAvLyAqIGBsZW5ndGhgIF9udW1iZXJfOiBsZW5ndGggb2YgdGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVhZCBpbiB0aGUgc3RyZWFtIChvcHRpb25hbCwgaWYgbm90IHNwZWNpZmllZCB3ZSByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlIGZyb20gdGhlIG9mZnNldClcbiAgLy8gKiBgZ2V0T3B0c2AgX29iamVjdF86IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgc3RyZWFtKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci4gYHN0cmVhbWAgaXMgdGhlIG9iamVjdCBjb250ZW50IHN0cmVhbVxuICBnZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG9mZnNldCwgbGVuZ3RoLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24obGVuZ3RoKSkge1xuICAgICAgY2IgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IDBcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihvZmZzZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvZmZzZXQgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGVuZ3RoIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSAnJ1xuICAgIGlmIChvZmZzZXQgfHwgbGVuZ3RoKSB7XG4gICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgIHJhbmdlID0gYGJ5dGVzPSR7K29mZnNldH0tYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmFuZ2UgPSAnYnl0ZXM9MC0nXG4gICAgICAgIG9mZnNldCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgcmFuZ2UgKz0gYCR7K2xlbmd0aCArIG9mZnNldCAtIDF9YFxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoZWFkZXJzID0ge31cbiAgICBpZiAocmFuZ2UgIT09ICcnKSB7XG4gICAgICBoZWFkZXJzLnJhbmdlID0gcmFuZ2VcbiAgICB9XG5cbiAgICB2YXIgZXhwZWN0ZWRTdGF0dXNDb2RlcyA9IFsyMDBdXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBleHBlY3RlZFN0YXR1c0NvZGVzLnB1c2goMjA2KVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcblxuICAgIHZhciBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShnZXRPcHRzKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMsIHF1ZXJ5IH0sICcnLCBleHBlY3RlZFN0YXR1c0NvZGVzLCAnJywgdHJ1ZSwgY2IpXG4gIH1cblxuICAvLyBVcGxvYWRzIHRoZSBvYmplY3QgdXNpbmcgY29udGVudHMgZnJvbSBhIGZpbGVcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZmlsZVBhdGhgIF9zdHJpbmdfOiBmaWxlIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWRcbiAgLy8gKiBgbWV0YURhdGFgIF9KYXZhc2NyaXB0IE9iamVjdF86IG1ldGFEYXRhIGFzc29zY2lhdGVkIHdpdGggdGhlIG9iamVjdFxuICAvLyAqIGBjYWxsYmFjayhlcnIsIG9iakluZm8pYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBvYmpJbmZvYCBfb2JqZWN0XyB3aGljaCBjb250YWlucyB2ZXJzaW9uSWQgYW5kIGV0YWcuXG4gIGZQdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZmlsZVBhdGgsIG1ldGFEYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGVQYXRoIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihtZXRhRGF0YSkpIHtcbiAgICAgIGNhbGxiYWNrID0gbWV0YURhdGFcbiAgICAgIG1ldGFEYXRhID0ge30gLy8gU2V0IG1ldGFEYXRhIGVtcHR5IGlmIG5vIG1ldGFEYXRhIHByb3ZpZGVkLlxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KG1ldGFEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWV0YURhdGEgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0cyBjb3JyZWN0IGBjb250ZW50LXR5cGVgIGF0dHJpYnV0ZSBiYXNlZCBvbiBtZXRhRGF0YSBhbmQgZmlsZVBhdGhcbiAgICBtZXRhRGF0YSA9IGluc2VydENvbnRlbnRUeXBlKG1ldGFEYXRhLCBmaWxlUGF0aClcblxuICAgIGZzLmxzdGF0KGZpbGVQYXRoLCAoZXJyLCBzdGF0KSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCksIHN0YXQuc2l6ZSwgbWV0YURhdGEsIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvLyBVcGxvYWRzIHRoZSBvYmplY3QuXG4gIC8vXG4gIC8vIFVwbG9hZGluZyBhIHN0cmVhbVxuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBzdHJlYW1gIF9TdHJlYW1fOiBSZWFkYWJsZSBzdHJlYW1cbiAgLy8gKiBgc2l6ZWAgX251bWJlcl86IHNpemUgb2YgdGhlIG9iamVjdCAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgZXRhZylgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYGV0YWdgIF9zdHJpbmdfIGlzIHRoZSBldGFnIG9mIHRoZSBvYmplY3QgdXBsb2FkZWQuXG4gIC8vXG4gIC8vIFVwbG9hZGluZyBcIkJ1ZmZlclwiIG9yIFwic3RyaW5nXCJcbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RyaW5nIG9yIEJ1ZmZlcmAgX3N0cmluZ18gb3IgX0J1ZmZlcl86IHN0cmluZyBvciBidWZmZXJcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBvYmpJbmZvKWAgX2Z1bmN0aW9uXzogYGVycmAgaXMgYG51bGxgIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYGluZm9gIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIG9iamVjdCBkZXRhaWxzOlxuICAvLyAgICogYGV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGB2ZXJzaW9uSWRgIF9zdHJpbmdfOiB2ZXJzaW9uSWQgb2YgdGhlIG9iamVjdFxuICBwdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgc3RyZWFtLCBzaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cblxuICAgIC8vIFdlJ2xsIG5lZWQgdG8gc2hpZnQgYXJndW1lbnRzIHRvIHRoZSBsZWZ0IGJlY2F1c2Ugb2Ygc2l6ZSBhbmQgbWV0YURhdGEuXG4gICAgaWYgKGlzRnVuY3Rpb24oc2l6ZSkpIHtcbiAgICAgIGNhbGxiYWNrID0gc2l6ZVxuICAgICAgbWV0YURhdGEgPSB7fVxuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihtZXRhRGF0YSkpIHtcbiAgICAgIGNhbGxiYWNrID0gbWV0YURhdGFcbiAgICAgIG1ldGFEYXRhID0ge31cbiAgICB9XG5cbiAgICAvLyBXZSdsbCBuZWVkIHRvIHNoaWZ0IGFyZ3VtZW50cyB0byB0aGUgbGVmdCBiZWNhdXNlIG9mIG1ldGFEYXRhXG4gICAgLy8gYW5kIHNpemUgYmVpbmcgb3B0aW9uYWwuXG4gICAgaWYgKGlzT2JqZWN0KHNpemUpKSB7XG4gICAgICBtZXRhRGF0YSA9IHNpemVcbiAgICB9XG5cbiAgICAvLyBFbnN1cmVzIE1ldGFkYXRhIGhhcyBhcHByb3ByaWF0ZSBwcmVmaXggZm9yIEEzIEFQSVxuICAgIG1ldGFEYXRhID0gcHJlcGVuZFhBTVpNZXRhKG1ldGFEYXRhKVxuICAgIGlmICh0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyB8fCBzdHJlYW0gaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIC8vIEFkYXB0cyB0aGUgbm9uLXN0cmVhbSBpbnRlcmZhY2UgaW50byBhIHN0cmVhbS5cbiAgICAgIHNpemUgPSBzdHJlYW0ubGVuZ3RoXG4gICAgICBzdHJlYW0gPSByZWFkYWJsZVN0cmVhbShzdHJlYW0pXG4gICAgfSBlbHNlIGlmICghaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlyZCBhcmd1bWVudCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmVhbS5SZWFkYWJsZVwiIG9yIFwiQnVmZmVyXCIgb3IgXCJzdHJpbmdcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIoc2l6ZSkgJiYgc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYHNpemUgY2Fubm90IGJlIG5lZ2F0aXZlLCBnaXZlbiBzaXplOiAke3NpemV9YClcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBhcnQgc2l6ZSBhbmQgZm9yd2FyZCB0aGF0IHRvIHRoZSBCbG9ja1N0cmVhbS4gRGVmYXVsdCB0byB0aGVcbiAgICAvLyBsYXJnZXN0IGJsb2NrIHNpemUgcG9zc2libGUgaWYgbmVjZXNzYXJ5LlxuICAgIGlmICghaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHNpemUgPSB0aGlzLm1heE9iamVjdFNpemVcbiAgICB9XG5cbiAgICBzaXplID0gdGhpcy5jYWxjdWxhdGVQYXJ0U2l6ZShzaXplKVxuXG4gICAgLy8gczMgcmVxdWlyZXMgdGhhdCBhbGwgbm9uLWVuZCBjaHVua3MgYmUgYXQgbGVhc3QgYHRoaXMucGFydFNpemVgLFxuICAgIC8vIHNvIHdlIGNodW5rIHRoZSBzdHJlYW0gdW50aWwgd2UgaGl0IGVpdGhlciB0aGF0IHNpemUgb3IgdGhlIGVuZCBiZWZvcmVcbiAgICAvLyB3ZSBmbHVzaCBpdCB0byBzMy5cbiAgICBsZXQgY2h1bmtlciA9IG5ldyBCbG9ja1N0cmVhbTIoeyBzaXplLCB6ZXJvUGFkZGluZzogZmFsc2UgfSlcblxuICAgIC8vIFRoaXMgaXMgYSBXcml0YWJsZSBzdHJlYW0gdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiBvcmRlciB0byB1cGxvYWRcbiAgICAvLyB0byB0aGUgc3BlY2lmaWVkIGJ1Y2tldCBhbmQgb2JqZWN0IGF1dG9tYXRpY2FsbHkuXG4gICAgbGV0IHVwbG9hZGVyID0gbmV3IE9iamVjdFVwbG9hZGVyKHRoaXMsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNpemUsIG1ldGFEYXRhLCBjYWxsYmFjaylcbiAgICAvLyBzdHJlYW0gPT4gY2h1bmtlciA9PiB1cGxvYWRlclxuICAgIHBpcGVzZXR1cChzdHJlYW0sIGNodW5rZXIsIHVwbG9hZGVyKVxuICB9XG5cbiAgLy8gQ29weSB0aGUgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBzcmNPYmplY3RgIF9zdHJpbmdfOiBwYXRoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJlIGNvcGllZFxuICAvLyAqIGBjb25kaXRpb25zYCBfQ29weUNvbmRpdGlvbnNfOiBjb3B5IGNvbmRpdGlvbnMgdGhhdCBuZWVkcyB0byBiZSBzYXRpc2ZpZWQgKG9wdGlvbmFsLCBkZWZhdWx0IGBudWxsYClcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCB7ZXRhZywgbGFzdE1vZGlmaWVkfSlgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYGV0YWdgIF9zdHJpbmdfIGFuZCBgbGlzdE1vZGlmZWRgIF9EYXRlXyBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBldGFnIGFuZCB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBuZXdseSBjb3BpZWQgb2JqZWN0XG4gIGNvcHlPYmplY3RWMShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7XG4gICAgdmFyIGJ1Y2tldE5hbWUgPSBhcmcxXG4gICAgdmFyIG9iamVjdE5hbWUgPSBhcmcyXG4gICAgdmFyIHNyY09iamVjdCA9IGFyZzNcbiAgICB2YXIgY29uZGl0aW9ucywgY2JcbiAgICBpZiAodHlwZW9mIGFyZzQgPT0gJ2Z1bmN0aW9uJyAmJiBhcmc1ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmRpdGlvbnMgPSBudWxsXG4gICAgICBjYiA9IGFyZzRcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucyA9IGFyZzRcbiAgICAgIGNiID0gYXJnNVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHNyY09iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NyY09iamVjdCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKHNyY09iamVjdCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBFbXB0eSBzb3VyY2UgcHJlZml4YClcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9ucyAhPT0gbnVsbCAmJiAhKGNvbmRpdGlvbnMgaW5zdGFuY2VvZiBDb3B5Q29uZGl0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbmRpdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJDb3B5Q29uZGl0aW9uc1wiJylcbiAgICB9XG5cbiAgICB2YXIgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UnXSA9IHVyaVJlc291cmNlRXNjYXBlKHNyY09iamVjdClcblxuICAgIGlmIChjb25kaXRpb25zICE9PSBudWxsKSB7XG4gICAgICBpZiAoY29uZGl0aW9ucy5tb2RpZmllZCAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbW9kaWZpZWQtc2luY2UnXSA9IGNvbmRpdGlvbnMubW9kaWZpZWRcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLnVubW9kaWZpZWQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLXVubW9kaWZpZWQtc2luY2UnXSA9IGNvbmRpdGlvbnMudW5tb2RpZmllZFxuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbnMubWF0Y2hFVGFnICE9PSAnJykge1xuICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1pZi1tYXRjaCddID0gY29uZGl0aW9ucy5tYXRjaEVUYWdcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLm1hdGNoRXRhZ0V4Y2VwdCAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbm9uZS1tYXRjaCddID0gY29uZGl0aW9ucy5tYXRjaEVUYWdFeGNlcHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBoZWFkZXJzIH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKClcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiBjYihudWxsLCBkYXRhKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIE1ldGhvZCB0byBwZXJmb3JtIGNvcHkgb2YgYW4gb2JqZWN0LlxuICAgKiBAcGFyYW0gc291cmNlQ29uZmlnIF9fb2JqZWN0X18gICBpbnN0YW5jZSBvZiBDb3B5U291cmNlT3B0aW9ucyBAbGluayAuL2hlbHBlcnMvQ29weVNvdXJjZU9wdGlvbnNcbiAgICogQHBhcmFtIGRlc3RDb25maWcgIF9fb2JqZWN0X18gICBpbnN0YW5jZSBvZiBDb3B5RGVzdGluYXRpb25PcHRpb25zIEBsaW5rIC4vaGVscGVycy9Db3B5RGVzdGluYXRpb25PcHRpb25zXG4gICAqIEBwYXJhbSBjYiBfX2Z1bmN0aW9uX18gY2FsbGVkIHdpdGggbnVsbCBpZiB0aGVyZSBpcyBhbiBlcnJvclxuICAgKiBAcmV0dXJucyBQcm9taXNlIGlmIG5vIGNhbGxhY2sgaXMgcGFzc2VkLlxuICAgKi9cbiAgY29weU9iamVjdFYyKHNvdXJjZUNvbmZpZywgZGVzdENvbmZpZywgY2IpIHtcbiAgICBpZiAoIShzb3VyY2VDb25maWcgaW5zdGFuY2VvZiBDb3B5U291cmNlT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NvdXJjZUNvbmZpZyBzaG91bGQgb2YgdHlwZSBDb3B5U291cmNlT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIShkZXN0Q29uZmlnIGluc3RhbmNlb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Rlc3RDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weURlc3RpbmF0aW9uT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIWRlc3RDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghZGVzdENvbmZpZy52YWxpZGF0ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlQ29uZmlnLmdldEhlYWRlcnMoKSwgZGVzdENvbmZpZy5nZXRIZWFkZXJzKCkpXG5cbiAgICBjb25zdCBidWNrZXROYW1lID0gZGVzdENvbmZpZy5CdWNrZXRcbiAgICBjb25zdCBvYmplY3ROYW1lID0gZGVzdENvbmZpZy5PYmplY3RcblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKClcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzSGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgICAgIGNvbnN0IGNvcHlPYmpSZXNwb25zZSA9IHtcbiAgICAgICAgICAgIEJ1Y2tldDogZGVzdENvbmZpZy5CdWNrZXQsXG4gICAgICAgICAgICBLZXk6IGRlc3RDb25maWcuT2JqZWN0LFxuICAgICAgICAgICAgTGFzdE1vZGlmaWVkOiBkYXRhLkxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIE1ldGFEYXRhOiBleHRyYWN0TWV0YWRhdGEocmVzSGVhZGVycyksXG4gICAgICAgICAgICBWZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNIZWFkZXJzKSxcbiAgICAgICAgICAgIFNvdXJjZVZlcnNpb25JZDogZ2V0U291cmNlVmVyc2lvbklkKHJlc0hlYWRlcnMpLFxuICAgICAgICAgICAgRXRhZzogc2FuaXRpemVFVGFnKHJlc0hlYWRlcnMuZXRhZyksXG4gICAgICAgICAgICBTaXplOiArcmVzSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2IobnVsbCwgY29weU9ialJlc3BvbnNlKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBDb3B5IE9iamVjdCBBUEkuXG4gIGNvcHlPYmplY3QoLi4uYWxsQXJncykge1xuICAgIGlmIChhbGxBcmdzWzBdIGluc3RhbmNlb2YgQ29weVNvdXJjZU9wdGlvbnMgJiYgYWxsQXJnc1sxXSBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3RWMiguLi5hcmd1bWVudHMpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3RWMSguLi5hcmd1bWVudHMpXG4gIH1cblxuICAvLyBsaXN0IGEgYmF0Y2ggb2Ygb2JqZWN0c1xuICBsaXN0T2JqZWN0c1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgbWFya2VyLCBsaXN0UXVlcnlPcHRzID0ge30pIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhtYXJrZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXJrZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGxldCB7IERlbGltaXRlciwgTWF4S2V5cywgSW5jbHVkZVZlcnNpb24gfSA9IGxpc3RRdWVyeU9wdHNcblxuICAgIGlmICghaXNPYmplY3QobGlzdFF1ZXJ5T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3RRdWVyeU9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhEZWxpbWl0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWxpbWl0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIoTWF4S2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01heEtleXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcmllcyA9IFtdXG4gICAgLy8gZXNjYXBlIGV2ZXJ5IHZhbHVlIGluIHF1ZXJ5IHN0cmluZywgZXhjZXB0IG1heEtleXNcbiAgICBxdWVyaWVzLnB1c2goYHByZWZpeD0ke3VyaUVzY2FwZShwcmVmaXgpfWApXG4gICAgcXVlcmllcy5wdXNoKGBkZWxpbWl0ZXI9JHt1cmlFc2NhcGUoRGVsaW1pdGVyKX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuXG4gICAgaWYgKEluY2x1ZGVWZXJzaW9uKSB7XG4gICAgICBxdWVyaWVzLnB1c2goYHZlcnNpb25zYClcbiAgICB9XG5cbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBtYXJrZXIgPSB1cmlFc2NhcGUobWFya2VyKVxuICAgICAgaWYgKEluY2x1ZGVWZXJzaW9uKSB7XG4gICAgICAgIHF1ZXJpZXMucHVzaChga2V5LW1hcmtlcj0ke21hcmtlcn1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcmllcy5wdXNoKGBtYXJrZXI9JHttYXJrZXJ9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBuZWVkIHRvIGVzY2FwZSBtYXhLZXlzXG4gICAgaWYgKE1heEtleXMpIHtcbiAgICAgIGlmIChNYXhLZXlzID49IDEwMDApIHtcbiAgICAgICAgTWF4S2V5cyA9IDEwMDBcbiAgICAgIH1cbiAgICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9JHtNYXhLZXlzfWApXG4gICAgfVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgdmFyIHF1ZXJ5ID0gJydcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJpZXMuam9pbignJicpfWBcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lcigpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG5cbiAgLy8gTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgcHJlZml4YCBfc3RyaW5nXzogdGhlIHByZWZpeCBvZiB0aGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsaXN0ZWQgKG9wdGlvbmFsLCBkZWZhdWx0IGAnJ2ApXG4gIC8vICogYHJlY3Vyc2l2ZWAgX2Jvb2xfOiBgdHJ1ZWAgaW5kaWNhdGVzIHJlY3Vyc2l2ZSBzdHlsZSBsaXN0aW5nIGFuZCBgZmFsc2VgIGluZGljYXRlcyBkaXJlY3Rvcnkgc3R5bGUgbGlzdGluZyBkZWxpbWl0ZWQgYnkgJy8nLiAob3B0aW9uYWwsIGRlZmF1bHQgYGZhbHNlYClcbiAgLy8gKiBgbGlzdE9wdHMgX29iamVjdF86IHF1ZXJ5IHBhcmFtcyB0byBsaXN0IG9iamVjdCB3aXRoIGJlbG93IGtleXNcbiAgLy8gKiAgICBsaXN0T3B0cy5NYXhLZXlzIF9pbnRfIG1heGltdW0gbnVtYmVyIG9mIGtleXMgdG8gcmV0dXJuXG4gIC8vICogICAgbGlzdE9wdHMuSW5jbHVkZVZlcnNpb24gIF9ib29sXyB0cnVlfGZhbHNlIHRvIGluY2x1ZGUgdmVyc2lvbnMuXG4gIC8vIF9fUmV0dXJuIFZhbHVlX19cbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogc3RyZWFtIGVtaXR0aW5nIHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQsIHRoZSBvYmplY3QgaXMgb2YgdGhlIGZvcm1hdDpcbiAgLy8gKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLnByZWZpeGAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdCBwcmVmaXhcbiAgLy8gKiBgb2JqLnNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgb2JqLmxhc3RNb2RpZmllZGAgX0RhdGVfOiBtb2RpZmllZCB0aW1lIHN0YW1wXG4gIC8vICogYG9iai5pc0RlbGV0ZU1hcmtlcmAgX2Jvb2xlYW5fOiB0cnVlIGlmIGl0IGlzIGEgZGVsZXRlIG1hcmtlclxuICAvLyAqIGBvYmoudmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbklkIG9mIHRoZSBvYmplY3RcbiAgbGlzdE9iamVjdHMoYnVja2V0TmFtZSwgcHJlZml4LCByZWN1cnNpdmUsIGxpc3RPcHRzID0ge30pIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZWZpeCA9ICcnXG4gICAgfVxuICAgIGlmIChyZWN1cnNpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVjdXJzaXZlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGxpc3RPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdE9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIHZhciBtYXJrZXIgPSAnJ1xuICAgIGNvbnN0IGxpc3RRdWVyeU9wdHMgPSB7XG4gICAgICBEZWxpbWl0ZXI6IHJlY3Vyc2l2ZSA/ICcnIDogJy8nLCAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICAgIE1heEtleXM6IDEwMDAsXG4gICAgICBJbmNsdWRlVmVyc2lvbjogbGlzdE9wdHMuSW5jbHVkZVZlcnNpb24sXG4gICAgfVxuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzUXVlcnkoYnVja2V0TmFtZSwgcHJlZml4LCBtYXJrZXIsIGxpc3RRdWVyeU9wdHMpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgbWFya2VyID0gcmVzdWx0Lm5leHRNYXJrZXIgfHwgcmVzdWx0LnZlcnNpb25JZE1hcmtlclxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0cyA9IHJlc3VsdC5vYmplY3RzXG4gICAgICAgICAgcmVhZFN0cmVhbS5fcmVhZCgpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZWFkU3RyZWFtXG4gIH1cblxuICAvLyBsaXN0T2JqZWN0c1YyUXVlcnkgLSAoTGlzdCBPYmplY3RzIFYyKSAtIExpc3Qgc29tZSBvciBhbGwgKHVwIHRvIDEwMDApIG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvL1xuICAvLyBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFzIHNlbGVjdGlvbiBjcml0ZXJpYSB0byByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIG9iamVjdHMgaW4gYSBidWNrZXQuXG4gIC8vIHJlcXVlc3QgcGFyYW1ldGVycyA6LVxuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IExpbWl0cyB0aGUgcmVzcG9uc2UgdG8ga2V5cyB0aGF0IGJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gIC8vICogYGNvbnRpbnVhdGlvbi10b2tlbmAgX3N0cmluZ186IFVzZWQgdG8gY29udGludWUgaXRlcmF0aW5nIG92ZXIgYSBzZXQgb2Ygb2JqZWN0cy5cbiAgLy8gKiBgZGVsaW1pdGVyYCBfc3RyaW5nXzogQSBkZWxpbWl0ZXIgaXMgYSBjaGFyYWN0ZXIgeW91IHVzZSB0byBncm91cCBrZXlzLlxuICAvLyAqIGBtYXgta2V5c2AgX251bWJlcl86IFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGtleXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gIC8vICogYHN0YXJ0LWFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuXG4gIGxpc3RPYmplY3RzVjJRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIG1heEtleXMsIHN0YXJ0QWZ0ZXIpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhjb250aW51YXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRpbnVhdGlvblRva2VuIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihtYXhLZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4S2V5cyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdGFydEFmdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhcnRBZnRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuXG4gICAgLy8gQ2FsbCBmb3IgbGlzdGluZyBvYmplY3RzIHYyIEFQSVxuICAgIHF1ZXJpZXMucHVzaChgbGlzdC10eXBlPTJgKVxuICAgIHF1ZXJpZXMucHVzaChgZW5jb2RpbmctdHlwZT11cmxgKVxuXG4gICAgLy8gZXNjYXBlIGV2ZXJ5IHZhbHVlIGluIHF1ZXJ5IHN0cmluZywgZXhjZXB0IG1heEtleXNcbiAgICBxdWVyaWVzLnB1c2goYHByZWZpeD0ke3VyaUVzY2FwZShwcmVmaXgpfWApXG4gICAgcXVlcmllcy5wdXNoKGBkZWxpbWl0ZXI9JHt1cmlFc2NhcGUoZGVsaW1pdGVyKX1gKVxuXG4gICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHVyaUVzY2FwZShjb250aW51YXRpb25Ub2tlbilcbiAgICAgIHF1ZXJpZXMucHVzaChgY29udGludWF0aW9uLXRva2VuPSR7Y29udGludWF0aW9uVG9rZW59YClcbiAgICB9XG4gICAgLy8gU2V0IHN0YXJ0LWFmdGVyXG4gICAgaWYgKHN0YXJ0QWZ0ZXIpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSB1cmlFc2NhcGUoc3RhcnRBZnRlcilcbiAgICAgIHF1ZXJpZXMucHVzaChgc3RhcnQtYWZ0ZXI9JHtzdGFydEFmdGVyfWApXG4gICAgfVxuICAgIC8vIG5vIG5lZWQgdG8gZXNjYXBlIG1heEtleXNcbiAgICBpZiAobWF4S2V5cykge1xuICAgICAgaWYgKG1heEtleXMgPj0gMTAwMCkge1xuICAgICAgICBtYXhLZXlzID0gMTAwMFxuICAgICAgfVxuICAgICAgcXVlcmllcy5wdXNoKGBtYXgta2V5cz0ke21heEtleXN9YClcbiAgICB9XG4gICAgcXVlcmllcy5zb3J0KClcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyKClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5lbWl0KCdlcnJvcicsIGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgIH0pXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyXG4gIH1cblxuICAvLyBMaXN0IHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQgdXNpbmcgUzMgTGlzdE9iamVjdHMgVjJcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gIC8vICogYHN0YXJ0QWZ0ZXJgIF9zdHJpbmdfOiBTcGVjaWZpZXMgdGhlIGtleSB0byBzdGFydCBhZnRlciB3aGVuIGxpc3Rpbmcgb2JqZWN0cyBpbiBhIGJ1Y2tldC4gKG9wdGlvbmFsLCBkZWZhdWx0IGAnJ2ApXG4gIC8vXG4gIC8vIF9fUmV0dXJuIFZhbHVlX19cbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogc3RyZWFtIGVtaXR0aW5nIHRoZSBvYmplY3RzIGluIHRoZSBidWNrZXQsIHRoZSBvYmplY3QgaXMgb2YgdGhlIGZvcm1hdDpcbiAgLy8gICAqIGBvYmoubmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iai5wcmVmaXhgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3QgcHJlZml4XG4gIC8vICAgKiBgb2JqLnNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmouZXRhZ2AgX3N0cmluZ186IGV0YWcgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iai5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICBsaXN0T2JqZWN0c1YyKGJ1Y2tldE5hbWUsIHByZWZpeCwgcmVjdXJzaXZlLCBzdGFydEFmdGVyKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGFydEFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0QWZ0ZXIgPSAnJ1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkUHJlZml4RXJyb3IoYEludmFsaWQgcHJlZml4IDogJHtwcmVmaXh9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKHJlY3Vyc2l2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY3Vyc2l2ZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIC8vIGlmIHJlY3Vyc2l2ZSBpcyBmYWxzZSBzZXQgZGVsaW1pdGVyIHRvICcvJ1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZWN1cnNpdmUgPyAnJyA6ICcvJ1xuICAgIHZhciBjb250aW51YXRpb25Ub2tlbiA9ICcnXG4gICAgdmFyIG9iamVjdHMgPSBbXVxuICAgIHZhciBlbmRlZCA9IGZhbHNlXG4gICAgdmFyIHJlYWRTdHJlYW0gPSBTdHJlYW0uUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlIH0pXG4gICAgcmVhZFN0cmVhbS5fcmVhZCA9ICgpID0+IHtcbiAgICAgIC8vIHB1c2ggb25lIG9iamVjdCBwZXIgX3JlYWQoKVxuICAgICAgaWYgKG9iamVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHJlYWRTdHJlYW0ucHVzaChvYmplY3RzLnNoaWZ0KCkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBvYmplY3RzIHRvIHB1c2ggZG8gcXVlcnkgZm9yIHRoZSBuZXh0IGJhdGNoIG9mIG9iamVjdHNcbiAgICAgIHRoaXMubGlzdE9iamVjdHNWMlF1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgY29udGludWF0aW9uVG9rZW4sIGRlbGltaXRlciwgMTAwMCwgc3RhcnRBZnRlcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3VsdC5uZXh0Q29udGludWF0aW9uVG9rZW5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdHMgPSByZXN1bHQub2JqZWN0c1xuICAgICAgICAgIHJlYWRTdHJlYW0uX3JlYWQoKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCB0aGUgb2JqZWN0cyByZXNpZGluZyBpbiB0aGUgb2JqZWN0c0xpc3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3RzTGlzdGAgX2FycmF5XzogYXJyYXkgb2Ygb2JqZWN0cyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWVzIGFzIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG9iamVjdCBrZXlzOiAgWydvYmplY3RuYW1lMScsJ29iamVjdG5hbWUyJ11cbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWUgYW5kIHZlcnNpb25JZCBhcyBhbiBvYmplY3Q6ICBbe25hbWU6XCJvYmplY3RuYW1lXCIsdmVyc2lvbklkOlwibXktdmVyc2lvbi1pZFwifV1cblxuICByZW1vdmVPYmplY3RzKGJ1Y2tldE5hbWUsIG9iamVjdHNMaXN0LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3RzTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29iamVjdHNMaXN0IHNob3VsZCBiZSBhIGxpc3QnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEVudHJpZXMgPSAxMDAwXG4gICAgY29uc3QgcXVlcnkgPSAnZGVsZXRlJ1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQT1NUJ1xuXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdHNMaXN0LnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICAgIHJlc3VsdC5saXN0LnB1c2goZW50cnkpXG4gICAgICAgIGlmIChyZXN1bHQubGlzdC5sZW5ndGggPT09IG1heEVudHJpZXMpIHtcbiAgICAgICAgICByZXN1bHQubGlzdE9mTGlzdC5wdXNoKHJlc3VsdC5saXN0KVxuICAgICAgICAgIHJlc3VsdC5saXN0ID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9LFxuICAgICAgeyBsaXN0T2ZMaXN0OiBbXSwgbGlzdDogW10gfSxcbiAgICApXG5cbiAgICBpZiAocmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0Lmxpc3RPZkxpc3QucHVzaChyZXN1bHQubGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcbiAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBbXVxuXG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIHJlc3VsdC5saXN0T2ZMaXN0LFxuICAgICAgKGxpc3QsIGJhdGNoQ2IpID0+IHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXVxuICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgb2JqZWN0cy5wdXNoKHsgS2V5OiB2YWx1ZS5uYW1lLCBWZXJzaW9uSWQ6IHZhbHVlLnZlcnNpb25JZCB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmplY3RzLnB1c2goeyBLZXk6IHZhbHVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsZXQgZGVsZXRlT2JqZWN0cyA9IHsgRGVsZXRlOiB7IFF1aWV0OiB0cnVlLCBPYmplY3Q6IG9iamVjdHMgfSB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSB9KVxuICAgICAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZGVsZXRlT2JqZWN0cylcbiAgICAgICAgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGVuY29kZXIuZW5jb2RlKHBheWxvYWQpKVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgICAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgICAgICBsZXQgcmVtb3ZlT2JqZWN0c1Jlc3VsdFxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hDYihlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5yZW1vdmVPYmplY3RzVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIHJlbW92ZU9iamVjdHNSZXN1bHQgPSBkYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaENiKGUsIG51bGwpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5wdXNoKHJlbW92ZU9iamVjdHNSZXN1bHQpXG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaENiKG51bGwsIHJlbW92ZU9iamVjdHNSZXN1bHQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2IobnVsbCwgXy5mbGF0dGVuKGJhdGNoUmVzdWx0cykpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIC8vIEdldCB0aGUgcG9saWN5IG9uIGEgYnVja2V0IG9yIGFuIG9iamVjdCBwcmVmaXguXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHBvbGljeSlgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uXG4gIGdldEJ1Y2tldFBvbGljeShidWNrZXROYW1lLCBjYikge1xuICAgIC8vIFZhbGlkYXRlIGFyZ3VtZW50cy5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGxldCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICdwb2xpY3knXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHBvbGljeSA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuZ2V0Q29uY2F0ZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IChwb2xpY3kgPSBkYXRhKSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBwb2xpY3kudG9TdHJpbmcoKSlcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gU2V0IHRoZSBwb2xpY3kgb24gYSBidWNrZXQgb3IgYW4gb2JqZWN0IHByZWZpeC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGJ1Y2tldFBvbGljeWAgX3N0cmluZ186IGJ1Y2tldCBwb2xpY3kgKEpTT04gc3RyaW5naWZ5J2VkKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvblxuICBzZXRCdWNrZXRQb2xpY3koYnVja2V0TmFtZSwgcG9saWN5LCBjYikge1xuICAgIC8vIFZhbGlkYXRlIGFyZ3VtZW50cy5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHBvbGljeSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldFBvbGljeUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBwb2xpY3k6ICR7cG9saWN5fSAtIG11c3QgYmUgXCJzdHJpbmdcImApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgbGV0IHF1ZXJ5ID0gJ3BvbGljeSdcblxuICAgIGlmIChwb2xpY3kpIHtcbiAgICAgIG1ldGhvZCA9ICdQVVQnXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgcG9saWN5LCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGEgZ2VuZXJpYyBwcmVzaWduZWQgVVJMIHdoaWNoIGNhbiBiZVxuICAvLyB1c2VkIGZvciBIVFRQIG1ldGhvZHMgR0VULCBQVVQsIEhFQUQgYW5kIERFTEVURVxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYG1ldGhvZGAgX3N0cmluZ186IG5hbWUgb2YgdGhlIEhUVFAgbWV0aG9kXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICAvLyAqIGByZXFQYXJhbXNgIF9vYmplY3RfOiByZXF1ZXN0IHBhcmFtZXRlcnMgKG9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIjEwZmE5OTQ2LTNmNjQtNDEzNy1hNThmLTg4ODA2NWMwNzMyZVwifVxuICAvLyAqIGByZXF1ZXN0RGF0ZWAgX0RhdGVfOiBBIGRhdGUgb2JqZWN0LCB0aGUgdXJsIHdpbGwgYmUgaXNzdWVkIGF0IChvcHRpb25hbClcbiAgcHJlc2lnbmVkVXJsKG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgcmVxUGFyYW1zLCByZXF1ZXN0RGF0ZSwgY2IpIHtcbiAgICBpZiAodGhpcy5hbm9ueW1vdXMpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuQW5vbnltb3VzUmVxdWVzdEVycm9yKCdQcmVzaWduZWQgJyArIG1ldGhvZCArICcgdXJsIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIGFub255bW91cyByZXF1ZXN0cycpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlcXVlc3REYXRlKSkge1xuICAgICAgY2IgPSByZXF1ZXN0RGF0ZVxuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlcVBhcmFtcykpIHtcbiAgICAgIGNiID0gcmVxUGFyYW1zXG4gICAgICByZXFQYXJhbXMgPSB7fVxuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKGV4cGlyZXMpKSB7XG4gICAgICBjYiA9IGV4cGlyZXNcbiAgICAgIHJlcVBhcmFtcyA9IHt9XG4gICAgICBleHBpcmVzID0gMjQgKiA2MCAqIDYwICogNyAvLyA3IGRheXMgaW4gc2Vjb25kc1xuICAgICAgcmVxdWVzdERhdGUgPSBuZXcgRGF0ZSgpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGlyZXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVxUGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxUGFyYW1zIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWREYXRlKHJlcXVlc3REYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxdWVzdERhdGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJEYXRlXCIgYW5kIHZhbGlkJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHJlcVBhcmFtcylcbiAgICB0aGlzLmdldEJ1Y2tldFJlZ2lvbihidWNrZXROYW1lLCAoZSwgcmVnaW9uKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGlzIGFkZGVkIHRvIGVuc3VyZSB0aGF0IHdlIHNlbmQgZXJyb3IgdGhyb3VnaFxuICAgICAgLy8gY2FsbGJhY2sgb24gcHJlc2lnbiBmYWlsdXJlLlxuICAgICAgdmFyIHVybFxuICAgICAgdmFyIHJlcU9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKHsgbWV0aG9kLCByZWdpb24sIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0pXG5cbiAgICAgIHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdXJsID0gcHJlc2lnblNpZ25hdHVyZVY0KFxuICAgICAgICAgIHJlcU9wdGlvbnMsXG4gICAgICAgICAgdGhpcy5hY2Nlc3NLZXksXG4gICAgICAgICAgdGhpcy5zZWNyZXRLZXksXG4gICAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4sXG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIHJlcXVlc3REYXRlLFxuICAgICAgICAgIGV4cGlyZXMsXG4gICAgICAgIClcbiAgICAgIH0gY2F0Y2ggKHBlKSB7XG4gICAgICAgIHJldHVybiBjYihwZSlcbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIHVybClcbiAgICB9KVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBwcmVzaWduZWQgVVJMIGZvciBHRVRcbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZXhwaXJ5YCBfbnVtYmVyXzogZXhwaXJ5IGluIHNlY29uZHMgKG9wdGlvbmFsLCBkZWZhdWx0IDcgZGF5cylcbiAgLy8gKiBgcmVzcEhlYWRlcnNgIF9vYmplY3RfOiByZXNwb25zZSBoZWFkZXJzIHRvIG92ZXJyaWRlIG9yIHJlcXVlc3QgcGFyYW1zIGZvciBxdWVyeSAob3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwiMTBmYTk5NDYtM2Y2NC00MTM3LWE1OGYtODg4MDY1YzA3MzJlXCJ9XG4gIC8vICogYHJlcXVlc3REYXRlYCBfRGF0ZV86IEEgZGF0ZSBvYmplY3QsIHRoZSB1cmwgd2lsbCBiZSBpc3N1ZWQgYXQgKG9wdGlvbmFsKVxuICBwcmVzaWduZWRHZXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgcmVzcEhlYWRlcnMsIHJlcXVlc3REYXRlLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ocmVzcEhlYWRlcnMpKSB7XG4gICAgICBjYiA9IHJlc3BIZWFkZXJzXG4gICAgICByZXNwSGVhZGVycyA9IHt9XG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG5cbiAgICB2YXIgdmFsaWRSZXNwSGVhZGVycyA9IFtcbiAgICAgICdyZXNwb25zZS1jb250ZW50LXR5cGUnLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UnLFxuICAgICAgJ3Jlc3BvbnNlLWV4cGlyZXMnLFxuICAgICAgJ3Jlc3BvbnNlLWNhY2hlLWNvbnRyb2wnLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24nLFxuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmcnLFxuICAgIF1cbiAgICB2YWxpZFJlc3BIZWFkZXJzLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgaWYgKHJlc3BIZWFkZXJzICE9PSB1bmRlZmluZWQgJiYgcmVzcEhlYWRlcnNbaGVhZGVyXSAhPT0gdW5kZWZpbmVkICYmICFpc1N0cmluZyhyZXNwSGVhZGVyc1toZWFkZXJdKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByZXNwb25zZSBoZWFkZXIgJHtoZWFkZXJ9IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCJgKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMucHJlc2lnbmVkVXJsKCdHRVQnLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXNwSGVhZGVycywgcmVxdWVzdERhdGUsIGNiKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBwcmVzaWduZWQgVVJMIGZvciBQVVQuIFVzaW5nIHRoaXMgVVJMLCB0aGUgYnJvd3NlciBjYW4gdXBsb2FkIHRvIFMzIG9ubHkgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBuYW1lLlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICBwcmVzaWduZWRQdXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVzaWduZWRVcmwoJ1BVVCcsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGV4cGlyZXMsIGNiKVxuICB9XG5cbiAgLy8gcmV0dXJuIFBvc3RQb2xpY3kgb2JqZWN0XG4gIG5ld1Bvc3RQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBQb3N0UG9saWN5KClcbiAgfVxuXG4gIC8vIHByZXNpZ25lZFBvc3RQb2xpY3kgY2FuIGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSB3YW50IG1vcmUgY29udHJvbCBvbiB0aGUgdXBsb2FkIHRoYW4gd2hhdFxuICAvLyBwcmVzaWduZWRQdXRPYmplY3QoKSBwcm92aWRlcy4gaS5lIFVzaW5nIHByZXNpZ25lZFBvc3RQb2xpY3kgd2Ugd2lsbCBiZSBhYmxlIHRvIHB1dCBwb2xpY3kgcmVzdHJpY3Rpb25zXG4gIC8vIG9uIHRoZSBvYmplY3QncyBgbmFtZWAgYGJ1Y2tldGAgYGV4cGlyeWAgYENvbnRlbnQtVHlwZWAgYENvbnRlbnQtRGlzcG9zaXRpb25gIGBtZXRhRGF0YWBcbiAgcHJlc2lnbmVkUG9zdFBvbGljeShwb3N0UG9saWN5LCBjYikge1xuICAgIGlmICh0aGlzLmFub255bW91cykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Bbm9ueW1vdXNSZXF1ZXN0RXJyb3IoJ1ByZXNpZ25lZCBQT1NUIHBvbGljeSBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZvciBhbm9ueW1vdXMgcmVxdWVzdHMnKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHBvc3RQb2xpY3kpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwb3N0UG9saWN5IHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYiBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB0aGlzLmdldEJ1Y2tldFJlZ2lvbihwb3N0UG9saWN5LmZvcm1EYXRhLmJ1Y2tldCwgKGUsIHJlZ2lvbikgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgIHZhciBkYXRlU3RyID0gbWFrZURhdGVMb25nKGRhdGUpXG5cbiAgICAgIHRoaXMuY2hlY2tBbmRSZWZyZXNoQ3JlZHMoKVxuXG4gICAgICBpZiAoIXBvc3RQb2xpY3kucG9saWN5LmV4cGlyYXRpb24pIHtcbiAgICAgICAgLy8gJ2V4cGlyYXRpb24nIGlzIG1hbmRhdG9yeSBmaWVsZCBmb3IgUzMuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGV4cGlyYXRpb24gZGF0ZSBvZiA3IGRheXMuXG4gICAgICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKVxuICAgICAgICBleHBpcmVzLnNldFNlY29uZHMoMjQgKiA2MCAqIDYwICogNylcbiAgICAgICAgcG9zdFBvbGljeS5zZXRFeHBpcmVzKGV4cGlyZXMpXG4gICAgICB9XG5cbiAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1kYXRlJywgZGF0ZVN0cl0pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1kYXRlJ10gPSBkYXRlU3RyXG5cbiAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1hbGdvcml0aG0nLCAnQVdTNC1ITUFDLVNIQTI1NiddKVxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotYWxnb3JpdGhtJ10gPSAnQVdTNC1ITUFDLVNIQTI1NidcblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWNyZWRlbnRpYWwnLCB0aGlzLmFjY2Vzc0tleSArICcvJyArIGdldFNjb3BlKHJlZ2lvbiwgZGF0ZSldKVxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotY3JlZGVudGlhbCddID0gdGhpcy5hY2Nlc3NLZXkgKyAnLycgKyBnZXRTY29wZShyZWdpb24sIGRhdGUpXG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25Ub2tlbikge1xuICAgICAgICBwb3N0UG9saWN5LnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckeC1hbXotc2VjdXJpdHktdG9rZW4nLCB0aGlzLnNlc3Npb25Ub2tlbl0pXG4gICAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LXNlY3VyaXR5LXRva2VuJ10gPSB0aGlzLnNlc3Npb25Ub2tlblxuICAgICAgfVxuXG4gICAgICB2YXIgcG9saWN5QmFzZTY0ID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocG9zdFBvbGljeS5wb2xpY3kpKS50b1N0cmluZygnYmFzZTY0JylcblxuICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YS5wb2xpY3kgPSBwb2xpY3lCYXNlNjRcblxuICAgICAgdmFyIHNpZ25hdHVyZSA9IHBvc3RQcmVzaWduU2lnbmF0dXJlVjQocmVnaW9uLCBkYXRlLCB0aGlzLnNlY3JldEtleSwgcG9saWN5QmFzZTY0KVxuXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1zaWduYXR1cmUnXSA9IHNpZ25hdHVyZVxuICAgICAgdmFyIG9wdHMgPSB7fVxuICAgICAgb3B0cy5yZWdpb24gPSByZWdpb25cbiAgICAgIG9wdHMuYnVja2V0TmFtZSA9IHBvc3RQb2xpY3kuZm9ybURhdGEuYnVja2V0XG4gICAgICB2YXIgcmVxT3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMob3B0cylcbiAgICAgIHZhciBwb3J0U3RyID0gdGhpcy5wb3J0ID09IDgwIHx8IHRoaXMucG9ydCA9PT0gNDQzID8gJycgOiBgOiR7dGhpcy5wb3J0LnRvU3RyaW5nKCl9YFxuICAgICAgdmFyIHVybFN0ciA9IGAke3JlcU9wdGlvbnMucHJvdG9jb2x9Ly8ke3JlcU9wdGlvbnMuaG9zdH0ke3BvcnRTdHJ9JHtyZXFPcHRpb25zLnBhdGh9YFxuICAgICAgY2IobnVsbCwgeyBwb3N0VVJMOiB1cmxTdHIsIGZvcm1EYXRhOiBwb3N0UG9saWN5LmZvcm1EYXRhIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIENvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLiBBZnRlciBhbGwgdGhlIHBhcnRzIGFyZSB1cGxvYWRlZCBpc3N1aW5nXG4gIC8vIHRoaXMgY2FsbCB3aWxsIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgb24gdGhlIHNlcnZlciBpbnRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIGV0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChldGFncykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwiQXJyYXlcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXJpRXNjYXBlKHVwbG9hZElkKX1gXG5cbiAgICB2YXIgcGFydHMgPSBbXVxuXG4gICAgZXRhZ3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIFBhcnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBQYXJ0TnVtYmVyOiBlbGVtZW50LnBhcnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFVGFnOiBlbGVtZW50LmV0YWcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHZhciBwYXlsb2FkT2JqZWN0ID0geyBDb21wbGV0ZU11bHRpcGFydFVwbG9hZDogcGFydHMgfVxuICAgIHZhciBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJDb2RlKSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBhcnQgQ29tcGxldGUgQVBJIHJldHVybnMgYW4gZXJyb3IgWE1MIGFmdGVyIGEgMjAwIGh0dHAgc3RhdHVzXG4gICAgICAgICAgICBjYihuZXcgZXJyb3JzLlMzRXJyb3IocmVzdWx0LmVyck1lc3NhZ2UpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZU11bHRpcGFydFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IobnVsbCwgY29tcGxldGVNdWx0aXBhcnRSZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBDYWxsZWQgYnkgbGlzdEluY29tcGxldGVVcGxvYWRzIHRvIGZldGNoIGEgYmF0Y2ggb2YgaW5jb21wbGV0ZSB1cGxvYWRzLlxuICBsaXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIsIGRlbGltaXRlcikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGtleU1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2tleU1hcmtlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyh1cGxvYWRJZE1hcmtlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkTWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGRlbGltaXRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlbGltaXRlciBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgdmFyIHF1ZXJpZXMgPSBbXVxuICAgIHF1ZXJpZXMucHVzaChgcHJlZml4PSR7dXJpRXNjYXBlKHByZWZpeCl9YClcbiAgICBxdWVyaWVzLnB1c2goYGRlbGltaXRlcj0ke3VyaUVzY2FwZShkZWxpbWl0ZXIpfWApXG5cbiAgICBpZiAoa2V5TWFya2VyKSB7XG4gICAgICBrZXlNYXJrZXIgPSB1cmlFc2NhcGUoa2V5TWFya2VyKVxuICAgICAgcXVlcmllcy5wdXNoKGBrZXktbWFya2VyPSR7a2V5TWFya2VyfWApXG4gICAgfVxuICAgIGlmICh1cGxvYWRJZE1hcmtlcikge1xuICAgICAgcXVlcmllcy5wdXNoKGB1cGxvYWQtaWQtbWFya2VyPSR7dXBsb2FkSWRNYXJrZXJ9YClcbiAgICB9XG5cbiAgICB2YXIgbWF4VXBsb2FkcyA9IDEwMDBcbiAgICBxdWVyaWVzLnB1c2goYG1heC11cGxvYWRzPSR7bWF4VXBsb2Fkc31gKVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgcXVlcmllcy51bnNoaWZ0KCd1cGxvYWRzJylcbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcmllcy5qb2luKCcmJyl9YFxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyKClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5lbWl0KCdlcnJvcicsIGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgIH0pXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyXG4gIH1cblxuICAvLyBGaW5kIHVwbG9hZElkIG9mIGFuIGluY29tcGxldGUgdXBsb2FkLlxuICBmaW5kVXBsb2FkSWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYiBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbGF0ZXN0VXBsb2FkXG4gICAgdmFyIGxpc3ROZXh0ID0gKGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIpID0+IHtcbiAgICAgIHRoaXMubGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgJycpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXN1bHQudXBsb2Fkcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1cGxvYWQua2V5ID09PSBvYmplY3ROYW1lKSB7XG4gICAgICAgICAgICAgIGlmICghbGF0ZXN0VXBsb2FkIHx8IHVwbG9hZC5pbml0aWF0ZWQuZ2V0VGltZSgpID4gbGF0ZXN0VXBsb2FkLmluaXRpYXRlZC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICBsYXRlc3RVcGxvYWQgPSB1cGxvYWRcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgbGlzdE5leHQocmVzdWx0Lm5leHRLZXlNYXJrZXIsIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxhdGVzdFVwbG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGxhdGVzdFVwbG9hZC51cGxvYWRJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IobnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBsaXN0TmV4dCgnJywgJycpXG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHRoZSBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbnMgaW4gdGhlIFMzIHByb3ZpZGVyXG4gIHNldEJ1Y2tldE5vdGlmaWNhdGlvbihidWNrZXROYW1lLCBjb25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChjb25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZmljYXRpb24gY29uZmlnIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICB2YXIgcXVlcnkgPSAnbm90aWZpY2F0aW9uJ1xuICAgIHZhciBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgdmFyIHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KGNvbmZpZylcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIHJlbW92ZUFsbEJ1Y2tldE5vdGlmaWNhdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIHRoaXMuc2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIG5ldyBOb3RpZmljYXRpb25Db25maWcoKSwgY2IpXG4gIH1cblxuICAvLyBSZXR1cm4gdGhlIGxpc3Qgb2Ygbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb25zIHN0b3JlZFxuICAvLyBpbiB0aGUgUzMgcHJvdmlkZXJcbiAgZ2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ25vdGlmaWNhdGlvbidcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEJ1Y2tldE5vdGlmaWNhdGlvblRyYW5zZm9ybWVyKClcbiAgICAgIHZhciBidWNrZXROb3RpZmljYXRpb25cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IChidWNrZXROb3RpZmljYXRpb24gPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIGJ1Y2tldE5vdGlmaWNhdGlvbikpXG4gICAgfSlcbiAgfVxuXG4gIC8vIExpc3RlbnMgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25zLiBSZXR1cm5zIGFuIEV2ZW50RW1pdHRlci5cbiAgbGlzdGVuQnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIHByZWZpeCwgc3VmZml4LCBldmVudHMpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzdWZmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdWZmaXggbXVzdCBiZSBvZiB0eXBlIHN0cmluZycpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShldmVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdldmVudHMgbXVzdCBiZSBvZiB0eXBlIEFycmF5JylcbiAgICB9XG4gICAgbGV0IGxpc3RlbmVyID0gbmV3IE5vdGlmaWNhdGlvblBvbGxlcih0aGlzLCBidWNrZXROYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZXZlbnRzKVxuICAgIGxpc3RlbmVyLnN0YXJ0KClcblxuICAgIHJldHVybiBsaXN0ZW5lclxuICB9XG5cbiAgZ2V0QnVja2V0VmVyc2lvbmluZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuICAgIHZhciBxdWVyeSA9ICd2ZXJzaW9uaW5nJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHZlcnNpb25Db25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLmJ1Y2tldFZlcnNpb25pbmdUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHZlcnNpb25Db25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgdmVyc2lvbkNvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0QnVja2V0VmVyc2lvbmluZyhidWNrZXROYW1lLCB2ZXJzaW9uQ29uZmlnLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghT2JqZWN0LmtleXModmVyc2lvbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd2ZXJzaW9uQ29uZmlnIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBxdWVyeSA9ICd2ZXJzaW9uaW5nJ1xuICAgIHZhciBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24nLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgICBoZWFkbGVzczogdHJ1ZSxcbiAgICB9KVxuICAgIHZhciBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdCh2ZXJzaW9uQ29uZmlnKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogVG8gc2V0IFRhZ3Mgb24gYSBidWNrZXQgb3Igb2JqZWN0IGJhc2VkIG9uIHRoZSBwYXJhbXNcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogdGFnZ2luZ1BhcmFtcyBfb2JqZWN0XyBXaGljaCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXNcbiAgICogIGJ1Y2tldE5hbWUgX3N0cmluZ18sXG4gICAqICBvYmplY3ROYW1lIF9zdHJpbmdfIChPcHRpb25hbCksXG4gICAqICB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogIHB1dE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9LFxuICAgKiAgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0VGFnZ2luZyh0YWdnaW5nUGFyYW1zKSB7XG4gICAgY29uc3QgeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzID0ge30sIGNiIH0gPSB0YWdnaW5nUGFyYW1zXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAndGFnZ2luZydcblxuICAgIGlmIChwdXRPcHRzICYmIHB1dE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJ5fSZ2ZXJzaW9uSWQ9JHtwdXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuICAgIGNvbnN0IHRhZ3NMaXN0ID0gW11cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgdGFnc0xpc3QucHVzaCh7IEtleToga2V5LCBWYWx1ZTogdmFsdWUgfSlcbiAgICB9XG4gICAgY29uc3QgdGFnZ2luZ0NvbmZpZyA9IHtcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiB7XG4gICAgICAgICAgVGFnOiB0YWdzTGlzdCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSwgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0gfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QodGFnZ2luZ0NvbmZpZylcbiAgICBwYXlsb2FkID0gQnVmZmVyLmZyb20oZW5jb2Rlci5lbmNvZGUocGF5bG9hZCkpXG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogU2V0IFRhZ3Mgb24gYSBCdWNrZXRcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0QnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCB0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodGFncykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3RhZ3Mgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignbWF4aW11bSB0YWdzIGFsbG93ZWQgaXMgMTBcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0VGFnZ2luZyh7IGJ1Y2tldE5hbWUsIHRhZ3MsIGNiIH0pXG4gIH1cblxuICAvKiogU2V0IFRhZ3Mgb24gYW4gT2JqZWN0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfXG4gICAqICAqIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiAgcHV0T3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgb2JqZWN0IG5hbWU6ICcgKyBvYmplY3ROYW1lKVxuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKHB1dE9wdHMpKSB7XG4gICAgICBjYiA9IHB1dE9wdHNcbiAgICAgIHB1dE9wdHMgPSB7fVxuICAgIH1cblxuICAgIGlmICghaXNPYmplY3QodGFncykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3RhZ3Mgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWF4aW11bSB0YWdzIGFsbG93ZWQgaXMgMTBcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0VGFnZ2luZyh7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMsIGNiIH0pXG4gIH1cblxuICAvKiogUmVtb3ZlIFRhZ3Mgb24gYW4gQnVja2V0L09iamVjdCBiYXNlZCBvbiBwYXJhbXNcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ18gKG9wdGlvbmFsKVxuICAgKiByZW1vdmVPcHRzIF9vYmplY3RfIChPcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifSxcbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZVRhZ2dpbmcoeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCByZW1vdmVPcHRzLCBjYiB9KSB7XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBsZXQgcXVlcnkgPSAndGFnZ2luZydcblxuICAgIGlmIChyZW1vdmVPcHRzICYmIE9iamVjdC5rZXlzKHJlbW92ZU9wdHMpLmxlbmd0aCAmJiByZW1vdmVPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyeX0mdmVyc2lvbklkPSR7cmVtb3ZlT3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9XG5cbiAgICBpZiAob2JqZWN0TmFtZSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnNbJ29iamVjdE5hbWUnXSA9IG9iamVjdE5hbWVcbiAgICB9XG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDAsIDIwNF0sICcnLCB0cnVlLCBjYilcbiAgfVxuXG4gIC8qKiBSZW1vdmUgVGFncyBhc3NvY2lhdGVkIHdpdGggYSBidWNrZXRcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcmVtb3ZlQnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbW92ZVRhZ2dpbmcoeyBidWNrZXROYW1lLCBjYiB9KVxuICB9XG5cbiAgLyoqIFJlbW92ZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3RcbiAgICogX19Bcmd1bWVudHNfX1xuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ19cbiAgICogcmVtb3ZlT3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZy4ge1ZlcnNpb25JRDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9XG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlT3B0cykpIHtcbiAgICAgIGNiID0gcmVtb3ZlT3B0c1xuICAgICAgcmVtb3ZlT3B0cyA9IHt9XG4gICAgfVxuICAgIGlmIChyZW1vdmVPcHRzICYmIE9iamVjdC5rZXlzKHJlbW92ZU9wdHMpLmxlbmd0aCAmJiAhaXNPYmplY3QocmVtb3ZlT3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlbW92ZU9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmVtb3ZlT3B0cywgY2IgfSlcbiAgfVxuXG4gIC8qKiBHZXQgVGFncyBhc3NvY2lhdGVkIHdpdGggYSBCdWNrZXRcbiAgICogIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoZXJyb3IsIHRhZ3MpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgZ2V0QnVja2V0VGFnZ2luZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICd0YWdnaW5nJ1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldFRhZ3NUcmFuc2Zvcm1lcigpXG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGxldCB0YWdzTGlzdFxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4gKHRhZ3NMaXN0ID0gcmVzdWx0KSlcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiBjYihudWxsLCB0YWdzTGlzdCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYnVja2V0IE9SIGFuIG9iamVjdFxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIG9iamVjdE5hbWUgX3N0cmluZ18gKE9wdGlvbmFsKVxuICAgKiBnZXRPcHRzIF9vYmplY3RfIChPcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifVxuICAgKiBgY2IoZXJyb3IsIHRhZ3MpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgZ2V0T2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzID0ge30sIGNiID0gKCkgPT4gZmFsc2UpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICd0YWdnaW5nJ1xuXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QoZ2V0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2dldE9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKGdldE9wdHMgJiYgZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke2dldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICByZXF1ZXN0T3B0aW9uc1snb2JqZWN0TmFtZSddID0gb2JqZWN0TmFtZVxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0VGFnc1RyYW5zZm9ybWVyKClcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgbGV0IHRhZ3NMaXN0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAodGFnc0xpc3QgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRhZ3NMaXN0KSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9uIGEgYnVja2V0LlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIHBvbGljeUNvbmZpZyBfb2JqZWN0XyBhIHZhbGlkIHBvbGljeSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIGFwcGx5QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIHBvbGljeUNvbmZpZywgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2xpZmVjeWNsZSdcblxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdMaWZlY3ljbGVDb25maWd1cmF0aW9uJyxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QocG9saWN5Q29uZmlnKVxuICAgIHBheWxvYWQgPSBCdWZmZXIuZnJvbShlbmNvZGVyLmVuY29kZShwYXlsb2FkKSlcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBSZW1vdmUgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb2YgYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBTZXQvT3ZlcnJpZGUgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGVtcHR5LCBpdCByZW1vdmVzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIGxpZmVDeWNsZUNvbmZpZyBfb2JqZWN0XyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IChudWxsIG9yICcnKSB0byByZW1vdmUgdGhlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLiBvciBhIHZhbGlkIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgbGlmZUN5Y2xlQ29uZmlnID0gbnVsbCwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGxpZmVDeWNsZUNvbmZpZykpIHtcbiAgICAgIHRoaXMucmVtb3ZlQnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGNiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGxpZmVDeWNsZUNvbmZpZywgY2IpXG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBsaWZlY3ljbGUgY29uZmlndXJhdGlvbiBvbiBhIGJ1Y2tldC5cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBgY2IoY29uZmlnKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gYXMgdGhlIGVycm9yIGFyZ3VtZW50LlxuICAgKi9cbiAgZ2V0QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdsaWZlY3ljbGUnXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5saWZlY3ljbGVUcmFuc2Zvcm1lcigpXG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGxldCBsaWZlY3ljbGVDb25maWdcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IChsaWZlY3ljbGVDb25maWcgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIGxpZmVjeWNsZUNvbmZpZykpXG4gICAgfSlcbiAgfVxuXG4gIHNldE9iamVjdExvY2tDb25maWcoYnVja2V0TmFtZSwgbG9ja0NvbmZpZ09wdHMgPSB7fSwgY2IpIHtcbiAgICBjb25zdCByZXRlbnRpb25Nb2RlcyA9IFtSRVRFTlRJT05fTU9ERVMuQ09NUExJQU5DRSwgUkVURU5USU9OX01PREVTLkdPVkVSTkFOQ0VdXG4gICAgY29uc3QgdmFsaWRVbml0cyA9IFtSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuREFZUywgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLllFQVJTXVxuXG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMubW9kZSAmJiAhcmV0ZW50aW9uTW9kZXMuaW5jbHVkZXMobG9ja0NvbmZpZ09wdHMubW9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGxvY2tDb25maWdPcHRzLm1vZGUgc2hvdWxkIGJlIG9uZSBvZiAke3JldGVudGlvbk1vZGVzfWApXG4gICAgfVxuICAgIGlmIChsb2NrQ29uZmlnT3B0cy51bml0ICYmICF2YWxpZFVuaXRzLmluY2x1ZGVzKGxvY2tDb25maWdPcHRzLnVuaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy51bml0IHNob3VsZCBiZSBvbmUgb2YgJHt2YWxpZFVuaXRzfWApXG4gICAgfVxuICAgIGlmIChsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSAmJiAhaXNOdW1iZXIobG9ja0NvbmZpZ09wdHMudmFsaWRpdHkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSBzaG91bGQgYmUgYSBudW1iZXJgKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAnb2JqZWN0LWxvY2snXG5cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgT2JqZWN0TG9ja0VuYWJsZWQ6ICdFbmFibGVkJyxcbiAgICB9XG4gICAgY29uc3QgY29uZmlnS2V5cyA9IE9iamVjdC5rZXlzKGxvY2tDb25maWdPcHRzKVxuICAgIC8vIENoZWNrIGlmIGtleXMgYXJlIHByZXNlbnQgYW5kIGFsbCBrZXlzIGFyZSBwcmVzZW50LlxuICAgIGlmIChjb25maWdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChfLmRpZmZlcmVuY2UoY29uZmlnS2V5cywgWyd1bml0JywgJ21vZGUnLCAndmFsaWRpdHknXSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYGxvY2tDb25maWdPcHRzLm1vZGUsbG9ja0NvbmZpZ09wdHMudW5pdCxsb2NrQ29uZmlnT3B0cy52YWxpZGl0eSBhbGwgdGhlIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNwZWNpZmllZC5gLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWcuUnVsZSA9IHtcbiAgICAgICAgICBEZWZhdWx0UmV0ZW50aW9uOiB7fSxcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9ja0NvbmZpZ09wdHMubW9kZSkge1xuICAgICAgICAgIGNvbmZpZy5SdWxlLkRlZmF1bHRSZXRlbnRpb24uTW9kZSA9IGxvY2tDb25maWdPcHRzLm1vZGVcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9ja0NvbmZpZ09wdHMudW5pdCA9PT0gUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLkRBWVMpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLkRheXMgPSBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eVxuICAgICAgICB9IGVsc2UgaWYgKGxvY2tDb25maWdPcHRzLnVuaXQgPT09IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSUykge1xuICAgICAgICAgIGNvbmZpZy5SdWxlLkRlZmF1bHRSZXRlbnRpb24uWWVhcnMgPSBsb2NrQ29uZmlnT3B0cy52YWxpZGl0eVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ09iamVjdExvY2tDb25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgZ2V0T2JqZWN0TG9ja0NvbmZpZyhidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnb2JqZWN0LWxvY2snXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgb2JqZWN0TG9ja0NvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMub2JqZWN0TG9ja1RyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgb2JqZWN0TG9ja0NvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBvYmplY3RMb2NrQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwdXRPYmplY3RSZXRlbnRpb24oYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmV0ZW50aW9uT3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmV0ZW50aW9uT3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JldGVudGlvbk9wdHMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MgJiYgIWlzQm9vbGVhbihyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIGdvdmVybmFuY2VCeXBhc3MnLCByZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJldGVudGlvbk9wdHMubW9kZSAmJlxuICAgICAgICAhW1JFVEVOVElPTl9NT0RFUy5DT01QTElBTkNFLCBSRVRFTlRJT05fTU9ERVMuR09WRVJOQU5DRV0uaW5jbHVkZXMocmV0ZW50aW9uT3B0cy5tb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgb2JqZWN0IHJldGVudGlvbiBtb2RlICcsIHJldGVudGlvbk9wdHMubW9kZSlcbiAgICAgIH1cbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSAmJiAhaXNTdHJpbmcocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJldGFpblVudGlsRGF0ZScsIHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlKVxuICAgICAgfVxuICAgICAgaWYgKHJldGVudGlvbk9wdHMudmVyc2lvbklkICYmICFpc1N0cmluZyhyZXRlbnRpb25PcHRzLnZlcnNpb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgdmVyc2lvbklkJywgcmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAncmV0ZW50aW9uJ1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaWYgKHJldGVudGlvbk9wdHMuZ292ZXJuYW5jZUJ5cGFzcykge1xuICAgICAgaGVhZGVyc1snWC1BbXotQnlwYXNzLUdvdmVybmFuY2UtUmV0ZW50aW9uJ10gPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJvb3ROYW1lOiAnUmV0ZW50aW9uJywgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sIGhlYWRsZXNzOiB0cnVlIH0pXG4gICAgY29uc3QgcGFyYW1zID0ge31cblxuICAgIGlmIChyZXRlbnRpb25PcHRzLm1vZGUpIHtcbiAgICAgIHBhcmFtcy5Nb2RlID0gcmV0ZW50aW9uT3B0cy5tb2RlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSkge1xuICAgICAgcGFyYW1zLlJldGFpblVudGlsRGF0ZSA9IHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25PcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtyZXRlbnRpb25PcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgbGV0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHBhcmFtcylcblxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDAsIDIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRPYmplY3RSZXRlbnRpb24oYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGdldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2UgaWYgKGdldE9wdHMudmVyc2lvbklkICYmICFpc1N0cmluZyhnZXRPcHRzLnZlcnNpb25JZCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1ZlcnNpb25JRCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKGNiICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBsZXQgcXVlcnkgPSAncmV0ZW50aW9uJ1xuICAgIGlmIChnZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtnZXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IHJldGVudGlvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMub2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICByZXRlbnRpb25Db25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgcmV0ZW50aW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzZXRCdWNrZXRFbmNyeXB0aW9uKGJ1Y2tldE5hbWUsIGVuY3J5cHRpb25Db25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihlbmNyeXB0aW9uQ29uZmlnKSkge1xuICAgICAgY2IgPSBlbmNyeXB0aW9uQ29uZmlnXG4gICAgICBlbmNyeXB0aW9uQ29uZmlnID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KGVuY3J5cHRpb25Db25maWcpICYmIGVuY3J5cHRpb25Db25maWcuUnVsZS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIFJ1bGUgbGVuZ3RoLiBPbmx5IG9uZSBydWxlIGlzIGFsbG93ZWQuOiAnICsgZW5jcnlwdGlvbkNvbmZpZy5SdWxlKVxuICAgIH1cbiAgICBpZiAoY2IgJiYgIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGxldCBlbmNyeXB0aW9uT2JqID0gZW5jcnlwdGlvbkNvbmZpZ1xuICAgIGlmIChfLmlzRW1wdHkoZW5jcnlwdGlvbkNvbmZpZykpIHtcbiAgICAgIGVuY3J5cHRpb25PYmogPSB7XG4gICAgICAgIC8vIERlZmF1bHQgTWluSU8gU2VydmVyIFN1cHBvcnRlZCBSdWxlXG4gICAgICAgIFJ1bGU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ0FFUzI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24nLFxuICAgICAgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sXG4gICAgICBoZWFkbGVzczogdHJ1ZSxcbiAgICB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChlbmNyeXB0aW9uT2JqKVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldEJ1Y2tldEVuY3J5cHRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgYnVja2V0RW5jQ29uZmlnID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5idWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBidWNrZXRFbmNDb25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgYnVja2V0RW5jQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cbiAgcmVtb3ZlQnVja2V0RW5jcnlwdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAnZW5jcnlwdGlvbidcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjA0XSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldE9iamVjdExlZ2FsSG9sZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KGdldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXMoZ2V0T3B0cykubGVuZ3RoID4gMCAmJiBnZXRPcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcoZ2V0T3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uSWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nLjonLCBnZXRPcHRzLnZlcnNpb25JZClcbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ2xlZ2FsLWhvbGQnXG5cbiAgICBpZiAoZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBsZWdhbEhvbGRDb25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgbGVnYWxIb2xkQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIGxlZ2FsSG9sZENvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0T2JqZWN0TGVnYWxIb2xkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgc3RhdHVzOiBMRUdBTF9IT0xEX1NUQVRVUy5FTkFCTEVELFxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihzZXRPcHRzKSkge1xuICAgICAgY2IgPSBzZXRPcHRzXG4gICAgICBzZXRPcHRzID0gZGVmYXVsdE9wdHNcbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KHNldE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzZXRPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwiT2JqZWN0XCInKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIVtMRUdBTF9IT0xEX1NUQVRVUy5FTkFCTEVELCBMRUdBTF9IT0xEX1NUQVRVUy5ESVNBQkxFRF0uaW5jbHVkZXMoc2V0T3B0cy5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzOiAnICsgc2V0T3B0cy5zdGF0dXMpXG4gICAgICB9XG4gICAgICBpZiAoc2V0T3B0cy52ZXJzaW9uSWQgJiYgIXNldE9wdHMudmVyc2lvbklkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uSWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nLjonICsgc2V0T3B0cy52ZXJzaW9uSWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHNldE9wdHMpKSB7XG4gICAgICBzZXRPcHRzID0ge1xuICAgICAgICBkZWZhdWx0T3B0cyxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICdsZWdhbC1ob2xkJ1xuXG4gICAgaWYgKHNldE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSArPSBgJnZlcnNpb25JZD0ke3NldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG5cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgU3RhdHVzOiBzZXRPcHRzLnN0YXR1cyxcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHsgcm9vdE5hbWU6ICdMZWdhbEhvbGQnLCByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSwgaGVhZGxlc3M6IHRydWUgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdXBsb2FkIGEgcGFydCBkdXJpbmcgY29tcG9zZSBvYmplY3QuXG4gICAqIEBwYXJhbSBwYXJ0Q29uZmlnIF9fb2JqZWN0X18gY29udGFpbnMgdGhlIGZvbGxvd2luZy5cbiAgICogICAgYnVja2V0TmFtZSBfX3N0cmluZ19fXG4gICAqICAgIG9iamVjdE5hbWUgX19zdHJpbmdfX1xuICAgKiAgICB1cGxvYWRJRCBfX3N0cmluZ19fXG4gICAqICAgIHBhcnROdW1iZXIgX19udW1iZXJfX1xuICAgKiAgICBoZWFkZXJzIF9fb2JqZWN0X19cbiAgICogQHBhcmFtIGNiIGNhbGxlZCB3aXRoIG51bGwgaW5jYXNlIG9mIGVycm9yLlxuICAgKi9cbiAgdXBsb2FkUGFydENvcHkocGFydENvbmZpZywgY2IpIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHVwbG9hZElELCBwYXJ0TnVtYmVyLCBoZWFkZXJzIH0gPSBwYXJ0Q29uZmlnXG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9IGB1cGxvYWRJZD0ke3VwbG9hZElEfSZwYXJ0TnVtYmVyPSR7cGFydE51bWJlcn1gXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZTogb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGxldCBwYXJ0Q29weVJlc3VsdCA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy51cGxvYWRQYXJ0VHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBwYXJ0Q29weVJlc3VsdCA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBsZXQgdXBsb2FkUGFydENvcHlSZXMgPSB7XG4gICAgICAgICAgICBldGFnOiBzYW5pdGl6ZUVUYWcocGFydENvcHlSZXN1bHQuRVRhZyksXG4gICAgICAgICAgICBrZXk6IG9iamVjdE5hbWUsXG4gICAgICAgICAgICBwYXJ0OiBwYXJ0TnVtYmVyLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKG51bGwsIHVwbG9hZFBhcnRDb3B5UmVzKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBjb21wb3NlT2JqZWN0KGRlc3RPYmpDb25maWcgPSB7fSwgc291cmNlT2JqTGlzdCA9IFtdLCBjYikge1xuICAgIGNvbnN0IG1lID0gdGhpcyAvLyBtYW55IGFzeW5jIGZsb3dzLiBzbyBzdG9yZSB0aGUgcmVmLlxuICAgIGNvbnN0IHNvdXJjZUZpbGVzTGVuZ3RoID0gc291cmNlT2JqTGlzdC5sZW5ndGhcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzb3VyY2VPYmpMaXN0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignc291cmNlQ29uZmlnIHNob3VsZCBhbiBhcnJheSBvZiBDb3B5U291cmNlT3B0aW9ucyAnKVxuICAgIH1cbiAgICBpZiAoIShkZXN0T2JqQ29uZmlnIGluc3RhbmNlb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Rlc3RDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weURlc3RpbmF0aW9uT3B0aW9ucyAnKVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VGaWxlc0xlbmd0aCA8IDEgfHwgc291cmNlRmlsZXNMZW5ndGggPiBQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFwiVGhlcmUgbXVzdCBiZSBhcyBsZWFzdCBvbmUgYW5kIHVwIHRvICR7UEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlR9IHNvdXJjZSBvYmplY3RzLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc291cmNlT2JqTGlzdFtpXS52YWxpZGF0ZSgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVzdE9iakNvbmZpZy52YWxpZGF0ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTdGF0T3B0aW9ucyA9IChzcmNDb25maWcpID0+IHtcbiAgICAgIGxldCBzdGF0T3B0cyA9IHt9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzcmNDb25maWcuVmVyc2lvbklEKSkge1xuICAgICAgICBzdGF0T3B0cyA9IHtcbiAgICAgICAgICB2ZXJzaW9uSWQ6IHNyY0NvbmZpZy5WZXJzaW9uSUQsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0T3B0c1xuICAgIH1cbiAgICBjb25zdCBzcmNPYmplY3RTaXplcyA9IFtdXG4gICAgbGV0IHRvdGFsU2l6ZSA9IDBcbiAgICBsZXQgdG90YWxQYXJ0cyA9IDBcblxuICAgIGNvbnN0IHNvdXJjZU9ialN0YXRzID0gc291cmNlT2JqTGlzdC5tYXAoKHNyY0l0ZW0pID0+XG4gICAgICBtZS5zdGF0T2JqZWN0KHNyY0l0ZW0uQnVja2V0LCBzcmNJdGVtLk9iamVjdCwgZ2V0U3RhdE9wdGlvbnMoc3JjSXRlbSkpLFxuICAgIClcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChzb3VyY2VPYmpTdGF0cylcbiAgICAgIC50aGVuKChzcmNPYmplY3RJbmZvcykgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRTdGF0cyA9IHNyY09iamVjdEluZm9zLm1hcCgocmVzSXRlbVN0YXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjQ29uZmlnID0gc291cmNlT2JqTGlzdFtpbmRleF1cblxuICAgICAgICAgIGxldCBzcmNDb3B5U2l6ZSA9IHJlc0l0ZW1TdGF0LnNpemVcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNlZ21lbnQgaXMgc3BlY2lmaWVkLCBhbmQgaWYgc28sIGlzIHRoZVxuICAgICAgICAgIC8vIHNlZ21lbnQgd2l0aGluIG9iamVjdCBib3VuZHM/XG4gICAgICAgICAgaWYgKHNyY0NvbmZpZy5NYXRjaFJhbmdlKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSByYW5nZSBpcyBzcGVjaWZpZWQsXG4gICAgICAgICAgICAvLyAgICAwIDw9IHNyYy5zcmNTdGFydCA8PSBzcmMuc3JjRW5kXG4gICAgICAgICAgICAvLyBzbyBvbmx5IGludmFsaWQgY2FzZSB0byBjaGVjayBpczpcbiAgICAgICAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gc3JjQ29uZmlnLlN0YXJ0XG4gICAgICAgICAgICBjb25zdCBzcmNFbmQgPSBzcmNDb25maWcuRW5kXG4gICAgICAgICAgICBpZiAoc3JjRW5kID49IHNyY0NvcHlTaXplIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3B5U3JjT3B0aW9ucyAke2luZGV4fSBoYXMgaW52YWxpZCBzZWdtZW50LXRvLWNvcHkgWyR7c3JjU3RhcnR9LCAke3NyY0VuZH1dIChzaXplIGlzICR7c3JjQ29weVNpemV9KWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNyY0NvcHlTaXplID0gc3JjRW5kIC0gc3JjU3RhcnQgKyAxXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSB0aGUgbGFzdCBzb3VyY2UgbWF5IGJlIGxlc3MgdGhhbiBgYWJzTWluUGFydFNpemVgXG4gICAgICAgICAgaWYgKHNyY0NvcHlTaXplIDwgUEFSVF9DT05TVFJBSU5UUy5BQlNfTUlOX1BBUlRfU0laRSAmJiBpbmRleCA8IHNvdXJjZUZpbGVzTGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICAgICAgYENvcHlTcmNPcHRpb25zICR7aW5kZXh9IGlzIHRvbyBzbWFsbCAoJHtzcmNDb3B5U2l6ZX0pIGFuZCBpdCBpcyBub3QgdGhlIGxhc3QgcGFydC5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElzIGRhdGEgdG8gY29weSB0b28gbGFyZ2U/XG4gICAgICAgICAgdG90YWxTaXplICs9IHNyY0NvcHlTaXplXG4gICAgICAgICAgaWYgKHRvdGFsU2l6ZSA+IFBBUlRfQ09OU1RSQUlOVFMuTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYENhbm5vdCBjb21wb3NlIGFuIG9iamVjdCBvZiBzaXplICR7dG90YWxTaXplfSAoPiA1VGlCKWApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcmVjb3JkIHNvdXJjZSBzaXplXG4gICAgICAgICAgc3JjT2JqZWN0U2l6ZXNbaW5kZXhdID0gc3JjQ29weVNpemVcblxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSBwYXJ0cyBuZWVkZWQgZm9yIGN1cnJlbnQgc291cmNlXG4gICAgICAgICAgdG90YWxQYXJ0cyArPSBwYXJ0c1JlcXVpcmVkKHNyY0NvcHlTaXplKVxuICAgICAgICAgIC8vIERvIHdlIG5lZWQgbW9yZSBwYXJ0cyB0aGFuIHdlIGFyZSBhbGxvd2VkP1xuICAgICAgICAgIGlmICh0b3RhbFBhcnRzID4gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIHByb3Bvc2VkIGNvbXBvc2Ugb2JqZWN0IHJlcXVpcmVzIG1vcmUgdGhhbiAke1BBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UfSBwYXJ0c2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc0l0ZW1TdGF0XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCh0b3RhbFBhcnRzID09PSAxICYmIHRvdGFsU2l6ZSA8PSBQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUX1NJWkUpIHx8IHRvdGFsU2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlPYmplY3Qoc291cmNlT2JqTGlzdFswXSwgZGVzdE9iakNvbmZpZywgY2IpIC8vIHVzZSBjb3B5T2JqZWN0VjJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXNlcnZlIGV0YWcgdG8gYXZvaWQgbW9kaWZpY2F0aW9uIG9mIG9iamVjdCB3aGlsZSBjb3B5aW5nLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBzb3VyY2VPYmpMaXN0W2ldLk1hdGNoRVRhZyA9IHZhbGlkYXRlZFN0YXRzW2ldLmV0YWdcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0UGFydFNpemVMaXN0ID0gdmFsaWRhdGVkU3RhdHMubWFwKChyZXNJdGVtU3RhdCwgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FsU2l6ZSA9IGNhbGN1bGF0ZUV2ZW5TcGxpdHMoc3JjT2JqZWN0U2l6ZXNbaWR4XSwgc291cmNlT2JqTGlzdFtpZHhdKVxuICAgICAgICAgIHJldHVybiBjYWxTaXplXG4gICAgICAgIH0pXG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VXBsb2FkUGFydENvbmZpZ0xpc3QodXBsb2FkSWQpIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRQYXJ0Q29uZmlnTGlzdCA9IFtdXG5cbiAgICAgICAgICBzcGxpdFBhcnRTaXplTGlzdC5mb3JFYWNoKChzcGxpdFNpemUsIHNwbGl0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleDogc3RhcnRJZHgsIGVuZEluZGV4OiBlbmRJZHgsIG9iakluZm86IG9iakNvbmZpZyB9ID0gc3BsaXRTaXplXG5cbiAgICAgICAgICAgIGxldCBwYXJ0SW5kZXggPSBzcGxpdEluZGV4ICsgMSAvLyBwYXJ0IGluZGV4IHN0YXJ0cyBmcm9tIDEuXG4gICAgICAgICAgICBjb25zdCB0b3RhbFVwbG9hZHMgPSBBcnJheS5mcm9tKHN0YXJ0SWR4KVxuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gc291cmNlT2JqTGlzdFtzcGxpdEluZGV4XS5nZXRIZWFkZXJzKClcblxuICAgICAgICAgICAgdG90YWxVcGxvYWRzLmZvckVhY2goKHNwbGl0U3RhcnQsIHVwbGRDdHJJZHgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHNwbGl0RW5kID0gZW5kSWR4W3VwbGRDdHJJZHhdXG5cbiAgICAgICAgICAgICAgY29uc3Qgc291cmNlT2JqID0gYCR7b2JqQ29uZmlnLkJ1Y2tldH0vJHtvYmpDb25maWcuT2JqZWN0fWBcbiAgICAgICAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UnXSA9IGAke3NvdXJjZU9ian1gXG4gICAgICAgICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLXJhbmdlJ10gPSBgYnl0ZXM9JHtzcGxpdFN0YXJ0fS0ke3NwbGl0RW5kfWBcblxuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRQYXJ0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IGRlc3RPYmpDb25maWcuQnVja2V0LFxuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6IGRlc3RPYmpDb25maWcuT2JqZWN0LFxuICAgICAgICAgICAgICAgIHVwbG9hZElEOiB1cGxvYWRJZCxcbiAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyOiBwYXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBzb3VyY2VPYmo6IHNvdXJjZU9iaixcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVwbG9hZFBhcnRDb25maWdMaXN0LnB1c2godXBsb2FkUGFydENvbmZpZylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiB1cGxvYWRQYXJ0Q29uZmlnTGlzdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGVyZm9ybVVwbG9hZFBhcnRzID0gKHVwbG9hZElkKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkTGlzdCA9IGdldFVwbG9hZFBhcnRDb25maWdMaXN0KHVwbG9hZElkKVxuXG4gICAgICAgICAgYXN5bmMubWFwKHVwbG9hZExpc3QsIG1lLnVwbG9hZFBhcnRDb3B5LmJpbmQobWUpLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgdGhpcy5hYm9ydE11bHRpcGFydFVwbG9hZChkZXN0T2JqQ29uZmlnLkJ1Y2tldCwgZGVzdE9iakNvbmZpZy5PYmplY3QsIHVwbG9hZElkKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IGNiKCksXG4gICAgICAgICAgICAgICAgKGVycikgPT4gY2IoZXJyKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnRzRG9uZSA9IHJlcy5tYXAoKHBhcnRDb3B5KSA9PiAoeyBldGFnOiBwYXJ0Q29weS5ldGFnLCBwYXJ0OiBwYXJ0Q29weS5wYXJ0IH0pKVxuICAgICAgICAgICAgcmV0dXJuIG1lLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgdXBsb2FkSWQsIHBhcnRzRG9uZSwgY2IpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1VwbG9hZEhlYWRlcnMgPSBkZXN0T2JqQ29uZmlnLmdldEhlYWRlcnMoKVxuXG4gICAgICAgIG1lLmluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgbmV3VXBsb2FkSGVhZGVycykudGhlbihcbiAgICAgICAgICAodXBsb2FkSWQpID0+IHtcbiAgICAgICAgICAgIHBlcmZvcm1VcGxvYWRQYXJ0cyh1cGxvYWRJZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNiKGVyciwgbnVsbClcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjYihlcnJvciwgbnVsbClcbiAgICAgIH0pXG4gIH1cbiAgc2VsZWN0T2JqZWN0Q29udGVudChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzZWxlY3RPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBuYW1lOiAke2J1Y2tldE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cykpIHtcbiAgICAgIGlmICghaXNTdHJpbmcoc2VsZWN0T3B0cy5leHByZXNzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzcWxFeHByZXNzaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5wdXRTZXJpYWxpemF0aW9uIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnB1dFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQnKVxuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uKSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHNlbGVjdE9wdHMub3V0cHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvdXRwdXRTZXJpYWxpemF0aW9uIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvdXRwdXRTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkJylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsaWQgc2VsZWN0IGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BPU1QnXG4gICAgbGV0IHF1ZXJ5ID0gYHNlbGVjdGBcbiAgICBxdWVyeSArPSAnJnNlbGVjdC10eXBlPTInXG5cbiAgICBjb25zdCBjb25maWcgPSBbXG4gICAgICB7XG4gICAgICAgIEV4cHJlc3Npb246IHNlbGVjdE9wdHMuZXhwcmVzc2lvbixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEV4cHJlc3Npb25UeXBlOiBzZWxlY3RPcHRzLmV4cHJlc3Npb25UeXBlIHx8ICdTUUwnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgSW5wdXRTZXJpYWxpemF0aW9uOiBbc2VsZWN0T3B0cy5pbnB1dFNlcmlhbGl6YXRpb25dLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgT3V0cHV0U2VyaWFsaXphdGlvbjogW3NlbGVjdE9wdHMub3V0cHV0U2VyaWFsaXphdGlvbl0sXG4gICAgICB9LFxuICAgIF1cblxuICAgIC8vIE9wdGlvbmFsXG4gICAgaWYgKHNlbGVjdE9wdHMucmVxdWVzdFByb2dyZXNzKSB7XG4gICAgICBjb25maWcucHVzaCh7IFJlcXVlc3RQcm9ncmVzczogc2VsZWN0T3B0cy5yZXF1ZXN0UHJvZ3Jlc3MgfSlcbiAgICB9XG4gICAgLy8gT3B0aW9uYWxcbiAgICBpZiAoc2VsZWN0T3B0cy5zY2FuUmFuZ2UpIHtcbiAgICAgIGNvbmZpZy5wdXNoKHsgU2NhblJhbmdlOiBzZWxlY3RPcHRzLnNjYW5SYW5nZSB9KVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdTZWxlY3RPYmplY3RDb250ZW50UmVxdWVzdCcsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgc2VsZWN0UmVzdWx0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5zZWxlY3RPYmplY3RDb250ZW50VHJhbnNmb3JtZXIoKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBzZWxlY3RSZXN1bHQgPSBwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHNlbGVjdFJlc3VsdClcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8vIFByb21pc2lmeSB2YXJpb3VzIHB1YmxpYy1mYWNpbmcgQVBJcyBvbiB0aGUgQ2xpZW50IG1vZHVsZS5cbkNsaWVudC5wcm90b3R5cGUubWFrZUJ1Y2tldCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLm1ha2VCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cylcblxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmdldFBhcnRpYWxPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRQYXJ0aWFsT2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5mR2V0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZkdldE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucHV0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHV0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5mUHV0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZlB1dE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuY29weU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmNvcHlPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdHMgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3RzKVxuXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFVybCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFVybClcbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkR2V0T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkR2V0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQdXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFBvc3RQb2xpY3kgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRQb3N0UG9saWN5KVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXROb3RpZmljYXRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXROb3RpZmljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldE5vdGlmaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldE5vdGlmaWNhdGlvbilcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRQb2xpY3kgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRQb2xpY3kpXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFBvbGljeSlcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlSW5jb21wbGV0ZVVwbG9hZCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUluY29tcGxldGVVcGxvYWQpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFZlcnNpb25pbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRWZXJzaW9uaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRWZXJzaW9uaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VmVyc2lvbmluZylcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldE9iamVjdFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3RUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0TGlmZWN5Y2xlID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0TGlmZWN5Y2xlKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRMaWZlY3ljbGUgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRMaWZlY3ljbGUpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldExpZmVjeWNsZSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldExpZmVjeWNsZSlcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TG9ja0NvbmZpZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldE9iamVjdExvY2tDb25maWcpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdExvY2tDb25maWcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMb2NrQ29uZmlnKVxuQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3RSZXRlbnRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3RSZXRlbnRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdFJldGVudGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdFJldGVudGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0RW5jcnlwdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldEVuY3J5cHRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldEVuY3J5cHRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRFbmNyeXB0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRFbmNyeXB0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0RW5jcnlwdGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TGVnYWxIb2xkID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TGVnYWxIb2xkKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMZWdhbEhvbGQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RMZWdhbEhvbGQpXG5DbGllbnQucHJvdG90eXBlLmNvbXBvc2VPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5jb21wb3NlT2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5zZWxlY3RPYmplY3RDb250ZW50ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2VsZWN0T2JqZWN0Q29udGVudClcblxuLy8gcmVmYWN0b3JlZCBBUEkgdXNlIHByb21pc2UgaW50ZXJuYWxseVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVPYmplY3QgPSBjYWxsYmFja2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdCA9IGNhbGxiYWNraWZ5KENsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0ID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmxpc3RCdWNrZXRzID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5saXN0QnVja2V0cylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0UmVwbGljYXRpb24gPSBjYWxsYmFja2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRSZXBsaWNhdGlvbiA9IGNhbGxiYWNraWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UmVwbGljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFJlcGxpY2F0aW9uID0gY2FsbGJhY2tpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRSZXBsaWNhdGlvbilcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQWdCQSxJQUFBQSxFQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxJQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFILHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFQLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxJQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFULE9BQUE7QUFFQSxJQUFBVSxNQUFBLEdBQUFYLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxRQUFBLEdBQUFYLE9BQUE7QUF5Q0FZLE1BQUEsQ0FBQUMsSUFBQSxDQUFBRixRQUFBLEVBQUFHLE9BQUEsV0FBQUMsR0FBQTtFQUFBLElBQUFBLEdBQUEsa0JBQUFBLEdBQUE7RUFBQSxJQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFDLFlBQUEsRUFBQUosR0FBQTtFQUFBLElBQUFBLEdBQUEsSUFBQUssT0FBQSxJQUFBQSxPQUFBLENBQUFMLEdBQUEsTUFBQUosUUFBQSxDQUFBSSxHQUFBO0VBQUFLLE9BQUEsQ0FBQUwsR0FBQSxJQUFBSixRQUFBLENBQUFJLEdBQUE7QUFBQTtBQXhDQSxJQUFBTSxZQUFBLEdBQUFyQixPQUFBO0FBQ0EsSUFBQXNCLE9BQUEsR0FBQXRCLE9B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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInBhdGgiLCJTdHJlYW0iLCJfYXN5bmMiLCJfYmxvY2tTdHJlYW0iLCJfbG9kYXNoIiwicXVlcnlzdHJpbmciLCJfd2ViRW5jb2RpbmciLCJfeG1sIiwiX3htbDJqcyIsImVycm9ycyIsIl9leHRlbnNpb25zIiwiX2hlbHBlcnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIl9leHBvcnROYW1lcyIsImV4cG9ydHMiLCJfY2xpZW50IiwiX2NvcHlDb25kaXRpb25zIiwiQ29weUNvbmRpdGlvbnMiLCJfaGVscGVyIiwiX3Bvc3RQb2xpY3kiLCJQb3N0UG9saWN5IiwiX3R5cGUiLCJfbm90aWZpY2F0aW9uIiwiX29iamVjdFVwbG9hZGVyIiwiX3Byb21pc2lmeSIsIl9zaWduaW5nIiwidHJhbnNmb3JtZXJzIiwiX3htbFBhcnNlcnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZXNjIiwic2V0IiwiQ2xpZW50IiwiVHlwZWRDbGllbnQiLCJzZXRBcHBJbmZvIiwiYXBwTmFtZSIsImFwcFZlcnNpb24iLCJpc1N0cmluZyIsIlR5cGVFcnJvciIsInRyaW0iLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInVzZXJBZ2VudCIsImNhbGN1bGF0ZVBhcnRTaXplIiwic2l6ZSIsImlzTnVtYmVyIiwibWF4T2JqZWN0U2l6ZSIsIm92ZXJSaWRlUGFydFNpemUiLCJwYXJ0U2l6ZSIsImxvZ0hUVFAiLCJyZXFPcHRpb25zIiwicmVzcG9uc2UiLCJlcnIiLCJsb2dTdHJlYW0iLCJpc09iamVjdCIsImlzUmVhZGFibGVTdHJlYW0iLCJFcnJvciIsImxvZ0hlYWRlcnMiLCJoZWFkZXJzIiwiXyIsInYiLCJrIiwicmVkYWN0ZXIiLCJSZWdFeHAiLCJyZXBsYWNlIiwid3JpdGUiLCJtZXRob2QiLCJzdGF0dXNDb2RlIiwiZXJySlNPTiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZU9uIiwic3RyZWFtIiwicHJvY2VzcyIsInN0ZG91dCIsInRyYWNlT2ZmIiwibWFrZVJlcXVlc3QiLCJvcHRpb25zIiwicGF5bG9hZCIsInN0YXR1c0NvZGVzIiwicmVnaW9uIiwicmV0dXJuUmVzcG9uc2UiLCJjYiIsImlzQm9vbGVhbiIsImlzRnVuY3Rpb24iLCJsZW5ndGgiLCJzaGEyNTZzdW0iLCJlbmFibGVTSEEyNTYiLCJ0b1NoYTI1NiIsInJlYWRhYmxlU3RyZWFtIiwibWFrZVJlcXVlc3RTdHJlYW0iLCJfbWFrZVJlcXVlc3QiLCJlIiwiZ2V0UmVxdWVzdE9wdGlvbnMiLCJhbm9ueW1vdXMiLCJkYXRlIiwiRGF0ZSIsIm1ha2VEYXRlTG9uZyIsInNlc3Npb25Ub2tlbiIsImNoZWNrQW5kUmVmcmVzaENyZWRzIiwiYXV0aG9yaXphdGlvbiIsInNpZ25WNCIsImFjY2Vzc0tleSIsInNlY3JldEtleSIsInJlcSIsInRyYW5zcG9ydCIsInJlcXVlc3QiLCJpbmNsdWRlcyIsInJlZ2lvbk1hcCIsImJ1Y2tldE5hbWUiLCJlcnJvclRyYW5zZm9ybWVyIiwiZ2V0RXJyb3JUcmFuc2Zvcm1lciIsInBpcGVzZXR1cCIsIm9uIiwicGlwZSIsImdldEJ1Y2tldFJlZ2lvbiIsImlzVmFsaWRCdWNrZXROYW1lIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsImV4dHJhY3RSZWdpb24iLCJ0cmFuc2Zvcm1lciIsImdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyIiwiREVGQVVMVF9SRUdJT04iLCJkYXRhIiwicXVlcnkiLCJwYXRoU3R5bGUiLCJ3aW5kb3ciLCJuYW1lIiwiUmVnaW9uIiwibWFrZUJ1Y2tldCIsIm1ha2VPcHRzIiwiY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiIsInB1c2giLCJfYXR0ciIsInhtbG5zIiwiTG9jYXRpb25Db25zdHJhaW50IiwicGF5bG9hZE9iamVjdCIsIkNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24iLCJYbWwiLCJPYmplY3RMb2NraW5nIiwicHJvY2Vzc1dpdGhSZXRyeSIsImNvZGUiLCJsaXN0QnVja2V0cyIsImdldExpc3RCdWNrZXRUcmFuc2Zvcm1lciIsImJ1Y2tldHMiLCJyZXN1bHQiLCJsaXN0SW5jb21wbGV0ZVVwbG9hZHMiLCJidWNrZXQiLCJwcmVmaXgiLCJyZWN1cnNpdmUiLCJ1bmRlZmluZWQiLCJpc1ZhbGlkUHJlZml4IiwiSW52YWxpZFByZWZpeEVycm9yIiwiZGVsaW1pdGVyIiwia2V5TWFya2VyIiwidXBsb2FkSWRNYXJrZXIiLCJ1cGxvYWRzIiwiZW5kZWQiLCJyZWFkU3RyZWFtIiwiUmVhZGFibGUiLCJvYmplY3RNb2RlIiwiX3JlYWQiLCJzaGlmdCIsImxpc3RJbmNvbXBsZXRlVXBsb2Fkc1F1ZXJ5IiwiZW1pdCIsInByZWZpeGVzIiwiYXN5bmMiLCJlYWNoU2VyaWVzIiwidXBsb2FkIiwibGlzdFBhcnRzIiwidXBsb2FkSWQiLCJwYXJ0cyIsInJlZHVjZSIsImFjYyIsIml0ZW0iLCJpc1RydW5jYXRlZCIsIm5leHRLZXlNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJidWNrZXRFeGlzdHMiLCJyZW1vdmVCdWNrZXQiLCJyZW1vdmVJbmNvbXBsZXRlVXBsb2FkIiwib2JqZWN0TmFtZSIsIklzVmFsaWRCdWNrZXROYW1lRXJyb3IiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJyZW1vdmVVcGxvYWRJZCIsImR1cmluZyIsImZpbmRVcGxvYWRJZCIsImZHZXRPYmplY3QiLCJmaWxlUGF0aCIsImdldE9wdHMiLCJwYXJ0RmlsZSIsInBhcnRGaWxlU3RyZWFtIiwib2JqU3RhdCIsInJlbmFtZSIsIndhdGVyZmFsbCIsInN0YXRPYmplY3QiLCJta2RpciIsImRpcm5hbWUiLCJldGFnIiwic3RhdCIsInN0YXRzIiwib2Zmc2V0IiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmbGFncyIsImdldFBhcnRpYWxPYmplY3QiLCJkb3dubG9hZFN0cmVhbSIsImdldE9iamVjdCIsInJhbmdlIiwiZXhwZWN0ZWRTdGF0dXNDb2RlcyIsImZQdXRPYmplY3QiLCJtZXRhRGF0YSIsImNhbGxiYWNrIiwiaW5zZXJ0Q29udGVudFR5cGUiLCJwcmVwZW5kWEFNWk1ldGEiLCJjYlRyaWdnZXJlZCIsIm9yaWdDYiIsImRlc3Ryb3kiLCJhcHBseSIsImFyZ3VtZW50cyIsIm11bHRpcGFydCIsInVwbG9hZGVyIiwiZ2V0VXBsb2FkZXIiLCJoYXNoIiwiZ2V0SGFzaFN1bW1lciIsInN0YXJ0IiwiZW5kIiwiYXV0b0Nsb3NlIiwiY3JlYXRlUmVhZFN0cmVhbSIsIm1kNXN1bSIsIm9iakluZm8iLCJldGFncyIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwicGFydCIsInBhcnRzRG9uZSIsInBhcnROdW1iZXIiLCJ1cGxvYWRlZFNpemUiLCJ3aGlsc3QiLCJtZDVzdW1IZXgiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsInJlc3QiLCJwdXRPYmplY3QiLCJjaHVua2VyIiwiQmxvY2tTdHJlYW0yIiwiemVyb1BhZGRpbmciLCJPYmplY3RVcGxvYWRlciIsImNvcHlPYmplY3RWMSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1Iiwic3JjT2JqZWN0IiwiY29uZGl0aW9ucyIsInVyaVJlc291cmNlRXNjYXBlIiwibW9kaWZpZWQiLCJ1bm1vZGlmaWVkIiwibWF0Y2hFVGFnIiwibWF0Y2hFdGFnRXhjZXB0IiwibWF0Y2hFVGFnRXhjZXB0IiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwiY29weU9iamVjdFYyIiwic291cmNlQ29uZmlnIiwiZGVzdENvbmZpZyIsIkNvcHlTb3VyY2VPcHRpb25zIiwiQ29weURlc3RpbmF0aW9uT3B0aW9ucyIsInZhbGlkYXRlIiwiYXNzaWduIiwiZ2V0SGVhZGVycyIsIkJ1Y2tldCIsInJlc0hlYWRlcnMiLCJjb3B5T2JqUmVzcG9uc2UiLCJLZXkiLCJMYXN0TW9kaWZpZWQiLCJNZXRhRGF0YSIsImV4dHJhY3RNZXRhZGF0YSIsIlZlcnNpb25JZCIsImdldFZlcnNpb25JZCIsIlNvdXJjZVZlcnNpb25JZCIsImdldFNvdXJjZVZlcnNpb25JZCIsIkV0YWciLCJzYW5pdGl6ZUVUYWciLCJTaXplIiwiY29weU9iamVjdCIsImFsbEFyZ3MiLCJsaXN0T2JqZWN0c1F1ZXJ5IiwibWFya2VyIiwibGlzdFF1ZXJ5T3B0cyIsIkRlbGltaXRlciIsIk1heEtleXMiLCJJbmNsdWRlVmVyc2lvbiIsInF1ZXJpZXMiLCJ1cmlFc2NhcGUiLCJzb3J0Iiwiam9pbiIsImdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIiLCJsaXN0T2JqZWN0cyIsImxpc3RPcHRzIiwib2JqZWN0cyIsIm5leHRNYXJrZXIiLCJ2ZXJzaW9uSWRNYXJrZXIiLCJsaXN0T2JqZWN0c1YyUXVlcnkiLCJjb250aW51YXRpb25Ub2tlbiIsIm1heEtleXMiLCJzdGFydEFmdGVyIiwiZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyIiwibGlzdE9iamVjdHNWMiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInN0YXRPcHRzIiwibGFzdE1vZGlmaWVkIiwidmVyc2lvbklkIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlT3B0cyIsInF1ZXJ5UGFyYW1zIiwiZ292ZXJuYW5jZUJ5cGFzcyIsImZvcmNlRGVsZXRlIiwicmVxdWVzdE9wdGlvbnMiLCJyZW1vdmVPYmplY3RzIiwib2JqZWN0c0xpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJtYXhFbnRyaWVzIiwiZW50cnkiLCJsaXN0IiwibGlzdE9mTGlzdCIsImVuY29kZXIiLCJUZXh0RW5jb2RlciIsImJhdGNoUmVzdWx0cyIsImJhdGNoQ2IiLCJ2YWx1ZSIsImRlbGV0ZU9iamVjdHMiLCJEZWxldGUiLCJRdWlldCIsImJ1aWxkZXIiLCJ4bWwyanMiLCJCdWlsZGVyIiwiaGVhZGxlc3MiLCJidWlsZE9iamVjdCIsImVuY29kZSIsInRvTWQ1IiwicmVtb3ZlT2JqZWN0c1Jlc3VsdCIsInJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lciIsImZsYXR0ZW4iLCJnZXRCdWNrZXRQb2xpY3kiLCJwb2xpY3kiLCJnZXRDb25jYXRlciIsInNldEJ1Y2tldFBvbGljeSIsIkludmFsaWRCdWNrZXRQb2xpY3lFcnJvciIsInByZXNpZ25lZFVybCIsImV4cGlyZXMiLCJyZXFQYXJhbXMiLCJyZXF1ZXN0RGF0ZSIsIkFub255bW91c1JlcXVlc3RFcnJvciIsImlzVmFsaWREYXRlIiwidXJsIiwicHJlc2lnblNpZ25hdHVyZVY0IiwicGUiLCJwcmVzaWduZWRHZXRPYmplY3QiLCJyZXNwSGVhZGVycyIsInZhbGlkUmVzcEhlYWRlcnMiLCJoZWFkZXIiLCJwcmVzaWduZWRQdXRPYmplY3QiLCJuZXdQb3N0UG9saWN5IiwicHJlc2lnbmVkUG9zdFBvbGljeSIsInBvc3RQb2xpY3kiLCJmb3JtRGF0YSIsImRhdGVTdHIiLCJleHBpcmF0aW9uIiwic2V0U2Vjb25kcyIsInNldEV4cGlyZXMiLCJnZXRTY29wZSIsInBvbGljeUJhc2U2NCIsInNpZ25hdHVyZSIsInBvc3RQcmVzaWduU2lnbmF0dXJlVjQiLCJvcHRzIiwicG9ydFN0ciIsInBvcnQiLCJ1cmxTdHIiLCJwcm90b2NvbCIsImhvc3QiLCJwb3N0VVJMIiwiZ2V0SW5pdGlhdGVNdWx0aXBhcnRUcmFuc2Zvcm1lciIsImVsZW1lbnQiLCJQYXJ0IiwiUGFydE51bWJlciIsIkVUYWciLCJDb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImdldENvbXBsZXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJlcnJDb2RlIiwiUzNFcnJvciIsImVyck1lc3NhZ2UiLCJjb21wbGV0ZU11bHRpcGFydFJlc3VsdCIsImxpc3ROZXh0IiwibGlzdFBhcnRzUXVlcnkiLCJjb25jYXQiLCJnZXRMaXN0UGFydHNUcmFuc2Zvcm1lciIsIm1heFVwbG9hZHMiLCJ1bnNoaWZ0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwibGF0ZXN0VXBsb2FkIiwiaW5pdGlhdGVkIiwiZ2V0VGltZSIsInNpbXBsZVVwbG9hZGVyIiwiYXJncyIsIm11bHRpcGFydFVwbG9hZGVyIiwic2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiY29uZmlnIiwicm9vdE5hbWUiLCJyZW5kZXJPcHRzIiwicHJldHR5IiwicmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uIiwiTm90aWZpY2F0aW9uQ29uZmlnIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJidWNrZXROb3RpZmljYXRpb24iLCJsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24iLCJzdWZmaXgiLCJldmVudHMiLCJsaXN0ZW5lciIsIk5vdGlmaWNhdGlvblBvbGxlciIsImdldEJ1Y2tldFZlcnNpb25pbmciLCJ2ZXJzaW9uQ29uZmlnIiwiYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyIiwic2V0QnVja2V0VmVyc2lvbmluZyIsInNldFRhZ2dpbmciLCJ0YWdnaW5nUGFyYW1zIiwidGFncyIsInB1dE9wdHMiLCJ0YWdzTGlzdCIsImVudHJpZXMiLCJWYWx1ZSIsInRhZ2dpbmdDb25maWciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwic2V0QnVja2V0VGFnZ2luZyIsInNldE9iamVjdFRhZ2dpbmciLCJyZW1vdmVUYWdnaW5nIiwicmVtb3ZlQnVja2V0VGFnZ2luZyIsInJlbW92ZU9iamVjdFRhZ2dpbmciLCJnZXRCdWNrZXRUYWdnaW5nIiwiZ2V0VGFnc1RyYW5zZm9ybWVyIiwiZ2V0T2JqZWN0VGFnZ2luZyIsImFwcGx5QnVja2V0TGlmZWN5Y2xlIiwicG9saWN5Q29uZmlnIiwicmVtb3ZlQnVja2V0TGlmZWN5Y2xlIiwic2V0QnVja2V0TGlmZWN5Y2xlIiwibGlmZUN5Y2xlQ29uZmlnIiwiaXNFbXB0eSIsImdldEJ1Y2tldExpZmVjeWNsZSIsImxpZmVjeWNsZVRyYW5zZm9ybWVyIiwibGlmZWN5Y2xlQ29uZmlnIiwic2V0T2JqZWN0TG9ja0NvbmZpZyIsImxvY2tDb25maWdPcHRzIiwicmV0ZW50aW9uTW9kZXMiLCJSRVRFTlRJT05fTU9ERVMiLCJDT01QTElBTkNFIiwiR09WRVJOQU5DRSIsInZhbGlkVW5pdHMiLCJSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMiLCJEQVlTIiwiWUVBUlMiLCJtb2RlIiwidW5pdCIsInZhbGlkaXR5IiwiT2JqZWN0TG9ja0VuYWJsZWQiLCJjb25maWdLZXlzIiwiZGlmZmVyZW5jZSIsIlJ1bGUiLCJEZWZhdWx0UmV0ZW50aW9uIiwiTW9kZSIsIkRheXMiLCJZZWFycyIsImdldE9iamVjdExvY2tDb25maWciLCJvYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0TG9ja1RyYW5zZm9ybWVyIiwicHV0T2JqZWN0UmV0ZW50aW9uIiwicmV0ZW50aW9uT3B0cyIsInJldGFpblVudGlsRGF0ZSIsInBhcmFtcyIsIlJldGFpblVudGlsRGF0ZSIsImdldE9iamVjdFJldGVudGlvbiIsInJldGVudGlvbkNvbmZpZyIsIm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyIiwic2V0QnVja2V0RW5jcnlwdGlvbiIsImVuY3J5cHRpb25Db25maWciLCJlbmNyeXB0aW9uT2JqIiwiQXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdCIsIlNTRUFsZ29yaXRobSIsImdldEJ1Y2tldEVuY3J5cHRpb24iLCJidWNrZXRFbmNDb25maWciLCJidWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIiLCJyZW1vdmVCdWNrZXRFbmNyeXB0aW9uIiwic2V0QnVja2V0UmVwbGljYXRpb24iLCJyZXBsaWNhdGlvbkNvbmZpZyIsInJvbGUiLCJydWxlcyIsInJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnIiwiUmVwbGljYXRpb25Db25maWd1cmF0aW9uIiwiUm9sZSIsImdldEJ1Y2tldFJlcGxpY2F0aW9uIiwicmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lciIsInJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uIiwiZ2V0T2JqZWN0TGVnYWxIb2xkIiwibGVnYWxIb2xkQ29uZmlnIiwib2JqZWN0TGVnYWxIb2xkVHJhbnNmb3JtZXIiLCJzZXRPYmplY3RMZWdhbEhvbGQiLCJzZXRPcHRzIiwiZGVmYXVsdE9wdHMiLCJzdGF0dXMiLCJMRUdBTF9IT0xEX1NUQVRVUyIsIkVOQUJMRUQiLCJESVNBQkxFRCIsIlN0YXR1cyIsImFib3J0TXVsdGlwYXJ0VXBsb2FkIiwidXBsb2FkUGFydENvcHkiLCJwYXJ0Q29uZmlnIiwidXBsb2FkSUQiLCJwYXJ0Q29weVJlc3VsdCIsInVwbG9hZFBhcnRUcmFuc2Zvcm1lciIsInVwbG9hZFBhcnRDb3B5UmVzIiwiY29tcG9zZU9iamVjdCIsImRlc3RPYmpDb25maWciLCJzb3VyY2VPYmpMaXN0IiwibWUiLCJzb3VyY2VGaWxlc0xlbmd0aCIsIlBBUlRfQ09OU1RSQUlOVFMiLCJNQVhfUEFSVFNfQ09VTlQiLCJpIiwiZ2V0U3RhdE9wdGlvbnMiLCJzcmNDb25maWciLCJWZXJzaW9uSUQiLCJzcmNPYmplY3RTaXplcyIsInRvdGFsU2l6ZSIsInRvdGFsUGFydHMiLCJzb3VyY2VPYmpTdGF0cyIsIm1hcCIsInNyY0l0ZW0iLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsInNyY09iamVjdEluZm9zIiwidmFsaWRhdGVkU3RhdHMiLCJyZXNJdGVtU3RhdCIsImluZGV4Iiwic3JjQ29weVNpemUiLCJNYXRjaFJhbmdlIiwic3JjU3RhcnQiLCJTdGFydCIsInNyY0VuZCIsIkVuZCIsIkFCU19NSU5fUEFSVF9TSVpFIiwiTUFYX01VTFRJUEFSVF9QVVRfT0JKRUNUX1NJWkUiLCJwYXJ0c1JlcXVpcmVkIiwiTUFYX1BBUlRfU0laRSIsIk1hdGNoRVRhZyIsInNwbGl0UGFydFNpemVMaXN0IiwiaWR4IiwiY2FsU2l6ZSIsImNhbGN1bGF0ZUV2ZW5TcGxpdHMiLCJnZXRVcGxvYWRQYXJ0Q29uZmlnTGlzdCIsInVwbG9hZFBhcnRDb25maWdMaXN0Iiwic3BsaXRTaXplIiwic3BsaXRJbmRleCIsInN0YXJ0SW5kZXgiLCJzdGFydElkeCIsImVuZEluZGV4IiwiZW5kSWR4Iiwib2JqQ29uZmlnIiwicGFydEluZGV4IiwidG90YWxVcGxvYWRzIiwic3BsaXRTdGFydCIsInVwbGRDdHJJZHgiLCJzcGxpdEVuZCIsInNvdXJjZU9iaiIsInVwbG9hZFBhcnRDb25maWciLCJwZXJmb3JtVXBsb2FkUGFydHMiLCJ1cGxvYWRMaXN0IiwiYmluZCIsInJlcyIsInBhcnRDb3B5IiwibmV3VXBsb2FkSGVhZGVycyIsImNhdGNoIiwiZXJyb3IiLCJzZWxlY3RPYmplY3RDb250ZW50Iiwic2VsZWN0T3B0cyIsImV4cHJlc3Npb24iLCJpbnB1dFNlcmlhbGl6YXRpb24iLCJvdXRwdXRTZXJpYWxpemF0aW9uIiwiRXhwcmVzc2lvbiIsIkV4cHJlc3Npb25UeXBlIiwiZXhwcmVzc2lvblR5cGUiLCJJbnB1dFNlcmlhbGl6YXRpb24iLCJPdXRwdXRTZXJpYWxpemF0aW9uIiwicmVxdWVzdFByb2dyZXNzIiwiUmVxdWVzdFByb2dyZXNzIiwic2NhblJhbmdlIiwiU2NhblJhbmdlIiwic2VsZWN0UmVzdWx0Iiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UiLCJleHRlbnNpb25zIiwiY2xpZW50RXh0ZW5zaW9ucyIsInByb21pc2lmeSJdLCJzb3VyY2VzIjpbIm1pbmlvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0IGFzeW5jIGZyb20gJ2FzeW5jJ1xuaW1wb3J0IEJsb2NrU3RyZWFtMiBmcm9tICdibG9jay1zdHJlYW0yJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHsgVGV4dEVuY29kZXIgfSBmcm9tICd3ZWItZW5jb2RpbmcnXG5pbXBvcnQgWG1sIGZyb20gJ3htbCdcbmltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi9leHRlbnNpb25zLmpzJ1xuaW1wb3J0IHsgQ29weURlc3RpbmF0aW9uT3B0aW9ucywgQ29weVNvdXJjZU9wdGlvbnMsIERFRkFVTFRfUkVHSU9OIH0gZnJvbSAnLi9oZWxwZXJzLnRzJ1xuaW1wb3J0IHsgVHlwZWRDbGllbnQgfSBmcm9tICcuL2ludGVybmFsL2NsaWVudC50cydcbmltcG9ydCB7IENvcHlDb25kaXRpb25zIH0gZnJvbSAnLi9pbnRlcm5hbC9jb3B5LWNvbmRpdGlvbnMudHMnXG5pbXBvcnQge1xuICBjYWxjdWxhdGVFdmVuU3BsaXRzLFxuICBleHRyYWN0TWV0YWRhdGEsXG4gIGdldFNjb3BlLFxuICBnZXRTb3VyY2VWZXJzaW9uSWQsXG4gIGdldFZlcnNpb25JZCxcbiAgaW5zZXJ0Q29udGVudFR5cGUsXG4gIGlzQm9vbGVhbixcbiAgaXNGdW5jdGlvbixcbiAgaXNOdW1iZXIsXG4gIGlzT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1N0cmluZyxcbiAgaXNWYWxpZEJ1Y2tldE5hbWUsXG4gIGlzVmFsaWREYXRlLFxuICBpc1ZhbGlkT2JqZWN0TmFtZSxcbiAgaXNWYWxpZFByZWZpeCxcbiAgbWFrZURhdGVMb25nLFxuICBQQVJUX0NPTlNUUkFJTlRTLFxuICBwYXJ0c1JlcXVpcmVkLFxuICBwaXBlc2V0dXAsXG4gIHByZXBlbmRYQU1aTWV0YSxcbiAgcmVhZGFibGVTdHJlYW0sXG4gIHNhbml0aXplRVRhZyxcbiAgdG9NZDUsXG4gIHRvU2hhMjU2LFxuICB1cmlFc2NhcGUsXG4gIHVyaVJlc291cmNlRXNjYXBlLFxufSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcbmltcG9ydCB7IFBvc3RQb2xpY3kgfSBmcm9tICcuL2ludGVybmFsL3Bvc3QtcG9saWN5LnRzJ1xuaW1wb3J0IHsgTEVHQUxfSE9MRF9TVEFUVVMsIFJFVEVOVElPTl9NT0RFUywgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlLnRzJ1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uQ29uZmlnLCBOb3RpZmljYXRpb25Qb2xsZXIgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5qcydcbmltcG9ydCB7IE9iamVjdFVwbG9hZGVyIH0gZnJvbSAnLi9vYmplY3QtdXBsb2FkZXIuanMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICcuL3Byb21pc2lmeS5qcydcbmltcG9ydCB7IHBvc3RQcmVzaWduU2lnbmF0dXJlVjQsIHByZXNpZ25TaWduYXR1cmVWNCwgc2lnblY0IH0gZnJvbSAnLi9zaWduaW5nLnRzJ1xuaW1wb3J0ICogYXMgdHJhbnNmb3JtZXJzIGZyb20gJy4vdHJhbnNmb3JtZXJzLmpzJ1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UgfSBmcm9tICcuL3htbC1wYXJzZXJzLmpzJ1xuXG5leHBvcnQgKiBmcm9tICcuL2hlbHBlcnMudHMnXG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbi5qcydcbmV4cG9ydCB7IENvcHlDb25kaXRpb25zLCBQb3N0UG9saWN5IH1cblxuZXhwb3J0IGNsYXNzIENsaWVudCBleHRlbmRzIFR5cGVkQ2xpZW50IHtcbiAgLy8gU2V0IGFwcGxpY2F0aW9uIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICAvL1xuICAvLyBHZW5lcmF0ZXMgVXNlci1BZ2VudCBpbiB0aGUgZm9sbG93aW5nIHN0eWxlLlxuICAvL1xuICAvLyAgICAgICBNaW5JTyAoT1M7IEFSQ0gpIExJQi9WRVIgQVBQL1ZFUlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGFwcE5hbWVgIF9zdHJpbmdfIC0gQXBwbGljYXRpb24gbmFtZS5cbiAgLy8gKiBgYXBwVmVyc2lvbmAgX3N0cmluZ18gLSBBcHBsaWNhdGlvbiB2ZXJzaW9uLlxuICBzZXRBcHBJbmZvKGFwcE5hbWUsIGFwcFZlcnNpb24pIHtcbiAgICBpZiAoIWlzU3RyaW5nKGFwcE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGFwcE5hbWU6ICR7YXBwTmFtZX1gKVxuICAgIH1cbiAgICBpZiAoYXBwTmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnB1dCBhcHBOYW1lIGNhbm5vdCBiZSBlbXB0eS4nKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGFwcFZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGFwcFZlcnNpb246ICR7YXBwVmVyc2lvbn1gKVxuICAgIH1cbiAgICBpZiAoYXBwVmVyc2lvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnB1dCBhcHBWZXJzaW9uIGNhbm5vdCBiZSBlbXB0eS4nKVxuICAgIH1cbiAgICB0aGlzLnVzZXJBZ2VudCA9IGAke3RoaXMudXNlckFnZW50fSAke2FwcE5hbWV9LyR7YXBwVmVyc2lvbn1gXG4gIH1cblxuICAvLyBDYWxjdWxhdGUgcGFydCBzaXplIGdpdmVuIHRoZSBvYmplY3Qgc2l6ZS4gUGFydCBzaXplIHdpbGwgYmUgYXRsZWFzdCB0aGlzLnBhcnRTaXplXG4gIGNhbGN1bGF0ZVBhcnRTaXplKHNpemUpIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA+IHRoaXMubWF4T2JqZWN0U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgc2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAke3RoaXMubWF4T2JqZWN0U2l6ZX1gKVxuICAgIH1cbiAgICBpZiAodGhpcy5vdmVyUmlkZVBhcnRTaXplKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJ0U2l6ZVxuICAgIH1cbiAgICB2YXIgcGFydFNpemUgPSB0aGlzLnBhcnRTaXplXG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gd2hpbGUodHJ1ZSkgey4uLn0gdGhyb3dzIGxpbnRpbmcgZXJyb3IuXG4gICAgICAvLyBJZiBwYXJ0U2l6ZSBpcyBiaWcgZW5vdWdoIHRvIGFjY29tb2RhdGUgdGhlIG9iamVjdCBzaXplLCB0aGVuIHVzZSBpdC5cbiAgICAgIGlmIChwYXJ0U2l6ZSAqIDEwMDAwID4gc2l6ZSkge1xuICAgICAgICByZXR1cm4gcGFydFNpemVcbiAgICAgIH1cbiAgICAgIC8vIFRyeSBwYXJ0IHNpemVzIGFzIDY0TUIsIDgwTUIsIDk2TUIgZXRjLlxuICAgICAgcGFydFNpemUgKz0gMTYgKiAxMDI0ICogMTAyNFxuICAgIH1cbiAgfVxuXG4gIC8vIGxvZyB0aGUgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yXG4gIGxvZ0hUVFAocmVxT3B0aW9ucywgcmVzcG9uc2UsIGVycikge1xuICAgIC8vIGlmIG5vIGxvZ3N0cmVhbWVyIGF2YWlsYWJsZSByZXR1cm4uXG4gICAgaWYgKCF0aGlzLmxvZ1N0cmVhbSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVxT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcU9wdGlvbnMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmIChyZXNwb25zZSAmJiAhaXNSZWFkYWJsZVN0cmVhbShyZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jlc3BvbnNlIHNob3VsZCBiZSBvZiB0eXBlIFwiU3RyZWFtXCInKVxuICAgIH1cbiAgICBpZiAoZXJyICYmICEoZXJyIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlcnIgc2hvdWxkIGJlIG9mIHR5cGUgXCJFcnJvclwiJylcbiAgICB9XG4gICAgdmFyIGxvZ0hlYWRlcnMgPSAoaGVhZGVycykgPT4ge1xuICAgICAgXy5mb3JFYWNoKGhlYWRlcnMsICh2LCBrKSA9PiB7XG4gICAgICAgIGlmIChrID09ICdhdXRob3JpemF0aW9uJykge1xuICAgICAgICAgIHZhciByZWRhY3RlciA9IG5ldyBSZWdFeHAoJ1NpZ25hdHVyZT0oWzAtOWEtZl0rKScpXG4gICAgICAgICAgdiA9IHYucmVwbGFjZShyZWRhY3RlciwgJ1NpZ25hdHVyZT0qKlJFREFDVEVEKionKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nU3RyZWFtLndyaXRlKGAke2t9OiAke3Z9XFxuYClcbiAgICAgIH0pXG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZSgnXFxuJylcbiAgICB9XG4gICAgdGhpcy5sb2dTdHJlYW0ud3JpdGUoYFJFUVVFU1Q6ICR7cmVxT3B0aW9ucy5tZXRob2R9ICR7cmVxT3B0aW9ucy5wYXRofVxcbmApXG4gICAgbG9nSGVhZGVycyhyZXFPcHRpb25zLmhlYWRlcnMpXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZShgUkVTUE9OU0U6ICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1cXG5gKVxuICAgICAgbG9nSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKVxuICAgIH1cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ1N0cmVhbS53cml0ZSgnRVJST1IgQk9EWTpcXG4nKVxuICAgICAgdmFyIGVyckpTT04gPSBKU09OLnN0cmluZ2lmeShlcnIsIG51bGwsICdcXHQnKVxuICAgICAgdGhpcy5sb2dTdHJlYW0ud3JpdGUoYCR7ZXJySlNPTn1cXG5gKVxuICAgIH1cbiAgfVxuXG4gIC8vIEVuYWJsZSB0cmFjaW5nXG4gIHRyYWNlT24oc3RyZWFtKSB7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHN0cmVhbSA9IHByb2Nlc3Muc3Rkb3V0XG4gICAgfVxuICAgIHRoaXMubG9nU3RyZWFtID0gc3RyZWFtXG4gIH1cblxuICAvLyBEaXNhYmxlIHRyYWNpbmdcbiAgdHJhY2VPZmYoKSB7XG4gICAgdGhpcy5sb2dTdHJlYW0gPSBudWxsXG4gIH1cblxuICAvLyBtYWtlUmVxdWVzdCBpcyB0aGUgcHJpbWl0aXZlIHVzZWQgYnkgdGhlIGFwaXMgZm9yIG1ha2luZyBTMyByZXF1ZXN0cy5cbiAgLy8gcGF5bG9hZCBjYW4gYmUgZW1wdHkgc3RyaW5nIGluIGNhc2Ugb2Ygbm8gcGF5bG9hZC5cbiAgLy8gc3RhdHVzQ29kZSBpcyB0aGUgZXhwZWN0ZWQgc3RhdHVzQ29kZS4gSWYgcmVzcG9uc2Uuc3RhdHVzQ29kZSBkb2VzIG5vdCBtYXRjaFxuICAvLyB3ZSBwYXJzZSB0aGUgWE1MIGVycm9yIGFuZCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLlxuICAvLyBBIHZhbGlkIHJlZ2lvbiBpcyBwYXNzZWQgYnkgdGhlIGNhbGxzIC0gbGlzdEJ1Y2tldHMsIG1ha2VCdWNrZXQgYW5kXG4gIC8vIGdldEJ1Y2tldFJlZ2lvbi5cbiAgbWFrZVJlcXVlc3Qob3B0aW9ucywgcGF5bG9hZCwgc3RhdHVzQ29kZXMsIHJlZ2lvbiwgcmV0dXJuUmVzcG9uc2UsIGNiKSB7XG4gICAgaWYgKCFpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwYXlsb2FkKSAmJiAhaXNPYmplY3QocGF5bG9hZCkpIHtcbiAgICAgIC8vIEJ1ZmZlciBpcyBvZiB0eXBlICdvYmplY3QnXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXlsb2FkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCIgb3IgXCJCdWZmZXJcIicpXG4gICAgfVxuICAgIHN0YXR1c0NvZGVzLmZvckVhY2goKHN0YXR1c0NvZGUpID0+IHtcbiAgICAgIGlmICghaXNOdW1iZXIoc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RhdHVzQ29kZSBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICghaXNTdHJpbmcocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVnaW9uIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZXR1cm5SZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JldHVyblJlc3BvbnNlIHNob3VsZCBiZSBvZiB0eXBlIFwiYm9vbGVhblwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHt9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ1BPU1QnIHx8IG9wdGlvbnMubWV0aG9kID09PSAnUFVUJyB8fCBvcHRpb25zLm1ldGhvZCA9PT0gJ0RFTEVURScpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IHBheWxvYWQubGVuZ3RoXG4gICAgfVxuICAgIHZhciBzaGEyNTZzdW0gPSAnJ1xuICAgIGlmICh0aGlzLmVuYWJsZVNIQTI1Nikge1xuICAgICAgc2hhMjU2c3VtID0gdG9TaGEyNTYocGF5bG9hZClcbiAgICB9XG4gICAgdmFyIHN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheWxvYWQpXG4gICAgdGhpcy5tYWtlUmVxdWVzdFN0cmVhbShvcHRpb25zLCBzdHJlYW0sIHNoYTI1NnN1bSwgc3RhdHVzQ29kZXMsIHJlZ2lvbiwgcmV0dXJuUmVzcG9uc2UsIGNiKVxuICB9XG5cbiAgLy8gbWFrZVJlcXVlc3RTdHJlYW0gd2lsbCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFrZVJlcXVlc3QgaW4gY2FzZSB0aGUgcGF5bG9hZFxuICAvLyBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0uIGZvciBleC4gcHV0T2JqZWN0XG4gIG1ha2VSZXF1ZXN0U3RyZWFtKG9wdGlvbnMsIHN0cmVhbSwgc2hhMjU2c3VtLCBzdGF0dXNDb2RlcywgcmVnaW9uLCByZXR1cm5SZXNwb25zZSwgY2IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoIWlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignc3RyZWFtIHNob3VsZCBiZSBhIHJlYWRhYmxlIFN0cmVhbScpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc2hhMjU2c3VtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBzdGF0dXNDb2Rlcy5mb3JFYWNoKChzdGF0dXNDb2RlKSA9PiB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHN0YXR1c0NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXR1c0NvZGUgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoIWlzU3RyaW5nKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lvbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4ocmV0dXJuUmVzcG9uc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXR1cm5SZXNwb25zZSBzaG91bGQgYmUgb2YgdHlwZSBcImJvb2xlYW5cIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgLy8gc2hhMjU2c3VtIHdpbGwgYmUgZW1wdHkgZm9yIGFub255bW91cyBvciBodHRwcyByZXF1ZXN0c1xuICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYgJiYgc2hhMjU2c3VtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgc2hhMjU2c3VtIGV4cGVjdGVkIHRvIGJlIGVtcHR5IGZvciBhbm9ueW1vdXMgb3IgaHR0cHMgcmVxdWVzdHNgKVxuICAgIH1cbiAgICAvLyBzaGEyNTZzdW0gc2hvdWxkIGJlIHZhbGlkIGZvciBub24tYW5vbnltb3VzIGh0dHAgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU0hBMjU2ICYmIHNoYTI1NnN1bS5sZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHNoYTI1NnN1bSA6ICR7c2hhMjU2c3VtfWApXG4gICAgfVxuXG4gICAgdmFyIF9tYWtlUmVxdWVzdCA9IChlLCByZWdpb24pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgb3B0aW9ucy5yZWdpb24gPSByZWdpb25cbiAgICAgIHZhciByZXFPcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucyhvcHRpb25zKVxuICAgICAgaWYgKCF0aGlzLmFub255bW91cykge1xuICAgICAgICAvLyBGb3Igbm9uLWFub255bW91cyBodHRwcyByZXF1ZXN0cyBzaGEyNTZzdW0gaXMgJ1VOU0lHTkVELVBBWUxPQUQnIGZvciBzaWduYXR1cmUgY2FsY3VsYXRpb24uXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYpIHtcbiAgICAgICAgICBzaGEyNTZzdW0gPSAnVU5TSUdORUQtUEFZTE9BRCdcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKVxuXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sneC1hbXotZGF0ZSddID0gbWFrZURhdGVMb25nKGRhdGUpXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVyc1sneC1hbXotY29udGVudC1zaGEyNTYnXSA9IHNoYTI1NnN1bVxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgICByZXFPcHRpb25zLmhlYWRlcnNbJ3gtYW16LXNlY3VyaXR5LXRva2VuJ10gPSB0aGlzLnNlc3Npb25Ub2tlblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG4gICAgICAgIHZhciBhdXRob3JpemF0aW9uID0gc2lnblY0KHJlcU9wdGlvbnMsIHRoaXMuYWNjZXNzS2V5LCB0aGlzLnNlY3JldEtleSwgcmVnaW9uLCBkYXRlLCBzaGEyNTZzdW0pXG4gICAgICAgIHJlcU9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID0gYXV0aG9yaXphdGlvblxuICAgICAgfVxuICAgICAgdmFyIHJlcSA9IHRoaXMudHJhbnNwb3J0LnJlcXVlc3QocmVxT3B0aW9ucywgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghc3RhdHVzQ29kZXMuaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAvLyBGb3IgYW4gaW5jb3JyZWN0IHJlZ2lvbiwgUzMgc2VydmVyIGFsd2F5cyBzZW5kcyBiYWNrIDQwMC5cbiAgICAgICAgICAvLyBCdXQgd2Ugd2lsbCBkbyBjYWNoZSBpbnZhbGlkYXRpb24gZm9yIGFsbCBlcnJvcnMgc28gdGhhdCxcbiAgICAgICAgICAvLyBpbiBmdXR1cmUsIGlmIEFXUyBTMyBkZWNpZGVzIHRvIHNlbmQgYSBkaWZmZXJlbnQgc3RhdHVzIGNvZGUgb3JcbiAgICAgICAgICAvLyBYTUwgZXJyb3IgY29kZSB3ZSB3aWxsIHN0aWxsIHdvcmsgZmluZS5cbiAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpb25NYXBbb3B0aW9ucy5idWNrZXROYW1lXVxuICAgICAgICAgIHZhciBlcnJvclRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEVycm9yVHJhbnNmb3JtZXIocmVzcG9uc2UpXG4gICAgICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCBlcnJvclRyYW5zZm9ybWVyKS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dIVFRQKHJlcU9wdGlvbnMsIHJlc3BvbnNlLCBlKVxuICAgICAgICAgICAgY2IoZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nSFRUUChyZXFPcHRpb25zLCByZXNwb25zZSlcbiAgICAgICAgaWYgKHJldHVyblJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRyYWluIHRoZSBzb2NrZXQgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZC4gTm90ZSB0aGF0IHRoaXNcbiAgICAgICAgLy8gaXMgbm90IGV4cGVuc2l2ZSBhcyB0aGUgc29ja2V0IHdpbGwgbm90IGhhdmUgYW55IGRhdGEuXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG4gICAgICAgIGNiKG51bGwpXG4gICAgICB9KVxuICAgICAgbGV0IHBpcGUgPSBwaXBlc2V0dXAoc3RyZWFtLCByZXEpXG4gICAgICBwaXBlLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nSFRUUChyZXFPcHRpb25zLCBudWxsLCBlKVxuICAgICAgICBjYihlKVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHJlZ2lvbikge1xuICAgICAgcmV0dXJuIF9tYWtlUmVxdWVzdChudWxsLCByZWdpb24pXG4gICAgfVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKG9wdGlvbnMuYnVja2V0TmFtZSwgX21ha2VSZXF1ZXN0KVxuICB9XG5cbiAgLy8gZ2V0cyB0aGUgcmVnaW9uIG9mIHRoZSBidWNrZXRcbiAgZ2V0QnVja2V0UmVnaW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKGBJbnZhbGlkIGJ1Y2tldCBuYW1lIDogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgLy8gUmVnaW9uIGlzIHNldCB3aXRoIGNvbnN0cnVjdG9yLCByZXR1cm4gdGhlIHJlZ2lvbiByaWdodCBoZXJlLlxuICAgIGlmICh0aGlzLnJlZ2lvbikge1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHRoaXMucmVnaW9uKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSkge1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdKVxuICAgIH1cbiAgICB2YXIgZXh0cmFjdFJlZ2lvbiA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyKClcbiAgICAgIHZhciByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICByZWdpb24gPSBkYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lvbk1hcFtidWNrZXROYW1lXSA9IHJlZ2lvblxuICAgICAgICAgIGNiKG51bGwsIHJlZ2lvbilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgcXVlcnkgPSAnbG9jYXRpb24nXG5cbiAgICAvLyBgZ2V0QnVja2V0TG9jYXRpb25gIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gZm9sbG93aW5nIHdheXMgZm9yXG4gICAgLy8gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbiAgICAvL1xuICAgIC8vIC0gRm9yIG5vZGVqcyBlbnYgd2UgZGVmYXVsdCB0byBwYXRoIHN0eWxlIHJlcXVlc3RzLlxuICAgIC8vIC0gRm9yIGJyb3dzZXIgZW52IHBhdGggc3R5bGUgcmVxdWVzdHMgb24gYnVja2V0cyB5aWVsZHMgQ09SU1xuICAgIC8vICAgZXJyb3IuIFRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtIHdlIG1ha2UgYSB2aXJ0dWFsIGhvc3RcbiAgICAvLyAgIHN0eWxlIHJlcXVlc3Qgc2lnbmVkIHdpdGggJ3VzLWVhc3QtMScuIFRoaXMgcmVxdWVzdCBmYWlsc1xuICAgIC8vICAgd2l0aCBhbiBlcnJvciAnQXV0aG9yaXphdGlvbkhlYWRlck1hbGZvcm1lZCcsIGFkZGl0aW9uYWxseVxuICAgIC8vICAgdGhlIGVycm9yIFhNTCBhbHNvIHByb3ZpZGVzIFJlZ2lvbiBvZiB0aGUgYnVja2V0LiBUbyB2YWxpZGF0ZVxuICAgIC8vICAgdGhpcyByZWdpb24gaXMgcHJvcGVyIHdlIHJldHJ5IHRoZSBzYW1lIHJlcXVlc3Qgd2l0aCB0aGUgbmV3bHlcbiAgICAvLyAgIG9idGFpbmVkIHJlZ2lvbi5cbiAgICB2YXIgcGF0aFN0eWxlID0gdGhpcy5wYXRoU3R5bGUgJiYgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCdcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBwYXRoU3R5bGUgfSwgJycsIFsyMDBdLCBERUZBVUxUX1JFR0lPTiwgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBpZiAoZS5uYW1lID09PSAnQXV0aG9yaXphdGlvbkhlYWRlck1hbGZvcm1lZCcpIHtcbiAgICAgICAgICB2YXIgcmVnaW9uID0gZS5SZWdpb25cbiAgICAgICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgcmVnaW9uLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYihlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXh0cmFjdFJlZ2lvbihyZXNwb25zZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgZXh0cmFjdFJlZ2lvbihyZXNwb25zZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQ3JlYXRlcyB0aGUgYnVja2V0IGBidWNrZXROYW1lYC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXyAtIE5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGByZWdpb25gIF9zdHJpbmdfIC0gcmVnaW9uIHZhbGlkIHZhbHVlcyBhcmUgX3VzLXdlc3QtMV8sIF91cy13ZXN0LTJfLCAgX2V1LXdlc3QtMV8sIF9ldS1jZW50cmFsLTFfLCBfYXAtc291dGhlYXN0LTFfLCBfYXAtbm9ydGhlYXN0LTFfLCBfYXAtc291dGhlYXN0LTJfLCBfc2EtZWFzdC0xXy5cbiAgLy8gKiBgbWFrZU9wdHNgIF9vYmplY3RfIC0gT3B0aW9ucyB0byBjcmVhdGUgYSBidWNrZXQuIGUuZyB7T2JqZWN0TG9ja2luZzp0cnVlfSAoT3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgYnVja2V0IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLlxuICBtYWtlQnVja2V0KGJ1Y2tldE5hbWUsIHJlZ2lvbiwgbWFrZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICAvLyBCYWNrd2FyZCBDb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzT2JqZWN0KHJlZ2lvbikpIHtcbiAgICAgIGNiID0gbWFrZU9wdHNcbiAgICAgIG1ha2VPcHRzID0gcmVnaW9uXG4gICAgICByZWdpb24gPSAnJ1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihyZWdpb24pKSB7XG4gICAgICBjYiA9IHJlZ2lvblxuICAgICAgcmVnaW9uID0gJydcbiAgICAgIG1ha2VPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24obWFrZU9wdHMpKSB7XG4gICAgICBjYiA9IG1ha2VPcHRzXG4gICAgICBtYWtlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWFrZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWtlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcGF5bG9hZCA9ICcnXG5cbiAgICAvLyBSZWdpb24gYWxyZWFkeSBzZXQgaW4gY29uc3RydWN0b3IsIHZhbGlkYXRlIGlmXG4gICAgLy8gY2FsbGVyIHJlcXVlc3RlZCBidWNrZXQgbG9jYXRpb24gaXMgc2FtZS5cbiAgICBpZiAocmVnaW9uICYmIHRoaXMucmVnaW9uKSB7XG4gICAgICBpZiAocmVnaW9uICE9PSB0aGlzLnJlZ2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDb25maWd1cmVkIHJlZ2lvbiAke3RoaXMucmVnaW9ufSwgcmVxdWVzdGVkICR7cmVnaW9ufWApXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlbmRpbmcgbWFrZUJ1Y2tldCByZXF1ZXN0IHdpdGggWE1MIGNvbnRhaW5pbmcgJ3VzLWVhc3QtMScgZmFpbHMuIEZvclxuICAgIC8vIGRlZmF1bHQgcmVnaW9uIHNlcnZlciBleHBlY3RzIHRoZSByZXF1ZXN0IHdpdGhvdXQgYm9keVxuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSBERUZBVUxUX1JFR0lPTikge1xuICAgICAgdmFyIGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24gPSBbXVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgX2F0dHI6IHtcbiAgICAgICAgICB4bWxuczogJ2h0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi5wdXNoKHtcbiAgICAgICAgTG9jYXRpb25Db25zdHJhaW50OiByZWdpb24sXG4gICAgICB9KVxuICAgICAgdmFyIHBheWxvYWRPYmplY3QgPSB7XG4gICAgICAgIENyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb246IGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24sXG4gICAgICB9XG4gICAgICBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBoZWFkZXJzID0ge31cblxuICAgIGlmIChtYWtlT3B0cy5PYmplY3RMb2NraW5nKSB7XG4gICAgICBoZWFkZXJzWyd4LWFtei1idWNrZXQtb2JqZWN0LWxvY2stZW5hYmxlZCddID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghcmVnaW9uKSB7XG4gICAgICByZWdpb24gPSBERUZBVUxUX1JFR0lPTlxuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NXaXRoUmV0cnkgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyICYmIChyZWdpb24gPT09ICcnIHx8IHJlZ2lvbiA9PT0gREVGQVVMVF9SRUdJT04pKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0F1dGhvcml6YXRpb25IZWFkZXJNYWxmb3JtZWQnICYmIGVyci5yZWdpb24gIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmV0cnkgd2l0aCByZWdpb24gcmV0dXJuZWQgYXMgcGFydCBvZiBlcnJvclxuICAgICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sIGVyci5yZWdpb24sIGZhbHNlLCBjYilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2IgJiYgY2IoZXJyKVxuICAgIH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCByZWdpb24sIGZhbHNlLCBwcm9jZXNzV2l0aFJldHJ5KVxuICB9XG5cbiAgLy8gTGlzdCBvZiBidWNrZXRzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBidWNrZXRzKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXJyb3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBgYnVja2V0c2AgaXMgYW4gYXJyYXkgb2YgYnVja2V0IGluZm9ybWF0aW9uXG4gIC8vXG4gIC8vIGBidWNrZXRzYCBhcnJheSBlbGVtZW50OlxuICAvLyAqIGBidWNrZXQubmFtZWAgX3N0cmluZ18gOiBidWNrZXQgbmFtZVxuICAvLyAqIGBidWNrZXQuY3JlYXRpb25EYXRlYCBfRGF0ZV86IGRhdGUgd2hlbiBidWNrZXQgd2FzIGNyZWF0ZWRcbiAgbGlzdEJ1Y2tldHMoY2IpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kIH0sICcnLCBbMjAwXSwgREVGQVVMVF9SRUdJT04sIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyKClcbiAgICAgIHZhciBidWNrZXRzXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAoYnVja2V0cyA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgYnVja2V0cykpXG4gICAgfSlcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyBvYmplY3RzIHRoYXQgYXJlIHBhcnRpYWxseSB1cGxvYWRlZC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHByZWZpeCBvZiB0aGUgb2JqZWN0IG5hbWVzIHRoYXQgYXJlIHBhcnRpYWxseSB1cGxvYWRlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIHdoZW4gZmFsc2UsIHJlY3Vyc2l2ZSBsaXN0aW5nIHdoZW4gdHJ1ZSAob3B0aW9uYWwsIGRlZmF1bHQgYGZhbHNlYClcbiAgLy9cbiAgLy8gX19SZXR1cm4gVmFsdWVfX1xuICAvLyAqIGBzdHJlYW1gIF9TdHJlYW1fIDogZW1pdHMgb2JqZWN0cyBvZiB0aGUgZm9ybWF0OlxuICAvLyAgICogYG9iamVjdC5rZXlgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmplY3QudXBsb2FkSWRgIF9zdHJpbmdfOiB1cGxvYWQgSUQgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYG9iamVjdC5zaXplYCBfSW50ZWdlcl86IHNpemUgb2YgdGhlIHBhcnRpYWxseSB1cGxvYWRlZCBvYmplY3RcbiAgbGlzdEluY29tcGxldGVVcGxvYWRzKGJ1Y2tldCwgcHJlZml4LCByZWN1cnNpdmUpIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZWZpeCA9ICcnXG4gICAgfVxuICAgIGlmIChyZWN1cnNpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVjdXJzaXZlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXQpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFByZWZpeChwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgSW52YWxpZCBwcmVmaXggOiAke3ByZWZpeH1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIga2V5TWFya2VyID0gJydcbiAgICB2YXIgdXBsb2FkSWRNYXJrZXIgPSAnJ1xuICAgIHZhciB1cGxvYWRzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSB1cGxvYWQgaW5mbyBwZXIgX3JlYWQoKVxuICAgICAgaWYgKHVwbG9hZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2godXBsb2Fkcy5zaGlmdCgpKVxuICAgICAgfVxuICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEluY29tcGxldGVVcGxvYWRzUXVlcnkoYnVja2V0LCBwcmVmaXgsIGtleU1hcmtlciwgdXBsb2FkSWRNYXJrZXIsIGRlbGltaXRlcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZSkpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXN1bHQucHJlZml4ZXMuZm9yRWFjaCgocHJlZml4KSA9PiB1cGxvYWRzLnB1c2gocHJlZml4KSlcbiAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKFxuICAgICAgICAgICAgcmVzdWx0LnVwbG9hZHMsXG4gICAgICAgICAgICAodXBsb2FkLCBjYikgPT4ge1xuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBpbmNvbXBsZXRlIHVwbG9hZCBhZGQgdGhlIHNpemVzIG9mIGl0cyB1cGxvYWRlZCBwYXJ0c1xuICAgICAgICAgICAgICB0aGlzLmxpc3RQYXJ0cyhidWNrZXQsIHVwbG9hZC5rZXksIHVwbG9hZC51cGxvYWRJZCwgKGVyciwgcGFydHMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGxvYWQuc2l6ZSA9IHBhcnRzLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgKyBpdGVtLnNpemUsIDApXG4gICAgICAgICAgICAgICAgdXBsb2Fkcy5wdXNoKHVwbG9hZClcbiAgICAgICAgICAgICAgICBjYigpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICAgICAga2V5TWFya2VyID0gcmVzdWx0Lm5leHRLZXlNYXJrZXJcbiAgICAgICAgICAgICAgICB1cGxvYWRJZE1hcmtlciA9IHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gVG8gY2hlY2sgaWYgYSBidWNrZXQgYWxyZWFkeSBleGlzdHMuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ18gOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgY2FsbGJhY2soZXJyKWAgX2Z1bmN0aW9uXyA6IGBlcnJgIGlzIGBudWxsYCBpZiB0aGUgYnVja2V0IGV4aXN0c1xuICBidWNrZXRFeGlzdHMoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0hFQUQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwMF0sICcnLCBmYWxzZSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT0gJ05vU3VjaEJ1Y2tldCcgfHwgZXJyLmNvZGUgPT0gJ05vdEZvdW5kJykge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdHJ1ZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIGEgYnVja2V0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfIDogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl8gOiBgZXJyYCBpcyBgbnVsbGAgaWYgdGhlIGJ1Y2tldCBpcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS5cbiAgcmVtb3ZlQnVja2V0KGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdERUxFVEUnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgKGUpID0+IHtcbiAgICAgIC8vIElmIHRoZSBidWNrZXQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCByZW1vdmUgdGhlIHJlZ2lvbiBtYXAgZW50cnkuXG4gICAgICBpZiAoIWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaW9uTWFwW2J1Y2tldE5hbWVdXG4gICAgICB9XG4gICAgICBjYihlKVxuICAgIH0pXG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHBhcnRpYWxseSB1cGxvYWRlZCBvYmplY3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG5vbiBgbnVsbGAgdmFsdWUgaW4gY2FzZSBvZiBlcnJvclxuICByZW1vdmVJbmNvbXBsZXRlVXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Jc1ZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIHJlbW92ZVVwbG9hZElkXG4gICAgYXN5bmMuZHVyaW5nKFxuICAgICAgKGNiKSA9PiB7XG4gICAgICAgIHRoaXMuZmluZFVwbG9hZElkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIChlLCB1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVtb3ZlVXBsb2FkSWQgPSB1cGxvYWRJZFxuICAgICAgICAgIGNiKG51bGwsIHVwbG9hZElkKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIChjYikgPT4ge1xuICAgICAgICB2YXIgbWV0aG9kID0gJ0RFTEVURSdcbiAgICAgICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7cmVtb3ZlVXBsb2FkSWR9YFxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgKGUpID0+IGNiKGUpKVxuICAgICAgfSxcbiAgICAgIGNiLFxuICAgIClcbiAgfVxuXG4gIC8vIENhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGBlcnJvcmAgaW4gY2FzZSBvZiBlcnJvciBvciBgbnVsbGAgaW4gY2FzZSBvZiBzdWNjZXNzXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGZpbGVQYXRoYCBfc3RyaW5nXzogcGF0aCB0byB3aGljaCB0aGUgb2JqZWN0IGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvXG4gIC8vICogYGdldE9wdHNgIF9vYmplY3RfOiBWZXJzaW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIGZvcm0gYHt2ZXJzaW9uSWQ6J215LXV1aWQnfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyYCBpbiBjYXNlIG9mIGVycm9yLlxuICBmR2V0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGZpbGVQYXRoLCBnZXRPcHRzID0ge30sIGNiKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbi5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVBhdGggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIC8vIEludGVybmFsIGRhdGEuXG4gICAgdmFyIHBhcnRGaWxlXG4gICAgdmFyIHBhcnRGaWxlU3RyZWFtXG4gICAgdmFyIG9ialN0YXRcblxuICAgIC8vIFJlbmFtZSB3cmFwcGVyLlxuICAgIHZhciByZW5hbWUgPSAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICB9XG4gICAgICBmcy5yZW5hbWUocGFydEZpbGUsIGZpbGVQYXRoLCBjYilcbiAgICB9XG5cbiAgICBhc3luYy53YXRlcmZhbGwoXG4gICAgICBbXG4gICAgICAgIChjYikgPT4gdGhpcy5zdGF0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMsIGNiKSxcbiAgICAgICAgKHJlc3VsdCwgY2IpID0+IHtcbiAgICAgICAgICBvYmpTdGF0ID0gcmVzdWx0XG4gICAgICAgICAgLy8gQ3JlYXRlIGFueSBtaXNzaW5nIHRvcCBsZXZlbCBkaXJlY3Rvcmllcy5cbiAgICAgICAgICBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9LCAoZXJyKSA9PiBjYihlcnIpKVxuICAgICAgICB9LFxuICAgICAgICAoY2IpID0+IHtcbiAgICAgICAgICBwYXJ0RmlsZSA9IGAke2ZpbGVQYXRofS4ke29ialN0YXQuZXRhZ30ucGFydC5taW5pb2BcbiAgICAgICAgICBmcy5zdGF0KHBhcnRGaWxlLCAoZSwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwXG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICBwYXJ0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBhcnRGaWxlLCB7IGZsYWdzOiAndycgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChvYmpTdGF0LnNpemUgPT09IHN0YXRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuYW1lKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvZmZzZXQgPSBzdGF0cy5zaXplXG4gICAgICAgICAgICAgIHBhcnRGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ocGFydEZpbGUsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG9mZnNldCwgMCwgZ2V0T3B0cywgY2IpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgKGRvd25sb2FkU3RyZWFtLCBjYikgPT4ge1xuICAgICAgICAgIHBpcGVzZXR1cChkb3dubG9hZFN0cmVhbSwgcGFydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAgICAgLm9uKCdmaW5pc2gnLCBjYilcbiAgICAgICAgfSxcbiAgICAgICAgKGNiKSA9PiBmcy5zdGF0KHBhcnRGaWxlLCBjYiksXG4gICAgICAgIChzdGF0cywgY2IpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA9PT0gb2JqU3RhdC5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1NpemUgbWlzbWF0Y2ggYmV0d2VlbiBkb3dubG9hZGVkIGZpbGUgYW5kIHRoZSBvYmplY3QnKSlcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZW5hbWUsXG4gICAgKVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggcmVhZGFibGUgc3RyZWFtIG9mIHRoZSBvYmplY3QgY29udGVudC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgZ2V0T3B0c2AgX29iamVjdF86IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpXG4gIC8vICogYGNhbGxiYWNrKGVyciwgc3RyZWFtKWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYGVycmAgaW4gY2FzZSBvZiBlcnJvci4gYHN0cmVhbWAgaXMgdGhlIG9iamVjdCBjb250ZW50IHN0cmVhbVxuICBnZXRPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB0aGlzLmdldFBhcnRpYWxPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgMCwgMCwgZ2V0T3B0cywgY2IpXG4gIH1cblxuICAvLyBDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCByZWFkYWJsZSBzdHJlYW0gb2YgdGhlIHBhcnRpYWwgb2JqZWN0IGNvbnRlbnQuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9mZnNldGAgX251bWJlcl86IG9mZnNldCBvZiB0aGUgb2JqZWN0IGZyb20gd2hlcmUgdGhlIHN0cmVhbSB3aWxsIHN0YXJ0XG4gIC8vICogYGxlbmd0aGAgX251bWJlcl86IGxlbmd0aCBvZiB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSByZWFkIGluIHRoZSBzdHJlYW0gKG9wdGlvbmFsLCBpZiBub3Qgc3BlY2lmaWVkIHdlIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgZnJvbSB0aGUgb2Zmc2V0KVxuICAvLyAqIGBnZXRPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJ31gLiBEZWZhdWx0IGlzIGB7fWAuIChvcHRpb25hbClcbiAgLy8gKiBgY2FsbGJhY2soZXJyLCBzdHJlYW0pYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBgZXJyYCBpbiBjYXNlIG9mIGVycm9yLiBgc3RyZWFtYCBpcyB0aGUgb2JqZWN0IGNvbnRlbnQgc3RyZWFtXG4gIGdldFBhcnRpYWxPYmplY3QoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgb2Zmc2V0LCBsZW5ndGgsIGdldE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihsZW5ndGgpKSB7XG4gICAgICBjYiA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gMFxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKG9mZnNldCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29mZnNldCBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsZW5ndGggc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIENvbXBhdGliaWxpdHlcbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHZhciByYW5nZSA9ICcnXG4gICAgaWYgKG9mZnNldCB8fCBsZW5ndGgpIHtcbiAgICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgcmFuZ2UgPSBgYnl0ZXM9JHsrb2Zmc2V0fS1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9ICdieXRlcz0wLSdcbiAgICAgICAgb2Zmc2V0ID0gMFxuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICByYW5nZSArPSBgJHsrbGVuZ3RoICsgb2Zmc2V0IC0gMX1gXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSB7fVxuICAgIGlmIChyYW5nZSAhPT0gJycpIHtcbiAgICAgIGhlYWRlcnMucmFuZ2UgPSByYW5nZVxuICAgIH1cblxuICAgIHZhciBleHBlY3RlZFN0YXR1c0NvZGVzID0gWzIwMF1cbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIGV4cGVjdGVkU3RhdHVzQ29kZXMucHVzaCgyMDYpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuXG4gICAgdmFyIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGdldE9wdHMpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycywgcXVlcnkgfSwgJycsIGV4cGVjdGVkU3RhdHVzQ29kZXMsICcnLCB0cnVlLCBjYilcbiAgfVxuXG4gIC8vIFVwbG9hZHMgdGhlIG9iamVjdCB1c2luZyBjb250ZW50cyBmcm9tIGEgZmlsZVxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBmaWxlUGF0aGAgX3N0cmluZ186IGZpbGUgcGF0aCBvZiB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAvLyAqIGBtZXRhRGF0YWAgX0phdmFzY3JpcHQgT2JqZWN0XzogbWV0YURhdGEgYXNzb3NjaWF0ZWQgd2l0aCB0aGUgb2JqZWN0XG4gIC8vICogYGNhbGxiYWNrKGVyciwgb2JqSW5mbylgIF9mdW5jdGlvbl86IG5vbiBudWxsIGBlcnJgIGluZGljYXRlcyBlcnJvciwgYG9iakluZm9gIF9vYmplY3RfIHdoaWNoIGNvbnRhaW5zIHZlcnNpb25JZCBhbmQgZXRhZy5cbiAgZlB1dE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBmaWxlUGF0aCwgbWV0YURhdGEsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVBhdGggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKG1ldGFEYXRhKSkge1xuICAgICAgY2FsbGJhY2sgPSBtZXRhRGF0YVxuICAgICAgbWV0YURhdGEgPSB7fSAvLyBTZXQgbWV0YURhdGEgZW1wdHkgaWYgbm8gbWV0YURhdGEgcHJvdmlkZWQuXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWV0YURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZXRhRGF0YSBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG5cbiAgICAvLyBJbnNlcnRzIGNvcnJlY3QgYGNvbnRlbnQtdHlwZWAgYXR0cmlidXRlIGJhc2VkIG9uIG1ldGFEYXRhIGFuZCBmaWxlUGF0aFxuICAgIG1ldGFEYXRhID0gaW5zZXJ0Q29udGVudFR5cGUobWV0YURhdGEsIGZpbGVQYXRoKVxuXG4gICAgLy8gVXBkYXRlcyBtZXRhRGF0YSB0byBoYXZlIHRoZSBjb3JyZWN0IHByZWZpeCBpZiBuZWVkZWRcbiAgICBtZXRhRGF0YSA9IHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YSlcbiAgICB2YXIgc2l6ZVxuICAgIHZhciBwYXJ0U2l6ZVxuXG4gICAgYXN5bmMud2F0ZXJmYWxsKFxuICAgICAgW1xuICAgICAgICAoY2IpID0+IGZzLnN0YXQoZmlsZVBhdGgsIGNiKSxcbiAgICAgICAgKHN0YXRzLCBjYikgPT4ge1xuICAgICAgICAgIHNpemUgPSBzdGF0cy5zaXplXG4gICAgICAgICAgdmFyIHN0cmVhbVxuICAgICAgICAgIHZhciBjYlRyaWdnZXJlZCA9IGZhbHNlXG4gICAgICAgICAgdmFyIG9yaWdDYiA9IGNiXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoY2JUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYlRyaWdnZXJlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdDYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaXplID4gdGhpcy5tYXhPYmplY3RTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKGAke2ZpbGVQYXRofSBzaXplIDogJHtzdGF0cy5zaXplfSwgbWF4IGFsbG93ZWQgc2l6ZSA6IDVUQmApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2l6ZSA8PSB0aGlzLnBhcnRTaXplKSB7XG4gICAgICAgICAgICAvLyBzaW1wbGUgUFVUIHJlcXVlc3QsIG5vIG11bHRpcGFydFxuICAgICAgICAgICAgdmFyIG11bHRpcGFydCA9IGZhbHNlXG4gICAgICAgICAgICB2YXIgdXBsb2FkZXIgPSB0aGlzLmdldFVwbG9hZGVyKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBtdWx0aXBhcnQpXG4gICAgICAgICAgICB2YXIgaGFzaCA9IHRyYW5zZm9ybWVycy5nZXRIYXNoU3VtbWVyKHRoaXMuZW5hYmxlU0hBMjU2KVxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gMFxuICAgICAgICAgICAgdmFyIGVuZCA9IHNpemUgLSAxXG4gICAgICAgICAgICB2YXIgYXV0b0Nsb3NlID0gdHJ1ZVxuICAgICAgICAgICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgZW5kID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IHN0YXJ0LCBlbmQsIGF1dG9DbG9zZSB9XG4gICAgICAgICAgICBwaXBlc2V0dXAoZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucyksIGhhc2gpXG4gICAgICAgICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIG1kNXN1bSA9IGRhdGEubWQ1c3VtXG4gICAgICAgICAgICAgICAgdmFyIHNoYTI1NnN1bSA9IGRhdGEuc2hhMjU2c3VtXG4gICAgICAgICAgICAgICAgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICB1cGxvYWRlcihzdHJlYW0sIHNpemUsIHNoYTI1NnN1bSwgbWQ1c3VtLCAoZXJyLCBvYmpJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIG9iakluZm8pXG4gICAgICAgICAgICAgICAgICBjYih0cnVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maW5kVXBsb2FkSWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgY2IpXG4gICAgICAgIH0sXG4gICAgICAgICh1cGxvYWRJZCwgY2IpID0+IHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBpbmNvbXBsZXRlIHVwbG9hZCwgZmV0Y2ggYWxsIGl0cyB1cGxvYWRlZCBwYXJ0cyBpbmZvXG4gICAgICAgICAgaWYgKHVwbG9hZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGFydHMoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIChlLCBldGFncykgPT4gY2IoZSwgdXBsb2FkSWQsIGV0YWdzKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIHByZXZpb3VzIHVwbG9hZCwgaW5pdGlhdGUgYSBuZXcgb25lXG4gICAgICAgICAgdGhpcy5pbml0aWF0ZU5ld011bHRpcGFydFVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBtZXRhRGF0YSwgKGUsIHVwbG9hZElkKSA9PiBjYihlLCB1cGxvYWRJZCwgW10pKVxuICAgICAgICB9LFxuICAgICAgICAodXBsb2FkSWQsIGV0YWdzLCBjYikgPT4ge1xuICAgICAgICAgIHBhcnRTaXplID0gdGhpcy5jYWxjdWxhdGVQYXJ0U2l6ZShzaXplKVxuICAgICAgICAgIHZhciBtdWx0aXBhcnQgPSB0cnVlXG4gICAgICAgICAgdmFyIHVwbG9hZGVyID0gdGhpcy5nZXRVcGxvYWRlcihidWNrZXROYW1lLCBvYmplY3ROYW1lLCBtZXRhRGF0YSwgbXVsdGlwYXJ0KVxuXG4gICAgICAgICAgLy8gY29udmVydCBhcnJheSB0byBvYmplY3QgdG8gbWFrZSB0aGluZ3MgZWFzeVxuICAgICAgICAgIHZhciBwYXJ0cyA9IGV0YWdzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoIWFjY1tpdGVtLnBhcnRdKSB7XG4gICAgICAgICAgICAgIGFjY1tpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIHZhciBwYXJ0c0RvbmUgPSBbXVxuICAgICAgICAgIHZhciBwYXJ0TnVtYmVyID0gMVxuICAgICAgICAgIHZhciB1cGxvYWRlZFNpemUgPSAwXG4gICAgICAgICAgYXN5bmMud2hpbHN0KFxuICAgICAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgICAgIGNiKG51bGwsIHVwbG9hZGVkU2l6ZSA8IHNpemUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGNiKSA9PiB7XG4gICAgICAgICAgICAgIHZhciBzdHJlYW1cbiAgICAgICAgICAgICAgdmFyIGNiVHJpZ2dlcmVkID0gZmFsc2VcbiAgICAgICAgICAgICAgdmFyIG9yaWdDYiA9IGNiXG4gICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChjYlRyaWdnZXJlZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNiVHJpZ2dlcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdDYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1twYXJ0TnVtYmVyXVxuICAgICAgICAgICAgICB2YXIgaGFzaCA9IHRyYW5zZm9ybWVycy5nZXRIYXNoU3VtbWVyKHRoaXMuZW5hYmxlU0hBMjU2KVxuICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gcGFydFNpemVcbiAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHNpemUgLSB1cGxvYWRlZFNpemUpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSBzaXplIC0gdXBsb2FkZWRTaXplXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdXBsb2FkZWRTaXplXG4gICAgICAgICAgICAgIHZhciBlbmQgPSB1cGxvYWRlZFNpemUgKyBsZW5ndGggLSAxXG4gICAgICAgICAgICAgIHZhciBhdXRvQ2xvc2UgPSB0cnVlXG4gICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBhdXRvQ2xvc2UsIHN0YXJ0LCBlbmQgfVxuICAgICAgICAgICAgICAvLyB2ZXJpZnkgbWQ1c3VtIG9mIGVhY2ggcGFydFxuICAgICAgICAgICAgICBwaXBlc2V0dXAoZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucyksIGhhc2gpXG4gICAgICAgICAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgIHZhciBtZDVzdW1IZXggPSBCdWZmZXIuZnJvbShkYXRhLm1kNXN1bSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgJiYgbWQ1c3VtSGV4ID09PSBwYXJ0LmV0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWQ1IG1hdGNoZXMsIGNodW5rIGFscmVhZHkgdXBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgcGFydHNEb25lLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBwYXJ0LmV0YWcgfSlcbiAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcisrXG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkU2l6ZSArPSBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgaXMgbm90IHVwbG9hZGVkIHlldCwgb3IgbWQ1IG1pc21hdGNoXG4gICAgICAgICAgICAgICAgICBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgdXBsb2FkZXIodXBsb2FkSWQsIHBhcnROdW1iZXIsIHN0cmVhbSwgbGVuZ3RoLCBkYXRhLnNoYTI1NnN1bSwgZGF0YS5tZDVzdW0sIChlLCBvYmpJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFydHNEb25lLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBvYmpJbmZvLmV0YWcgfSlcbiAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcisrXG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkU2l6ZSArPSBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2IobnVsbCwgcGFydHNEb25lLCB1cGxvYWRJZClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICAvLyBhbGwgcGFydHMgdXBsb2FkZWQsIGNvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkXG4gICAgICAgIChldGFncywgdXBsb2FkSWQsIGNiKSA9PiB0aGlzLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHVwbG9hZElkLCBldGFncywgY2IpLFxuICAgICAgXSxcbiAgICAgIChlcnIsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgaWYgKGVyciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVyciwgLi4ucmVzdClcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gVXBsb2FkcyB0aGUgb2JqZWN0LlxuICAvL1xuICAvLyBVcGxvYWRpbmcgYSBzdHJlYW1cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RyZWFtYCBfU3RyZWFtXzogUmVhZGFibGUgc3RyZWFtXG4gIC8vICogYHNpemVgIF9udW1iZXJfOiBzaXplIG9mIHRoZSBvYmplY3QgKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIsIGV0YWcpYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBldGFnYCBfc3RyaW5nXyBpcyB0aGUgZXRhZyBvZiB0aGUgb2JqZWN0IHVwbG9hZGVkLlxuICAvL1xuICAvLyBVcGxvYWRpbmcgXCJCdWZmZXJcIiBvciBcInN0cmluZ1wiXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYHN0cmluZyBvciBCdWZmZXJgIF9zdHJpbmdfIG9yIF9CdWZmZXJfOiBzdHJpbmcgb3IgYnVmZmVyXG4gIC8vICogYGNhbGxiYWNrKGVyciwgb2JqSW5mbylgIF9mdW5jdGlvbl86IGBlcnJgIGlzIGBudWxsYCBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGBpbmZvYCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBvYmplY3QgZGV0YWlsczpcbiAgLy8gICAqIGBldGFnYCBfc3RyaW5nXzogZXRhZyBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgdmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbklkIG9mIHRoZSBvYmplY3RcbiAgcHV0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHN0cmVhbSwgc2l6ZSwgbWV0YURhdGEsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICAvLyBXZSdsbCBuZWVkIHRvIHNoaWZ0IGFyZ3VtZW50cyB0byB0aGUgbGVmdCBiZWNhdXNlIG9mIHNpemUgYW5kIG1ldGFEYXRhLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNpemUpKSB7XG4gICAgICBjYWxsYmFjayA9IHNpemVcbiAgICAgIG1ldGFEYXRhID0ge31cbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24obWV0YURhdGEpKSB7XG4gICAgICBjYWxsYmFjayA9IG1ldGFEYXRhXG4gICAgICBtZXRhRGF0YSA9IHt9XG4gICAgfVxuXG4gICAgLy8gV2UnbGwgbmVlZCB0byBzaGlmdCBhcmd1bWVudHMgdG8gdGhlIGxlZnQgYmVjYXVzZSBvZiBtZXRhRGF0YVxuICAgIC8vIGFuZCBzaXplIGJlaW5nIG9wdGlvbmFsLlxuICAgIGlmIChpc09iamVjdChzaXplKSkge1xuICAgICAgbWV0YURhdGEgPSBzaXplXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlcyBNZXRhZGF0YSBoYXMgYXBwcm9wcmlhdGUgcHJlZml4IGZvciBBMyBBUElcbiAgICBtZXRhRGF0YSA9IHByZXBlbmRYQU1aTWV0YShtZXRhRGF0YSlcbiAgICBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgfHwgc3RyZWFtIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAvLyBBZGFwdHMgdGhlIG5vbi1zdHJlYW0gaW50ZXJmYWNlIGludG8gYSBzdHJlYW0uXG4gICAgICBzaXplID0gc3RyZWFtLmxlbmd0aFxuICAgICAgc3RyZWFtID0gcmVhZGFibGVTdHJlYW0oc3RyZWFtKVxuICAgIH0gZWxzZSBpZiAoIWlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcmQgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJlYW0uUmVhZGFibGVcIiBvciBcIkJ1ZmZlclwiIG9yIFwic3RyaW5nXCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKHNpemUpICYmIHNpemUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSwgZ2l2ZW4gc2l6ZTogJHtzaXplfWApXG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBwYXJ0IHNpemUgYW5kIGZvcndhcmQgdGhhdCB0byB0aGUgQmxvY2tTdHJlYW0uIERlZmF1bHQgdG8gdGhlXG4gICAgLy8gbGFyZ2VzdCBibG9jayBzaXplIHBvc3NpYmxlIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoIWlzTnVtYmVyKHNpemUpKSB7XG4gICAgICBzaXplID0gdGhpcy5tYXhPYmplY3RTaXplXG4gICAgfVxuXG4gICAgc2l6ZSA9IHRoaXMuY2FsY3VsYXRlUGFydFNpemUoc2l6ZSlcblxuICAgIC8vIHMzIHJlcXVpcmVzIHRoYXQgYWxsIG5vbi1lbmQgY2h1bmtzIGJlIGF0IGxlYXN0IGB0aGlzLnBhcnRTaXplYCxcbiAgICAvLyBzbyB3ZSBjaHVuayB0aGUgc3RyZWFtIHVudGlsIHdlIGhpdCBlaXRoZXIgdGhhdCBzaXplIG9yIHRoZSBlbmQgYmVmb3JlXG4gICAgLy8gd2UgZmx1c2ggaXQgdG8gczMuXG4gICAgbGV0IGNodW5rZXIgPSBuZXcgQmxvY2tTdHJlYW0yKHsgc2l6ZSwgemVyb1BhZGRpbmc6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGlzIGlzIGEgV3JpdGFibGUgc3RyZWFtIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW4gb3JkZXIgdG8gdXBsb2FkXG4gICAgLy8gdG8gdGhlIHNwZWNpZmllZCBidWNrZXQgYW5kIG9iamVjdCBhdXRvbWF0aWNhbGx5LlxuICAgIGxldCB1cGxvYWRlciA9IG5ldyBPYmplY3RVcGxvYWRlcih0aGlzLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spXG4gICAgLy8gc3RyZWFtID0+IGNodW5rZXIgPT4gdXBsb2FkZXJcbiAgICBwaXBlc2V0dXAoc3RyZWFtLCBjaHVua2VyLCB1cGxvYWRlcilcbiAgfVxuXG4gIC8vIENvcHkgdGhlIG9iamVjdC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3JjT2JqZWN0YCBfc3RyaW5nXzogcGF0aCBvZiB0aGUgc291cmNlIG9iamVjdCB0byBiZSBjb3BpZWRcbiAgLy8gKiBgY29uZGl0aW9uc2AgX0NvcHlDb25kaXRpb25zXzogY29weSBjb25kaXRpb25zIHRoYXQgbmVlZHMgdG8gYmUgc2F0aXNmaWVkIChvcHRpb25hbCwgZGVmYXVsdCBgbnVsbGApXG4gIC8vICogYGNhbGxiYWNrKGVyciwge2V0YWcsIGxhc3RNb2RpZmllZH0pYCBfZnVuY3Rpb25fOiBub24gbnVsbCBgZXJyYCBpbmRpY2F0ZXMgZXJyb3IsIGBldGFnYCBfc3RyaW5nXyBhbmQgYGxpc3RNb2RpZmVkYCBfRGF0ZV8gYXJlIHJlc3BlY3RpdmVseSB0aGUgZXRhZyBhbmQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgbmV3bHkgY29waWVkIG9iamVjdFxuICBjb3B5T2JqZWN0VjEoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkge1xuICAgIHZhciBidWNrZXROYW1lID0gYXJnMVxuICAgIHZhciBvYmplY3ROYW1lID0gYXJnMlxuICAgIHZhciBzcmNPYmplY3QgPSBhcmczXG4gICAgdmFyIGNvbmRpdGlvbnMsIGNiXG4gICAgaWYgKHR5cGVvZiBhcmc0ID09ICdmdW5jdGlvbicgJiYgYXJnNSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25kaXRpb25zID0gbnVsbFxuICAgICAgY2IgPSBhcmc0XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMgPSBhcmc0XG4gICAgICBjYiA9IGFyZzVcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhzcmNPYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzcmNPYmplY3Qgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChzcmNPYmplY3QgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgRW1wdHkgc291cmNlIHByZWZpeGApXG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbnMgIT09IG51bGwgJiYgIShjb25kaXRpb25zIGluc3RhbmNlb2YgQ29weUNvbmRpdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb25kaXRpb25zIHNob3VsZCBiZSBvZiB0eXBlIFwiQ29weUNvbmRpdGlvbnNcIicpXG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSB1cmlSZXNvdXJjZUVzY2FwZShzcmNPYmplY3QpXG5cbiAgICBpZiAoY29uZGl0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbmRpdGlvbnMubW9kaWZpZWQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW1vZGlmaWVkLXNpbmNlJ10gPSBjb25kaXRpb25zLm1vZGlmaWVkXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9ucy51bm1vZGlmaWVkICE9PSAnJykge1xuICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlJ10gPSBjb25kaXRpb25zLnVubW9kaWZpZWRcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25zLm1hdGNoRVRhZyAhPT0gJycpIHtcbiAgICAgICAgaGVhZGVyc1sneC1hbXotY29weS1zb3VyY2UtaWYtbWF0Y2gnXSA9IGNvbmRpdGlvbnMubWF0Y2hFVGFnXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9ucy5tYXRjaEV0YWdFeGNlcHQgIT09ICcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW5vbmUtbWF0Y2gnXSA9IGNvbmRpdGlvbnMubWF0Y2hFVGFnRXhjZXB0XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdQVVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gY2IobnVsbCwgZGF0YSkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBNZXRob2QgdG8gcGVyZm9ybSBjb3B5IG9mIGFuIG9iamVjdC5cbiAgICogQHBhcmFtIHNvdXJjZUNvbmZpZyBfX29iamVjdF9fICAgaW5zdGFuY2Ugb2YgQ29weVNvdXJjZU9wdGlvbnMgQGxpbmsgLi9oZWxwZXJzL0NvcHlTb3VyY2VPcHRpb25zXG4gICAqIEBwYXJhbSBkZXN0Q29uZmlnICBfX29iamVjdF9fICAgaW5zdGFuY2Ugb2YgQ29weURlc3RpbmF0aW9uT3B0aW9ucyBAbGluayAuL2hlbHBlcnMvQ29weURlc3RpbmF0aW9uT3B0aW9uc1xuICAgKiBAcGFyYW0gY2IgX19mdW5jdGlvbl9fIGNhbGxlZCB3aXRoIG51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3JcbiAgICogQHJldHVybnMgUHJvbWlzZSBpZiBubyBjYWxsYWNrIGlzIHBhc3NlZC5cbiAgICovXG4gIGNvcHlPYmplY3RWMihzb3VyY2VDb25maWcsIGRlc3RDb25maWcsIGNiKSB7XG4gICAgaWYgKCEoc291cmNlQ29uZmlnIGluc3RhbmNlb2YgQ29weVNvdXJjZU9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdzb3VyY2VDb25maWcgc2hvdWxkIG9mIHR5cGUgQ29weVNvdXJjZU9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCEoZGVzdENvbmZpZyBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdkZXN0Q29uZmlnIHNob3VsZCBvZiB0eXBlIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCFkZXN0Q29uZmlnLnZhbGlkYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWRlc3RDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZUNvbmZpZy5nZXRIZWFkZXJzKCksIGRlc3RDb25maWcuZ2V0SGVhZGVycygpKVxuXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IGRlc3RDb25maWcuQnVja2V0XG4gICAgY29uc3Qgb2JqZWN0TmFtZSA9IGRlc3RDb25maWcuT2JqZWN0XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc0hlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzXG5cbiAgICAgICAgICBjb25zdCBjb3B5T2JqUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBCdWNrZXQ6IGRlc3RDb25maWcuQnVja2V0LFxuICAgICAgICAgICAgS2V5OiBkZXN0Q29uZmlnLk9iamVjdCxcbiAgICAgICAgICAgIExhc3RNb2RpZmllZDogZGF0YS5MYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICBNZXRhRGF0YTogZXh0cmFjdE1ldGFkYXRhKHJlc0hlYWRlcnMpLFxuICAgICAgICAgICAgVmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzSGVhZGVycyksXG4gICAgICAgICAgICBTb3VyY2VWZXJzaW9uSWQ6IGdldFNvdXJjZVZlcnNpb25JZChyZXNIZWFkZXJzKSxcbiAgICAgICAgICAgIEV0YWc6IHNhbml0aXplRVRhZyhyZXNIZWFkZXJzLmV0YWcpLFxuICAgICAgICAgICAgU2l6ZTogK3Jlc0hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10sXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGNvcHlPYmpSZXNwb25zZSlcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgQ29weSBPYmplY3QgQVBJLlxuICBjb3B5T2JqZWN0KC4uLmFsbEFyZ3MpIHtcbiAgICBpZiAoYWxsQXJnc1swXSBpbnN0YW5jZW9mIENvcHlTb3VyY2VPcHRpb25zICYmIGFsbEFyZ3NbMV0gaW5zdGFuY2VvZiBDb3B5RGVzdGluYXRpb25PcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0VjIoLi4uYXJndW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0VjEoLi4uYXJndW1lbnRzKVxuICB9XG5cbiAgLy8gbGlzdCBhIGJhdGNoIG9mIG9iamVjdHNcbiAgbGlzdE9iamVjdHNRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIG1hcmtlciwgbGlzdFF1ZXJ5T3B0cyA9IHt9KSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcobWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBsZXQgeyBEZWxpbWl0ZXIsIE1heEtleXMsIEluY2x1ZGVWZXJzaW9uIH0gPSBsaXN0UXVlcnlPcHRzXG5cbiAgICBpZiAoIWlzT2JqZWN0KGxpc3RRdWVyeU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0UXVlcnlPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGlmICghaXNTdHJpbmcoRGVsaW1pdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVsaW1pdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzTnVtYmVyKE1heEtleXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNYXhLZXlzIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBbXVxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKERlbGltaXRlcil9YClcbiAgICBxdWVyaWVzLnB1c2goYGVuY29kaW5nLXR5cGU9dXJsYClcblxuICAgIGlmIChJbmNsdWRlVmVyc2lvbikge1xuICAgICAgcXVlcmllcy5wdXNoKGB2ZXJzaW9uc2ApXG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcikge1xuICAgICAgbWFya2VyID0gdXJpRXNjYXBlKG1hcmtlcilcbiAgICAgIGlmIChJbmNsdWRlVmVyc2lvbikge1xuICAgICAgICBxdWVyaWVzLnB1c2goYGtleS1tYXJrZXI9JHttYXJrZXJ9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJpZXMucHVzaChgbWFya2VyPSR7bWFya2VyfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gbmVlZCB0byBlc2NhcGUgbWF4S2V5c1xuICAgIGlmIChNYXhLZXlzKSB7XG4gICAgICBpZiAoTWF4S2V5cyA+PSAxMDAwKSB7XG4gICAgICAgIE1heEtleXMgPSAxMDAwXG4gICAgICB9XG4gICAgICBxdWVyaWVzLnB1c2goYG1heC1rZXlzPSR7TWF4S2V5c31gKVxuICAgIH1cbiAgICBxdWVyaWVzLnNvcnQoKVxuICAgIHZhciBxdWVyeSA9ICcnXG4gICAgaWYgKHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyaWVzLmpvaW4oJyYnKX1gXG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIoKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmVtaXQoJ2Vycm9yJywgZSlcbiAgICAgIH1cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgfSlcbiAgICByZXR1cm4gdHJhbnNmb3JtZXJcbiAgfVxuXG4gIC8vIExpc3QgdGhlIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYHByZWZpeGAgX3N0cmluZ186IHRoZSBwcmVmaXggb2YgdGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbGlzdGVkIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvLyAqIGByZWN1cnNpdmVgIF9ib29sXzogYHRydWVgIGluZGljYXRlcyByZWN1cnNpdmUgc3R5bGUgbGlzdGluZyBhbmQgYGZhbHNlYCBpbmRpY2F0ZXMgZGlyZWN0b3J5IHN0eWxlIGxpc3RpbmcgZGVsaW1pdGVkIGJ5ICcvJy4gKG9wdGlvbmFsLCBkZWZhdWx0IGBmYWxzZWApXG4gIC8vICogYGxpc3RPcHRzIF9vYmplY3RfOiBxdWVyeSBwYXJhbXMgdG8gbGlzdCBvYmplY3Qgd2l0aCBiZWxvdyBrZXlzXG4gIC8vICogICAgbGlzdE9wdHMuTWF4S2V5cyBfaW50XyBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHRvIHJldHVyblxuICAvLyAqICAgIGxpc3RPcHRzLkluY2x1ZGVWZXJzaW9uICBfYm9vbF8gdHJ1ZXxmYWxzZSB0byBpbmNsdWRlIHZlcnNpb25zLlxuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICogYG9iai5uYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5wcmVmaXhgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3QgcHJlZml4XG4gIC8vICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5ldGFnYCBfc3RyaW5nXzogZXRhZyBvZiB0aGUgb2JqZWN0XG4gIC8vICogYG9iai5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICAvLyAqIGBvYmouaXNEZWxldGVNYXJrZXJgIF9ib29sZWFuXzogdHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSBtYXJrZXJcbiAgLy8gKiBgb2JqLnZlcnNpb25JZGAgX3N0cmluZ186IHZlcnNpb25JZCBvZiB0aGUgb2JqZWN0XG4gIGxpc3RPYmplY3RzKGJ1Y2tldE5hbWUsIHByZWZpeCwgcmVjdXJzaXZlLCBsaXN0T3B0cyA9IHt9KSB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSAnJ1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY3Vyc2l2ZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZFByZWZpeChwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgSW52YWxpZCBwcmVmaXggOiAke3ByZWZpeH1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWZpeCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4ocmVjdXJzaXZlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVjdXJzaXZlIHNob3VsZCBiZSBvZiB0eXBlIFwiYm9vbGVhblwiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChsaXN0T3B0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3RPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICB2YXIgbWFya2VyID0gJydcbiAgICBjb25zdCBsaXN0UXVlcnlPcHRzID0ge1xuICAgICAgRGVsaW1pdGVyOiByZWN1cnNpdmUgPyAnJyA6ICcvJywgLy8gaWYgcmVjdXJzaXZlIGlzIGZhbHNlIHNldCBkZWxpbWl0ZXIgdG8gJy8nXG4gICAgICBNYXhLZXlzOiAxMDAwLFxuICAgICAgSW5jbHVkZVZlcnNpb246IGxpc3RPcHRzLkluY2x1ZGVWZXJzaW9uLFxuICAgIH1cbiAgICB2YXIgb2JqZWN0cyA9IFtdXG4gICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICB2YXIgcmVhZFN0cmVhbSA9IFN0cmVhbS5SZWFkYWJsZSh7IG9iamVjdE1vZGU6IHRydWUgfSlcbiAgICByZWFkU3RyZWFtLl9yZWFkID0gKCkgPT4ge1xuICAgICAgLy8gcHVzaCBvbmUgb2JqZWN0IHBlciBfcmVhZCgpXG4gICAgICBpZiAob2JqZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgcmVhZFN0cmVhbS5wdXNoKG9iamVjdHMuc2hpZnQoKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0ucHVzaChudWxsKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG9iamVjdHMgdG8gcHVzaCBkbyBxdWVyeSBmb3IgdGhlIG5leHQgYmF0Y2ggb2Ygb2JqZWN0c1xuICAgICAgdGhpcy5saXN0T2JqZWN0c1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwgbWFya2VyLCBsaXN0UXVlcnlPcHRzKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgICAgIG1hcmtlciA9IHJlc3VsdC5uZXh0TWFya2VyIHx8IHJlc3VsdC52ZXJzaW9uSWRNYXJrZXJcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdHMgPSByZXN1bHQub2JqZWN0c1xuICAgICAgICAgIHJlYWRTdHJlYW0uX3JlYWQoKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhZFN0cmVhbVxuICB9XG5cbiAgLy8gbGlzdE9iamVjdHNWMlF1ZXJ5IC0gKExpc3QgT2JqZWN0cyBWMikgLSBMaXN0IHNvbWUgb3IgYWxsICh1cCB0byAxMDAwKSBvZiB0aGUgb2JqZWN0cyBpbiBhIGJ1Y2tldC5cbiAgLy9cbiAgLy8gWW91IGNhbiB1c2UgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBhcyBzZWxlY3Rpb24gY3JpdGVyaWEgdG8gcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBvYmplY3RzIGluIGEgYnVja2V0LlxuICAvLyByZXF1ZXN0IHBhcmFtZXRlcnMgOi1cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiBMaW1pdHMgdGhlIHJlc3BvbnNlIHRvIGtleXMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LlxuICAvLyAqIGBjb250aW51YXRpb24tdG9rZW5gIF9zdHJpbmdfOiBVc2VkIHRvIGNvbnRpbnVlIGl0ZXJhdGluZyBvdmVyIGEgc2V0IG9mIG9iamVjdHMuXG4gIC8vICogYGRlbGltaXRlcmAgX3N0cmluZ186IEEgZGVsaW1pdGVyIGlzIGEgY2hhcmFjdGVyIHlvdSB1c2UgdG8gZ3JvdXAga2V5cy5cbiAgLy8gKiBgbWF4LWtleXNgIF9udW1iZXJfOiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICAvLyAqIGBzdGFydC1hZnRlcmAgX3N0cmluZ186IFNwZWNpZmllcyB0aGUga2V5IHRvIHN0YXJ0IGFmdGVyIHdoZW4gbGlzdGluZyBvYmplY3RzIGluIGEgYnVja2V0LlxuICBsaXN0T2JqZWN0c1YyUXVlcnkoYnVja2V0TmFtZSwgcHJlZml4LCBjb250aW51YXRpb25Ub2tlbiwgZGVsaW1pdGVyLCBtYXhLZXlzLCBzdGFydEFmdGVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoY29udGludWF0aW9uVG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb250aW51YXRpb25Ub2tlbiBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhkZWxpbWl0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkZWxpbWl0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobWF4S2V5cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEtleXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoc3RhcnRBZnRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXJ0QWZ0ZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIHZhciBxdWVyaWVzID0gW11cblxuICAgIC8vIENhbGwgZm9yIGxpc3Rpbmcgb2JqZWN0cyB2MiBBUElcbiAgICBxdWVyaWVzLnB1c2goYGxpc3QtdHlwZT0yYClcbiAgICBxdWVyaWVzLnB1c2goYGVuY29kaW5nLXR5cGU9dXJsYClcblxuICAgIC8vIGVzY2FwZSBldmVyeSB2YWx1ZSBpbiBxdWVyeSBzdHJpbmcsIGV4Y2VwdCBtYXhLZXlzXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcblxuICAgIGlmIChjb250aW51YXRpb25Ub2tlbikge1xuICAgICAgY29udGludWF0aW9uVG9rZW4gPSB1cmlFc2NhcGUoY29udGludWF0aW9uVG9rZW4pXG4gICAgICBxdWVyaWVzLnB1c2goYGNvbnRpbnVhdGlvbi10b2tlbj0ke2NvbnRpbnVhdGlvblRva2VufWApXG4gICAgfVxuICAgIC8vIFNldCBzdGFydC1hZnRlclxuICAgIGlmIChzdGFydEFmdGVyKSB7XG4gICAgICBzdGFydEFmdGVyID0gdXJpRXNjYXBlKHN0YXJ0QWZ0ZXIpXG4gICAgICBxdWVyaWVzLnB1c2goYHN0YXJ0LWFmdGVyPSR7c3RhcnRBZnRlcn1gKVxuICAgIH1cbiAgICAvLyBubyBuZWVkIHRvIGVzY2FwZSBtYXhLZXlzXG4gICAgaWYgKG1heEtleXMpIHtcbiAgICAgIGlmIChtYXhLZXlzID49IDEwMDApIHtcbiAgICAgICAgbWF4S2V5cyA9IDEwMDBcbiAgICAgIH1cbiAgICAgIHF1ZXJpZXMucHVzaChgbWF4LWtleXM9JHttYXhLZXlzfWApXG4gICAgfVxuICAgIHF1ZXJpZXMuc29ydCgpXG4gICAgdmFyIHF1ZXJ5ID0gJydcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJpZXMuam9pbignJicpfWBcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldExpc3RPYmplY3RzVjJUcmFuc2Zvcm1lcigpXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICB9KVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG5cbiAgLy8gTGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHVzaW5nIFMzIExpc3RPYmplY3RzIFYyXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBwcmVmaXhgIF9zdHJpbmdfOiB0aGUgcHJlZml4IG9mIHRoZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCAob3B0aW9uYWwsIGRlZmF1bHQgYCcnYClcbiAgLy8gKiBgcmVjdXJzaXZlYCBfYm9vbF86IGB0cnVlYCBpbmRpY2F0ZXMgcmVjdXJzaXZlIHN0eWxlIGxpc3RpbmcgYW5kIGBmYWxzZWAgaW5kaWNhdGVzIGRpcmVjdG9yeSBzdHlsZSBsaXN0aW5nIGRlbGltaXRlZCBieSAnLycuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICAvLyAqIGBzdGFydEFmdGVyYCBfc3RyaW5nXzogU3BlY2lmaWVzIHRoZSBrZXkgdG8gc3RhcnQgYWZ0ZXIgd2hlbiBsaXN0aW5nIG9iamVjdHMgaW4gYSBidWNrZXQuIChvcHRpb25hbCwgZGVmYXVsdCBgJydgKVxuICAvL1xuICAvLyBfX1JldHVybiBWYWx1ZV9fXG4gIC8vICogYHN0cmVhbWAgX1N0cmVhbV86IHN0cmVhbSBlbWl0dGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LCB0aGUgb2JqZWN0IGlzIG9mIHRoZSBmb3JtYXQ6XG4gIC8vICAgKiBgb2JqLm5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoucHJlZml4YCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0IHByZWZpeFxuICAvLyAgICogYG9iai5zaXplYCBfbnVtYmVyXzogc2l6ZSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgb2JqLmV0YWdgIF9zdHJpbmdfOiBldGFnIG9mIHRoZSBvYmplY3RcbiAgLy8gICAqIGBvYmoubGFzdE1vZGlmaWVkYCBfRGF0ZV86IG1vZGlmaWVkIHRpbWUgc3RhbXBcbiAgbGlzdE9iamVjdHNWMihidWNrZXROYW1lLCBwcmVmaXgsIHJlY3Vyc2l2ZSwgc3RhcnRBZnRlcikge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJlZml4ID0gJydcbiAgICB9XG4gICAgaWYgKHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWN1cnNpdmUgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhcnRBZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydEFmdGVyID0gJydcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihyZWN1cnNpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWN1cnNpdmUgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN0YXJ0QWZ0ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdGFydEFmdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICAvLyBpZiByZWN1cnNpdmUgaXMgZmFsc2Ugc2V0IGRlbGltaXRlciB0byAnLydcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVjdXJzaXZlID8gJycgOiAnLydcbiAgICB2YXIgY29udGludWF0aW9uVG9rZW4gPSAnJ1xuICAgIHZhciBvYmplY3RzID0gW11cbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuICAgIHZhciByZWFkU3RyZWFtID0gU3RyZWFtLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KVxuICAgIHJlYWRTdHJlYW0uX3JlYWQgPSAoKSA9PiB7XG4gICAgICAvLyBwdXNoIG9uZSBvYmplY3QgcGVyIF9yZWFkKClcbiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLnB1c2gob2JqZWN0cy5zaGlmdCgpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5wdXNoKG51bGwpXG4gICAgICB9XG4gICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyB0byBwdXNoIGRvIHF1ZXJ5IGZvciB0aGUgbmV4dCBiYXRjaCBvZiBvYmplY3RzXG4gICAgICB0aGlzLmxpc3RPYmplY3RzVjJRdWVyeShidWNrZXROYW1lLCBwcmVmaXgsIGNvbnRpbnVhdGlvblRva2VuLCBkZWxpbWl0ZXIsIDEwMDAsIHN0YXJ0QWZ0ZXIpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RzID0gcmVzdWx0Lm9iamVjdHNcbiAgICAgICAgICByZWFkU3RyZWFtLl9yZWFkKClcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRTdHJlYW1cbiAgfVxuXG4gIC8vIFN0YXQgaW5mb3JtYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYG9iamVjdE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBvYmplY3RcbiAgLy8gKiBgc3RhdE9wdHNgICBfb2JqZWN0XyA6IFZlcnNpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9ybSBge3ZlcnNpb25JZDonbXktdXVpZCd9YC4gRGVmYXVsdCBpcyBge31gLiAob3B0aW9uYWwpLlxuICAvLyAqIGBjYWxsYmFjayhlcnIsIHN0YXQpYCBfZnVuY3Rpb25fOiBgZXJyYCBpcyBub3QgYG51bGxgIGluIGNhc2Ugb2YgZXJyb3IsIGBzdGF0YCBjb250YWlucyB0aGUgb2JqZWN0IGluZm9ybWF0aW9uOlxuICAvLyAgICogYHN0YXQuc2l6ZWAgX251bWJlcl86IHNpemUgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYHN0YXQuZXRhZ2AgX3N0cmluZ186IGV0YWcgb2YgdGhlIG9iamVjdFxuICAvLyAgICogYHN0YXQubWV0YURhdGFgIF9zdHJpbmdfOiBNZXRhRGF0YSBvZiB0aGUgb2JqZWN0XG4gIC8vICAgKiBgc3RhdC5sYXN0TW9kaWZpZWRgIF9EYXRlXzogbW9kaWZpZWQgdGltZSBzdGFtcFxuICAvLyAgICogYHN0YXQudmVyc2lvbklkYCBfc3RyaW5nXzogdmVyc2lvbiBpZCBvZiB0aGUgb2JqZWN0IGlmIGF2YWlsYWJsZVxuICBzdGF0T2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHN0YXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChpc0Z1bmN0aW9uKHN0YXRPcHRzKSkge1xuICAgICAgY2IgPSBzdGF0T3B0c1xuICAgICAgc3RhdE9wdHMgPSB7fVxuICAgIH1cblxuICAgIGlmICghaXNPYmplY3Qoc3RhdE9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdzdGF0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICB2YXIgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoc3RhdE9wdHMpXG4gICAgdmFyIG1ldGhvZCA9ICdIRUFEJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRyYWluIHRoZSBzb2NrZXQgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZC4gTm90ZSB0aGF0IHRoaXNcbiAgICAgIC8vIGlzIG5vdCBleHBlbnNpdmUgYXMgdGhlIHNvY2tldCB3aWxsIG5vdCBoYXZlIGFueSBkYXRhLlxuICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzaXplOiArcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSxcbiAgICAgICAgbWV0YURhdGE6IGV4dHJhY3RNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZShyZXNwb25zZS5oZWFkZXJzWydsYXN0LW1vZGlmaWVkJ10pLFxuICAgICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICB9XG5cbiAgICAgIGNiKG51bGwsIHJlc3VsdClcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGByZW1vdmVPcHRzYCBfb2JqZWN0XzogVmVyc2lvbiBvZiB0aGUgb2JqZWN0IGluIHRoZSBmb3JtIGB7dmVyc2lvbklkOidteS11dWlkJywgZ292ZXJuYW5jZUJ5cGFzczp0cnVlfGZhbHNlLCBmb3JjZURlbGV0ZTp0cnVlfGZhbHNlfWAuIERlZmF1bHQgaXMgYHt9YC4gKG9wdGlvbmFsKVxuICAvLyAqIGBjYWxsYmFjayhlcnIpYCBfZnVuY3Rpb25fOiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBub24gYG51bGxgIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3JcbiAgcmVtb3ZlT2JqZWN0KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlT3B0cykpIHtcbiAgICAgIGNiID0gcmVtb3ZlT3B0c1xuICAgICAgcmVtb3ZlT3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChyZW1vdmVPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncmVtb3ZlT3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHt9XG5cbiAgICBpZiAocmVtb3ZlT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLnZlcnNpb25JZCA9IGAke3JlbW92ZU9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaWYgKHJlbW92ZU9wdHMuZ292ZXJuYW5jZUJ5cGFzcykge1xuICAgICAgaGVhZGVyc1snWC1BbXotQnlwYXNzLUdvdmVybmFuY2UtUmV0ZW50aW9uJ10gPSB0cnVlXG4gICAgfVxuICAgIGlmIChyZW1vdmVPcHRzLmZvcmNlRGVsZXRlKSB7XG4gICAgICBoZWFkZXJzWyd4LW1pbmlvLWZvcmNlLWRlbGV0ZSddID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gICAgbGV0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGhlYWRlcnMgfVxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnNbJ3F1ZXJ5J10gPSBxdWVyeVxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwLCAyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCB0aGUgb2JqZWN0cyByZXNpZGluZyBpbiB0aGUgb2JqZWN0c0xpc3QuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3RzTGlzdGAgX2FycmF5XzogYXJyYXkgb2Ygb2JqZWN0cyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWVzIGFzIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG9iamVjdCBrZXlzOiAgWydvYmplY3RuYW1lMScsJ29iamVjdG5hbWUyJ11cbiAgLy8gKiAgICAgICAgIExpc3Qgb2YgT2JqZWN0IG5hbWUgYW5kIHZlcnNpb25JZCBhcyBhbiBvYmplY3Q6ICBbe25hbWU6XCJvYmplY3RuYW1lXCIsdmVyc2lvbklkOlwibXktdmVyc2lvbi1pZFwifV1cblxuICByZW1vdmVPYmplY3RzKGJ1Y2tldE5hbWUsIG9iamVjdHNMaXN0LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3RzTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29iamVjdHNMaXN0IHNob3VsZCBiZSBhIGxpc3QnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEVudHJpZXMgPSAxMDAwXG4gICAgY29uc3QgcXVlcnkgPSAnZGVsZXRlJ1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQT1NUJ1xuXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdHNMaXN0LnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICAgIHJlc3VsdC5saXN0LnB1c2goZW50cnkpXG4gICAgICAgIGlmIChyZXN1bHQubGlzdC5sZW5ndGggPT09IG1heEVudHJpZXMpIHtcbiAgICAgICAgICByZXN1bHQubGlzdE9mTGlzdC5wdXNoKHJlc3VsdC5saXN0KVxuICAgICAgICAgIHJlc3VsdC5saXN0ID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9LFxuICAgICAgeyBsaXN0T2ZMaXN0OiBbXSwgbGlzdDogW10gfSxcbiAgICApXG5cbiAgICBpZiAocmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0Lmxpc3RPZkxpc3QucHVzaChyZXN1bHQubGlzdClcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcbiAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBbXVxuXG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIHJlc3VsdC5saXN0T2ZMaXN0LFxuICAgICAgKGxpc3QsIGJhdGNoQ2IpID0+IHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXVxuICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgb2JqZWN0cy5wdXNoKHsgS2V5OiB2YWx1ZS5uYW1lLCBWZXJzaW9uSWQ6IHZhbHVlLnZlcnNpb25JZCB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmplY3RzLnB1c2goeyBLZXk6IHZhbHVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBsZXQgZGVsZXRlT2JqZWN0cyA9IHsgRGVsZXRlOiB7IFF1aWV0OiB0cnVlLCBPYmplY3Q6IG9iamVjdHMgfSB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyBoZWFkbGVzczogdHJ1ZSB9KVxuICAgICAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZGVsZXRlT2JqZWN0cylcbiAgICAgICAgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHBheWxvYWQpXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuXG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgICAgIGxldCByZW1vdmVPYmplY3RzUmVzdWx0XG4gICAgICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sIHBheWxvYWQsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXRjaENiKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLnJlbW92ZU9iamVjdHNUcmFuc2Zvcm1lcigpKVxuICAgICAgICAgICAgLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlT2JqZWN0c1Jlc3VsdCA9IGRhdGFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoQ2IoZSwgbnVsbClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLnB1c2gocmVtb3ZlT2JqZWN0c1Jlc3VsdClcbiAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoQ2IobnVsbCwgcmVtb3ZlT2JqZWN0c1Jlc3VsdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjYihudWxsLCBfLmZsYXR0ZW4oYmF0Y2hSZXN1bHRzKSlcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLy8gR2V0IHRoZSBwb2xpY3kgb24gYSBidWNrZXQgb3IgYW4gb2JqZWN0IHByZWZpeC5cbiAgLy9cbiAgLy8gX19Bcmd1bWVudHNfX1xuICAvLyAqIGBidWNrZXROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgYnVja2V0XG4gIC8vICogYGNhbGxiYWNrKGVyciwgcG9saWN5KWAgX2Z1bmN0aW9uXzogY2FsbGJhY2sgZnVuY3Rpb25cbiAgZ2V0QnVja2V0UG9saWN5KGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgLy8gVmFsaWRhdGUgYXJndW1lbnRzLlxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgbGV0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3BvbGljeSdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgcG9saWN5ID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5nZXRDb25jYXRlcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gKHBvbGljeSA9IGRhdGEpKVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHBvbGljeS50b1N0cmluZygpKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBTZXQgdGhlIHBvbGljeSBvbiBhIGJ1Y2tldCBvciBhbiBvYmplY3QgcHJlZml4LlxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgYnVja2V0UG9saWN5YCBfc3RyaW5nXzogYnVja2V0IHBvbGljeSAoSlNPTiBzdHJpbmdpZnknZWQpXG4gIC8vICogYGNhbGxiYWNrKGVycilgIF9mdW5jdGlvbl86IGNhbGxiYWNrIGZ1bmN0aW9uXG4gIHNldEJ1Y2tldFBvbGljeShidWNrZXROYW1lLCBwb2xpY3ksIGNiKSB7XG4gICAgLy8gVmFsaWRhdGUgYXJndW1lbnRzLlxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocG9saWN5KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0UG9saWN5RXJyb3IoYEludmFsaWQgYnVja2V0IHBvbGljeTogJHtwb2xpY3l9IC0gbXVzdCBiZSBcInN0cmluZ1wiYClcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBsZXQgbWV0aG9kID0gJ0RFTEVURSdcbiAgICBsZXQgcXVlcnkgPSAncG9saWN5J1xuXG4gICAgaWYgKHBvbGljeSkge1xuICAgICAgbWV0aG9kID0gJ1BVVCdcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwb2xpY3ksIFsyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgYSBnZW5lcmljIHByZXNpZ25lZCBVUkwgd2hpY2ggY2FuIGJlXG4gIC8vIHVzZWQgZm9yIEhUVFAgbWV0aG9kcyBHRVQsIFBVVCwgSEVBRCBhbmQgREVMRVRFXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgbWV0aG9kYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgSFRUUCBtZXRob2RcbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGV4cGlyeWAgX251bWJlcl86IGV4cGlyeSBpbiBzZWNvbmRzIChvcHRpb25hbCwgZGVmYXVsdCA3IGRheXMpXG4gIC8vICogYHJlcVBhcmFtc2AgX29iamVjdF86IHJlcXVlc3QgcGFyYW1ldGVycyAob3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwiMTBmYTk5NDYtM2Y2NC00MTM3LWE1OGYtODg4MDY1YzA3MzJlXCJ9XG4gIC8vICogYHJlcXVlc3REYXRlYCBfRGF0ZV86IEEgZGF0ZSBvYmplY3QsIHRoZSB1cmwgd2lsbCBiZSBpc3N1ZWQgYXQgKG9wdGlvbmFsKVxuICBwcmVzaWduZWRVcmwobWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXFQYXJhbXMsIHJlcXVlc3REYXRlLCBjYikge1xuICAgIGlmICh0aGlzLmFub255bW91cykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Bbm9ueW1vdXNSZXF1ZXN0RXJyb3IoJ1ByZXNpZ25lZCAnICsgbWV0aG9kICsgJyB1cmwgY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgYW5vbnltb3VzIHJlcXVlc3RzJylcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVxdWVzdERhdGUpKSB7XG4gICAgICBjYiA9IHJlcXVlc3REYXRlXG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVxUGFyYW1zKSkge1xuICAgICAgY2IgPSByZXFQYXJhbXNcbiAgICAgIHJlcVBhcmFtcyA9IHt9XG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oZXhwaXJlcykpIHtcbiAgICAgIGNiID0gZXhwaXJlc1xuICAgICAgcmVxUGFyYW1zID0ge31cbiAgICAgIGV4cGlyZXMgPSAyNCAqIDYwICogNjAgKiA3IC8vIDcgZGF5cyBpbiBzZWNvbmRzXG4gICAgICByZXF1ZXN0RGF0ZSA9IG5ldyBEYXRlKClcbiAgICB9XG4gICAgaWYgKCFpc051bWJlcihleHBpcmVzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwaXJlcyBzaG91bGQgYmUgb2YgdHlwZSBcIm51bWJlclwiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChyZXFQYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXFQYXJhbXMgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZERhdGUocmVxdWVzdERhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXF1ZXN0RGF0ZSBzaG91bGQgYmUgb2YgdHlwZSBcIkRhdGVcIiBhbmQgdmFsaWQnKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkocmVxUGFyYW1zKVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKGJ1Y2tldE5hbWUsIChlLCByZWdpb24pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgaXMgYWRkZWQgdG8gZW5zdXJlIHRoYXQgd2Ugc2VuZCBlcnJvciB0aHJvdWdoXG4gICAgICAvLyBjYWxsYmFjayBvbiBwcmVzaWduIGZhaWx1cmUuXG4gICAgICB2YXIgdXJsXG4gICAgICB2YXIgcmVxT3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoeyBtZXRob2QsIHJlZ2lvbiwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSlcblxuICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBwcmVzaWduU2lnbmF0dXJlVjQoXG4gICAgICAgICAgcmVxT3B0aW9ucyxcbiAgICAgICAgICB0aGlzLmFjY2Vzc0tleSxcbiAgICAgICAgICB0aGlzLnNlY3JldEtleSxcbiAgICAgICAgICB0aGlzLnNlc3Npb25Ub2tlbixcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgcmVxdWVzdERhdGUsXG4gICAgICAgICAgZXhwaXJlcyxcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAocGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKHBlKVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgdXJsKVxuICAgIH0pXG4gIH1cblxuICAvLyBHZW5lcmF0ZSBhIHByZXNpZ25lZCBVUkwgZm9yIEdFVFxuICAvL1xuICAvLyBfX0FyZ3VtZW50c19fXG4gIC8vICogYGJ1Y2tldE5hbWVgIF9zdHJpbmdfOiBuYW1lIG9mIHRoZSBidWNrZXRcbiAgLy8gKiBgb2JqZWN0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIG9iamVjdFxuICAvLyAqIGBleHBpcnlgIF9udW1iZXJfOiBleHBpcnkgaW4gc2Vjb25kcyAob3B0aW9uYWwsIGRlZmF1bHQgNyBkYXlzKVxuICAvLyAqIGByZXNwSGVhZGVyc2AgX29iamVjdF86IHJlc3BvbnNlIGhlYWRlcnMgdG8gb3ZlcnJpZGUgb3IgcmVxdWVzdCBwYXJhbXMgZm9yIHF1ZXJ5IChvcHRpb25hbCkgZS5nIHt2ZXJzaW9uSWQ6XCIxMGZhOTk0Ni0zZjY0LTQxMzctYTU4Zi04ODgwNjVjMDczMmVcIn1cbiAgLy8gKiBgcmVxdWVzdERhdGVgIF9EYXRlXzogQSBkYXRlIG9iamVjdCwgdGhlIHVybCB3aWxsIGJlIGlzc3VlZCBhdCAob3B0aW9uYWwpXG4gIHByZXNpZ25lZEdldE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCByZXNwSGVhZGVycywgcmVxdWVzdERhdGUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihyZXNwSGVhZGVycykpIHtcbiAgICAgIGNiID0gcmVzcEhlYWRlcnNcbiAgICAgIHJlc3BIZWFkZXJzID0ge31cbiAgICAgIHJlcXVlc3REYXRlID0gbmV3IERhdGUoKVxuICAgIH1cblxuICAgIHZhciB2YWxpZFJlc3BIZWFkZXJzID0gW1xuICAgICAgJ3Jlc3BvbnNlLWNvbnRlbnQtdHlwZScsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1sYW5ndWFnZScsXG4gICAgICAncmVzcG9uc2UtZXhwaXJlcycsXG4gICAgICAncmVzcG9uc2UtY2FjaGUtY29udHJvbCcsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbicsXG4gICAgICAncmVzcG9uc2UtY29udGVudC1lbmNvZGluZycsXG4gICAgXVxuICAgIHZhbGlkUmVzcEhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICBpZiAocmVzcEhlYWRlcnMgIT09IHVuZGVmaW5lZCAmJiByZXNwSGVhZGVyc1toZWFkZXJdICE9PSB1bmRlZmluZWQgJiYgIWlzU3RyaW5nKHJlc3BIZWFkZXJzW2hlYWRlcl0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHJlc3BvbnNlIGhlYWRlciAke2hlYWRlcn0gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcImApXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5wcmVzaWduZWRVcmwoJ0dFVCcsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGV4cGlyZXMsIHJlc3BIZWFkZXJzLCByZXF1ZXN0RGF0ZSwgY2IpXG4gIH1cblxuICAvLyBHZW5lcmF0ZSBhIHByZXNpZ25lZCBVUkwgZm9yIFBVVC4gVXNpbmcgdGhpcyBVUkwsIHRoZSBicm93c2VyIGNhbiB1cGxvYWQgdG8gUzMgb25seSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG5hbWUuXG4gIC8vXG4gIC8vIF9fQXJndW1lbnRzX19cbiAgLy8gKiBgYnVja2V0TmFtZWAgX3N0cmluZ186IG5hbWUgb2YgdGhlIGJ1Y2tldFxuICAvLyAqIGBvYmplY3ROYW1lYCBfc3RyaW5nXzogbmFtZSBvZiB0aGUgb2JqZWN0XG4gIC8vICogYGV4cGlyeWAgX251bWJlcl86IGV4cGlyeSBpbiBzZWNvbmRzIChvcHRpb25hbCwgZGVmYXVsdCA3IGRheXMpXG4gIHByZXNpZ25lZFB1dE9iamVjdChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBleHBpcmVzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByZXNpZ25lZFVybCgnUFVUJywgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZXhwaXJlcywgY2IpXG4gIH1cblxuICAvLyByZXR1cm4gUG9zdFBvbGljeSBvYmplY3RcbiAgbmV3UG9zdFBvbGljeSgpIHtcbiAgICByZXR1cm4gbmV3IFBvc3RQb2xpY3koKVxuICB9XG5cbiAgLy8gcHJlc2lnbmVkUG9zdFBvbGljeSBjYW4gYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlIHdhbnQgbW9yZSBjb250cm9sIG9uIHRoZSB1cGxvYWQgdGhhbiB3aGF0XG4gIC8vIHByZXNpZ25lZFB1dE9iamVjdCgpIHByb3ZpZGVzLiBpLmUgVXNpbmcgcHJlc2lnbmVkUG9zdFBvbGljeSB3ZSB3aWxsIGJlIGFibGUgdG8gcHV0IHBvbGljeSByZXN0cmljdGlvbnNcbiAgLy8gb24gdGhlIG9iamVjdCdzIGBuYW1lYCBgYnVja2V0YCBgZXhwaXJ5YCBgQ29udGVudC1UeXBlYCBgQ29udGVudC1EaXNwb3NpdGlvbmAgYG1ldGFEYXRhYFxuICBwcmVzaWduZWRQb3N0UG9saWN5KHBvc3RQb2xpY3ksIGNiKSB7XG4gICAgaWYgKHRoaXMuYW5vbnltb3VzKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkFub255bW91c1JlcXVlc3RFcnJvcignUHJlc2lnbmVkIFBPU1QgcG9saWN5IGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIGFub255bW91cyByZXF1ZXN0cycpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocG9zdFBvbGljeSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Bvc3RQb2xpY3kgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHRoaXMuZ2V0QnVja2V0UmVnaW9uKHBvc3RQb2xpY3kuZm9ybURhdGEuYnVja2V0LCAoZSwgcmVnaW9uKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgdmFyIGRhdGVTdHIgPSBtYWtlRGF0ZUxvbmcoZGF0ZSlcblxuICAgICAgdGhpcy5jaGVja0FuZFJlZnJlc2hDcmVkcygpXG5cbiAgICAgIGlmICghcG9zdFBvbGljeS5wb2xpY3kuZXhwaXJhdGlvbikge1xuICAgICAgICAvLyAnZXhwaXJhdGlvbicgaXMgbWFuZGF0b3J5IGZpZWxkIGZvciBTMy5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgZXhwaXJhdGlvbiBkYXRlIG9mIDcgZGF5cy5cbiAgICAgICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGV4cGlyZXMuc2V0U2Vjb25kcygyNCAqIDYwICogNjAgKiA3KVxuICAgICAgICBwb3N0UG9saWN5LnNldEV4cGlyZXMoZXhwaXJlcylcbiAgICAgIH1cblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWRhdGUnLCBkYXRlU3RyXSlcbiAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LWRhdGUnXSA9IGRhdGVTdHJcblxuICAgICAgcG9zdFBvbGljeS5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJHgtYW16LWFsZ29yaXRobScsICdBV1M0LUhNQUMtU0hBMjU2J10pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1hbGdvcml0aG0nXSA9ICdBV1M0LUhNQUMtU0hBMjU2J1xuXG4gICAgICBwb3N0UG9saWN5LnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckeC1hbXotY3JlZGVudGlhbCcsIHRoaXMuYWNjZXNzS2V5ICsgJy8nICsgZ2V0U2NvcGUocmVnaW9uLCBkYXRlKV0pXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhWyd4LWFtei1jcmVkZW50aWFsJ10gPSB0aGlzLmFjY2Vzc0tleSArICcvJyArIGdldFNjb3BlKHJlZ2lvbiwgZGF0ZSlcblxuICAgICAgaWYgKHRoaXMuc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIHBvc3RQb2xpY3kucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyR4LWFtei1zZWN1cml0eS10b2tlbicsIHRoaXMuc2Vzc2lvblRva2VuXSlcbiAgICAgICAgcG9zdFBvbGljeS5mb3JtRGF0YVsneC1hbXotc2VjdXJpdHktdG9rZW4nXSA9IHRoaXMuc2Vzc2lvblRva2VuXG4gICAgICB9XG5cbiAgICAgIHZhciBwb2xpY3lCYXNlNjQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwb3N0UG9saWN5LnBvbGljeSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG4gICAgICBwb3N0UG9saWN5LmZvcm1EYXRhLnBvbGljeSA9IHBvbGljeUJhc2U2NFxuXG4gICAgICB2YXIgc2lnbmF0dXJlID0gcG9zdFByZXNpZ25TaWduYXR1cmVWNChyZWdpb24sIGRhdGUsIHRoaXMuc2VjcmV0S2V5LCBwb2xpY3lCYXNlNjQpXG5cbiAgICAgIHBvc3RQb2xpY3kuZm9ybURhdGFbJ3gtYW16LXNpZ25hdHVyZSddID0gc2lnbmF0dXJlXG4gICAgICB2YXIgb3B0cyA9IHt9XG4gICAgICBvcHRzLnJlZ2lvbiA9IHJlZ2lvblxuICAgICAgb3B0cy5idWNrZXROYW1lID0gcG9zdFBvbGljeS5mb3JtRGF0YS5idWNrZXRcbiAgICAgIHZhciByZXFPcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucyhvcHRzKVxuICAgICAgdmFyIHBvcnRTdHIgPSB0aGlzLnBvcnQgPT0gODAgfHwgdGhpcy5wb3J0ID09PSA0NDMgPyAnJyA6IGA6JHt0aGlzLnBvcnQudG9TdHJpbmcoKX1gXG4gICAgICB2YXIgdXJsU3RyID0gYCR7cmVxT3B0aW9ucy5wcm90b2NvbH0vLyR7cmVxT3B0aW9ucy5ob3N0fSR7cG9ydFN0cn0ke3JlcU9wdGlvbnMucGF0aH1gXG4gICAgICBjYihudWxsLCB7IHBvc3RVUkw6IHVybFN0ciwgZm9ybURhdGE6IHBvc3RQb2xpY3kuZm9ybURhdGEgfSlcbiAgICB9KVxuICB9XG5cbiAgLy8gQ2FsbHMgaW1wbGVtZW50ZWQgYmVsb3cgYXJlIHJlbGF0ZWQgdG8gbXVsdGlwYXJ0LlxuXG4gIC8vIEluaXRpYXRlIGEgbmV3IG11bHRpcGFydCB1cGxvYWQuXG4gIGluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QobWV0YURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoJ2NvbnRlbnRUeXBlIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgbGV0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBtZXRhRGF0YSlcbiAgICB2YXIgcXVlcnkgPSAndXBsb2FkcydcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzLmdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIoKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHVwbG9hZElkKSA9PiBjYihudWxsLCB1cGxvYWRJZCkpXG4gICAgfSlcbiAgfVxuXG4gIC8vIENvbXBsZXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLiBBZnRlciBhbGwgdGhlIHBhcnRzIGFyZSB1cGxvYWRlZCBpc3N1aW5nXG4gIC8vIHRoaXMgY2FsbCB3aWxsIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgb24gdGhlIHNlcnZlciBpbnRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIGV0YWdzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cGxvYWRJZCBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChldGFncykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwiQXJyYXlcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigndXBsb2FkSWQgY2Fubm90IGJlIGVtcHR5JylcbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ1BPU1QnXG4gICAgdmFyIHF1ZXJ5ID0gYHVwbG9hZElkPSR7dXJpRXNjYXBlKHVwbG9hZElkKX1gXG5cbiAgICB2YXIgcGFydHMgPSBbXVxuXG4gICAgZXRhZ3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIFBhcnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBQYXJ0TnVtYmVyOiBlbGVtZW50LnBhcnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFVGFnOiBlbGVtZW50LmV0YWcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHZhciBwYXlsb2FkT2JqZWN0ID0geyBDb21wbGV0ZU11bHRpcGFydFVwbG9hZDogcGFydHMgfVxuICAgIHZhciBwYXlsb2FkID0gWG1sKHBheWxvYWRPYmplY3QpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJDb2RlKSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBhcnQgQ29tcGxldGUgQVBJIHJldHVybnMgYW4gZXJyb3IgWE1MIGFmdGVyIGEgMjAwIGh0dHAgc3RhdHVzXG4gICAgICAgICAgICBjYihuZXcgZXJyb3JzLlMzRXJyb3IocmVzdWx0LmVyck1lc3NhZ2UpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZU11bHRpcGFydFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IobnVsbCwgY29tcGxldGVNdWx0aXBhcnRSZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvLyBHZXQgcGFydC1pbmZvIG9mIGFsbCBwYXJ0cyBvZiBhbiBpbmNvbXBsZXRlIHVwbG9hZCBzcGVjaWZpZWQgYnkgdXBsb2FkSWQuXG4gIGxpc3RQYXJ0cyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghdXBsb2FkSWQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwbG9hZElkIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgfVxuICAgIHZhciBwYXJ0cyA9IFtdXG4gICAgdmFyIGxpc3ROZXh0ID0gKG1hcmtlcikgPT4ge1xuICAgICAgdGhpcy5saXN0UGFydHNRdWVyeShidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgbWFya2VyLCAoZSwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgY2IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChyZXN1bHQucGFydHMpXG4gICAgICAgIGlmIChyZXN1bHQuaXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgICBsaXN0TmV4dChyZXN1bHQubWFya2VyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNiKG51bGwsIHBhcnRzKVxuICAgICAgfSlcbiAgICB9XG4gICAgbGlzdE5leHQoMClcbiAgfVxuXG4gIC8vIENhbGxlZCBieSBsaXN0UGFydHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBwYXJ0LWluZm9cbiAgbGlzdFBhcnRzUXVlcnkoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgdXBsb2FkSWQsIG1hcmtlciwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNOdW1iZXIobWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBpZiAoIXVwbG9hZElkKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd1cGxvYWRJZCBjYW5ub3QgYmUgZW1wdHknKVxuICAgIH1cbiAgICB2YXIgcXVlcnkgPSAnJ1xuICAgIGlmIChtYXJrZXIgJiYgbWFya2VyICE9PSAwKSB7XG4gICAgICBxdWVyeSArPSBgcGFydC1udW1iZXItbWFya2VyPSR7bWFya2VyfSZgXG4gICAgfVxuICAgIHF1ZXJ5ICs9IGB1cGxvYWRJZD0ke3VyaUVzY2FwZSh1cGxvYWRJZCl9YFxuXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cbiAgICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRMaXN0UGFydHNUcmFuc2Zvcm1lcigpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4gY2IobnVsbCwgZGF0YSkpXG4gICAgfSlcbiAgfVxuXG4gIC8vIENhbGxlZCBieSBsaXN0SW5jb21wbGV0ZVVwbG9hZHMgdG8gZmV0Y2ggYSBiYXRjaCBvZiBpbmNvbXBsZXRlIHVwbG9hZHMuXG4gIGxpc3RJbmNvbXBsZXRlVXBsb2Fkc1F1ZXJ5KGJ1Y2tldE5hbWUsIHByZWZpeCwga2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlciwgZGVsaW1pdGVyKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVmaXggc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoa2V5TWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2V5TWFya2VyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHVwbG9hZElkTWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXBsb2FkSWRNYXJrZXIgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcoZGVsaW1pdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGVsaW1pdGVyIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgIH1cbiAgICB2YXIgcXVlcmllcyA9IFtdXG4gICAgcXVlcmllcy5wdXNoKGBwcmVmaXg9JHt1cmlFc2NhcGUocHJlZml4KX1gKVxuICAgIHF1ZXJpZXMucHVzaChgZGVsaW1pdGVyPSR7dXJpRXNjYXBlKGRlbGltaXRlcil9YClcblxuICAgIGlmIChrZXlNYXJrZXIpIHtcbiAgICAgIGtleU1hcmtlciA9IHVyaUVzY2FwZShrZXlNYXJrZXIpXG4gICAgICBxdWVyaWVzLnB1c2goYGtleS1tYXJrZXI9JHtrZXlNYXJrZXJ9YClcbiAgICB9XG4gICAgaWYgKHVwbG9hZElkTWFya2VyKSB7XG4gICAgICBxdWVyaWVzLnB1c2goYHVwbG9hZC1pZC1tYXJrZXI9JHt1cGxvYWRJZE1hcmtlcn1gKVxuICAgIH1cblxuICAgIHZhciBtYXhVcGxvYWRzID0gMTAwMFxuICAgIHF1ZXJpZXMucHVzaChgbWF4LXVwbG9hZHM9JHttYXhVcGxvYWRzfWApXG4gICAgcXVlcmllcy5zb3J0KClcbiAgICBxdWVyaWVzLnVuc2hpZnQoJ3VwbG9hZHMnKVxuICAgIHZhciBxdWVyeSA9ICcnXG4gICAgaWYgKHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyaWVzLmpvaW4oJyYnKX1gXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnR0VUJ1xuICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmVtaXQoJ2Vycm9yJywgZSlcbiAgICAgIH1cbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgfSlcbiAgICByZXR1cm4gdHJhbnNmb3JtZXJcbiAgfVxuXG4gIC8vIEZpbmQgdXBsb2FkSWQgb2YgYW4gaW5jb21wbGV0ZSB1cGxvYWQuXG4gIGZpbmRVcGxvYWRJZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NiIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBsYXRlc3RVcGxvYWRcbiAgICB2YXIgbGlzdE5leHQgPSAoa2V5TWFya2VyLCB1cGxvYWRJZE1hcmtlcikgPT4ge1xuICAgICAgdGhpcy5saXN0SW5jb21wbGV0ZVVwbG9hZHNRdWVyeShidWNrZXROYW1lLCBvYmplY3ROYW1lLCBrZXlNYXJrZXIsIHVwbG9hZElkTWFya2VyLCAnJylcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC51cGxvYWRzLmZvckVhY2goKHVwbG9hZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVwbG9hZC5rZXkgPT09IG9iamVjdE5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCFsYXRlc3RVcGxvYWQgfHwgdXBsb2FkLmluaXRpYXRlZC5nZXRUaW1lKCkgPiBsYXRlc3RVcGxvYWQuaW5pdGlhdGVkLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIGxhdGVzdFVwbG9hZCA9IHVwbG9hZFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAocmVzdWx0LmlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBsaXN0TmV4dChyZXN1bHQubmV4dEtleU1hcmtlciwgcmVzdWx0Lm5leHRVcGxvYWRJZE1hcmtlcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF0ZXN0VXBsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbGF0ZXN0VXBsb2FkLnVwbG9hZElkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYihudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGxpc3ROZXh0KCcnLCAnJylcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB1cGxvYWRpbmcgb2JqZWN0cy5cbiAgLy8gSWYgbXVsdGlwYXJ0ID09PSB0cnVlLCBpdCByZXR1cm5zIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byB1cGxvYWRcbiAgLy8gYSBwYXJ0IG9mIHRoZSBtdWx0aXBhcnQuXG4gIGdldFVwbG9hZGVyKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIG1ldGFEYXRhLCBtdWx0aXBhcnQpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihtdWx0aXBhcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdWx0aXBhcnQgc2hvdWxkIGJlIG9mIHR5cGUgXCJib29sZWFuXCInKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KG1ldGFEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWV0YWRhdGEgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuXG4gICAgdmFyIHZhbGlkYXRlID0gKHN0cmVhbSwgbGVuZ3RoLCBzaGEyNTZzdW0sIG1kNXN1bSwgY2IpID0+IHtcbiAgICAgIGlmICghaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmVhbSBzaG91bGQgYmUgb2YgdHlwZSBcIlN0cmVhbVwiJylcbiAgICAgIH1cbiAgICAgIGlmICghaXNOdW1iZXIobGVuZ3RoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsZW5ndGggc2hvdWxkIGJlIG9mIHR5cGUgXCJudW1iZXJcIicpXG4gICAgICB9XG4gICAgICBpZiAoIWlzU3RyaW5nKHNoYTI1NnN1bSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2hhMjU2c3VtIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFpc1N0cmluZyhtZDVzdW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21kNXN1bSBzaG91bGQgYmUgb2YgdHlwZSBcInN0cmluZ1wiJylcbiAgICAgIH1cbiAgICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHNpbXBsZVVwbG9hZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHZhbGlkYXRlKC4uLmFyZ3MpXG4gICAgICB2YXIgcXVlcnkgPSAnJ1xuICAgICAgdXBsb2FkKHF1ZXJ5LCAuLi5hcmdzKVxuICAgIH1cbiAgICB2YXIgbXVsdGlwYXJ0VXBsb2FkZXIgPSAodXBsb2FkSWQsIHBhcnROdW1iZXIsIC4uLnJlc3QpID0+IHtcbiAgICAgIGlmICghaXNTdHJpbmcodXBsb2FkSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VwbG9hZElkIHNob3VsZCBiZSBvZiB0eXBlIFwic3RyaW5nXCInKVxuICAgICAgfVxuICAgICAgaWYgKCFpc051bWJlcihwYXJ0TnVtYmVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJ0TnVtYmVyIHNob3VsZCBiZSBvZiB0eXBlIFwibnVtYmVyXCInKVxuICAgICAgfVxuICAgICAgaWYgKCF1cGxvYWRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbXB0eSB1cGxvYWRJZCcpXG4gICAgICB9XG4gICAgICBpZiAoIXBhcnROdW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcigncGFydE51bWJlciBjYW5ub3QgYmUgMCcpXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZSguLi5yZXN0KVxuICAgICAgdmFyIHF1ZXJ5ID0gYHBhcnROdW1iZXI9JHtwYXJ0TnVtYmVyfSZ1cGxvYWRJZD0ke3VyaUVzY2FwZSh1cGxvYWRJZCl9YFxuICAgICAgdXBsb2FkKHF1ZXJ5LCAuLi5yZXN0KVxuICAgIH1cbiAgICB2YXIgdXBsb2FkID0gKHF1ZXJ5LCBzdHJlYW0sIGxlbmd0aCwgc2hhMjU2c3VtLCBtZDVzdW0sIGNiKSA9PiB7XG4gICAgICB2YXIgbWV0aG9kID0gJ1BVVCdcbiAgICAgIGxldCBoZWFkZXJzID0geyAnQ29udGVudC1MZW5ndGgnOiBsZW5ndGggfVxuXG4gICAgICBpZiAoIW11bHRpcGFydCkge1xuICAgICAgICBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgbWV0YURhdGEsIGhlYWRlcnMpXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5lbmFibGVTSEEyNTYpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IG1kNXN1bVxuICAgICAgfVxuICAgICAgdGhpcy5tYWtlUmVxdWVzdFN0cmVhbShcbiAgICAgICAgeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH0sXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgc2hhMjU2c3VtLFxuICAgICAgICBbMjAwXSxcbiAgICAgICAgJycsXG4gICAgICAgIHRydWUsXG4gICAgICAgIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IGdldFZlcnNpb25JZChyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICAgIGlmIChtdWx0aXBhcnQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBhcnRVcGxvYWRlclxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlVXBsb2FkZXJcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9ucyBpbiB0aGUgUzMgcHJvdmlkZXJcbiAgc2V0QnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNvbmZpZywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdGlmaWNhdGlvbiBjb25maWcgc2hvdWxkIGJlIG9mIHR5cGUgXCJPYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHZhciBtZXRob2QgPSAnUFVUJ1xuICAgIHZhciBxdWVyeSA9ICdub3RpZmljYXRpb24nXG4gICAgdmFyIGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdOb3RpZmljYXRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICB2YXIgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgcmVtb3ZlQWxsQnVja2V0Tm90aWZpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgdGhpcy5zZXRCdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgbmV3IE5vdGlmaWNhdGlvbkNvbmZpZygpLCBjYilcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgbGlzdCBvZiBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbnMgc3RvcmVkXG4gIC8vIGluIHRoZSBTMyBwcm92aWRlclxuICBnZXRCdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCdcbiAgICB2YXIgcXVlcnkgPSAnbm90aWZpY2F0aW9uJ1xuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKVxuICAgICAgdmFyIGJ1Y2tldE5vdGlmaWNhdGlvblxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcilcbiAgICAgICAgLm9uKCdkYXRhJywgKHJlc3VsdCkgPT4gKGJ1Y2tldE5vdGlmaWNhdGlvbiA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgYnVja2V0Tm90aWZpY2F0aW9uKSlcbiAgICB9KVxuICB9XG5cbiAgLy8gTGlzdGVucyBmb3IgYnVja2V0IG5vdGlmaWNhdGlvbnMuIFJldHVybnMgYW4gRXZlbnRFbWl0dGVyLlxuICBsaXN0ZW5CdWNrZXROb3RpZmljYXRpb24oYnVja2V0TmFtZSwgcHJlZml4LCBzdWZmaXgsIGV2ZW50cykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZTogJHtidWNrZXROYW1lfWApXG4gICAgfVxuICAgIGlmICghaXNTdHJpbmcocHJlZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZml4IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaW5nKHN1ZmZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N1ZmZpeCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V2ZW50cyBtdXN0IGJlIG9mIHR5cGUgQXJyYXknKVxuICAgIH1cbiAgICBsZXQgbGlzdGVuZXIgPSBuZXcgTm90aWZpY2F0aW9uUG9sbGVyKHRoaXMsIGJ1Y2tldE5hbWUsIHByZWZpeCwgc3VmZml4LCBldmVudHMpXG4gICAgbGlzdGVuZXIuc3RhcnQoKVxuXG4gICAgcmV0dXJuIGxpc3RlbmVyXG4gIH1cblxuICBnZXRCdWNrZXRWZXJzaW9uaW5nKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ3ZlcnNpb25pbmcnXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgdmVyc2lvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgdmVyc2lvbkNvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCB2ZXJzaW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzZXRCdWNrZXRWZXJzaW9uaW5nKGJ1Y2tldE5hbWUsIHZlcnNpb25Db25maWcsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFPYmplY3Qua2V5cyh2ZXJzaW9uQ29uZmlnKS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3ZlcnNpb25Db25maWcgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdQVVQnXG4gICAgdmFyIHF1ZXJ5ID0gJ3ZlcnNpb25pbmcnXG4gICAgdmFyIGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdWZXJzaW9uaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgdmFyIHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHZlcnNpb25Db25maWcpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIC8qKiBUbyBzZXQgVGFncyBvbiBhIGJ1Y2tldCBvciBvYmplY3QgYmFzZWQgb24gdGhlIHBhcmFtc1xuICAgKiAgX19Bcmd1bWVudHNfX1xuICAgKiB0YWdnaW5nUGFyYW1zIF9vYmplY3RfIFdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllc1xuICAgKiAgYnVja2V0TmFtZSBfc3RyaW5nXyxcbiAgICogIG9iamVjdE5hbWUgX3N0cmluZ18gKE9wdGlvbmFsKSxcbiAgICogIHRhZ3MgX29iamVjdF8gb2YgdGhlIGZvcm0geyc8dGFnLWtleS0xPic6Jzx0YWctdmFsdWUtMT4nLCc8dGFnLWtleS0yPic6Jzx0YWctdmFsdWUtMj4nfVxuICAgKiAgcHV0T3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqICBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBzZXRUYWdnaW5nKHRhZ2dpbmdQYXJhbXMpIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHRhZ3MsIHB1dE9wdHMgPSB7fSwgY2IgfSA9IHRhZ2dpbmdQYXJhbXNcbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICd0YWdnaW5nJ1xuXG4gICAgaWYgKHB1dE9wdHMgJiYgcHV0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke3B1dE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgdGFnc0xpc3QgPSBbXVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICB0YWdzTGlzdC5wdXNoKHsgS2V5OiBrZXksIFZhbHVlOiB2YWx1ZSB9KVxuICAgIH1cbiAgICBjb25zdCB0YWdnaW5nQ29uZmlnID0ge1xuICAgICAgVGFnZ2luZzoge1xuICAgICAgICBUYWdTZXQ6IHtcbiAgICAgICAgICBUYWc6IHRhZ3NMaXN0LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IGhlYWRsZXNzOiB0cnVlLCByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdCh0YWdnaW5nQ29uZmlnKVxuICAgIHBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShwYXlsb2FkKVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH1cblxuICAgIGlmIChvYmplY3ROYW1lKSB7XG4gICAgICByZXF1ZXN0T3B0aW9uc1snb2JqZWN0TmFtZSddID0gb2JqZWN0TmFtZVxuICAgIH1cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIHBheWxvYWQsIFsyMDBdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgLyoqIFNldCBUYWdzIG9uIGEgQnVja2V0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHNldEJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgdGFncywgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHRhZ3MpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heGltdW0gdGFncyBhbGxvd2VkIGlzIDEwXCInKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldFRhZ2dpbmcoeyBidWNrZXROYW1lLCB0YWdzLCBjYiB9KVxuICB9XG5cbiAgLyoqIFNldCBUYWdzIG9uIGFuIE9iamVjdFxuICAgKiBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogb2JqZWN0TmFtZSBfc3RyaW5nX1xuICAgKiAgKiB0YWdzIF9vYmplY3RfIG9mIHRoZSBmb3JtIHsnPHRhZy1rZXktMT4nOic8dGFnLXZhbHVlLTE+JywnPHRhZy1rZXktMj4nOic8dGFnLXZhbHVlLTI+J31cbiAgICogIHB1dE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9LFxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0T2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIG9iamVjdCBuYW1lOiAnICsgb2JqZWN0TmFtZSlcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihwdXRPcHRzKSkge1xuICAgICAgY2IgPSBwdXRPcHRzXG4gICAgICBwdXRPcHRzID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWlzT2JqZWN0KHRhZ3MpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCd0YWdzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ01heGltdW0gdGFncyBhbGxvd2VkIGlzIDEwXCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldFRhZ2dpbmcoeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB0YWdzLCBwdXRPcHRzLCBjYiB9KVxuICB9XG5cbiAgLyoqIFJlbW92ZSBUYWdzIG9uIGFuIEJ1Y2tldC9PYmplY3QgYmFzZWQgb24gcGFyYW1zXG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfIChvcHRpb25hbClcbiAgICogcmVtb3ZlT3B0cyBfb2JqZWN0XyAoT3B0aW9uYWwpIGUuZyB7dmVyc2lvbklkOlwibXktb2JqZWN0LXZlcnNpb24taWRcIn0sXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcmVtb3ZlT3B0cywgY2IgfSkge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgbGV0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG5cbiAgICBpZiAocmVtb3ZlT3B0cyAmJiBPYmplY3Qua2V5cyhyZW1vdmVPcHRzKS5sZW5ndGggJiYgcmVtb3ZlT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9JnZlcnNpb25JZD0ke3JlbW92ZU9wdHMudmVyc2lvbklkfWBcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnkgfVxuXG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwLCAyMDRdLCAnJywgdHJ1ZSwgY2IpXG4gIH1cblxuICAvKiogUmVtb3ZlIFRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYnVja2V0XG4gICAqICBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHJlbW92ZUJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW1vdmVUYWdnaW5nKHsgYnVja2V0TmFtZSwgY2IgfSlcbiAgfVxuXG4gIC8qKiBSZW1vdmUgdGFncyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0XG4gICAqIF9fQXJndW1lbnRzX19cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBvYmplY3ROYW1lIF9zdHJpbmdfXG4gICAqIHJlbW92ZU9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcuIHtWZXJzaW9uSUQ6XCJteS1vYmplY3QtdmVyc2lvbi1pZFwifVxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgcmVtb3ZlT2JqZWN0VGFnZ2luZyhidWNrZXROYW1lLCBvYmplY3ROYW1lLCByZW1vdmVPcHRzLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBvYmplY3QgbmFtZTogJyArIG9iamVjdE5hbWUpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlbW92ZU9wdHMpKSB7XG4gICAgICBjYiA9IHJlbW92ZU9wdHNcbiAgICAgIHJlbW92ZU9wdHMgPSB7fVxuICAgIH1cbiAgICBpZiAocmVtb3ZlT3B0cyAmJiBPYmplY3Qua2V5cyhyZW1vdmVPcHRzKS5sZW5ndGggJiYgIWlzT2JqZWN0KHJlbW92ZU9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZW1vdmVPcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlVGFnZ2luZyh7IGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJlbW92ZU9wdHMsIGNiIH0pXG4gIH1cblxuICAvKiogR2V0IFRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgQnVja2V0XG4gICAqICBfX0FyZ3VtZW50c19fXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGVycm9yLCB0YWdzKWAgX2Z1bmN0aW9uXyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYGVycmAgYXMgdGhlIGVycm9yIGFyZ3VtZW50LiBgZXJyYCBpcyBudWxsIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIGdldEJ1Y2tldFRhZ2dpbmcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMuZ2V0VGFnc1RyYW5zZm9ybWVyKClcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgbGV0IHRhZ3NMaXN0XG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAodGFnc0xpc3QgPSByZXN1bHQpKVxuICAgICAgICAub24oJ2Vycm9yJywgKGUpID0+IGNiKGUpKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRhZ3NMaXN0KSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEdldCB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggYSBidWNrZXQgT1IgYW4gb2JqZWN0XG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogb2JqZWN0TmFtZSBfc3RyaW5nXyAoT3B0aW9uYWwpXG4gICAqIGdldE9wdHMgX29iamVjdF8gKE9wdGlvbmFsKSBlLmcge3ZlcnNpb25JZDpcIm15LW9iamVjdC12ZXJzaW9uLWlkXCJ9XG4gICAqIGBjYihlcnJvciwgdGFncylgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBnZXRPYmplY3RUYWdnaW5nKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMgPSB7fSwgY2IgPSAoKSA9PiBmYWxzZSkge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3RhZ2dpbmcnXG5cbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgb2JqZWN0IG5hbWU6ICcgKyBvYmplY3ROYW1lKVxuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRzKSkge1xuICAgICAgY2IgPSBnZXRPcHRzXG4gICAgICBnZXRPcHRzID0ge31cbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignZ2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBpZiAoZ2V0T3B0cyAmJiBnZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgPSBgJHtxdWVyeX0mdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9XG4gICAgaWYgKG9iamVjdE5hbWUpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zWydvYmplY3ROYW1lJ10gPSBvYmplY3ROYW1lXG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVycy5nZXRUYWdzVHJhbnNmb3JtZXIoKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBsZXQgdGFnc0xpc3RcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXIpXG4gICAgICAgIC5vbignZGF0YScsIChyZXN1bHQpID0+ICh0YWdzTGlzdCA9IHJlc3VsdCkpXG4gICAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gY2IoZSkpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgdGFnc0xpc3QpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogcG9saWN5Q29uZmlnIF9vYmplY3RfIGEgdmFsaWQgcG9saWN5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgYXBwbHlCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgcG9saWN5Q29uZmlnLCBjYikge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuXG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ0xpZmVjeWNsZUNvbmZpZ3VyYXRpb24nLFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICB9KVxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChwb2xpY3lDb25maWcpXG4gICAgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHBheWxvYWQpXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogUmVtb3ZlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9mIGEgYnVja2V0LlxuICAgKiBidWNrZXROYW1lIF9zdHJpbmdfXG4gICAqIGBjYihlcnJvcilgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGBlcnJgIGFzIHRoZSBlcnJvciBhcmd1bWVudC4gYGVycmAgaXMgbnVsbCBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICByZW1vdmVCdWNrZXRMaWZlY3ljbGUoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2xpZmVjeWNsZSdcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKiogU2V0L092ZXJyaWRlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9uIGEgYnVja2V0LiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBlbXB0eSwgaXQgcmVtb3ZlcyB0aGUgY29uZmlndXJhdGlvbi5cbiAgICogYnVja2V0TmFtZSBfc3RyaW5nX1xuICAgKiBsaWZlQ3ljbGVDb25maWcgX29iamVjdF8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAobnVsbCBvciAnJykgdG8gcmVtb3ZlIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvbi4gb3IgYSB2YWxpZCBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKiBgY2IoZXJyb3IpYCBfZnVuY3Rpb25fIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBgZXJyYCBhcyB0aGUgZXJyb3IgYXJndW1lbnQuIGBlcnJgIGlzIG51bGwgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgKi9cbiAgc2V0QnVja2V0TGlmZWN5Y2xlKGJ1Y2tldE5hbWUsIGxpZmVDeWNsZUNvbmZpZyA9IG51bGwsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShsaWZlQ3ljbGVDb25maWcpKSB7XG4gICAgICB0aGlzLnJlbW92ZUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBseUJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBsaWZlQ3ljbGVDb25maWcsIGNiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXQuXG4gICAqIGJ1Y2tldE5hbWUgX3N0cmluZ19cbiAgICogYGNiKGNvbmZpZylgIF9mdW5jdGlvbl8gLSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGFzIHRoZSBlcnJvciBhcmd1bWVudC5cbiAgICovXG4gIGdldEJ1Y2tldExpZmVjeWNsZShidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgY29uc3QgcXVlcnkgPSAnbGlmZWN5Y2xlJ1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnMubGlmZWN5Y2xlVHJhbnNmb3JtZXIoKVxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG4gICAgICBsZXQgbGlmZWN5Y2xlQ29uZmlnXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVyKVxuICAgICAgICAub24oJ2RhdGEnLCAocmVzdWx0KSA9PiAobGlmZWN5Y2xlQ29uZmlnID0gcmVzdWx0KSlcbiAgICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBjYihlKSlcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiBjYihudWxsLCBsaWZlY3ljbGVDb25maWcpKVxuICAgIH0pXG4gIH1cblxuICBzZXRPYmplY3RMb2NrQ29uZmlnKGJ1Y2tldE5hbWUsIGxvY2tDb25maWdPcHRzID0ge30sIGNiKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uTW9kZXMgPSBbUkVURU5USU9OX01PREVTLkNPTVBMSUFOQ0UsIFJFVEVOVElPTl9NT0RFUy5HT1ZFUk5BTkNFXVxuICAgIGNvbnN0IHZhbGlkVW5pdHMgPSBbUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLkRBWVMsIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSU11cblxuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGxvY2tDb25maWdPcHRzLm1vZGUgJiYgIXJldGVudGlvbk1vZGVzLmluY2x1ZGVzKGxvY2tDb25maWdPcHRzLm1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBsb2NrQ29uZmlnT3B0cy5tb2RlIHNob3VsZCBiZSBvbmUgb2YgJHtyZXRlbnRpb25Nb2Rlc31gKVxuICAgIH1cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMudW5pdCAmJiAhdmFsaWRVbml0cy5pbmNsdWRlcyhsb2NrQ29uZmlnT3B0cy51bml0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgbG9ja0NvbmZpZ09wdHMudW5pdCBzaG91bGQgYmUgb25lIG9mICR7dmFsaWRVbml0c31gKVxuICAgIH1cbiAgICBpZiAobG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgJiYgIWlzTnVtYmVyKGxvY2tDb25maWdPcHRzLnZhbGlkaXR5KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgbG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgc2hvdWxkIGJlIGEgbnVtYmVyYClcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUFVUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ29iamVjdC1sb2NrJ1xuXG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIE9iamVjdExvY2tFbmFibGVkOiAnRW5hYmxlZCcsXG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhsb2NrQ29uZmlnT3B0cylcbiAgICAvLyBDaGVjayBpZiBrZXlzIGFyZSBwcmVzZW50IGFuZCBhbGwga2V5cyBhcmUgcHJlc2VudC5cbiAgICBpZiAoY29uZmlnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXy5kaWZmZXJlbmNlKGNvbmZpZ0tleXMsIFsndW5pdCcsICdtb2RlJywgJ3ZhbGlkaXR5J10pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBsb2NrQ29uZmlnT3B0cy5tb2RlLGxvY2tDb25maWdPcHRzLnVuaXQsbG9ja0NvbmZpZ09wdHMudmFsaWRpdHkgYWxsIHRoZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzcGVjaWZpZWQuYCxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnLlJ1bGUgPSB7XG4gICAgICAgICAgRGVmYXVsdFJldGVudGlvbjoge30sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2tDb25maWdPcHRzLm1vZGUpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLk1vZGUgPSBsb2NrQ29uZmlnT3B0cy5tb2RlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2tDb25maWdPcHRzLnVuaXQgPT09IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5EQVlTKSB7XG4gICAgICAgICAgY29uZmlnLlJ1bGUuRGVmYXVsdFJldGVudGlvbi5EYXlzID0gbG9ja0NvbmZpZ09wdHMudmFsaWRpdHlcbiAgICAgICAgfSBlbHNlIGlmIChsb2NrQ29uZmlnT3B0cy51bml0ID09PSBSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuWUVBUlMpIHtcbiAgICAgICAgICBjb25maWcuUnVsZS5EZWZhdWx0UmV0ZW50aW9uLlllYXJzID0gbG9ja0NvbmZpZ09wdHMudmFsaWRpdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoe1xuICAgICAgcm9vdE5hbWU6ICdPYmplY3RMb2NrQ29uZmlndXJhdGlvbicsXG4gICAgICByZW5kZXJPcHRzOiB7IHByZXR0eTogZmFsc2UgfSxcbiAgICAgIGhlYWRsZXNzOiB0cnVlLFxuICAgIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldE9iamVjdExvY2tDb25maWcoYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ29iamVjdC1sb2NrJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IG9iamVjdExvY2tDb25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdExvY2tUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIG9iamVjdExvY2tDb25maWcgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgb2JqZWN0TG9ja0NvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHV0T2JqZWN0UmV0ZW50aW9uKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHJldGVudGlvbk9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHJldGVudGlvbk9wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXRlbnRpb25PcHRzIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzICYmICFpc0Jvb2xlYW4ocmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBnb3Zlcm5hbmNlQnlwYXNzJywgcmV0ZW50aW9uT3B0cy5nb3Zlcm5hbmNlQnlwYXNzKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZXRlbnRpb25PcHRzLm1vZGUgJiZcbiAgICAgICAgIVtSRVRFTlRJT05fTU9ERVMuQ09NUExJQU5DRSwgUkVURU5USU9OX01PREVTLkdPVkVSTkFOQ0VdLmluY2x1ZGVzKHJldGVudGlvbk9wdHMubW9kZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIG9iamVjdCByZXRlbnRpb24gbW9kZSAnLCByZXRlbnRpb25PcHRzLm1vZGUpXG4gICAgICB9XG4gICAgICBpZiAocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUgJiYgIWlzU3RyaW5nKHJldGVudGlvbk9wdHMucmV0YWluVW50aWxEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciByZXRhaW5VbnRpbERhdGUnLCByZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZSlcbiAgICAgIH1cbiAgICAgIGlmIChyZXRlbnRpb25PcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcocmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHZlcnNpb25JZCcsIHJldGVudGlvbk9wdHMudmVyc2lvbklkKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3JldGVudGlvbidcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGlmIChyZXRlbnRpb25PcHRzLmdvdmVybmFuY2VCeXBhc3MpIHtcbiAgICAgIGhlYWRlcnNbJ1gtQW16LUJ5cGFzcy1Hb3Zlcm5hbmNlLVJldGVudGlvbiddID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoeyByb290TmFtZTogJ1JldGVudGlvbicsIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuICAgIGNvbnN0IHBhcmFtcyA9IHt9XG5cbiAgICBpZiAocmV0ZW50aW9uT3B0cy5tb2RlKSB7XG4gICAgICBwYXJhbXMuTW9kZSA9IHJldGVudGlvbk9wdHMubW9kZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uT3B0cy5yZXRhaW5VbnRpbERhdGUpIHtcbiAgICAgIHBhcmFtcy5SZXRhaW5VbnRpbERhdGUgPSByZXRlbnRpb25PcHRzLnJldGFpblVudGlsRGF0ZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uT3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7cmV0ZW50aW9uT3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChwYXJhbXMpXG5cbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdG9NZDUocGF5bG9hZClcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwLCAyMDRdLCAnJywgZmFsc2UsIGNiKVxuICB9XG5cbiAgZ2V0T2JqZWN0UmV0ZW50aW9uKGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIGdldE9wdHMsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgfSBlbHNlIGlmIChnZXRPcHRzLnZlcnNpb25JZCAmJiAhaXNTdHJpbmcoZ2V0T3B0cy52ZXJzaW9uSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdWZXJzaW9uSUQgc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgfVxuICAgIGlmIChjYiAmJiAhaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdHRVQnXG4gICAgbGV0IHF1ZXJ5ID0gJ3JldGVudGlvbidcbiAgICBpZiAoZ2V0T3B0cy52ZXJzaW9uSWQpIHtcbiAgICAgIHF1ZXJ5ICs9IGAmdmVyc2lvbklkPSR7Z2V0T3B0cy52ZXJzaW9uSWR9YFxuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCByZXRlbnRpb25Db25maWcgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0ZW50aW9uQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHJldGVudGlvbkNvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2V0QnVja2V0RW5jcnlwdGlvbihidWNrZXROYW1lLCBlbmNyeXB0aW9uQ29uZmlnLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oZW5jcnlwdGlvbkNvbmZpZykpIHtcbiAgICAgIGNiID0gZW5jcnlwdGlvbkNvbmZpZ1xuICAgICAgZW5jcnlwdGlvbkNvbmZpZyA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlbmNyeXB0aW9uQ29uZmlnKSAmJiBlbmNyeXB0aW9uQ29uZmlnLlJ1bGUubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBSdWxlIGxlbmd0aC4gT25seSBvbmUgcnVsZSBpcyBhbGxvd2VkLjogJyArIGVuY3J5cHRpb25Db25maWcuUnVsZSlcbiAgICB9XG4gICAgaWYgKGNiICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBsZXQgZW5jcnlwdGlvbk9iaiA9IGVuY3J5cHRpb25Db25maWdcbiAgICBpZiAoXy5pc0VtcHR5KGVuY3J5cHRpb25Db25maWcpKSB7XG4gICAgICBlbmNyeXB0aW9uT2JqID0ge1xuICAgICAgICAvLyBEZWZhdWx0IE1pbklPIFNlcnZlciBTdXBwb3J0ZWQgUnVsZVxuICAgICAgICBSdWxlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgQXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDoge1xuICAgICAgICAgICAgICBTU0VBbGdvcml0aG06ICdBRVMyNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtZXRob2QgPSAnUFVUJ1xuICAgIGxldCBxdWVyeSA9ICdlbmNyeXB0aW9uJ1xuICAgIGxldCBidWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtcbiAgICAgIHJvb3ROYW1lOiAnU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBsZXQgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoZW5jcnlwdGlvbk9iailcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRCdWNrZXRFbmNyeXB0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdlbmNyeXB0aW9uJ1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICByZXR1cm4gY2IoZSlcbiAgICAgIH1cblxuICAgICAgbGV0IGJ1Y2tldEVuY0NvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMuYnVja2V0RW5jcnlwdGlvblRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgYnVja2V0RW5jQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIGJ1Y2tldEVuY0NvbmZpZylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG4gIHJlbW92ZUJ1Y2tldEVuY3J5cHRpb24oYnVja2V0TmFtZSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgYnVja2V0IG5hbWU6ICcgKyBidWNrZXROYW1lKVxuICAgIH1cbiAgICBpZiAoIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdjYWxsYmFjayBzaG91bGQgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2VuY3J5cHRpb24nXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSB9LCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBzZXRCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lLCByZXBsaWNhdGlvbkNvbmZpZyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVwbGljYXRpb25Db25maWcpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdyZXBsaWNhdGlvbkNvbmZpZyBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5yb2xlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdSb2xlIGNhbm5vdCBiZSBlbXB0eScpXG4gICAgICB9IGVsc2UgaWYgKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUgJiYgIWlzU3RyaW5nKHJlcGxpY2F0aW9uQ29uZmlnLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJvbGUnLCByZXBsaWNhdGlvbkNvbmZpZy5yb2xlKVxuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShyZXBsaWNhdGlvbkNvbmZpZy5ydWxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTWluaW11bSBvbmUgcmVwbGljYXRpb24gcnVsZSBtdXN0IGJlIHNwZWNpZmllZCcpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBjb25zdCByZXBsaWNhdGlvblBhcmFtc0NvbmZpZyA9IHtcbiAgICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBSb2xlOiByZXBsaWNhdGlvbkNvbmZpZy5yb2xlLFxuICAgICAgICBSdWxlOiByZXBsaWNhdGlvbkNvbmZpZy5ydWxlcyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LCBoZWFkbGVzczogdHJ1ZSB9KVxuXG4gICAgbGV0IHBheWxvYWQgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KHJlcGxpY2F0aW9uUGFyYW1zQ29uZmlnKVxuXG4gICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHRvTWQ1KHBheWxvYWQpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBxdWVyeSwgaGVhZGVycyB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIGZhbHNlLCBjYilcbiAgfVxuXG4gIGdldEJ1Y2tldFJlcGxpY2F0aW9uKGJ1Y2tldE5hbWUsIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gJ0dFVCdcbiAgICBjb25zdCBxdWVyeSA9ICdyZXBsaWNhdGlvbidcblxuICAgIHRoaXMubWFrZVJlcXVlc3QoeyBtZXRob2QsIGJ1Y2tldE5hbWUsIHF1ZXJ5IH0sICcnLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCByZXBsaWNhdGlvbkNvbmZpZyA9IEJ1ZmZlci5mcm9tKCcnKVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMucmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJlcGxpY2F0aW9uQ29uZmlnID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgY2IpXG4gICAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNiKG51bGwsIHJlcGxpY2F0aW9uQ29uZmlnKVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZW1vdmVCdWNrZXRSZXBsaWNhdGlvbihidWNrZXROYW1lLCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnXG4gICAgY29uc3QgcXVlcnkgPSAncmVwbGljYXRpb24nXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgcXVlcnkgfSwgJycsIFsyMDAsIDIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICBnZXRPYmplY3RMZWdhbEhvbGQoYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgZ2V0T3B0cyA9IHt9LCBjYikge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBidWNrZXQgbmFtZTogJyArIGJ1Y2tldE5hbWUpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUob2JqZWN0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBvYmplY3QgbmFtZTogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0cykpIHtcbiAgICAgIGNiID0gZ2V0T3B0c1xuICAgICAgZ2V0T3B0cyA9IHt9XG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChnZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIk9iamVjdFwiJylcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKGdldE9wdHMpLmxlbmd0aCA+IDAgJiYgZ2V0T3B0cy52ZXJzaW9uSWQgJiYgIWlzU3RyaW5nKGdldE9wdHMudmVyc2lvbklkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmVyc2lvbklkIHNob3VsZCBiZSBvZiB0eXBlIHN0cmluZy46JywgZ2V0T3B0cy52ZXJzaW9uSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnR0VUJ1xuICAgIGxldCBxdWVyeSA9ICdsZWdhbC1ob2xkJ1xuXG4gICAgaWYgKGdldE9wdHMudmVyc2lvbklkKSB7XG4gICAgICBxdWVyeSArPSBgJnZlcnNpb25JZD0ke2dldE9wdHMudmVyc2lvbklkfWBcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuXG4gICAgICBsZXQgbGVnYWxIb2xkQ29uZmlnID0gQnVmZmVyLmZyb20oJycpXG4gICAgICBwaXBlc2V0dXAocmVzcG9uc2UsIHRyYW5zZm9ybWVycy5vYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGxlZ2FsSG9sZENvbmZpZyA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGNiKVxuICAgICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjYihudWxsLCBsZWdhbEhvbGRDb25maWcpXG4gICAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHNldE9iamVjdExlZ2FsSG9sZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCBzZXRPcHRzID0ge30sIGNiKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIGJ1Y2tldCBuYW1lOiAnICsgYnVja2V0TmFtZSlcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lOiAke29iamVjdE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgIHN0YXR1czogTEVHQUxfSE9MRF9TVEFUVVMuRU5BQkxFRCxcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24oc2V0T3B0cykpIHtcbiAgICAgIGNiID0gc2V0T3B0c1xuICAgICAgc2V0T3B0cyA9IGRlZmF1bHRPcHRzXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChzZXRPcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2V0T3B0cyBzaG91bGQgYmUgb2YgdHlwZSBcIk9iamVjdFwiJylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFbTEVHQUxfSE9MRF9TVEFUVVMuRU5BQkxFRCwgTEVHQUxfSE9MRF9TVEFUVVMuRElTQUJMRURdLmluY2x1ZGVzKHNldE9wdHMuc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0YXR1czogJyArIHNldE9wdHMuc3RhdHVzKVxuICAgICAgfVxuICAgICAgaWYgKHNldE9wdHMudmVyc2lvbklkICYmICFzZXRPcHRzLnZlcnNpb25JZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmVyc2lvbklkIHNob3VsZCBiZSBvZiB0eXBlIHN0cmluZy46JyArIHNldE9wdHMudmVyc2lvbklkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eShzZXRPcHRzKSkge1xuICAgICAgc2V0T3B0cyA9IHtcbiAgICAgICAgZGVmYXVsdE9wdHMsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSAnbGVnYWwtaG9sZCdcblxuICAgIGlmIChzZXRPcHRzLnZlcnNpb25JZCkge1xuICAgICAgcXVlcnkgKz0gYCZ2ZXJzaW9uSWQ9JHtzZXRPcHRzLnZlcnNpb25JZH1gXG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIFN0YXR1czogc2V0T3B0cy5zdGF0dXMsXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7IHJvb3ROYW1lOiAnTGVnYWxIb2xkJywgcmVuZGVyT3B0czogeyBwcmV0dHk6IGZhbHNlIH0sIGhlYWRsZXNzOiB0cnVlIH0pXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QoY29uZmlnKVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB0b01kNShwYXlsb2FkKVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdCh7IG1ldGhvZCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcXVlcnksIGhlYWRlcnMgfSwgcGF5bG9hZCwgWzIwMF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgTWV0aG9kIHRvIGFib3J0IGEgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IGluIGNhc2Ugb2YgYW55IGVycm9ycy5cbiAgICogQHBhcmFtIGJ1Y2tldE5hbWUgX19zdHJpbmdfXyBCdWNrZXQgTmFtZVxuICAgKiBAcGFyYW0gb2JqZWN0TmFtZSBfX3N0cmluZ19fIE9iamVjdCBOYW1lXG4gICAqIEBwYXJhbSB1cGxvYWRJZCBfX3N0cmluZ19fIGlkIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCB0byBjYW5jZWwgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0IHNlcXVlbmNlLlxuICAgKiBAcGFyYW0gY2IgX19mdW5jdGlvbl9fIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBhYm9ydE11bHRpcGFydFVwbG9hZChidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJZCwgY2IpIHtcbiAgICBjb25zdCBtZXRob2QgPSAnREVMRVRFJ1xuICAgIGxldCBxdWVyeSA9IGB1cGxvYWRJZD0ke3VwbG9hZElkfWBcblxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWU6IG9iamVjdE5hbWUsIHF1ZXJ5IH1cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAnJywgWzIwNF0sICcnLCBmYWxzZSwgY2IpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHVwbG9hZCBhIHBhcnQgZHVyaW5nIGNvbXBvc2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gcGFydENvbmZpZyBfX29iamVjdF9fIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcuXG4gICAqICAgIGJ1Y2tldE5hbWUgX19zdHJpbmdfX1xuICAgKiAgICBvYmplY3ROYW1lIF9fc3RyaW5nX19cbiAgICogICAgdXBsb2FkSUQgX19zdHJpbmdfX1xuICAgKiAgICBwYXJ0TnVtYmVyIF9fbnVtYmVyX19cbiAgICogICAgaGVhZGVycyBfX29iamVjdF9fXG4gICAqIEBwYXJhbSBjYiBjYWxsZWQgd2l0aCBudWxsIGluY2FzZSBvZiBlcnJvci5cbiAgICovXG4gIHVwbG9hZFBhcnRDb3B5KHBhcnRDb25maWcsIGNiKSB7XG4gICAgY29uc3QgeyBidWNrZXROYW1lLCBvYmplY3ROYW1lLCB1cGxvYWRJRCwgcGFydE51bWJlciwgaGVhZGVycyB9ID0gcGFydENvbmZpZ1xuXG4gICAgY29uc3QgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgcXVlcnkgPSBgdXBsb2FkSWQ9JHt1cGxvYWRJRH0mcGFydE51bWJlcj0ke3BhcnROdW1iZXJ9YFxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0geyBtZXRob2QsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWU6IG9iamVjdE5hbWUsIHF1ZXJ5LCBoZWFkZXJzIH1cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGUsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBsZXQgcGFydENvcHlSZXN1bHQgPSBCdWZmZXIuZnJvbSgnJylcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIHJldHVybiBjYihlKVxuICAgICAgfVxuICAgICAgcGlwZXNldHVwKHJlc3BvbnNlLCB0cmFuc2Zvcm1lcnMudXBsb2FkUGFydFRyYW5zZm9ybWVyKCkpXG4gICAgICAgIC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgcGFydENvcHlSZXN1bHQgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgbGV0IHVwbG9hZFBhcnRDb3B5UmVzID0ge1xuICAgICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHBhcnRDb3B5UmVzdWx0LkVUYWcpLFxuICAgICAgICAgICAga2V5OiBvYmplY3ROYW1lLFxuICAgICAgICAgICAgcGFydDogcGFydE51bWJlcixcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYihudWxsLCB1cGxvYWRQYXJ0Q29weVJlcylcbiAgICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29tcG9zZU9iamVjdChkZXN0T2JqQ29uZmlnID0ge30sIHNvdXJjZU9iakxpc3QgPSBbXSwgY2IpIHtcbiAgICBjb25zdCBtZSA9IHRoaXMgLy8gbWFueSBhc3luYyBmbG93cy4gc28gc3RvcmUgdGhlIHJlZi5cbiAgICBjb25zdCBzb3VyY2VGaWxlc0xlbmd0aCA9IHNvdXJjZU9iakxpc3QubGVuZ3RoXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlT2JqTGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NvdXJjZUNvbmZpZyBzaG91bGQgYW4gYXJyYXkgb2YgQ29weVNvdXJjZU9wdGlvbnMgJylcbiAgICB9XG4gICAgaWYgKCEoZGVzdE9iakNvbmZpZyBpbnN0YW5jZW9mIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdkZXN0Q29uZmlnIHNob3VsZCBvZiB0eXBlIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMgJylcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRmlsZXNMZW5ndGggPCAxIHx8IHNvdXJjZUZpbGVzTGVuZ3RoID4gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVFNfQ09VTlQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBcIlRoZXJlIG11c3QgYmUgYXMgbGVhc3Qgb25lIGFuZCB1cCB0byAke1BBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UfSBzb3VyY2Ugb2JqZWN0cy5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICghaXNGdW5jdGlvbihjYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlc0xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXNvdXJjZU9iakxpc3RbaV0udmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlc3RPYmpDb25maWcudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3RhdE9wdGlvbnMgPSAoc3JjQ29uZmlnKSA9PiB7XG4gICAgICBsZXQgc3RhdE9wdHMgPSB7fVxuICAgICAgaWYgKCFfLmlzRW1wdHkoc3JjQ29uZmlnLlZlcnNpb25JRCkpIHtcbiAgICAgICAgc3RhdE9wdHMgPSB7XG4gICAgICAgICAgdmVyc2lvbklkOiBzcmNDb25maWcuVmVyc2lvbklELFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdE9wdHNcbiAgICB9XG4gICAgY29uc3Qgc3JjT2JqZWN0U2l6ZXMgPSBbXVxuICAgIGxldCB0b3RhbFNpemUgPSAwXG4gICAgbGV0IHRvdGFsUGFydHMgPSAwXG5cbiAgICBjb25zdCBzb3VyY2VPYmpTdGF0cyA9IHNvdXJjZU9iakxpc3QubWFwKChzcmNJdGVtKSA9PlxuICAgICAgbWUuc3RhdE9iamVjdChzcmNJdGVtLkJ1Y2tldCwgc3JjSXRlbS5PYmplY3QsIGdldFN0YXRPcHRpb25zKHNyY0l0ZW0pKSxcbiAgICApXG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc291cmNlT2JqU3RhdHMpXG4gICAgICAudGhlbigoc3JjT2JqZWN0SW5mb3MpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkU3RhdHMgPSBzcmNPYmplY3RJbmZvcy5tYXAoKHJlc0l0ZW1TdGF0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY0NvbmZpZyA9IHNvdXJjZU9iakxpc3RbaW5kZXhdXG5cbiAgICAgICAgICBsZXQgc3JjQ29weVNpemUgPSByZXNJdGVtU3RhdC5zaXplXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBzZWdtZW50IGlzIHNwZWNpZmllZCwgYW5kIGlmIHNvLCBpcyB0aGVcbiAgICAgICAgICAvLyBzZWdtZW50IHdpdGhpbiBvYmplY3QgYm91bmRzP1xuICAgICAgICAgIGlmIChzcmNDb25maWcuTWF0Y2hSYW5nZSkge1xuICAgICAgICAgICAgLy8gU2luY2UgcmFuZ2UgaXMgc3BlY2lmaWVkLFxuICAgICAgICAgICAgLy8gICAgMCA8PSBzcmMuc3JjU3RhcnQgPD0gc3JjLnNyY0VuZFxuICAgICAgICAgICAgLy8gc28gb25seSBpbnZhbGlkIGNhc2UgdG8gY2hlY2sgaXM6XG4gICAgICAgICAgICBjb25zdCBzcmNTdGFydCA9IHNyY0NvbmZpZy5TdGFydFxuICAgICAgICAgICAgY29uc3Qgc3JjRW5kID0gc3JjQ29uZmlnLkVuZFxuICAgICAgICAgICAgaWYgKHNyY0VuZCA+PSBzcmNDb3B5U2l6ZSB8fCBzcmNTdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29weVNyY09wdGlvbnMgJHtpbmRleH0gaGFzIGludmFsaWQgc2VnbWVudC10by1jb3B5IFske3NyY1N0YXJ0fSwgJHtzcmNFbmR9XSAoc2l6ZSBpcyAke3NyY0NvcHlTaXplfSlgLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcmNDb3B5U2l6ZSA9IHNyY0VuZCAtIHNyY1N0YXJ0ICsgMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9ubHkgdGhlIGxhc3Qgc291cmNlIG1heSBiZSBsZXNzIHRoYW4gYGFic01pblBhcnRTaXplYFxuICAgICAgICAgIGlmIChzcmNDb3B5U2l6ZSA8IFBBUlRfQ09OU1RSQUlOVFMuQUJTX01JTl9QQVJUX1NJWkUgJiYgaW5kZXggPCBzb3VyY2VGaWxlc0xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBDb3B5U3JjT3B0aW9ucyAke2luZGV4fSBpcyB0b28gc21hbGwgKCR7c3JjQ29weVNpemV9KSBhbmQgaXQgaXMgbm90IHRoZSBsYXN0IHBhcnQuYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJcyBkYXRhIHRvIGNvcHkgdG9vIGxhcmdlP1xuICAgICAgICAgIHRvdGFsU2l6ZSArPSBzcmNDb3B5U2l6ZVxuICAgICAgICAgIGlmICh0b3RhbFNpemUgPiBQQVJUX0NPTlNUUkFJTlRTLk1BWF9NVUxUSVBBUlRfUFVUX09CSkVDVF9TSVpFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBDYW5ub3QgY29tcG9zZSBhbiBvYmplY3Qgb2Ygc2l6ZSAke3RvdGFsU2l6ZX0gKD4gNVRpQilgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHJlY29yZCBzb3VyY2Ugc2l6ZVxuICAgICAgICAgIHNyY09iamVjdFNpemVzW2luZGV4XSA9IHNyY0NvcHlTaXplXG5cbiAgICAgICAgICAvLyBjYWxjdWxhdGUgcGFydHMgbmVlZGVkIGZvciBjdXJyZW50IHNvdXJjZVxuICAgICAgICAgIHRvdGFsUGFydHMgKz0gcGFydHNSZXF1aXJlZChzcmNDb3B5U2l6ZSlcbiAgICAgICAgICAvLyBEbyB3ZSBuZWVkIG1vcmUgcGFydHMgdGhhbiB3ZSBhcmUgYWxsb3dlZD9cbiAgICAgICAgICBpZiAodG90YWxQYXJ0cyA+IFBBUlRfQ09OU1RSQUlOVFMuTUFYX1BBUlRTX0NPVU5UKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgICBgWW91ciBwcm9wb3NlZCBjb21wb3NlIG9iamVjdCByZXF1aXJlcyBtb3JlIHRoYW4gJHtQQVJUX0NPTlNUUkFJTlRTLk1BWF9QQVJUU19DT1VOVH0gcGFydHNgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXNJdGVtU3RhdFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgodG90YWxQYXJ0cyA9PT0gMSAmJiB0b3RhbFNpemUgPD0gUEFSVF9DT05TVFJBSU5UUy5NQVhfUEFSVF9TSVpFKSB8fCB0b3RhbFNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5T2JqZWN0KHNvdXJjZU9iakxpc3RbMF0sIGRlc3RPYmpDb25maWcsIGNiKSAvLyB1c2UgY29weU9iamVjdFYyXG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmVzZXJ2ZSBldGFnIHRvIGF2b2lkIG1vZGlmaWNhdGlvbiBvZiBvYmplY3Qgd2hpbGUgY29weWluZy5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc291cmNlT2JqTGlzdFtpXS5NYXRjaEVUYWcgPSB2YWxpZGF0ZWRTdGF0c1tpXS5ldGFnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFBhcnRTaXplTGlzdCA9IHZhbGlkYXRlZFN0YXRzLm1hcCgocmVzSXRlbVN0YXQsIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbFNpemUgPSBjYWxjdWxhdGVFdmVuU3BsaXRzKHNyY09iamVjdFNpemVzW2lkeF0sIHNvdXJjZU9iakxpc3RbaWR4XSlcbiAgICAgICAgICByZXR1cm4gY2FsU2l6ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldFVwbG9hZFBhcnRDb25maWdMaXN0KHVwbG9hZElkKSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkUGFydENvbmZpZ0xpc3QgPSBbXVxuXG4gICAgICAgICAgc3BsaXRQYXJ0U2l6ZUxpc3QuZm9yRWFjaCgoc3BsaXRTaXplLCBzcGxpdEluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0SW5kZXg6IHN0YXJ0SWR4LCBlbmRJbmRleDogZW5kSWR4LCBvYmpJbmZvOiBvYmpDb25maWcgfSA9IHNwbGl0U2l6ZVxuXG4gICAgICAgICAgICBsZXQgcGFydEluZGV4ID0gc3BsaXRJbmRleCArIDEgLy8gcGFydCBpbmRleCBzdGFydHMgZnJvbSAxLlxuICAgICAgICAgICAgY29uc3QgdG90YWxVcGxvYWRzID0gQXJyYXkuZnJvbShzdGFydElkeClcblxuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHNvdXJjZU9iakxpc3Rbc3BsaXRJbmRleF0uZ2V0SGVhZGVycygpXG5cbiAgICAgICAgICAgIHRvdGFsVXBsb2Fkcy5mb3JFYWNoKChzcGxpdFN0YXJ0LCB1cGxkQ3RySWR4KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBzcGxpdEVuZCA9IGVuZElkeFt1cGxkQ3RySWR4XVxuXG4gICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9iaiA9IGAke29iakNvbmZpZy5CdWNrZXR9LyR7b2JqQ29uZmlnLk9iamVjdH1gXG4gICAgICAgICAgICAgIGhlYWRlcnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSBgJHtzb3VyY2VPYmp9YFxuICAgICAgICAgICAgICBoZWFkZXJzWyd4LWFtei1jb3B5LXNvdXJjZS1yYW5nZSddID0gYGJ5dGVzPSR7c3BsaXRTdGFydH0tJHtzcGxpdEVuZH1gXG5cbiAgICAgICAgICAgICAgY29uc3QgdXBsb2FkUGFydENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBidWNrZXROYW1lOiBkZXN0T2JqQ29uZmlnLkJ1Y2tldCxcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiBkZXN0T2JqQ29uZmlnLk9iamVjdCxcbiAgICAgICAgICAgICAgICB1cGxvYWRJRDogdXBsb2FkSWQsXG4gICAgICAgICAgICAgICAgcGFydE51bWJlcjogcGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgc291cmNlT2JqOiBzb3VyY2VPYmosXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1cGxvYWRQYXJ0Q29uZmlnTGlzdC5wdXNoKHVwbG9hZFBhcnRDb25maWcpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdXBsb2FkUGFydENvbmZpZ0xpc3RcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBlcmZvcm1VcGxvYWRQYXJ0cyA9ICh1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZExpc3QgPSBnZXRVcGxvYWRQYXJ0Q29uZmlnTGlzdCh1cGxvYWRJZClcblxuICAgICAgICAgIGFzeW5jLm1hcCh1cGxvYWRMaXN0LCBtZS51cGxvYWRQYXJ0Q29weS5iaW5kKG1lKSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmFib3J0TXVsdGlwYXJ0VXBsb2FkKGRlc3RPYmpDb25maWcuQnVja2V0LCBkZXN0T2JqQ29uZmlnLk9iamVjdCwgdXBsb2FkSWQsIGNiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydHNEb25lID0gcmVzLm1hcCgocGFydENvcHkpID0+ICh7IGV0YWc6IHBhcnRDb3B5LmV0YWcsIHBhcnQ6IHBhcnRDb3B5LnBhcnQgfSkpXG4gICAgICAgICAgICByZXR1cm4gbWUuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoZGVzdE9iakNvbmZpZy5CdWNrZXQsIGRlc3RPYmpDb25maWcuT2JqZWN0LCB1cGxvYWRJZCwgcGFydHNEb25lLCBjYilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VXBsb2FkSGVhZGVycyA9IGRlc3RPYmpDb25maWcuZ2V0SGVhZGVycygpXG5cbiAgICAgICAgbWUuaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQoZGVzdE9iakNvbmZpZy5CdWNrZXQsIGRlc3RPYmpDb25maWcuT2JqZWN0LCBuZXdVcGxvYWRIZWFkZXJzLCAoZXJyLCB1cGxvYWRJZCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIsIG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICAgIHBlcmZvcm1VcGxvYWRQYXJ0cyh1cGxvYWRJZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNiKGVycm9yLCBudWxsKVxuICAgICAgfSlcbiAgfVxuICBzZWxlY3RPYmplY3RDb250ZW50KGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHNlbGVjdE9wdHMgPSB7fSwgY2IpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWU6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWU6ICR7b2JqZWN0TmFtZX1gKVxuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzKSkge1xuICAgICAgaWYgKCFpc1N0cmluZyhzZWxlY3RPcHRzLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NxbEV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJzdHJpbmdcIicpXG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnB1dFNlcmlhbGl6YXRpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lucHV0U2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCcpXG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxlY3RPcHRzLm91dHB1dFNlcmlhbGl6YXRpb24pKSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHB1dFNlcmlhbGl6YXRpb24gc2hvdWxkIGJlIG9mIHR5cGUgXCJvYmplY3RcIicpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHB1dFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWxpZCBzZWxlY3QgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgc2hvdWxkIGJlIG9mIHR5cGUgXCJmdW5jdGlvblwiJylcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSAnUE9TVCdcbiAgICBsZXQgcXVlcnkgPSBgc2VsZWN0YFxuICAgIHF1ZXJ5ICs9ICcmc2VsZWN0LXR5cGU9MidcblxuICAgIGNvbnN0IGNvbmZpZyA9IFtcbiAgICAgIHtcbiAgICAgICAgRXhwcmVzc2lvbjogc2VsZWN0T3B0cy5leHByZXNzaW9uLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgRXhwcmVzc2lvblR5cGU6IHNlbGVjdE9wdHMuZXhwcmVzc2lvblR5cGUgfHwgJ1NRTCcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBJbnB1dFNlcmlhbGl6YXRpb246IFtzZWxlY3RPcHRzLmlucHV0U2VyaWFsaXphdGlvbl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBPdXRwdXRTZXJpYWxpemF0aW9uOiBbc2VsZWN0T3B0cy5vdXRwdXRTZXJpYWxpemF0aW9uXSxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgLy8gT3B0aW9uYWxcbiAgICBpZiAoc2VsZWN0T3B0cy5yZXF1ZXN0UHJvZ3Jlc3MpIHtcbiAgICAgIGNvbmZpZy5wdXNoKHsgUmVxdWVzdFByb2dyZXNzOiBzZWxlY3RPcHRzLnJlcXVlc3RQcm9ncmVzcyB9KVxuICAgIH1cbiAgICAvLyBPcHRpb25hbFxuICAgIGlmIChzZWxlY3RPcHRzLnNjYW5SYW5nZSkge1xuICAgICAgY29uZmlnLnB1c2goeyBTY2FuUmFuZ2U6IHNlbGVjdE9wdHMuc2NhblJhbmdlIH0pXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih7XG4gICAgICByb290TmFtZTogJ1NlbGVjdE9iamVjdENvbnRlbnRSZXF1ZXN0JyxcbiAgICAgIHJlbmRlck9wdHM6IHsgcHJldHR5OiBmYWxzZSB9LFxuICAgICAgaGVhZGxlc3M6IHRydWUsXG4gICAgfSlcbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRlci5idWlsZE9iamVjdChjb25maWcpXG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHsgbWV0aG9kLCBidWNrZXROYW1lLCBvYmplY3ROYW1lLCBxdWVyeSB9LCBwYXlsb2FkLCBbMjAwXSwgJycsIHRydWUsIChlLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgcmV0dXJuIGNiKGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBzZWxlY3RSZXN1bHRcbiAgICAgIHBpcGVzZXR1cChyZXNwb25zZSwgdHJhbnNmb3JtZXJzLnNlbGVjdE9iamVjdENvbnRlbnRUcmFuc2Zvcm1lcigpKVxuICAgICAgICAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHNlbGVjdFJlc3VsdCA9IHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBjYilcbiAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobnVsbCwgc2VsZWN0UmVzdWx0KVxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50RXh0ZW5zaW9ucykge1xuICAgICAgdGhpcy5jbGllbnRFeHRlbnNpb25zID0gbmV3IGV4dGVuc2lvbnModGhpcylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50RXh0ZW5zaW9uc1xuICB9XG59XG5cbi8vIFByb21pc2lmeSB2YXJpb3VzIHB1YmxpYy1mYWNpbmcgQVBJcyBvbiB0aGUgQ2xpZW50IG1vZHVsZS5cbkNsaWVudC5wcm90b3R5cGUubWFrZUJ1Y2tldCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLm1ha2VCdWNrZXQpXG5DbGllbnQucHJvdG90eXBlLmxpc3RCdWNrZXRzID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUubGlzdEJ1Y2tldHMpXG5DbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmJ1Y2tldEV4aXN0cylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0KVxuXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuZ2V0UGFydGlhbE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldFBhcnRpYWxPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmZHZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5mR2V0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wdXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLmZQdXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5mUHV0T2JqZWN0KVxuQ2xpZW50LnByb3RvdHlwZS5jb3B5T2JqZWN0ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuY29weU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUuc3RhdE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnN0YXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlT2JqZWN0cyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdHMpXG5cbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkVXJsID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkVXJsKVxuQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRHZXRPYmplY3QgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5wcmVzaWduZWRHZXRPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFB1dE9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFB1dE9iamVjdClcbkNsaWVudC5wcm90b3R5cGUucHJlc2lnbmVkUG9zdFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnByZXNpZ25lZFBvc3RQb2xpY3kpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldE5vdGlmaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldE5vdGlmaWNhdGlvbilcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0Tm90aWZpY2F0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0Tm90aWZpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVBbGxCdWNrZXROb3RpZmljYXRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVBbGxCdWNrZXROb3RpZmljYXRpb24pXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFBvbGljeSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFBvbGljeSlcbkNsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UG9saWN5ID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0UG9saWN5KVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVJbmNvbXBsZXRlVXBsb2FkID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlSW5jb21wbGV0ZVVwbG9hZClcbkNsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0VmVyc2lvbmluZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFZlcnNpb25pbmcpXG5DbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFZlcnNpb25pbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRWZXJzaW9uaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RUYWdnaW5nID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0VGFnZ2luZylcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlT2JqZWN0VGFnZ2luZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZU9iamVjdFRhZ2dpbmcpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdFRhZ2dpbmcgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5nZXRPYmplY3RUYWdnaW5nKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRMaWZlY3ljbGUgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRMaWZlY3ljbGUpXG5DbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldExpZmVjeWNsZSA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldExpZmVjeWNsZSlcbkNsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0TGlmZWN5Y2xlID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUucmVtb3ZlQnVja2V0TGlmZWN5Y2xlKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMb2NrQ29uZmlnID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0T2JqZWN0TG9ja0NvbmZpZylcbkNsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0TG9ja0NvbmZpZyA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdExvY2tDb25maWcpXG5DbGllbnQucHJvdG90eXBlLnB1dE9iamVjdFJldGVudGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnB1dE9iamVjdFJldGVudGlvbilcbkNsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0UmV0ZW50aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuZ2V0T2JqZWN0UmV0ZW50aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRFbmNyeXB0aW9uID0gcHJvbWlzaWZ5KENsaWVudC5wcm90b3R5cGUuc2V0QnVja2V0RW5jcnlwdGlvbilcbkNsaWVudC5wcm90b3R5cGUuZ2V0QnVja2V0RW5jcnlwdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldEVuY3J5cHRpb24pXG5DbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldEVuY3J5cHRpb24gPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRFbmNyeXB0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnNldEJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5nZXRCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldEJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5yZW1vdmVCdWNrZXRSZXBsaWNhdGlvbiA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLnJlbW92ZUJ1Y2tldFJlcGxpY2F0aW9uKVxuQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMZWdhbEhvbGQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZXRPYmplY3RMZWdhbEhvbGQpXG5DbGllbnQucHJvdG90eXBlLmdldE9iamVjdExlZ2FsSG9sZCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmdldE9iamVjdExlZ2FsSG9sZClcbkNsaWVudC5wcm90b3R5cGUuY29tcG9zZU9iamVjdCA9IHByb21pc2lmeShDbGllbnQucHJvdG90eXBlLmNvbXBvc2VPYmplY3QpXG5DbGllbnQucHJvdG90eXBlLnNlbGVjdE9iamVjdENvbnRlbnQgPSBwcm9taXNpZnkoQ2xpZW50LnByb3RvdHlwZS5zZWxlY3RPYmplY3RDb250ZW50KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBZ0JBLElBQUFBLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQVAsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLElBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUVBLElBQUFVLE1BQUEsR0FBQVgsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFFBQUEsR0FBQVosT0FBQTtBQXlDQWEsTUFBQSxDQUFBQyxJQUFBLENBQUFGLFFBQUEsRUFBQUcsT0FBQSxXQUFBQyxHQUFBO0VBQUEs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 /***/ }), @@ -81931,18 +85108,25 @@ class ObjectUploader extends _stream.Transform { // If no upload ID exists, initiate a new one. if (!id) { - this.client.initiateNewMultipartUpload(this.bucketName, this.objectName, this.metaData).then(id => { + this.client.initiateNewMultipartUpload(this.bucketName, this.objectName, this.metaData, (err, id) => { + if (err) { + return callback(err); + } this.id = id; // We are now ready to accept new chunks — this will flush the buffered chunk. this.emit('ready'); - }, err => callback(err)); + }); return; } this.id = id; // Retrieve the pre-uploaded parts, if we need to resume the upload. - this.client.listParts(this.bucketName, this.objectName, id).then(etags => { + this.client.listParts(this.bucketName, this.objectName, id, (err, etags) => { + if (err) { + return this.emit('error', err); + } + // It is possible for no parts to be already uploaded. if (!etags) { etags = []; @@ -81956,8 +85140,6 @@ class ObjectUploader extends _stream.Transform { return prev; }, {}); this.emit('ready'); - }, err => { - return this.emit('error', err); }); }); return; @@ -82083,7 +85265,7 @@ class ObjectUploader extends _stream.Transform { exports.ObjectUploader = ObjectUploader; var _default = ObjectUploader; exports["default"] = _default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3RyZWFtIiwicXVlcnlzdHJpbmciLCJfaGVscGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk9iamVjdFVwbG9hZGVyIiwiVHJhbnNmb3JtIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsInBhcnRTaXplIiwibWV0YURhdGEiLCJjYWxsYmFjayIsImVtcHR5U3RyZWFtIiwicGFydE51bWJlciIsIm9sZFBhcnRzIiwiZXRhZ3MiLCJpZCIsIm9uIiwiZXJyIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJtZXRob2QiLCJoZWFkZXJzIiwibGVuZ3RoIiwibWQ1ZGlnZXN0IiwiZW5hYmxlU0hBMjU2IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRpZ2VzdCIsInRvU3RyaW5nIiwib3B0aW9ucyIsImFzc2lnbiIsInF1ZXJ5IiwibWFrZVJlcXVlc3QiLCJyZXNwb25zZSIsInJlc3VsdCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJ2ZXJzaW9uSWQiLCJnZXRWZXJzaW9uSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJvbmNlIiwiZmluZFVwbG9hZElkIiwiZW1pdCIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwidGhlbiIsImxpc3RQYXJ0cyIsInJlZHVjZSIsInByZXYiLCJpdGVtIiwicGFydCIsIm9sZFBhcnQiLCJwdXNoIiwic3RyaW5naWZ5IiwidXBsb2FkSWQiLCJyZXBsYWNlIiwiX2ZsdXNoIiwiY29tcGxldGVNdWx0aXBhcnRVcGxvYWQiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyJvYmplY3QtdXBsb2FkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTYgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgQ3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5cbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5LXN0cmluZydcblxuaW1wb3J0IHsgZ2V0VmVyc2lvbklkLCBzYW5pdGl6ZUVUYWcgfSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcblxuLy8gV2UgZXh0ZW5kIFRyYW5zZm9ybSBiZWNhdXNlIFdyaXRhYmxlIGRvZXMgbm90IGltcGxlbWVudCAuX2ZsdXNoKCkuXG5leHBvcnQgY2xhc3MgT2JqZWN0VXBsb2FkZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGJ1Y2tldE5hbWUsIG9iamVjdE5hbWUsIHBhcnRTaXplLCBtZXRhRGF0YSwgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5lbXB0eVN0cmVhbSA9IHRydWVcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuYnVja2V0TmFtZSA9IGJ1Y2tldE5hbWVcbiAgICB0aGlzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lXG4gICAgLy8gVGhlIHNpemUgb2YgZWFjaCBtdWx0aXBhcnQsIGNodW5rZWQgYnkgQmxvY2tTdHJlYW0yLlxuICAgIHRoaXMucGFydFNpemUgPSBwYXJ0U2l6ZVxuICAgIC8vIFRoaXMgaXMgdGhlIG1ldGFkYXRhIGZvciB0aGUgb2JqZWN0LlxuICAgIHRoaXMubWV0YURhdGEgPSBtZXRhRGF0YVxuXG4gICAgLy8gQ2FsbCBsaWtlOiBjYWxsYmFjayhlcnJvciwge2V0YWcsIHZlcnNpb25JZH0pLlxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuXG4gICAgLy8gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgbnVtYmVyIGNodW5rL3BhcnQgd2UncmUgb24uIFRoaXMgaW5jcmVtZW50c1xuICAgIC8vIGVhY2ggdGltZSBfd3JpdGUoKSBpcyBjYWxsZWQuIFN0YXJ0cyB3aXRoIDEsIG5vdCAwLlxuICAgIHRoaXMucGFydE51bWJlciA9IDFcblxuICAgIC8vIEEgbGlzdCBvZiB0aGUgcHJldmlvdXNseSB1cGxvYWRlZCBjaHVua3MsIGZvciByZXN1bWluZyBhIGZpbGUgdXBsb2FkLiBUaGlzXG4gICAgLy8gd2lsbCBiZSBudWxsIGlmIHdlIGFyZW4ndCByZXN1bWluZyBhbiB1cGxvYWQuXG4gICAgdGhpcy5vbGRQYXJ0cyA9IG51bGxcblxuICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGV0YWdzIGZvciBhZ2dyZWdhdGluZyB0aGUgY2h1bmtzIHRvZ2V0aGVyIGxhdGVyLiBFYWNoXG4gICAgLy8gZXRhZyByZXByZXNlbnRzIGEgc2luZ2xlIGNodW5rIG9mIHRoZSBmaWxlLlxuICAgIHRoaXMuZXRhZ3MgPSBbXVxuXG4gICAgLy8gVGhpcyBpcyBmb3IgdGhlIG11bHRpcGFydCB1cGxvYWQgcmVxdWVzdCDigJQgaWYgbnVsbCwgd2UncmUgZWl0aGVyIG5vdCBpbml0aWF0ZWRcbiAgICAvLyB5ZXQgb3Igd2UncmUgZmx1c2hpbmcgaW4gb25lIHBhY2tldC5cbiAgICB0aGlzLmlkID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIGVycm9ycy5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9KVxuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbXB0eVN0cmVhbSA9IGZhbHNlXG4gICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgbGV0IGhlYWRlcnMgPSB7ICdDb250ZW50LUxlbmd0aCc6IGNodW5rLmxlbmd0aCB9XG4gICAgbGV0IG1kNWRpZ2VzdCA9ICcnXG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBDb250ZW50LU1ENSBoZWFkZXIgaWYgU0hBMjU2IGlzIG5vdCBzZXQuXG4gICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBvbmx5IHdoZW4gdGhlcmUgaXMgYSBzZWN1cmUgY29ubmVjdGlvbiB0byB0aGUgczMgc2VydmVyLlxuICAgIGlmICghdGhpcy5jbGllbnQuZW5hYmxlU0hBMjU2KSB7XG4gICAgICBtZDVkaWdlc3QgPSBDcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGNodW5rKS5kaWdlc3QoKVxuICAgICAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IG1kNWRpZ2VzdC50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG4gICAgLy8gV2UgY2FuIGZsdXNoIHRoZSBvYmplY3QgaW4gb25lIHBhY2tldCBpZiBpdCBmaXRzIGluIG9uZSBjaHVuay4gVGhpcyBpcyB0cnVlXG4gICAgLy8gaWYgdGhlIGNodW5rIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBwYXJ0IHNpemUsIHNpZ25pZnlpbmcgdGhlIGVuZCBvZiB0aGVcbiAgICAvLyBzdHJlYW0uXG4gICAgaWYgKHRoaXMucGFydE51bWJlciA9PSAxICYmIGNodW5rLmxlbmd0aCA8IHRoaXMucGFydFNpemUpIHtcbiAgICAgIC8vIFBVVCB0aGUgY2h1bmsgaW4gYSBzaW5nbGUgcmVxdWVzdCDigJQgdXNlIGFuIGVtcHR5IHF1ZXJ5LlxuICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgLy8gU2V0IHVzZXIgbWV0YWRhdGEgYXMgdGhpcyBpcyBub3QgYSBtdWx0aXBhcnQgdXBsb2FkXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubWV0YURhdGEsIGhlYWRlcnMpLFxuICAgICAgICBxdWVyeTogJycsXG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdChvcHRpb25zLCBjaHVuaywgWzIwMF0sICcnLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgIGV0YWc6IHNhbml0aXplRVRhZyhyZXNwb25zZS5oZWFkZXJzLmV0YWcpLFxuICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSB0aGUgJ2RhdGEnIGV2ZW50IHNvIHRoYXQgdGhlIHN0cmVhbSBjbG9zZXMuIChub2RlanMgc3RyZWFtIHJlcXVpcmVtZW50KVxuICAgICAgICByZXNwb25zZS5vbignZGF0YScsICgpID0+IHt9KVxuXG4gICAgICAgIC8vIEdpdmUgdGhlIGV0YWcgYmFjaywgd2UncmUgZG9uZSFcblxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWNhdXNlIHdlJ3JlIHN1cmUgdGhlIHN0cmVhbSBoYXMgZW5kZWQsIGFsbG93IGl0IHRvIGZsdXNoIGFuZCBlbmQuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHdlIGFyZW4ndCBmbHVzaGluZyBpbiBvbmUgcGFja2V0LCB3ZSBuZWVkIHRvIGluaXRpYXRlIHRoZSBtdWx0aXBhcnQgdXBsb2FkLFxuICAgIC8vIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZS4gVGhlIHdyaXRlIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgdGhlIHVwbG9hZCBoYXMgYmVlblxuICAgIC8vIGluaXRpYXRlZC5cbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gICAgICB9KVxuXG4gICAgICAvLyBDaGVjayBmb3IgYW4gaW5jb21wbGV0ZSBwcmV2aW91cyB1cGxvYWQuXG4gICAgICB0aGlzLmNsaWVudC5maW5kVXBsb2FkSWQodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIChlcnIsIGlkKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHVwbG9hZCBJRCBleGlzdHMsIGluaXRpYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIHRoaXMuY2xpZW50LmluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCB0aGlzLm1ldGFEYXRhKS50aGVuKFxuICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgICAgICAgICAgIC8vIFdlIGFyZSBub3cgcmVhZHkgdG8gYWNjZXB0IG5ldyBjaHVua3Mg4oCUIHRoaXMgd2lsbCBmbHVzaCB0aGUgYnVmZmVyZWQgY2h1bmsuXG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVhZHknKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IGNhbGxiYWNrKGVyciksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlkID0gaWRcblxuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcHJlLXVwbG9hZGVkIHBhcnRzLCBpZiB3ZSBuZWVkIHRvIHJlc3VtZSB0aGUgdXBsb2FkLlxuICAgICAgICB0aGlzLmNsaWVudC5saXN0UGFydHModGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIGlkKS50aGVuKFxuICAgICAgICAgIChldGFncykgPT4ge1xuICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIG5vIHBhcnRzIHRvIGJlIGFscmVhZHkgdXBsb2FkZWQuXG4gICAgICAgICAgICBpZiAoIWV0YWdzKSB7XG4gICAgICAgICAgICAgIGV0YWdzID0gW11cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gb2xkUGFydHMgd2lsbCBiZWNvbWUgYW4gb2JqZWN0LCBhbGxvd2luZyBvbGRQYXJ0c1twYXJ0TnVtYmVyXS5ldGFnXG4gICAgICAgICAgICB0aGlzLm9sZFBhcnRzID0gZXRhZ3MucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBpdGVtKSB7XG4gICAgICAgICAgICAgIGlmICghcHJldltpdGVtLnBhcnRdKSB7XG4gICAgICAgICAgICAgICAgcHJldltpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2XG4gICAgICAgICAgICB9LCB7fSlcblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkeScpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDb250aW51ZSB1cGxvYWRpbmcgdmFyaW91cyBwYXJ0cyBpZiB3ZSBoYXZlIGluaXRpYXRlZCBtdWx0aXBhcnQgdXBsb2FkLlxuICAgIGxldCBwYXJ0TnVtYmVyID0gdGhpcy5wYXJ0TnVtYmVyKytcblxuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHVwbG9hZGVkIHRoaXMgY2h1bmsuIElmIHRoZSBoYXNoIHN1bXMgbWF0Y2gsXG4gICAgLy8gd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgY2h1bmsuXG4gICAgaWYgKHRoaXMub2xkUGFydHMpIHtcbiAgICAgIGxldCBvbGRQYXJ0ID0gdGhpcy5vbGRQYXJ0c1twYXJ0TnVtYmVyXVxuXG4gICAgICAvLyBDYWx1bGNhdGUgdGhlIG1kNSBoYXNoLCBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkLlxuICAgICAgaWYgKCFtZDVkaWdlc3QpIHtcbiAgICAgICAgbWQ1ZGlnZXN0ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShjaHVuaykuZGlnZXN0KClcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFBhcnQgJiYgbWQ1ZGlnZXN0LnRvU3RyaW5nKCdoZXgnKSA9PT0gb2xkUGFydC5ldGFnKSB7XG4gICAgICAgIC8vIFRoZSBtZDUgbWF0Y2hlcywgdGhlIGNodW5rIGhhcyBhbHJlYWR5IGJlZW4gdXBsb2FkZWQuXG4gICAgICAgIHRoaXMuZXRhZ3MucHVzaCh7IHBhcnQ6IHBhcnROdW1iZXIsIGV0YWc6IG9sZFBhcnQuZXRhZyB9KVxuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIGNodW5rIHdpdGggYW4gdXBsb2FkZXIuXG4gICAgbGV0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHtcbiAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICB1cGxvYWRJZDogdGhpcy5pZCxcbiAgICB9KVxuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBxdWVyeSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3ROYW1lOiB0aGlzLm9iamVjdE5hbWUsXG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQubWFrZVJlcXVlc3Qob3B0aW9ucywgY2h1bmssIFsyMDBdLCAnJywgdHJ1ZSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgIH1cblxuICAgICAgLy8gSW4gb3JkZXIgdG8gYWdncmVnYXRlIHRoZSBwYXJ0cyB0b2dldGhlciwgd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBldGFncy5cbiAgICAgIGxldCBldGFnID0gcmVzcG9uc2UuaGVhZGVycy5ldGFnXG4gICAgICBpZiAoZXRhZykge1xuICAgICAgICBldGFnID0gZXRhZy5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXCIkLywgJycpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXRhZ3MucHVzaCh7IHBhcnQ6IHBhcnROdW1iZXIsIGV0YWcgfSlcblxuICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICByZXNwb25zZS5vbignZGF0YScsICgpID0+IHt9KVxuXG4gICAgICAvLyBXZSdyZSByZWFkeSBmb3IgdGhlIG5leHQgY2h1bmsuXG4gICAgICBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIF9mbHVzaChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmVtcHR5U3RyZWFtKSB7XG4gICAgICBsZXQgbWV0aG9kID0gJ1BVVCdcbiAgICAgIGxldCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tZXRhRGF0YSwgeyAnQ29udGVudC1MZW5ndGgnOiAwIH0pXG4gICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBxdWVyeTogJycsXG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdChvcHRpb25zLCAnJywgWzIwMF0sICcnLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgdmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZ25vcmUgdGhlICdkYXRhJyBldmVudCBzbyB0aGF0IHRoZSBzdHJlYW0gY2xvc2VzLiAobm9kZWpzIHN0cmVhbSByZXF1aXJlbWVudClcbiAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgICAvLyBHaXZlIHRoZSBldGFnIGJhY2ssIHdlJ3JlIGRvbmUhXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UncmUgc3VyZSB0aGUgc3RyZWFtIGhhcyBlbmRlZCwgYWxsb3cgaXQgdG8gZmx1c2ggYW5kIGVuZC5cbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIElmIGl0IGhhcyBiZWVuIHVwbG9hZGVkIGluIGEgc2luZ2xlIHBhY2tldCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy5cbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbGwgb2YgdGhlIGNodW5rcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHksIHRodXNcbiAgICAvLyBjb21wbGV0aW5nIHRoZSBtdWx0aXBhcnQgdXBsb2FkLlxuICAgIHRoaXMuY2xpZW50LmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCB0aGlzLmlkLCB0aGlzLmV0YWdzLCAoZXJyLCBldGFnKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgb3VyIGNhbGxiYWNrIG9uIHRoZSBuZXh0IHRpY2sgdG8gYWxsb3cgdGhlIHN0cmVhbXMgaW5mcmFzdHJ1Y3R1cmVcbiAgICAgIC8vIHRvIGZpbmlzaCB3aGF0IGl0cyBkb2luZyBiZWZvcmUgd2UgY29udGludWUuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCBldGFnKVxuICAgICAgfSlcblxuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gZGVwcmVjYXRlZCBkZWZhdWx0IGV4cG9ydCwgcGxlYXNlIHVzZSBuYW1lZCBleHBvcnRzLlxuLy8ga2VlcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVmYXVsdC1leHBvcnRcbmV4cG9ydCBkZWZhdWx0IE9iamVjdFVwbG9hZGVyXG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLFdBQUEsR0FBQUgsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUFpRSxTQUFBSSx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBTix3QkFBQVUsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3RyZWFtIiwicXVlcnlzdHJpbmciLCJfaGVscGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIk9iamVjdFVwbG9hZGVyIiwiVHJhbnNmb3JtIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJidWNrZXROYW1lIiwib2JqZWN0TmFtZSIsInBhcnRTaXplIiwibWV0YURhdGEiLCJjYWxsYmFjayIsImVtcHR5U3RyZWFtIiwicGFydE51bWJlciIsIm9sZFBhcnRzIiwiZXRhZ3MiLCJpZCIsIm9uIiwiZXJyIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJtZXRob2QiLCJoZWFkZXJzIiwibGVuZ3RoIiwibWQ1ZGlnZXN0IiwiZW5hYmxlU0hBMjU2IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRpZ2VzdCIsInRvU3RyaW5nIiwib3B0aW9ucyIsImFzc2lnbiIsInF1ZXJ5IiwibWFrZVJlcXVlc3QiLCJyZXNwb25zZSIsInJlc3VsdCIsImV0YWciLCJzYW5pdGl6ZUVUYWciLCJ2ZXJzaW9uSWQiLCJnZXRWZXJzaW9uSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJvbmNlIiwiZmluZFVwbG9hZElkIiwiZW1pdCIsImluaXRpYXRlTmV3TXVsdGlwYXJ0VXBsb2FkIiwibGlzdFBhcnRzIiwicmVkdWNlIiwicHJldiIsIml0ZW0iLCJwYXJ0Iiwib2xkUGFydCIsInB1c2giLCJzdHJpbmdpZnkiLCJ1cGxvYWRJZCIsInJlcGxhY2UiLCJfZmx1c2giLCJjb21wbGV0ZU11bHRpcGFydFVwbG9hZCIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIm9iamVjdC11cGxvYWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdub2RlOnN0cmVhbSdcblxuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJ1xuXG5pbXBvcnQgeyBnZXRWZXJzaW9uSWQsIHNhbml0aXplRVRhZyB9IGZyb20gJy4vaW50ZXJuYWwvaGVscGVyLnRzJ1xuXG4vLyBXZSBleHRlbmQgVHJhbnNmb3JtIGJlY2F1c2UgV3JpdGFibGUgZG9lcyBub3QgaW1wbGVtZW50IC5fZmx1c2goKS5cbmV4cG9ydCBjbGFzcyBPYmplY3RVcGxvYWRlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgYnVja2V0TmFtZSwgb2JqZWN0TmFtZSwgcGFydFNpemUsIG1ldGFEYXRhLCBjYWxsYmFjaykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmVtcHR5U3RyZWFtID0gdHJ1ZVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5idWNrZXROYW1lID0gYnVja2V0TmFtZVxuICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWVcbiAgICAvLyBUaGUgc2l6ZSBvZiBlYWNoIG11bHRpcGFydCwgY2h1bmtlZCBieSBCbG9ja1N0cmVhbTIuXG4gICAgdGhpcy5wYXJ0U2l6ZSA9IHBhcnRTaXplXG4gICAgLy8gVGhpcyBpcyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBvYmplY3QuXG4gICAgdGhpcy5tZXRhRGF0YSA9IG1ldGFEYXRhXG5cbiAgICAvLyBDYWxsIGxpa2U6IGNhbGxiYWNrKGVycm9yLCB7ZXRhZywgdmVyc2lvbklkfSkuXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG5cbiAgICAvLyBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBudW1iZXIgY2h1bmsvcGFydCB3ZSdyZSBvbi4gVGhpcyBpbmNyZW1lbnRzXG4gICAgLy8gZWFjaCB0aW1lIF93cml0ZSgpIGlzIGNhbGxlZC4gU3RhcnRzIHdpdGggMSwgbm90IDAuXG4gICAgdGhpcy5wYXJ0TnVtYmVyID0gMVxuXG4gICAgLy8gQSBsaXN0IG9mIHRoZSBwcmV2aW91c2x5IHVwbG9hZGVkIGNodW5rcywgZm9yIHJlc3VtaW5nIGEgZmlsZSB1cGxvYWQuIFRoaXNcbiAgICAvLyB3aWxsIGJlIG51bGwgaWYgd2UgYXJlbid0IHJlc3VtaW5nIGFuIHVwbG9hZC5cbiAgICB0aGlzLm9sZFBhcnRzID0gbnVsbFxuXG4gICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgZXRhZ3MgZm9yIGFnZ3JlZ2F0aW5nIHRoZSBjaHVua3MgdG9nZXRoZXIgbGF0ZXIuIEVhY2hcbiAgICAvLyBldGFnIHJlcHJlc2VudHMgYSBzaW5nbGUgY2h1bmsgb2YgdGhlIGZpbGUuXG4gICAgdGhpcy5ldGFncyA9IFtdXG5cbiAgICAvLyBUaGlzIGlzIGZvciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCByZXF1ZXN0IOKAlCBpZiBudWxsLCB3ZSdyZSBlaXRoZXIgbm90IGluaXRpYXRlZFxuICAgIC8vIHlldCBvciB3ZSdyZSBmbHVzaGluZyBpbiBvbmUgcGFja2V0LlxuICAgIHRoaXMuaWQgPSBudWxsXG5cbiAgICAvLyBIYW5kbGUgZXJyb3JzLlxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0pXG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtcHR5U3RyZWFtID0gZmFsc2VcbiAgICBsZXQgbWV0aG9kID0gJ1BVVCdcbiAgICBsZXQgaGVhZGVycyA9IHsgJ0NvbnRlbnQtTGVuZ3RoJzogY2h1bmsubGVuZ3RoIH1cbiAgICBsZXQgbWQ1ZGlnZXN0ID0gJydcblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IENvbnRlbnQtTUQ1IGhlYWRlciBpZiBTSEEyNTYgaXMgbm90IHNldC5cbiAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHNlY3VyZSBjb25uZWN0aW9uIHRvIHRoZSBzMyBzZXJ2ZXIuXG4gICAgaWYgKCF0aGlzLmNsaWVudC5lbmFibGVTSEEyNTYpIHtcbiAgICAgIG1kNWRpZ2VzdCA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY2h1bmspLmRpZ2VzdCgpXG4gICAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gbWQ1ZGlnZXN0LnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbiAgICAvLyBXZSBjYW4gZmx1c2ggdGhlIG9iamVjdCBpbiBvbmUgcGFja2V0IGlmIGl0IGZpdHMgaW4gb25lIGNodW5rLiBUaGlzIGlzIHRydWVcbiAgICAvLyBpZiB0aGUgY2h1bmsgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHBhcnQgc2l6ZSwgc2lnbmlmeWluZyB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBpZiAodGhpcy5wYXJ0TnVtYmVyID09IDEgJiYgY2h1bmsubGVuZ3RoIDwgdGhpcy5wYXJ0U2l6ZSkge1xuICAgICAgLy8gUFVUIHRoZSBjaHVuayBpbiBhIHNpbmdsZSByZXF1ZXN0IOKAlCB1c2UgYW4gZW1wdHkgcXVlcnkuXG4gICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICAvLyBTZXQgdXNlciBtZXRhZGF0YSBhcyB0aGlzIGlzIG5vdCBhIG11bHRpcGFydCB1cGxvYWRcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tZXRhRGF0YSwgaGVhZGVycyksXG4gICAgICAgIHF1ZXJ5OiAnJyxcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBvYmplY3ROYW1lOiB0aGlzLm9iamVjdE5hbWUsXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0KG9wdGlvbnMsIGNodW5rLCBbMjAwXSwgJycsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgZXRhZzogc2FuaXRpemVFVGFnKHJlc3BvbnNlLmhlYWRlcnMuZXRhZyksXG4gICAgICAgICAgdmVyc2lvbklkOiBnZXRWZXJzaW9uSWQocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG5cbiAgICAgICAgLy8gR2l2ZSB0aGUgZXRhZyBiYWNrLCB3ZSdyZSBkb25lIVxuXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UncmUgc3VyZSB0aGUgc3RyZWFtIGhhcyBlbmRlZCwgYWxsb3cgaXQgdG8gZmx1c2ggYW5kIGVuZC5cbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYXJlbid0IGZsdXNoaW5nIGluIG9uZSBwYWNrZXQsIHdlIG5lZWQgdG8gaW5pdGlhdGUgdGhlIG11bHRpcGFydCB1cGxvYWQsXG4gICAgLy8gaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBkb25lLiBUaGUgd3JpdGUgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCB0aGUgdXBsb2FkIGhhcyBiZWVuXG4gICAgLy8gaW5pdGlhdGVkLlxuICAgIGlmICh0aGlzLmlkID09PSBudWxsKSB7XG4gICAgICB0aGlzLm9uY2UoJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaylcbiAgICAgIH0pXG5cbiAgICAgIC8vIENoZWNrIGZvciBhbiBpbmNvbXBsZXRlIHByZXZpb3VzIHVwbG9hZC5cbiAgICAgIHRoaXMuY2xpZW50LmZpbmRVcGxvYWRJZCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMub2JqZWN0TmFtZSwgKGVyciwgaWQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gdXBsb2FkIElEIGV4aXN0cywgaW5pdGlhdGUgYSBuZXcgb25lLlxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5jbGllbnQuaW5pdGlhdGVOZXdNdWx0aXBhcnRVcGxvYWQodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdE5hbWUsIHRoaXMubWV0YURhdGEsIChlcnIsIGlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgICAgICAgICAvLyBXZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCBuZXcgY2h1bmtzIOKAlCB0aGlzIHdpbGwgZmx1c2ggdGhlIGJ1ZmZlcmVkIGNodW5rLlxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkeScpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkXG5cbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByZS11cGxvYWRlZCBwYXJ0cywgaWYgd2UgbmVlZCB0byByZXN1bWUgdGhlIHVwbG9hZC5cbiAgICAgICAgdGhpcy5jbGllbnQubGlzdFBhcnRzKHRoaXMuYnVja2V0TmFtZSwgdGhpcy5vYmplY3ROYW1lLCBpZCwgKGVyciwgZXRhZ3MpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3Igbm8gcGFydHMgdG8gYmUgYWxyZWFkeSB1cGxvYWRlZC5cbiAgICAgICAgICBpZiAoIWV0YWdzKSB7XG4gICAgICAgICAgICBldGFncyA9IFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gb2xkUGFydHMgd2lsbCBiZWNvbWUgYW4gb2JqZWN0LCBhbGxvd2luZyBvbGRQYXJ0c1twYXJ0TnVtYmVyXS5ldGFnXG4gICAgICAgICAgdGhpcy5vbGRQYXJ0cyA9IGV0YWdzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgaXRlbSkge1xuICAgICAgICAgICAgaWYgKCFwcmV2W2l0ZW0ucGFydF0pIHtcbiAgICAgICAgICAgICAgcHJldltpdGVtLnBhcnRdID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgICB9LCB7fSlcblxuICAgICAgICAgIHRoaXMuZW1pdCgncmVhZHknKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29udGludWUgdXBsb2FkaW5nIHZhcmlvdXMgcGFydHMgaWYgd2UgaGF2ZSBpbml0aWF0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAgICBsZXQgcGFydE51bWJlciA9IHRoaXMucGFydE51bWJlcisrXG5cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSB1cGxvYWRlZCB0aGlzIGNodW5rLiBJZiB0aGUgaGFzaCBzdW1zIG1hdGNoLFxuICAgIC8vIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0IGNodW5rLlxuICAgIGlmICh0aGlzLm9sZFBhcnRzKSB7XG4gICAgICBsZXQgb2xkUGFydCA9IHRoaXMub2xkUGFydHNbcGFydE51bWJlcl1cblxuICAgICAgLy8gQ2FsdWxjYXRlIHRoZSBtZDUgaGFzaCwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgIGlmICghbWQ1ZGlnZXN0KSB7XG4gICAgICAgIG1kNWRpZ2VzdCA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY2h1bmspLmRpZ2VzdCgpXG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRQYXJ0ICYmIG1kNWRpZ2VzdC50b1N0cmluZygnaGV4JykgPT09IG9sZFBhcnQuZXRhZykge1xuICAgICAgICAvLyBUaGUgbWQ1IG1hdGNoZXMsIHRoZSBjaHVuayBoYXMgYWxyZWFkeSBiZWVuIHVwbG9hZGVkLlxuICAgICAgICB0aGlzLmV0YWdzLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnOiBvbGRQYXJ0LmV0YWcgfSlcblxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBjaHVuayB3aXRoIGFuIHVwbG9hZGVyLlxuICAgIGxldCBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh7XG4gICAgICBwYXJ0TnVtYmVyOiBwYXJ0TnVtYmVyLFxuICAgICAgdXBsb2FkSWQ6IHRoaXMuaWQsXG4gICAgfSlcblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgcXVlcnksXG4gICAgICBoZWFkZXJzLFxuICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgb2JqZWN0TmFtZTogdGhpcy5vYmplY3ROYW1lLFxuICAgIH1cblxuICAgIHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0KG9wdGlvbnMsIGNodW5rLCBbMjAwXSwgJycsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG5cbiAgICAgIC8vIEluIG9yZGVyIHRvIGFnZ3JlZ2F0ZSB0aGUgcGFydHMgdG9nZXRoZXIsIHdlIG5lZWQgdG8gY29sbGVjdCB0aGUgZXRhZ3MuXG4gICAgICBsZXQgZXRhZyA9IHJlc3BvbnNlLmhlYWRlcnMuZXRhZ1xuICAgICAgaWYgKGV0YWcpIHtcbiAgICAgICAgZXRhZyA9IGV0YWcucmVwbGFjZSgvXlwiLywgJycpLnJlcGxhY2UoL1wiJC8sICcnKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmV0YWdzLnB1c2goeyBwYXJ0OiBwYXJ0TnVtYmVyLCBldGFnIH0pXG5cbiAgICAgIC8vIElnbm9yZSB0aGUgJ2RhdGEnIGV2ZW50IHNvIHRoYXQgdGhlIHN0cmVhbSBjbG9zZXMuIChub2RlanMgc3RyZWFtIHJlcXVpcmVtZW50KVxuICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoKSA9PiB7fSlcblxuICAgICAgLy8gV2UncmUgcmVhZHkgZm9yIHRoZSBuZXh0IGNodW5rLlxuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5lbXB0eVN0cmVhbSkge1xuICAgICAgbGV0IG1ldGhvZCA9ICdQVVQnXG4gICAgICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubWV0YURhdGEsIHsgJ0NvbnRlbnQtTGVuZ3RoJzogMCB9KVxuICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6ICcnLFxuICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdE5hbWU6IHRoaXMub2JqZWN0TmFtZSxcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGllbnQubWFrZVJlcXVlc3Qob3B0aW9ucywgJycsIFsyMDBdLCAnJywgdHJ1ZSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgIGV0YWc6IHNhbml0aXplRVRhZyhyZXNwb25zZS5oZWFkZXJzLmV0YWcpLFxuICAgICAgICAgIHZlcnNpb25JZDogZ2V0VmVyc2lvbklkKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWdub3JlIHRoZSAnZGF0YScgZXZlbnQgc28gdGhhdCB0aGUgc3RyZWFtIGNsb3Nlcy4gKG5vZGVqcyBzdHJlYW0gcmVxdWlyZW1lbnQpXG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKCkgPT4ge30pXG5cbiAgICAgICAgLy8gR2l2ZSB0aGUgZXRhZyBiYWNrLCB3ZSdyZSBkb25lIVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWNhdXNlIHdlJ3JlIHN1cmUgdGhlIHN0cmVhbSBoYXMgZW5kZWQsIGFsbG93IGl0IHRvIGZsdXNoIGFuZCBlbmQuXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBJZiBpdCBoYXMgYmVlbiB1cGxvYWRlZCBpbiBhIHNpbmdsZSBwYWNrZXQsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuXG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYWxsIG9mIHRoZSBjaHVua3MgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0aHVzXG4gICAgLy8gY29tcGxldGluZyB0aGUgbXVsdGlwYXJ0IHVwbG9hZC5cbiAgICB0aGlzLmNsaWVudC5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMub2JqZWN0TmFtZSwgdGhpcy5pZCwgdGhpcy5ldGFncywgKGVyciwgZXRhZykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIG91ciBjYWxsYmFjayBvbiB0aGUgbmV4dCB0aWNrIHRvIGFsbG93IHRoZSBzdHJlYW1zIGluZnJhc3RydWN0dXJlXG4gICAgICAvLyB0byBmaW5pc2ggd2hhdCBpdHMgZG9pbmcgYmVmb3JlIHdlIGNvbnRpbnVlLlxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgZXRhZylcbiAgICAgIH0pXG5cbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9XG59XG5cbi8vIGRlcHJlY2F0ZWQgZGVmYXVsdCBleHBvcnQsIHBsZWFzZSB1c2UgbmFtZWQgZXhwb3J0cy5cbi8vIGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBPYmplY3RVcGxvYWRlclxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxXQUFBLEdBQUFILHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFBaUUsU0FBQUkseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQU4sd0JBQUFVLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FB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 /***/ }), @@ -82417,14 +85599,19 @@ Object.defineProperty(exports, "__esModule", ({ exports.bucketEncryptionTransformer = bucketEncryptionTransformer; exports.bucketVersioningTransformer = bucketVersioningTransformer; exports.getBucketNotificationTransformer = getBucketNotificationTransformer; +exports.getBucketRegionTransformer = getBucketRegionTransformer; exports.getCompleteMultipartTransformer = getCompleteMultipartTransformer; exports.getConcater = getConcater; exports.getCopyObjectTransformer = getCopyObjectTransformer; +exports.getErrorTransformer = getErrorTransformer; exports.getHashSummer = getHashSummer; +exports.getInitiateMultipartTransformer = getInitiateMultipartTransformer; +exports.getListBucketTransformer = getListBucketTransformer; exports.getListMultipartTransformer = getListMultipartTransformer; exports.getListObjectsTransformer = getListObjectsTransformer; exports.getListObjectsV2Transformer = getListObjectsV2Transformer; exports.getListObjectsV2WithMetadataTransformer = getListObjectsV2WithMetadataTransformer; +exports.getListPartsTransformer = getListPartsTransformer; exports.getNotificationTransformer = getNotificationTransformer; exports.getTagsTransformer = getTagsTransformer; exports.lifecycleTransformer = lifecycleTransformer; @@ -82432,11 +85619,14 @@ exports.objectLegalHoldTransformer = objectLegalHoldTransformer; exports.objectLockTransformer = objectLockTransformer; exports.objectRetentionTransformer = objectRetentionTransformer; exports.removeObjectsTransformer = removeObjectsTransformer; +exports.replicationConfigTransformer = replicationConfigTransformer; exports.selectObjectContentTransformer = selectObjectContentTransformer; exports.uploadPartTransformer = uploadPartTransformer; var Crypto = _interopRequireWildcard(__nccwpck_require__(6113), true); var _jsonStream = __nccwpck_require__(1676); +var _lodash = __nccwpck_require__(250); var _through = __nccwpck_require__(8180); +var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); var _helper = __nccwpck_require__(9921); var xmlParsers = _interopRequireWildcard(__nccwpck_require__(714), true); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -82493,6 +85683,65 @@ function getConcater(parser, emitError) { }); } +// Generates an Error object depending on http statusCode and XML body +function getErrorTransformer(response) { + var statusCode = response.statusCode; + var code, message; + if (statusCode === 301) { + code = 'MovedPermanently'; + message = 'Moved Permanently'; + } else if (statusCode === 307) { + code = 'TemporaryRedirect'; + message = 'Are you using the correct endpoint URL?'; + } else if (statusCode === 403) { + code = 'AccessDenied'; + message = 'Valid and authorized credentials required'; + } else if (statusCode === 404) { + code = 'NotFound'; + message = 'Not Found'; + } else if (statusCode === 405) { + code = 'MethodNotAllowed'; + message = 'Method Not Allowed'; + } else if (statusCode === 501) { + code = 'MethodNotAllowed'; + message = 'Method Not Allowed'; + } else { + code = 'UnknownError'; + message = `${statusCode}`; + } + var headerInfo = {}; + // A value created by S3 compatible server that uniquely identifies + // the request. + headerInfo.amzRequestid = response.headersSent ? response.getHeader('x-amz-request-id') : null; + // A special token that helps troubleshoot API replies and issues. + headerInfo.amzId2 = response.headersSent ? response.getHeader('x-amz-id-2') : null; + // Region where the bucket is located. This header is returned only + // in HEAD bucket and ListObjects response. + headerInfo.amzBucketRegion = response.headersSent ? response.getHeader('x-amz-bucket-region') : null; + return getConcater(xmlString => { + let getError = () => { + // Message should be instantiated for each S3Errors. + var e = new errors.S3Error(message); + // S3 Error code. + e.code = code; + _lodash.each(headerInfo, (value, key) => { + e[key] = value; + }); + return e; + }; + if (!xmlString) { + return getError(); + } + let e; + try { + e = xmlParsers.parseError(xmlString, headerInfo); + } catch (ex) { + return getError(); + } + return e; + }, true); +} + // A through stream that calculates md5sum and sha256sum function getHashSummer(enableSHA256) { var md5 = Crypto.createHash('md5'); @@ -82530,11 +85779,26 @@ function getCopyObjectTransformer() { return getConcater(xmlParsers.parseCopyObject); } +// Parses listBuckets response. +function getListBucketTransformer() { + return getConcater(xmlParsers.parseListBucket); +} + // Parses listMultipartUploads response. function getListMultipartTransformer() { return getConcater(xmlParsers.parseListMultipart); } +// Parses listParts response. +function getListPartsTransformer() { + return getConcater(xmlParsers.parseListParts); +} + +// Parses initMultipartUpload response. +function getInitiateMultipartTransformer() { + return getConcater(xmlParsers.parseInitiateMultipart); +} + // Parses listObjects response. function getListObjectsTransformer() { return getConcater(xmlParsers.parseListObjects); @@ -82555,6 +85819,11 @@ function getCompleteMultipartTransformer() { return getConcater(xmlParsers.parseCompleteMultipart); } +// Parses getBucketLocation response. +function getBucketRegionTransformer() { + return getConcater(xmlParsers.parseBucketRegion); +} + // Parses GET/SET BucketNotification response function getBucketNotificationTransformer() { return getConcater(xmlParsers.parseBucketNotification); @@ -82583,6 +85852,9 @@ function objectRetentionTransformer() { function bucketEncryptionTransformer() { return getConcater(xmlParsers.parseBucketEncryptionConfig); } +function replicationConfigTransformer() { + return getConcater(xmlParsers.parseReplicationConfig); +} function objectLegalHoldTransformer() { return getConcater(xmlParsers.parseObjectLegalHoldConfig); } @@ -82595,7 +85867,7 @@ function selectObjectContentTransformer() { function removeObjectsTransformer() { return getConcater(xmlParsers.removeObjectsParser); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfanNvblN0cmVhbSIsIl90aHJvdWdoIiwiX2hlbHBlciIsInhtbFBhcnNlcnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiZ2V0Q29uY2F0ZXIiLCJwYXJzZXIiLCJlbWl0RXJyb3IiLCJvYmplY3RNb2RlIiwiYnVmcyIsImlzRnVuY3Rpb24iLCJUeXBlRXJyb3IiLCJUaHJvdWdoMiIsImNodW5rIiwiZW5jIiwiY2IiLCJwdXNoIiwiQnVmZmVyIiwiY29uY2F0IiwidG9TdHJpbmciLCJsZW5ndGgiLCJnZXRIYXNoU3VtbWVyIiwiZW5hYmxlU0hBMjU2IiwibWQ1IiwiY3JlYXRlSGFzaCIsInNoYTI1NiIsInVwZGF0ZSIsIm1kNXN1bSIsInNoYTI1NnN1bSIsImRpZ2VzdCIsImhhc2hEYXRhIiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwicGFyc2VDb3B5T2JqZWN0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsInBhcnNlTGlzdE9iamVjdHMiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjIiLCJnZXRMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VDb21wbGV0ZU11bHRpcGFydCIsImdldEJ1Y2tldE5vdGlmaWNhdGlvblRyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXROb3RpZmljYXRpb24iLCJnZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lciIsIkpTT05QYXJzZXIiLCJidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIiLCJwYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWciLCJnZXRUYWdzVHJhbnNmb3JtZXIiLCJwYXJzZVRhZ2dpbmciLCJsaWZlY3ljbGVUcmFuc2Zvcm1lciIsInBhcnNlTGlmZWN5Y2xlQ29uZmlnIiwib2JqZWN0TG9ja1RyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwib2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsImJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lciIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsIm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWciLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0UGFyc2VyIiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1BhcnNlciJdLCJzb3VyY2VzIjpbInRyYW5zZm9ybWVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSwgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5cbmltcG9ydCBKU09OUGFyc2VyIGZyb20gJ2pzb24tc3RyZWFtJ1xuaW1wb3J0IFRocm91Z2gyIGZyb20gJ3Rocm91Z2gyJ1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB4bWxQYXJzZXJzIGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbi8vIGdldENvbmNhdGVyIHJldHVybnMgYSBzdHJlYW0gdGhhdCBjb25jYXRlbmF0ZXMgdGhlIGlucHV0IGFuZCBlbWl0c1xuLy8gdGhlIGNvbmNhdGVuYXRlZCBvdXRwdXQgd2hlbiAnZW5kJyBoYXMgcmVhY2hlZC4gSWYgYW4gb3B0aW9uYWxcbi8vIHBhcnNlciBmdW5jdGlvbiBpcyBwYXNzZWQgdXBvbiByZWFjaGluZyB0aGUgJ2VuZCcgb2YgdGhlIHN0cmVhbSxcbi8vIGBwYXJzZXIoY29uY2F0ZW5hdGVkX2RhdGEpYCB3aWxsIGJlIGVtaXR0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY2F0ZXIocGFyc2VyLCBlbWl0RXJyb3IpIHtcbiAgdmFyIG9iamVjdE1vZGUgPSBmYWxzZVxuICB2YXIgYnVmcyA9IFtdXG5cbiAgaWYgKHBhcnNlciAmJiAhaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gIH1cblxuICBpZiAocGFyc2VyKSB7XG4gICAgb2JqZWN0TW9kZSA9IHRydWVcbiAgfVxuXG4gIHJldHVybiBUaHJvdWdoMihcbiAgICB7IG9iamVjdE1vZGUgfSxcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGJ1ZnMucHVzaChjaHVuaylcbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgaWYgKGVtaXRFcnJvcikge1xuICAgICAgICBjYihwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgLy8gY2IoZSkgd291bGQgbWVhbiB3ZSBoYXZlIHRvIGVtaXQgJ2VuZCcgYnkgZXhwbGljaXRseSBjYWxsaW5nIHRoaXMucHVzaChudWxsKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYnVmcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICAgIHRoaXMucHVzaChwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gQSB0aHJvdWdoIHN0cmVhbSB0aGF0IGNhbGN1bGF0ZXMgbWQ1c3VtIGFuZCBzaGEyNTZzdW1cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYXNoU3VtbWVyKGVuYWJsZVNIQTI1Nikge1xuICB2YXIgbWQ1ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpXG4gIHZhciBzaGEyNTYgPSBDcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JylcblxuICByZXR1cm4gVGhyb3VnaDIub2JqKFxuICAgIGZ1bmN0aW9uIChjaHVuaywgZW5jLCBjYikge1xuICAgICAgaWYgKGVuYWJsZVNIQTI1Nikge1xuICAgICAgICBzaGEyNTYudXBkYXRlKGNodW5rKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWQ1LnVwZGF0ZShjaHVuaylcbiAgICAgIH1cbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIG1kNXN1bSA9ICcnXG4gICAgICB2YXIgc2hhMjU2c3VtID0gJydcbiAgICAgIGlmIChlbmFibGVTSEEyNTYpIHtcbiAgICAgICAgc2hhMjU2c3VtID0gc2hhMjU2LmRpZ2VzdCgnaGV4JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1kNXN1bSA9IG1kNS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICB9XG4gICAgICB2YXIgaGFzaERhdGEgPSB7IG1kNXN1bSwgc2hhMjU2c3VtIH1cbiAgICAgIHRoaXMucHVzaChoYXNoRGF0YSlcbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gRm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gYSBzdHJlYW0gb2JqZWN0IHRoYXQgcGFyc2VzIFhNTFxuLy8gYW5kIGVtaXRzIHN1aXRhYmxlIEphdmFzY3JpcHQgb2JqZWN0cy5cblxuLy8gUGFyc2VzIENvcHlPYmplY3QgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUNvcHlPYmplY3QpXG59XG5cbi8vIFBhcnNlcyBsaXN0TXVsdGlwYXJ0VXBsb2FkcyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGxpc3RPYmplY3RzIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldExpc3RPYmplY3RzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE9iamVjdHMpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE9iamVjdHNWMilcbn1cblxuLy8gUGFyc2VzIGxpc3RPYmplY3RzIHdpdGggbWV0YWRhdGEgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YVRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEpXG59XG5cbi8vIFBhcnNlcyBjb21wbGV0ZU11bHRpcGFydFVwbG9hZCByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUNvbXBsZXRlTXVsdGlwYXJ0KVxufVxuXG4vLyBQYXJzZXMgR0VUL1NFVCBCdWNrZXROb3RpZmljYXRpb24gcmVzcG9uc2VcbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VCdWNrZXROb3RpZmljYXRpb24pXG59XG5cbi8vIFBhcnNlcyBhIG5vdGlmaWNhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lcigpIHtcbiAgLy8gVGhpcyB3aWxsIHBhcnNlIGFuZCByZXR1cm4gZWFjaCBvYmplY3QuXG4gIHJldHVybiBuZXcgSlNPTlBhcnNlcigpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWNrZXRWZXJzaW9uaW5nVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlQnVja2V0VmVyc2lvbmluZ0NvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhZ3NUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VUYWdnaW5nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlmZWN5Y2xlVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlmZWN5Y2xlQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TG9ja1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZU9iamVjdExvY2tDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RSZXRlbnRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RSZXRlbnRpb25Db25maWcpXG59XG5leHBvcnQgZnVuY3Rpb24gYnVja2V0RW5jcnlwdGlvblRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldEVuY3J5cHRpb25Db25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RMZWdhbEhvbGRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRQYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnVwbG9hZFBhcnRQYXJzZXIpXG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5yZW1vdmVPYmplY3RzUGFyc2VyKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUwsdUJBQUEsQ0FBQUMsT0FBQTtBQUE4QyxTQUFBSyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBUCx3QkFBQVcsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxD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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcnlwdG8iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfanNvblN0cmVhbSIsIl9sb2Rhc2giLCJfdGhyb3VnaCIsImVycm9ycyIsIl9oZWxwZXIiLCJ4bWxQYXJzZXJzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsImdldENvbmNhdGVyIiwicGFyc2VyIiwiZW1pdEVycm9yIiwib2JqZWN0TW9kZSIsImJ1ZnMiLCJpc0Z1bmN0aW9uIiwiVHlwZUVycm9yIiwiVGhyb3VnaDIiLCJjaHVuayIsImVuYyIsImNiIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsInRvU3RyaW5nIiwibGVuZ3RoIiwiZ2V0RXJyb3JUcmFuc2Zvcm1lciIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsImNvZGUiLCJtZXNzYWdlIiwiaGVhZGVySW5mbyIsImFtelJlcXVlc3RpZCIsImhlYWRlcnNTZW50IiwiZ2V0SGVhZGVyIiwiYW16SWQyIiwiYW16QnVja2V0UmVnaW9uIiwieG1sU3RyaW5nIiwiZ2V0RXJyb3IiLCJlIiwiUzNFcnJvciIsIl8iLCJlYWNoIiwidmFsdWUiLCJwYXJzZUVycm9yIiwiZXgiLCJnZXRIYXNoU3VtbWVyIiwiZW5hYmxlU0hBMjU2IiwibWQ1IiwiY3JlYXRlSGFzaCIsInNoYTI1NiIsInVwZGF0ZSIsIm1kNXN1bSIsInNoYTI1NnN1bSIsImRpZ2VzdCIsImhhc2hEYXRhIiwiZ2V0Q29weU9iamVjdFRyYW5zZm9ybWVyIiwicGFyc2VDb3B5T2JqZWN0IiwiZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0QnVja2V0IiwiZ2V0TGlzdE11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwiZ2V0TGlzdFBhcnRzVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RQYXJ0cyIsImdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIiLCJwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IiwiZ2V0TGlzdE9iamVjdHNUcmFuc2Zvcm1lciIsInBhcnNlTGlzdE9iamVjdHMiLCJnZXRMaXN0T2JqZWN0c1YyVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjIiLCJnZXRMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhVHJhbnNmb3JtZXIiLCJwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEiLCJnZXRDb21wbGV0ZU11bHRpcGFydFRyYW5zZm9ybWVyIiwicGFyc2VDb21wbGV0ZU11bHRpcGFydCIsImdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXRSZWdpb24iLCJnZXRCdWNrZXROb3RpZmljYXRpb25UcmFuc2Zvcm1lciIsInBhcnNlQnVja2V0Tm90aWZpY2F0aW9uIiwiZ2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIiLCJKU09OUGFyc2VyIiwiYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwiZ2V0VGFnc1RyYW5zZm9ybWVyIiwicGFyc2VUYWdnaW5nIiwibGlmZWN5Y2xlVHJhbnNmb3JtZXIiLCJwYXJzZUxpZmVjeWNsZUNvbmZpZyIsIm9iamVjdExvY2tUcmFuc2Zvcm1lciIsInBhcnNlT2JqZWN0TG9ja0NvbmZpZyIsIm9iamVjdFJldGVudGlvblRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RSZXRlbnRpb25Db25maWciLCJidWNrZXRFbmNyeXB0aW9uVHJhbnNmb3JtZXIiLCJwYXJzZUJ1Y2tldEVuY3J5cHRpb25Db25maWciLCJyZXBsaWNhdGlvbkNvbmZpZ1RyYW5zZm9ybWVyIiwicGFyc2VSZXBsaWNhdGlvbkNvbmZpZyIsIm9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyIiwicGFyc2VPYmplY3RMZWdhbEhvbGRDb25maWciLCJ1cGxvYWRQYXJ0VHJhbnNmb3JtZXIiLCJ1cGxvYWRQYXJ0UGFyc2VyIiwic2VsZWN0T2JqZWN0Q29udGVudFRyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1RyYW5zZm9ybWVyIiwicmVtb3ZlT2JqZWN0c1BhcnNlciJdLCJzb3VyY2VzIjpbInRyYW5zZm9ybWVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTWluSU8gSmF2YXNjcmlwdCBMaWJyYXJ5IGZvciBBbWF6b24gUzMgQ29tcGF0aWJsZSBDbG91ZCBTdG9yYWdlLCAoQykgMjAxNSwgMjAxNiBNaW5JTywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBDcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5cbmltcG9ydCBKU09OUGFyc2VyIGZyb20gJ2pzb24tc3RyZWFtJ1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IFRocm91Z2gyIGZyb20gJ3Rocm91Z2gyJ1xuXG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgKiBhcyB4bWxQYXJzZXJzIGZyb20gJy4veG1sLXBhcnNlcnMuanMnXG5cbi8vIGdldENvbmNhdGVyIHJldHVybnMgYSBzdHJlYW0gdGhhdCBjb25jYXRlbmF0ZXMgdGhlIGlucHV0IGFuZCBlbWl0c1xuLy8gdGhlIGNvbmNhdGVuYXRlZCBvdXRwdXQgd2hlbiAnZW5kJyBoYXMgcmVhY2hlZC4gSWYgYW4gb3B0aW9uYWxcbi8vIHBhcnNlciBmdW5jdGlvbiBpcyBwYXNzZWQgdXBvbiByZWFjaGluZyB0aGUgJ2VuZCcgb2YgdGhlIHN0cmVhbSxcbi8vIGBwYXJzZXIoY29uY2F0ZW5hdGVkX2RhdGEpYCB3aWxsIGJlIGVtaXR0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY2F0ZXIocGFyc2VyLCBlbWl0RXJyb3IpIHtcbiAgdmFyIG9iamVjdE1vZGUgPSBmYWxzZVxuICB2YXIgYnVmcyA9IFtdXG5cbiAgaWYgKHBhcnNlciAmJiAhaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIHNob3VsZCBiZSBvZiB0eXBlIFwiZnVuY3Rpb25cIicpXG4gIH1cblxuICBpZiAocGFyc2VyKSB7XG4gICAgb2JqZWN0TW9kZSA9IHRydWVcbiAgfVxuXG4gIHJldHVybiBUaHJvdWdoMihcbiAgICB7IG9iamVjdE1vZGUgfSxcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGJ1ZnMucHVzaChjaHVuaylcbiAgICAgIGNiKClcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgaWYgKGVtaXRFcnJvcikge1xuICAgICAgICBjYihwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgLy8gY2IoZSkgd291bGQgbWVhbiB3ZSBoYXZlIHRvIGVtaXQgJ2VuZCcgYnkgZXhwbGljaXRseSBjYWxsaW5nIHRoaXMucHVzaChudWxsKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYnVmcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICAgIHRoaXMucHVzaChwYXJzZXIoQnVmZmVyLmNvbmNhdChidWZzKS50b1N0cmluZygpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IoKVxuICAgIH0sXG4gIClcbn1cblxuLy8gR2VuZXJhdGVzIGFuIEVycm9yIG9iamVjdCBkZXBlbmRpbmcgb24gaHR0cCBzdGF0dXNDb2RlIGFuZCBYTUwgYm9keVxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yVHJhbnNmb3JtZXIocmVzcG9uc2UpIHtcbiAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlXG4gIHZhciBjb2RlLCBtZXNzYWdlXG4gIGlmIChzdGF0dXNDb2RlID09PSAzMDEpIHtcbiAgICBjb2RlID0gJ01vdmVkUGVybWFuZW50bHknXG4gICAgbWVzc2FnZSA9ICdNb3ZlZCBQZXJtYW5lbnRseSdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSAzMDcpIHtcbiAgICBjb2RlID0gJ1RlbXBvcmFyeVJlZGlyZWN0J1xuICAgIG1lc3NhZ2UgPSAnQXJlIHlvdSB1c2luZyB0aGUgY29ycmVjdCBlbmRwb2ludCBVUkw/J1xuICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgIGNvZGUgPSAnQWNjZXNzRGVuaWVkJ1xuICAgIG1lc3NhZ2UgPSAnVmFsaWQgYW5kIGF1dGhvcml6ZWQgY3JlZGVudGlhbHMgcmVxdWlyZWQnXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgY29kZSA9ICdOb3RGb3VuZCdcbiAgICBtZXNzYWdlID0gJ05vdCBGb3VuZCdcbiAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSA0MDUpIHtcbiAgICBjb2RlID0gJ01ldGhvZE5vdEFsbG93ZWQnXG4gICAgbWVzc2FnZSA9ICdNZXRob2QgTm90IEFsbG93ZWQnXG4gIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gNTAxKSB7XG4gICAgY29kZSA9ICdNZXRob2ROb3RBbGxvd2VkJ1xuICAgIG1lc3NhZ2UgPSAnTWV0aG9kIE5vdCBBbGxvd2VkJ1xuICB9IGVsc2Uge1xuICAgIGNvZGUgPSAnVW5rbm93bkVycm9yJ1xuICAgIG1lc3NhZ2UgPSBgJHtzdGF0dXNDb2RlfWBcbiAgfVxuXG4gIHZhciBoZWFkZXJJbmZvID0ge31cbiAgLy8gQSB2YWx1ZSBjcmVhdGVkIGJ5IFMzIGNvbXBhdGlibGUgc2VydmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllc1xuICAvLyB0aGUgcmVxdWVzdC5cbiAgaGVhZGVySW5mby5hbXpSZXF1ZXN0aWQgPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotcmVxdWVzdC1pZCcpIDogbnVsbFxuICAvLyBBIHNwZWNpYWwgdG9rZW4gdGhhdCBoZWxwcyB0cm91Ymxlc2hvb3QgQVBJIHJlcGxpZXMgYW5kIGlzc3Vlcy5cbiAgaGVhZGVySW5mby5hbXpJZDIgPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotaWQtMicpIDogbnVsbFxuICAvLyBSZWdpb24gd2hlcmUgdGhlIGJ1Y2tldCBpcyBsb2NhdGVkLiBUaGlzIGhlYWRlciBpcyByZXR1cm5lZCBvbmx5XG4gIC8vIGluIEhFQUQgYnVja2V0IGFuZCBMaXN0T2JqZWN0cyByZXNwb25zZS5cbiAgaGVhZGVySW5mby5hbXpCdWNrZXRSZWdpb24gPSByZXNwb25zZS5oZWFkZXJzU2VudCA/IHJlc3BvbnNlLmdldEhlYWRlcigneC1hbXotYnVja2V0LXJlZ2lvbicpIDogbnVsbFxuXG4gIHJldHVybiBnZXRDb25jYXRlcigoeG1sU3RyaW5nKSA9PiB7XG4gICAgbGV0IGdldEVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gTWVzc2FnZSBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciBlYWNoIFMzRXJyb3JzLlxuICAgICAgdmFyIGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IobWVzc2FnZSlcbiAgICAgIC8vIFMzIEVycm9yIGNvZGUuXG4gICAgICBlLmNvZGUgPSBjb2RlXG4gICAgICBfLmVhY2goaGVhZGVySW5mbywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgZVtrZXldID0gdmFsdWVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZVxuICAgIH1cbiAgICBpZiAoIXhtbFN0cmluZykge1xuICAgICAgcmV0dXJuIGdldEVycm9yKClcbiAgICB9XG4gICAgbGV0IGVcbiAgICB0cnkge1xuICAgICAgZSA9IHhtbFBhcnNlcnMucGFyc2VFcnJvcih4bWxTdHJpbmcsIGhlYWRlckluZm8pXG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBnZXRFcnJvcigpXG4gICAgfVxuICAgIHJldHVybiBlXG4gIH0sIHRydWUpXG59XG5cbi8vIEEgdGhyb3VnaCBzdHJlYW0gdGhhdCBjYWxjdWxhdGVzIG1kNXN1bSBhbmQgc2hhMjU2c3VtXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFzaFN1bW1lcihlbmFibGVTSEEyNTYpIHtcbiAgdmFyIG1kNSA9IENyeXB0by5jcmVhdGVIYXNoKCdtZDUnKVxuICB2YXIgc2hhMjU2ID0gQ3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG5cbiAgcmV0dXJuIFRocm91Z2gyLm9iaihcbiAgICBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgIGlmIChlbmFibGVTSEEyNTYpIHtcbiAgICAgICAgc2hhMjU2LnVwZGF0ZShjaHVuaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1kNS51cGRhdGUoY2h1bmspXG4gICAgICB9XG4gICAgICBjYigpXG4gICAgfSxcbiAgICBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBtZDVzdW0gPSAnJ1xuICAgICAgdmFyIHNoYTI1NnN1bSA9ICcnXG4gICAgICBpZiAoZW5hYmxlU0hBMjU2KSB7XG4gICAgICAgIHNoYTI1NnN1bSA9IHNoYTI1Ni5kaWdlc3QoJ2hleCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZDVzdW0gPSBtZDUuZGlnZXN0KCdiYXNlNjQnKVxuICAgICAgfVxuICAgICAgdmFyIGhhc2hEYXRhID0geyBtZDVzdW0sIHNoYTI1NnN1bSB9XG4gICAgICB0aGlzLnB1c2goaGFzaERhdGEpXG4gICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIGNiKClcbiAgICB9LFxuICApXG59XG5cbi8vIEZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIGEgc3RyZWFtIG9iamVjdCB0aGF0IHBhcnNlcyBYTUxcbi8vIGFuZCBlbWl0cyBzdWl0YWJsZSBKYXZhc2NyaXB0IG9iamVjdHMuXG5cbi8vIFBhcnNlcyBDb3B5T2JqZWN0IHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvcHlPYmplY3RUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VDb3B5T2JqZWN0KVxufVxuXG4vLyBQYXJzZXMgbGlzdEJ1Y2tldHMgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdEJ1Y2tldFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RCdWNrZXQpXG59XG5cbi8vIFBhcnNlcyBsaXN0TXVsdGlwYXJ0VXBsb2FkcyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0TXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlTGlzdE11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGxpc3RQYXJ0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0UGFydHNUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VMaXN0UGFydHMpXG59XG5cbi8vIFBhcnNlcyBpbml0TXVsdGlwYXJ0VXBsb2FkIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYXRlTXVsdGlwYXJ0VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlSW5pdGlhdGVNdWx0aXBhcnQpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyByZXNwb25zZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0T2JqZWN0c1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzKVxufVxuXG4vLyBQYXJzZXMgbGlzdE9iamVjdHMgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlzdE9iamVjdHNWMlRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpc3RPYmplY3RzVjIpXG59XG5cbi8vIFBhcnNlcyBsaXN0T2JqZWN0cyB3aXRoIG1ldGFkYXRhIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldExpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGFUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhKVxufVxuXG4vLyBQYXJzZXMgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgcmVzcG9uc2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGxldGVNdWx0aXBhcnRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VDb21wbGV0ZU11bHRpcGFydClcbn1cblxuLy8gUGFyc2VzIGdldEJ1Y2tldExvY2F0aW9uIHJlc3BvbnNlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldFJlZ2lvblRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldFJlZ2lvbilcbn1cblxuLy8gUGFyc2VzIEdFVC9TRVQgQnVja2V0Tm90aWZpY2F0aW9uIHJlc3BvbnNlXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlQnVja2V0Tm90aWZpY2F0aW9uKVxufVxuXG4vLyBQYXJzZXMgYSBub3RpZmljYXRpb24uXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVHJhbnNmb3JtZXIoKSB7XG4gIC8vIFRoaXMgd2lsbCBwYXJzZSBhbmQgcmV0dXJuIGVhY2ggb2JqZWN0LlxuICByZXR1cm4gbmV3IEpTT05QYXJzZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVja2V0VmVyc2lvbmluZ1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWdzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlVGFnZ2luZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpZmVjeWNsZVRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZUxpZmVjeWNsZUNvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdExvY2tUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VPYmplY3RMb2NrQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0UmV0ZW50aW9uVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnBhcnNlT2JqZWN0UmV0ZW50aW9uQ29uZmlnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGJ1Y2tldEVuY3J5cHRpb25UcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VCdWNrZXRFbmNyeXB0aW9uQ29uZmlnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGljYXRpb25Db25maWdUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMucGFyc2VSZXBsaWNhdGlvbkNvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdExlZ2FsSG9sZFRyYW5zZm9ybWVyKCkge1xuICByZXR1cm4gZ2V0Q29uY2F0ZXIoeG1sUGFyc2Vycy5wYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBhcnRUcmFuc2Zvcm1lcigpIHtcbiAgcmV0dXJuIGdldENvbmNhdGVyKHhtbFBhcnNlcnMudXBsb2FkUGFydFBhcnNlcilcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RPYmplY3RDb250ZW50VHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcigpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVPYmplY3RzVHJhbnNmb3JtZXIoKSB7XG4gIHJldHVybiBnZXRDb25jYXRlcih4bWxQYXJzZXJzLnJlbW92ZU9iamVjdHNQYXJzZXIpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBUCx1QkFBQSxDQUFBQyxPQUFBO0FBQThDLFNBQUFPLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFULHdCQUFBYSxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsb0JBQUFBLEdBQUEsd0JBQUFBLEdBQUEsNEJBQUFFLE9BQUEsRUFBQUYsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLEdBQUEsSUFBQVgsR0FBQSxRQUFBVyxHQUFBLGtCQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFkLEdBQUEsRUFBQVcsR0FBQSxTQUFBSSxJQUFBLEdBQUFSLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsR0FBQSxFQUFBVyxHQUFBLGNBQUFJLElBQUEsS0FBQUEsSUFBQSxDQUFBVixHQUFBLElBQUFVLElBQUEsQ0FBQUMsR0FBQSxLQUFBUixNQUFBLENBQUFDLGNBQUEsQ0FBQUgsTUFBQSxFQUFBSyxHQUFBLEVBQUFJLElBQUEsWUFBQVQsTUFBQSxDQUFBSyxHQUFBLElBQUFYLEdBQUEsQ0FBQVcsR0FBQSxTQUFBTCxNQUFBLENBQUFKLE9BQUEsR0FBQUYsR0FBQSxNQUFBRyxLQUFBLElBQUFBLEtBQUEsQ0FBQWEsR0FBQSxDQUFBaEIsR0FBQSxFQUFBTSxNQUFBLFlBQUFBLE1BQUE7QUF4QjlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNXLFdBQVdBLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxFQUFFO0VBQzdDLElBQUlDLFVBQVUsR0FBRyxLQUFLO0VBQ3RCLElBQUlDLElBQUksR0FBRyxFQUFFO0VBRWIsSUFBSUgsTUFBTSxJQUFJLENBQUMsSUFBQUksa0JBQVUsRUFBQ0osTUFBTSxDQUFDLEVBQUU7SUFDakMsTUFBTSxJQUFJSyxTQUFTLENBQUMscUNBQXFDLENBQUM7RUFDNUQ7RUFFQSxJQUFJTCxNQUFNLEVBQUU7SUFDVkUsVUFBVSxHQUFHLElBQUk7RUFDbkI7RUFFQSxPQUFPSSxRQUFRLENBQ2I7SUFBRUo7RUFBVyxDQUFDLEVBQ2QsVUFBVUssS0FBSyxFQUFFQyxHQUFHLEVBQUVDLEVBQUUsRUFBRTtJQUN4Qk4sSUFBSSxDQUFDTyxJQUFJLENBQUNILEtBQUssQ0FBQztJQUNoQkUsRUFBRSxDQUFDLENBQUM7RUFDTixDQUFDLEVBQ0QsVUFBVUEsRUFBRSxFQUFFO0lBQ1osSUFBSVIsU0FBUyxFQUFFO01BQ2JRLEVBQUUsQ0FBQ1QsTUFBTSxDQUFDVyxNQUFNLENBQUNDLE1BQU0sQ0FBQ1QsSUFBSSxDQUFDLENBQUNVLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMxQztNQUNBLElBQUksQ0FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNmO0lBQ0Y7SUFDQSxJQUFJUCxJQUFJLENBQUNXLE1BQU0sRUFBRTtNQUNmLElBQUlkLE1BQU0sRUFBRTtRQUNWLElBQUksQ0FBQ1UsSUFBSSxDQUFDVixNQUFNLENBQUNXLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDVCxJQUFJLENBQUMsQ0FBQ1UsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ25ELENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQ0gsSUFBSSxDQUFDQyxNQUFNLENBQUNDLE1BQU0sQ0FBQ1QsSUFBSSxDQUFDLENBQUM7TUFDaEM7SUFDRjtJQUNBTSxFQUFFLENBQUMsQ0FBQztFQUNOLENBQ0YsQ0FBQztBQUNIOztBQUVBO0FBQ08sU0FBU00sbUJBQW1CQSxDQUFDQyxRQUFRLEVBQUU7RUFDNUMsSUFBSUMsVUFBVSxHQUFHRCxRQUFRLENBQUNDLFVBQVU7RUFDcEMsSUFBSUMsSUFBSSxFQUFFQyxPQUFPO0VBQ2pCLElBQUlGLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDdEJDLElBQUksR0FBRyxrQkFBa0I7SUFDekJDLE9BQU8sR0FBRyxtQkFBbUI7RUFDL0IsQ0FBQyxNQUFNLElBQUlGLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDN0JDLElBQUksR0FBRyxtQkFBbUI7SUFDMUJDLE9BQU8sR0FBRyx5Q0FBeUM7RUFDckQsQ0FBQyxNQUFNLElBQUlGLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDN0JDLElBQUksR0FBRyxjQUFjO0lBQ3JCQyxPQUFPLEdBQUcsMkNBQTJDO0VBQ3ZELENBQUMsTUFBTSxJQUFJRixVQUFVLEtBQUssR0FBRyxFQUFFO0lBQzdCQyxJQUFJLEdBQUcsVUFBVTtJQUNqQkMsT0FBTyxHQUFHLFdBQVc7RUFDdkIsQ0FBQyxNQUFNLElBQUlGLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDN0JDLElBQUksR0FBRyxrQkFBa0I7SUFDekJDLE9BQU8sR0FBRyxvQkFBb0I7RUFDaEMsQ0FBQyxNQUFNLElBQUlGLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDN0JDLElBQUksR0FBRyxrQkFBa0I7SUFDekJDLE9BQU8sR0FBRyxvQkFBb0I7RUFDaEMsQ0FBQyxNQUFNO0lBQ0xELElBQUksR0FBRyxjQUFjO0lBQ3JCQyxPQUFPLEdBQUksR0FBRUYsVUFBVyxFQUFDO0VBQzNCO0VBRUEsSUFBSUcsVUFBVSxHQUFHLENBQUMsQ0FBQztFQUNuQjtFQUNBO0VBQ0FBLFVBQVUsQ0FBQ0MsWUFBWSxHQUFHTCxRQUFRLENBQUNNLFdBQVcsR0FBR04sUUFBUSxDQUFDTyxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJO0VBQzlGO0VBQ0FILFVBQVUsQ0FBQ0ksTUFBTSxHQUFHUixRQUFRLENBQUNNLFdBQVcsR0FBR04sUUFBUSxDQUFDTyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSTtFQUNsRjtFQUNBO0VBQ0FILFVBQVUsQ0FBQ0ssZUFBZSxHQUFHVCxRQUFRLENBQUNNLFdBQVcsR0FBR04sUUFBUSxDQUFDTyxTQUFTLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJO0VBRXBHLE9BQU94QixXQUFXLENBQUUyQixTQUFTLElBQUs7SUFDaEMsSUFBSUMsUUFBUSxHQUFHQSxDQUFBLEtBQU07TUFDbkI7TUFDQSxJQUFJQyxDQUFDLEdBQUcsSUFBSXRELE1BQU0sQ0FBQ3VELE9BQU8sQ0FBQ1YsT0FBTyxDQUFDO01BQ25DO01BQ0FTLENBQUMsQ0FBQ1YsSUFBSSxHQUFHQSxJQUFJO01BQ2JZLE9BQUMsQ0FBQ0MsSUFBSSxDQUFDWCxVQUFVLEVBQUUsQ0FBQ1ksS0FBSyxFQUFFdkMsR0FBRyxLQUFLO1FBQ2pDbUMsQ0FBQyxDQUFDbkMsR0FBRyxDQUFDLEdBQUd1QyxLQUFLO01BQ2hCLENBQUMsQ0FBQztNQUNGLE9BQU9KLENBQUM7SUFDVixDQUFDO0lBQ0QsSUFBSSxDQUFDRixTQUFTLEVBQUU7TUFDZCxPQUFPQyxRQUFRLENBQUMsQ0FBQztJQUNuQjtJQUNBLElBQUlDLENBQUM7SUFDTCxJQUFJO01BQ0ZBLENBQUMsR0FBR3BELFVBQVUsQ0FBQ3lELFVBQVUsQ0FBQ1AsU0FBUyxFQUFFTixVQUFVLENBQUM7SUFDbEQsQ0FBQyxDQUFDLE9BQU9jLEVBQUUsRUFBRTtNQUNYLE9BQU9QLFFBQVEsQ0FBQyxDQUFDO0lBQ25CO0lBQ0EsT0FBT0MsQ0FBQztFQUNWLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDVjs7QUFFQTtBQUNPLFNBQVNPLGFBQWFBLENBQUNDLFlBQVksRUFBRTtFQUMxQyxJQUFJQyxHQUFHLEdBQUdyRSxNQUFNLENBQUNzRSxVQUFVLENBQUMsS0FBSyxDQUFDO0VBQ2xDLElBQUlDLE1BQU0sR0FBR3ZFLE1BQU0sQ0FBQ3NFLFVBQVUsQ0FBQyxRQUFRLENBQUM7RUFFeEMsT0FBT2hDLFFBQVEsQ0FBQ3hCLEdBQUcsQ0FDakIsVUFBVXlCLEtBQUssRUFBRUMsR0FBRyxFQUFFQyxFQUFFLEVBQUU7SUFDeEIsSUFBSTJCLFlBQVksRUFBRTtNQUNoQkcsTUFBTSxDQUFDQyxNQUFNLENBQUNqQyxLQUFLLENBQUM7SUFDdEIsQ0FBQyxNQUFNO01BQ0w4QixHQUFHLENBQUNHLE1BQU0sQ0FBQ2pDLEtBQUssQ0FBQztJQUNuQjtJQUNBRSxFQUFFLENBQUMsQ0FBQztFQUNOLENBQUMsRUFDRCxVQUFVQSxFQUFFLEVBQUU7SUFDWixJQUFJZ0MsTUFBTSxHQUFHLEVBQUU7SUFDZixJQUFJQyxTQUFTLEdBQUcsRUFBRTtJQUNsQixJQUFJTixZQUFZLEVBQUU7TUFDaEJNLFNBQVMsR0FBR0gsTUFBTSxDQUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUMsTUFBTTtNQUNMRixNQUFNLEdBQUdKLEdBQUcsQ0FBQ00sTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUMvQjtJQUNBLElBQUlDLFFBQVEsR0FBRztNQUFFSCxNQUFNO01BQUVDO0lBQVUsQ0FBQztJQUNwQyxJQUFJLENBQUNoQyxJQUFJLENBQUNrQyxRQUFRLENBQUM7SUFDbkIsSUFBSSxDQUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNmRCxFQUFFLENBQUMsQ0FBQztFQUNOLENBQ0YsQ0FBQztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDTyxTQUFTb0Msd0JBQXdCQSxDQUFBLEVBQUc7RUFDekMsT0FBTzlDLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ3NFLGVBQWUsQ0FBQztBQUNoRDs7QUFFQTtBQUNPLFNBQVNDLHdCQUF3QkEsQ0FBQSxFQUFHO0VBQ3pDLE9BQU9oRCxXQUFXLENBQUN2QixVQUFVLENBQUN3RSxlQUFlLENBQUM7QUFDaEQ7O0FBRUE7QUFDTyxTQUFTQywyQkFBMkJBLENBQUEsRUFBRztFQUM1QyxPQUFPbEQsV0FBVyxDQUFDdkIsVUFBVSxDQUFDMEUsa0JBQWtCLENBQUM7QUFDbkQ7O0FBRUE7QUFDTyxTQUFTQyx1QkFBdUJBLENBQUEsRUFBRztFQUN4QyxPQUFPcEQsV0FBVyxDQUFDdkIsVUFBVSxDQUFDNEUsY0FBYyxDQUFDO0FBQy9DOztBQUVBO0FBQ08sU0FBU0MsK0JBQStCQSxDQUFBLEVBQUc7RUFDaEQsT0FBT3RELFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQzhFLHNCQUFzQixDQUFDO0FBQ3ZEOztBQUVBO0FBQ08sU0FBU0MseUJBQXlCQSxDQUFBLEVBQUc7RUFDMUMsT0FBT3hELFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ2dGLGdCQUFnQixDQUFDO0FBQ2pEOztBQUVBO0FBQ08sU0FBU0MsMkJBQTJCQSxDQUFBLEVBQUc7RUFDNUMsT0FBTzFELFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ2tGLGtCQUFrQixDQUFDO0FBQ25EOztBQUVBO0FBQ08sU0FBU0MsdUNBQXVDQSxDQUFBLEVBQUc7RUFDeEQsT0FBTzVELFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ29GLDhCQUE4QixDQUFDO0FBQy9EOztBQUVBO0FBQ08sU0FBU0MsK0JBQStCQSxDQUFBLEVBQUc7RUFDaEQsT0FBTzlELFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ3NGLHNCQUFzQixDQUFDO0FBQ3ZEOztBQUVBO0FBQ08sU0FBU0MsMEJBQTBCQSxDQUFBLEVBQUc7RUFDM0MsT0FBT2hFLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ3dGLGlCQUFpQixDQUFDO0FBQ2xEOztBQUVBO0FBQ08sU0FBU0MsZ0NBQWdDQSxDQUFBLEVBQUc7RUFDakQsT0FBT2xFLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQzBGLHVCQUF1QixDQUFDO0FBQ3hEOztBQUVBO0FBQ08sU0FBU0MsMEJBQTBCQSxDQUFBLEVBQUc7RUFDM0M7RUFDQSxPQUFPLElBQUlDLFdBQVUsQ0FBQyxDQUFDO0FBQ3pCO0FBRU8sU0FBU0MsMkJBQTJCQSxDQUFBLEVBQUc7RUFDNUMsT0FBT3RFLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQzhGLDJCQUEyQixDQUFDO0FBQzVEO0FBRU8sU0FBU0Msa0JBQWtCQSxDQUFBLEVBQUc7RUFDbkMsT0FBT3hFLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ2dHLFlBQVksQ0FBQztBQUM3QztBQUVPLFNBQVNDLG9CQUFvQkEsQ0FBQSxFQUFHO0VBQ3JDLE9BQU8xRSxXQUFXLENBQUN2QixVQUFVLENBQUNrRyxvQkFBb0IsQ0FBQztBQUNyRDtBQUVPLFNBQVNDLHFCQUFxQkEsQ0FBQSxFQUFHO0VBQ3RDLE9BQU81RSxXQUFXLENBQUN2QixVQUFVLENBQUNvRyxxQkFBcUIsQ0FBQztBQUN0RDtBQUVPLFNBQVNDLDBCQUEwQkEsQ0FBQSxFQUFHO0VBQzNDLE9BQU85RSxXQUFXLENBQUN2QixVQUFVLENBQUNzRywwQkFBMEIsQ0FBQztBQUMzRDtBQUNPLFNBQVNDLDJCQUEyQkEsQ0FBQSxFQUFHO0VBQzVDLE9BQU9oRixXQUFXLENBQUN2QixVQUFVLENBQUN3RywyQkFBMkIsQ0FBQztBQUM1RDtBQUVPLFNBQVNDLDRCQUE0QkEsQ0FBQSxFQUFHO0VBQzdDLE9BQU9sRixXQUFXLENBQUN2QixVQUFVLENBQUMwRyxzQkFBc0IsQ0FBQztBQUN2RDtBQUVPLFNBQVNDLDBCQUEwQkEsQ0FBQSxFQUFHO0VBQzNDLE9BQU9wRixXQUFXLENBQUN2QixVQUFVLENBQUM0RywwQkFBMEIsQ0FBQztBQUMzRDtBQUVPLFNBQVNDLHFCQUFxQkEsQ0FBQSxFQUFHO0VBQ3RDLE9BQU90RixXQUFXLENBQUN2QixVQUFVLENBQUM4RyxnQkFBZ0IsQ0FBQztBQUNqRDtBQUNPLFNBQVNDLDhCQUE4QkEsQ0FBQSxFQUFHO0VBQy9DLE9BQU94RixXQUFXLENBQUMsQ0FBQztBQUN0QjtBQUVPLFNBQVN5Rix3QkFBd0JBLENBQUEsRUFBRztFQUN6QyxPQUFPekYsV0FBVyxDQUFDdkIsVUFBVSxDQUFDaUgsbUJBQW1CLENBQUM7QUFDcEQifQ== /***/ }), @@ -82610,23 +85882,30 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.parseBucketEncryptionConfig = parseBucketEncryptionConfig; exports.parseBucketNotification = parseBucketNotification; +exports.parseBucketRegion = parseBucketRegion; exports.parseBucketVersioningConfig = parseBucketVersioningConfig; exports.parseCompleteMultipart = parseCompleteMultipart; exports.parseCopyObject = parseCopyObject; +exports.parseError = parseError; +exports.parseInitiateMultipart = parseInitiateMultipart; exports.parseLifecycleConfig = parseLifecycleConfig; +exports.parseListBucket = parseListBucket; exports.parseListMultipart = parseListMultipart; exports.parseListObjects = parseListObjects; exports.parseListObjectsV2 = parseListObjectsV2; exports.parseListObjectsV2WithMetadata = parseListObjectsV2WithMetadata; +exports.parseListParts = parseListParts; exports.parseObjectLegalHoldConfig = parseObjectLegalHoldConfig; exports.parseObjectLockConfig = parseObjectLockConfig; exports.parseObjectRetentionConfig = parseObjectRetentionConfig; +exports.parseReplicationConfig = parseReplicationConfig; exports.parseSelectObjectContentResponse = parseSelectObjectContentResponse; exports.parseTagging = parseTagging; exports.removeObjectsParser = removeObjectsParser; exports.uploadPartParser = uploadPartParser; var _bufferCrc = __nccwpck_require__(4024); var _fastXmlParser = __nccwpck_require__(2603); +var _lodash = __nccwpck_require__(250); var errors = _interopRequireWildcard(__nccwpck_require__(1174), true); var _helpers = __nccwpck_require__(9455); var _helper = __nccwpck_require__(9921); @@ -82649,11 +85928,25 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && * limitations under the License. */ -const fxpWithoutNumParser = new _fastXmlParser.XMLParser({ - numberParseOptions: { - skipLike: /./ +// Parse XML and return information as Javascript types +const fxp = new _fastXmlParser.XMLParser(); + +// parse error XML response +function parseError(xml, headerInfo) { + var xmlErr = {}; + var xmlObj = fxp.parse(xml); + if (xmlObj.Error) { + xmlErr = xmlObj.Error; } -}); + var e = new errors.S3Error(); + _lodash.each(xmlErr, (value, key) => { + e[key.toLowerCase()] = value; + }); + _lodash.each(headerInfo, (value, key) => { + e[key] = value; + }); + return e; +} // parse XML response for copy object function parseCopyObject(xml) { @@ -82694,7 +85987,7 @@ function parseListMultipart(xml) { result.nextKeyMarker = xmlobj.NextKeyMarker; } if (xmlobj.NextUploadIdMarker) { - result.nextUploadIdMarker = xmlobj.nextUploadIdMarker || ''; + result.nextUploadIdMarker = xmlobj.nextUploadIdMarker; } if (xmlobj.CommonPrefixes) { (0, _helper.toArray)(xmlobj.CommonPrefixes).forEach(prefix => { @@ -82731,6 +86024,27 @@ function parseListMultipart(xml) { } // parse XML response to list all the owned buckets +function parseListBucket(xml) { + var result = []; + var xmlobj = (0, _helper.parseXml)(xml); + if (!xmlobj.ListAllMyBucketsResult) { + throw new errors.InvalidXMLError('Missing tag: "ListAllMyBucketsResult"'); + } + xmlobj = xmlobj.ListAllMyBucketsResult; + if (xmlobj.Buckets) { + if (xmlobj.Buckets.Bucket) { + (0, _helper.toArray)(xmlobj.Buckets.Bucket).forEach(bucket => { + var name = bucket.Name; + var creationDate = new Date(bucket.CreationDate); + result.push({ + name, + creationDate + }); + }); + } + } + return result; +} // parse XML response for bucket notification function parseBucketNotification(xml) { @@ -82821,6 +86135,58 @@ function parseBucketNotification(xml) { return result; } +// parse XML response for bucket region +function parseBucketRegion(xml) { + // return region information + return (0, _helper.parseXml)(xml).LocationConstraint; +} + +// parse XML response for list parts of an in progress multipart upload +function parseListParts(xml) { + var xmlobj = (0, _helper.parseXml)(xml); + var result = { + isTruncated: false, + parts: [], + marker: undefined + }; + if (!xmlobj.ListPartsResult) { + throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"'); + } + xmlobj = xmlobj.ListPartsResult; + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated; + } + if (xmlobj.NextPartNumberMarker) { + result.marker = +(0, _helper.toArray)(xmlobj.NextPartNumberMarker)[0]; + } + if (xmlobj.Part) { + (0, _helper.toArray)(xmlobj.Part).forEach(p => { + var part = +(0, _helper.toArray)(p.PartNumber)[0]; + var lastModified = new Date(p.LastModified); + var etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, '').replace(/^"/g, '').replace(/"$/g, ''); + result.parts.push({ + part, + lastModified, + etag + }); + }); + } + return result; +} + +// parse XML response when a new multipart upload is initiated +function parseInitiateMultipart(xml) { + var xmlobj = (0, _helper.parseXml)(xml); + if (!xmlobj.InitiateMultipartUploadResult) { + throw new errors.InvalidXMLError('Missing tag: "InitiateMultipartUploadResult"'); + } + xmlobj = xmlobj.InitiateMultipartUploadResult; + if (xmlobj.UploadId) { + return xmlobj.UploadId; + } + throw new errors.InvalidXMLError('Missing tag: "UploadId"'); +} + // parse XML response when a multipart upload is completed function parseCompleteMultipart(xml) { var xmlobj = (0, _helper.parseXml)(xml).CompleteMultipartUploadResult; @@ -82861,12 +86227,11 @@ const formatObjInfo = (content, opts = {}) => { const name = (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(Key)[0]); const lastModified = new Date((0, _helper.toArray)(LastModified)[0]); const etag = (0, _helper.sanitizeETag)((0, _helper.toArray)(ETag)[0]); - const size = (0, _helper.sanitizeSize)(Size); return { name, lastModified, etag, - size, + size: Size, versionId: VersionId, isLatest: IsLatest, isDeleteMarker: opts.IsDeleteMarker ? opts.IsDeleteMarker : false @@ -82881,7 +86246,7 @@ function parseListObjects(xml) { }; let isTruncated = false; let nextMarker, nextVersionKeyMarker; - const xmlobj = fxpWithoutNumParser.parse(xml); + const xmlobj = (0, _helper.parseXml)(xml); const parseCommonPrefixesEntity = responseEntity => { if (responseEntity) { (0, _helper.toArray)(responseEntity).forEach(commonPrefix => { @@ -82903,7 +86268,7 @@ function parseListObjects(xml) { const name = (0, _helper.sanitizeObjectKey)((0, _helper.toArray)(content.Key)[0]); const lastModified = new Date((0, _helper.toArray)(content.LastModified)[0]); const etag = (0, _helper.sanitizeETag)((0, _helper.toArray)(content.ETag)[0]); - const size = (0, _helper.sanitizeSize)(content.Size); + const size = content.Size; result.objects.push({ name, lastModified, @@ -83097,6 +86462,16 @@ function parseBucketEncryptionConfig(xml) { let encConfig = (0, _helper.parseXml)(xml); return encConfig; } +function parseReplicationConfig(xml) { + const xmlObj = (0, _helper.parseXml)(xml); + const replicationConfig = { + ReplicationConfiguration: { + role: xmlObj.ReplicationConfiguration.Role, + rules: (0, _helper.toArray)(xmlObj.ReplicationConfiguration.Rule) + } + }; + return replicationConfig; +} function parseObjectLegalHoldConfig(xml) { const xmlObj = (0, _helper.parseXml)(xml); return xmlObj.LegalHold; @@ -83246,7 +86621,222 @@ function parseSelectObjectContentResponse(res) { } // messageType End } // Top Level Stream End } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVmZmVyQ3JjIiwicmVxdWlyZSIsIl9mYXN0WG1sUGFyc2VyIiwiZXJyb3JzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfaGVscGVycyIsIl9oZWxwZXIiLCJfdHlwZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJmeHBXaXRob3V0TnVtUGFyc2VyIiwiWE1MUGFyc2VyIiwibnVtYmVyUGFyc2VPcHRpb25zIiwic2tpcExpa2UiLCJwYXJzZUNvcHlPYmplY3QiLCJ4bWwiLCJyZXN1bHQiLCJldGFnIiwibGFzdE1vZGlmaWVkIiwieG1sb2JqIiwicGFyc2VYbWwiLCJDb3B5T2JqZWN0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiRVRhZyIsInJlcGxhY2UiLCJMYXN0TW9kaWZpZWQiLCJEYXRlIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwidXBsb2FkcyIsInByZWZpeGVzIiwiaXNUcnVuY2F0ZWQiLCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCIsIklzVHJ1bmNhdGVkIiwiTmV4dEtleU1hcmtlciIsIm5leHRLZXlNYXJrZXIiLCJOZXh0VXBsb2FkSWRNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJDb21tb25QcmVmaXhlcyIsInRvQXJyYXkiLCJmb3JFYWNoIiwicHJlZml4IiwicHVzaCIsInNhbml0aXplT2JqZWN0S2V5IiwiUHJlZml4IiwiVXBsb2FkIiwidXBsb2FkIiwiS2V5IiwidXBsb2FkSWQiLCJVcGxvYWRJZCIsImluaXRpYXRvciIsImlkIiwiSW5pdGlhdG9yIiwiSUQiLCJkaXNwbGF5TmFtZSIsIkRpc3BsYXlOYW1lIiwib3duZXIiLCJPd25lciIsInN0b3JhZ2VDbGFzcyIsIlN0b3JhZ2VDbGFzcyIsImluaXRpYXRlZCIsIkluaXRpYXRlZCIsInBhcnNlQnVja2V0Tm90aWZpY2F0aW9uIiwiVG9waWNDb25maWd1cmF0aW9uIiwiUXVldWVDb25maWd1cmF0aW9uIiwiQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24iLCJnZW5FdmVudHMiLCJldmVudHMiLCJzM2V2ZW50IiwiZ2VuRmlsdGVyUnVsZXMiLCJmaWx0ZXJzIiwiUzNLZXkiLCJGaWx0ZXJSdWxlIiwicnVsZSIsIk5hbWUiLCJWYWx1ZSIsIk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJjb25maWciLCJJZCIsIlRvcGljIiwiRXZlbnQiLCJGaWx0ZXIiLCJRdWV1ZSIsIkNsb3VkRnVuY3Rpb24iLCJwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0IiwiQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJMb2NhdGlvbiIsImxvY2F0aW9uIiwiYnVja2V0IiwiQnVja2V0IiwiQ29kZSIsIk1lc3NhZ2UiLCJlcnJDb2RlIiwiZXJyTWVzc2FnZSIsImZvcm1hdE9iakluZm8iLCJjb250ZW50Iiwib3B0cyIsIlNpemUiLCJWZXJzaW9uSWQiLCJJc0xhdGVzdCIsImlzT2JqZWN0IiwibmFtZSIsInNhbml0aXplRVRhZyIsInNpemUiLCJzYW5pdGl6ZVNpemUiLCJ2ZXJzaW9uSWQiLCJpc0xhdGVzdCIsImlzRGVsZXRlTWFya2VyIiwiSXNEZWxldGVNYXJrZXIiLCJwYXJzZUxpc3RPYmplY3RzIiwib2JqZWN0cyIsIm5leHRNYXJrZXIiLCJuZXh0VmVyc2lvbktleU1hcmtlciIsInBhcnNlIiwicGFyc2VDb21tb25QcmVmaXhlc0VudGl0eSIsInJlc3BvbnNlRW50aXR5IiwiY29tbW9uUHJlZml4IiwibGlzdEJ1Y2tldFJlc3VsdCIsIkxpc3RCdWNrZXRSZXN1bHQiLCJsaXN0VmVyc2lvbnNSZXN1bHQiLCJMaXN0VmVyc2lvbnNSZXN1bHQiLCJDb250ZW50cyIsIk5leHRNYXJrZXIiLCJWZXJzaW9uIiwiRGVsZXRlTWFya2VyIiwiTmV4dFZlcnNpb25JZE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsInBhcnNlTGlzdE9iamVjdHNWMiIsIk5leHRDb250aW51YXRpb25Ub2tlbiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSIsIm1ldGFkYXRhIiwiVXNlck1ldGFkYXRhIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwieG1sT2JqIiwiVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24iLCJwYXJzZVRhZ2dpbmciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwidGFnUmVzdWx0IiwicGFyc2VMaWZlY3ljbGVDb25maWciLCJMaWZlY3ljbGVDb25maWd1cmF0aW9uIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ1Jlc3VsdCIsIk9iamVjdExvY2tDb25maWd1cmF0aW9uIiwib2JqZWN0TG9ja0VuYWJsZWQiLCJPYmplY3RMb2NrRW5hYmxlZCIsInJldGVudGlvblJlc3AiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIm1vZGUiLCJNb2RlIiwiaXNVbml0WWVhcnMiLCJZZWFycyIsInZhbGlkaXR5IiwidW5pdCIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIllFQVJTIiwiRGF5cyIsIkRBWVMiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsInJldGVudGlvbkNvbmZpZyIsIlJldGVudGlvbiIsInJldGFpblVudGlsRGF0ZSIsIlJldGFpblVudGlsRGF0ZSIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsImVuY0NvbmZpZyIsInBhcnNlT2JqZWN0TGVnYWxIb2xkQ29uZmlnIiwiTGVnYWxIb2xkIiwidXBsb2FkUGFydFBhcnNlciIsInJlc3BFbCIsIkNvcHlQYXJ0UmVzdWx0IiwicmVtb3ZlT2JqZWN0c1BhcnNlciIsIkRlbGV0ZVJlc3VsdCIsIkVycm9yIiwicGFyc2VTZWxlY3RPYmplY3RDb250ZW50UmVzcG9uc2UiLCJyZXMiLCJleHRyYWN0SGVhZGVyVHlwZSIsInN0cmVhbSIsImhlYWRlck5hbWVMZW4iLCJCdWZmZXIiLCJmcm9tIiwicmVhZCIsInJlYWRVSW50OCIsImhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIiwidG9TdHJpbmciLCJzcGxpdEJ5U2VwYXJhdG9yIiwic3BsaXQiLCJoZWFkZXJOYW1lIiwibGVuZ3RoIiwiZXh0cmFjdEhlYWRlclZhbHVlIiwiYm9keUxlbiIsInJlYWRVSW50MTZCRSIsImJvZHlOYW1lIiwic2VsZWN0UmVzdWx0cyIsIlNlbGVjdFJlc3VsdHMiLCJyZXNwb25zZVN0cmVhbSIsInJlYWRhYmxlU3RyZWFtIiwiX3JlYWRhYmxlU3RhdGUiLCJtc2dDcmNBY2N1bXVsYXRvciIsInRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciIsImNyYzMyIiwiaGVhZGVyQnl0ZXNCdWZmZXIiLCJjYWxjdWxhdGVkUHJlbHVkZUNyYyIsInJlYWRJbnQzMkJFIiwicHJlbHVkZUNyY0J1ZmZlciIsInRvdGFsTXNnTGVuZ3RoIiwiaGVhZGVyTGVuZ3RoIiwicHJlbHVkZUNyY0J5dGVWYWx1ZSIsImhlYWRlcnMiLCJoZWFkZXJCeXRlcyIsImhlYWRlclJlYWRlclN0cmVhbSIsImhlYWRlclR5cGVOYW1lIiwicGF5bG9hZFN0cmVhbSIsInBheUxvYWRMZW5ndGgiLCJwYXlMb2FkQnVmZmVyIiwibWVzc2FnZUNyY0J5dGVWYWx1ZSIsImNhbGN1bGF0ZWRDcmMiLCJtZXNzYWdlVHlwZSIsImVycm9yTWVzc2FnZSIsImNvbnRlbnRUeXBlIiwiZXZlbnRUeXBlIiwic2V0UmVzcG9uc2UiLCJyZWFkRGF0YSIsInNldFJlY29yZHMiLCJwcm9ncmVzc0RhdGEiLCJzZXRQcm9ncmVzcyIsInN0YXRzRGF0YSIsInNldFN0YXRzIiwid2FybmluZ01lc3NhZ2UiLCJjb25zb2xlIiwid2FybiJdLCJzb3VyY2VzIjpbInhtbC1wYXJzZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBNaW5JTyBKYXZhc2NyaXB0IExpYnJhcnkgZm9yIEFtYXpvbiBTMyBDb21wYXRpYmxlIENsb3VkIFN0b3JhZ2UsIChDKSAyMDE1IE1pbklPLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBjcmMzMiBmcm9tICdidWZmZXItY3JjMzInXG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInXG5cbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuL2Vycm9ycy50cydcbmltcG9ydCB7IFNlbGVjdFJlc3VsdHMgfSBmcm9tICcuL2hlbHBlcnMudHMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgcGFyc2VYbWwsXG4gIHJlYWRhYmxlU3RyZWFtLFxuICBzYW5pdGl6ZUVUYWcsXG4gIHNhbml0aXplT2JqZWN0S2V5LFxuICBzYW5pdGl6ZVNpemUsXG4gIHRvQXJyYXksXG59IGZyb20gJy4vaW50ZXJuYWwvaGVscGVyLnRzJ1xuaW1wb3J0IHsgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlLnRzJ1xuXG5jb25zdCBmeHBXaXRob3V0TnVtUGFyc2VyID0gbmV3IFhNTFBhcnNlcih7XG4gIG51bWJlclBhcnNlT3B0aW9uczoge1xuICAgIHNraXBMaWtlOiAvLi8sXG4gIH0sXG59KVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGNvcHkgb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb3B5T2JqZWN0KHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIGV0YWc6ICcnLFxuICAgIGxhc3RNb2RpZmllZDogJycsXG4gIH1cblxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5Db3B5T2JqZWN0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkNvcHlPYmplY3RSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkNvcHlPYmplY3RSZXN1bHRcbiAgaWYgKHhtbG9iai5FVGFnKSB7XG4gICAgcmVzdWx0LmV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuICB9XG4gIGlmICh4bWxvYmouTGFzdE1vZGlmaWVkKSB7XG4gICAgcmVzdWx0Lmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHhtbG9iai5MYXN0TW9kaWZpZWQpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdGluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE11bHRpcGFydCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB1cGxvYWRzOiBbXSxcbiAgICBwcmVmaXhlczogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXhtbG9iai5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dEtleU1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0S2V5TWFya2VyID0geG1sb2JqLk5leHRLZXlNYXJrZXJcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRVcGxvYWRJZE1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIgPSB4bWxvYmoubmV4dFVwbG9hZElkTWFya2VyIHx8ICcnXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKHByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0LnByZWZpeGVzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkocHJlZml4LlByZWZpeClbMF0pIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouVXBsb2FkKSB7XG4gICAgdG9BcnJheSh4bWxvYmouVXBsb2FkKS5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIHZhciBrZXkgPSB1cGxvYWQuS2V5XG4gICAgICB2YXIgdXBsb2FkSWQgPSB1cGxvYWQuVXBsb2FkSWRcbiAgICAgIHZhciBpbml0aWF0b3IgPSB7IGlkOiB1cGxvYWQuSW5pdGlhdG9yLklELCBkaXNwbGF5TmFtZTogdXBsb2FkLkluaXRpYXRvci5EaXNwbGF5TmFtZSB9XG4gICAgICB2YXIgb3duZXIgPSB7IGlkOiB1cGxvYWQuT3duZXIuSUQsIGRpc3BsYXlOYW1lOiB1cGxvYWQuT3duZXIuRGlzcGxheU5hbWUgfVxuICAgICAgdmFyIHN0b3JhZ2VDbGFzcyA9IHVwbG9hZC5TdG9yYWdlQ2xhc3NcbiAgICAgIHZhciBpbml0aWF0ZWQgPSBuZXcgRGF0ZSh1cGxvYWQuSW5pdGlhdGVkKVxuICAgICAgcmVzdWx0LnVwbG9hZHMucHVzaCh7IGtleSwgdXBsb2FkSWQsIGluaXRpYXRvciwgb3duZXIsIHN0b3JhZ2VDbGFzcywgaW5pdGlhdGVkIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB0byBsaXN0IGFsbCB0aGUgb3duZWQgYnVja2V0c1xuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBUb3BpY0NvbmZpZ3VyYXRpb246IFtdLFxuICAgIFF1ZXVlQ29uZmlndXJhdGlvbjogW10sXG4gICAgQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb246IFtdLFxuICB9XG4gIC8vIFBhcnNlIHRoZSBldmVudHMgbGlzdFxuICB2YXIgZ2VuRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRvQXJyYXkoZXZlbnRzKS5mb3JFYWNoKChzM2V2ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHMzZXZlbnQpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgLy8gUGFyc2UgYWxsIGZpbHRlciBydWxlc1xuICB2YXIgZ2VuRmlsdGVyUnVsZXMgPSBmdW5jdGlvbiAoZmlsdGVycykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdG9BcnJheShmaWx0ZXJzKVxuICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXkpIHtcbiAgICAgICAgZmlsdGVyc1swXS5TM0tleSA9IHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleSlcbiAgICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXlbMF0uRmlsdGVyUnVsZSkge1xuICAgICAgICAgIHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleVswXS5GaWx0ZXJSdWxlKS5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICAgICAgICB2YXIgTmFtZSA9IHRvQXJyYXkocnVsZS5OYW1lKVswXVxuICAgICAgICAgICAgdmFyIFZhbHVlID0gdG9BcnJheShydWxlLlZhbHVlKVswXVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBOYW1lLCBWYWx1ZSB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgeG1sb2JqID0geG1sb2JqLk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cblxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBUb3BpYyA9IHRvQXJyYXkoY29uZmlnLlRvcGljKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlRvcGljQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFRvcGljLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBRdWV1ZSA9IHRvQXJyYXkoY29uZmlnLlF1ZXVlKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlF1ZXVlQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFF1ZXVlLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgUXVldWVDb25maWd1cmF0aW9uIGFycmF5c1xuICBpZiAoeG1sb2JqLkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24pLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgdmFyIElkID0gdG9BcnJheShjb25maWcuSWQpWzBdXG4gICAgICB2YXIgQ2xvdWRGdW5jdGlvbiA9IHRvQXJyYXkoY29uZmlnLkNsb3VkRnVuY3Rpb24pWzBdXG4gICAgICB2YXIgRXZlbnQgPSBnZW5FdmVudHMoY29uZmlnLkV2ZW50KVxuICAgICAgdmFyIEZpbHRlciA9IGdlbkZpbHRlclJ1bGVzKGNvbmZpZy5GaWx0ZXIpXG4gICAgICByZXN1bHQuQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24ucHVzaCh7IElkLCBDbG91ZEZ1bmN0aW9uLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIHdoZW4gYSBtdWx0aXBhcnQgdXBsb2FkIGlzIGNvbXBsZXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tcGxldGVNdWx0aXBhcnQoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpLkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG4gIGlmICh4bWxvYmouTG9jYXRpb24pIHtcbiAgICB2YXIgbG9jYXRpb24gPSB0b0FycmF5KHhtbG9iai5Mb2NhdGlvbilbMF1cbiAgICB2YXIgYnVja2V0ID0gdG9BcnJheSh4bWxvYmouQnVja2V0KVswXVxuICAgIHZhciBrZXkgPSB4bWxvYmouS2V5XG4gICAgdmFyIGV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuXG4gICAgcmV0dXJuIHsgbG9jYXRpb24sIGJ1Y2tldCwga2V5LCBldGFnIH1cbiAgfVxuICAvLyBDb21wbGV0ZSBNdWx0aXBhcnQgY2FuIHJldHVybiBYTUwgRXJyb3IgYWZ0ZXIgYSAyMDAgT0sgcmVzcG9uc2VcbiAgaWYgKHhtbG9iai5Db2RlICYmIHhtbG9iai5NZXNzYWdlKSB7XG4gICAgdmFyIGVyckNvZGUgPSB0b0FycmF5KHhtbG9iai5Db2RlKVswXVxuICAgIHZhciBlcnJNZXNzYWdlID0gdG9BcnJheSh4bWxvYmouTWVzc2FnZSlbMF1cbiAgICByZXR1cm4geyBlcnJDb2RlLCBlcnJNZXNzYWdlIH1cbiAgfVxufVxuXG5jb25zdCBmb3JtYXRPYmpJbmZvID0gKGNvbnRlbnQsIG9wdHMgPSB7fSkgPT4ge1xuICBsZXQgeyBLZXksIExhc3RNb2RpZmllZCwgRVRhZywgU2l6ZSwgVmVyc2lvbklkLCBJc0xhdGVzdCB9ID0gY29udGVudFxuXG4gIGlmICghaXNPYmplY3Qob3B0cykpIHtcbiAgICBvcHRzID0ge31cbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KEtleSlbMF0pXG4gIGNvbnN0IGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHRvQXJyYXkoTGFzdE1vZGlmaWVkKVswXSlcbiAgY29uc3QgZXRhZyA9IHNhbml0aXplRVRhZyh0b0FycmF5KEVUYWcpWzBdKVxuICBjb25zdCBzaXplID0gc2FuaXRpemVTaXplKFNpemUpXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIGxhc3RNb2RpZmllZCxcbiAgICBldGFnLFxuICAgIHNpemUsXG4gICAgdmVyc2lvbklkOiBWZXJzaW9uSWQsXG4gICAgaXNMYXRlc3Q6IElzTGF0ZXN0LFxuICAgIGlzRGVsZXRlTWFya2VyOiBvcHRzLklzRGVsZXRlTWFya2VyID8gb3B0cy5Jc0RlbGV0ZU1hcmtlciA6IGZhbHNlLFxuICB9XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0cyh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gIH1cbiAgbGV0IGlzVHJ1bmNhdGVkID0gZmFsc2VcbiAgbGV0IG5leHRNYXJrZXIsIG5leHRWZXJzaW9uS2V5TWFya2VyXG4gIGNvbnN0IHhtbG9iaiA9IGZ4cFdpdGhvdXROdW1QYXJzZXIucGFyc2UoeG1sKVxuXG4gIGNvbnN0IHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkgPSAocmVzcG9uc2VFbnRpdHkpID0+IHtcbiAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHtcbiAgICAgIHRvQXJyYXkocmVzcG9uc2VFbnRpdHkpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBsaXN0QnVja2V0UmVzdWx0ID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgY29uc3QgbGlzdFZlcnNpb25zUmVzdWx0ID0geG1sb2JqLkxpc3RWZXJzaW9uc1Jlc3VsdFxuXG4gIGlmIChsaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuSXNUcnVuY2F0ZWQpIHtcbiAgICAgIGlzVHJ1bmNhdGVkID0gbGlzdEJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5Db250ZW50cykge1xuICAgICAgdG9BcnJheShsaXN0QnVja2V0UmVzdWx0LkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbnRlbnQuS2V5KVswXSlcbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUodG9BcnJheShjb250ZW50Lkxhc3RNb2RpZmllZClbMF0pXG4gICAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShjb250ZW50LkVUYWcpWzBdKVxuICAgICAgICBjb25zdCBzaXplID0gc2FuaXRpemVTaXplKGNvbnRlbnQuU2l6ZSlcbiAgICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5OZXh0TWFya2VyKSB7XG4gICAgICBuZXh0TWFya2VyID0gbGlzdEJ1Y2tldFJlc3VsdC5OZXh0TWFya2VyXG4gICAgfVxuICAgIHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkobGlzdEJ1Y2tldFJlc3VsdC5Db21tb25QcmVmaXhlcylcbiAgfVxuXG4gIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQpIHtcbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LklzVHJ1bmNhdGVkKSB7XG4gICAgICBpc1RydW5jYXRlZCA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cblxuICAgIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQuVmVyc2lvbikge1xuICAgICAgdG9BcnJheShsaXN0VmVyc2lvbnNSZXN1bHQuVmVyc2lvbikuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKGZvcm1hdE9iakluZm8oY29udGVudCkpXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LkRlbGV0ZU1hcmtlcikge1xuICAgICAgdG9BcnJheShsaXN0VmVyc2lvbnNSZXN1bHQuRGVsZXRlTWFya2VyKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goZm9ybWF0T2JqSW5mbyhjb250ZW50LCB7IElzRGVsZXRlTWFya2VyOiB0cnVlIH0pKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0Lk5leHRLZXlNYXJrZXIpIHtcbiAgICAgIG5leHRWZXJzaW9uS2V5TWFya2VyID0gbGlzdFZlcnNpb25zUmVzdWx0Lk5leHRLZXlNYXJrZXJcbiAgICB9XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0VmVyc2lvbklkTWFya2VyKSB7XG4gICAgICByZXN1bHQudmVyc2lvbklkTWFya2VyID0gbGlzdFZlcnNpb25zUmVzdWx0Lk5leHRWZXJzaW9uSWRNYXJrZXJcbiAgICB9XG4gICAgcGFyc2VDb21tb25QcmVmaXhlc0VudGl0eShsaXN0VmVyc2lvbnNSZXN1bHQuQ29tbW9uUHJlZml4ZXMpXG4gIH1cblxuICByZXN1bHQuaXNUcnVuY2F0ZWQgPSBpc1RydW5jYXRlZFxuICBpZiAoaXNUcnVuY2F0ZWQpIHtcbiAgICByZXN1bHQubmV4dE1hcmtlciA9IG5leHRWZXJzaW9uS2V5TWFya2VyIHx8IG5leHRNYXJrZXJcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0c1YyKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5MaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RCdWNrZXRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgcmVzdWx0Lm5leHRDb250aW51YXRpb25Ub2tlbiA9IHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW5cbiAgfVxuICBpZiAoeG1sb2JqLkNvbnRlbnRzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29udGVudHMpLmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgIHZhciBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShjb250ZW50LktleSlbMF0pXG4gICAgICB2YXIgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUoY29udGVudC5MYXN0TW9kaWZpZWQpXG4gICAgICB2YXIgZXRhZyA9IHNhbml0aXplRVRhZyhjb250ZW50LkVUYWcpXG4gICAgICB2YXIgc2l6ZSA9IGNvbnRlbnQuU2l6ZVxuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSB9KVxuICAgIH0pXG4gIH1cbiAgaWYgKHhtbG9iai5Db21tb25QcmVmaXhlcykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbW1vblByZWZpeGVzKS5mb3JFYWNoKChjb21tb25QcmVmaXgpID0+IHtcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29tbW9uUHJlZml4LlByZWZpeClbMF0pLCBzaXplOiAwIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBvYmplY3RzIHYyIHdpdGggbWV0YWRhdGEgaW4gYSBidWNrZXRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RPYmplY3RzVjJXaXRoTWV0YWRhdGEoeG1sKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgb2JqZWN0czogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIGlmICgheG1sb2JqLkxpc3RCdWNrZXRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdEJ1Y2tldFJlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdFxuICBpZiAoeG1sb2JqLklzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0LmlzVHJ1bmNhdGVkID0geG1sb2JqLklzVHJ1bmNhdGVkXG4gIH1cbiAgaWYgKHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW4pIHtcbiAgICByZXN1bHQubmV4dENvbnRpbnVhdGlvblRva2VuID0geG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlblxuICB9XG5cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICB2YXIgbmFtZSA9IHNhbml0aXplT2JqZWN0S2V5KGNvbnRlbnQuS2V5KVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGNvbnRlbnQuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgdmFyIHNpemUgPSBjb250ZW50LlNpemVcbiAgICAgIHZhciBtZXRhZGF0YVxuICAgICAgaWYgKGNvbnRlbnQuVXNlck1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgbWV0YWRhdGEgPSB0b0FycmF5KGNvbnRlbnQuVXNlck1ldGFkYXRhKVswXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEgPSBudWxsXG4gICAgICB9XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgbmFtZSwgbGFzdE1vZGlmaWVkLCBldGFnLCBzaXplLCBtZXRhZGF0YSB9KVxuICAgIH0pXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IHByZWZpeDogc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShjb21tb25QcmVmaXguUHJlZml4KVswXSksIHNpemU6IDAgfSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVja2V0VmVyc2lvbmluZ0NvbmZpZyh4bWwpIHtcbiAgdmFyIHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIHhtbE9iai5WZXJzaW9uaW5nQ29uZmlndXJhdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWdnaW5nKHhtbCkge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGxldCByZXN1bHQgPSBbXVxuICBpZiAoeG1sT2JqLlRhZ2dpbmcgJiYgeG1sT2JqLlRhZ2dpbmcuVGFnU2V0ICYmIHhtbE9iai5UYWdnaW5nLlRhZ1NldC5UYWcpIHtcbiAgICBjb25zdCB0YWdSZXN1bHQgPSB4bWxPYmouVGFnZ2luZy5UYWdTZXQuVGFnXG4gICAgLy8gaWYgaXQgaXMgYSBzaW5nbGUgdGFnIGNvbnZlcnQgaW50byBhbiBhcnJheSBzbyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIGFuIGFycmF5LlxuICAgIGlmIChpc09iamVjdCh0YWdSZXN1bHQpKSB7XG4gICAgICByZXN1bHQucHVzaCh0YWdSZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRhZ1Jlc3VsdFxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpZmVjeWNsZUNvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2JqZWN0TG9ja0NvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBsZXQgbG9ja0NvbmZpZ1Jlc3VsdCA9IHt9XG4gIGlmICh4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24pIHtcbiAgICBsb2NrQ29uZmlnUmVzdWx0ID0ge1xuICAgICAgb2JqZWN0TG9ja0VuYWJsZWQ6IHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5PYmplY3RMb2NrRW5hYmxlZCxcbiAgICB9XG4gICAgbGV0IHJldGVudGlvblJlc3BcbiAgICBpZiAoXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24gJiZcbiAgICAgIHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5SdWxlICYmXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uUnVsZS5EZWZhdWx0UmV0ZW50aW9uXG4gICAgKSB7XG4gICAgICByZXRlbnRpb25SZXNwID0geG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uLlJ1bGUuRGVmYXVsdFJldGVudGlvbiB8fCB7fVxuICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC5tb2RlID0gcmV0ZW50aW9uUmVzcC5Nb2RlXG4gICAgfVxuICAgIGlmIChyZXRlbnRpb25SZXNwKSB7XG4gICAgICBjb25zdCBpc1VuaXRZZWFycyA9IHJldGVudGlvblJlc3AuWWVhcnNcbiAgICAgIGlmIChpc1VuaXRZZWFycykge1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnZhbGlkaXR5ID0gaXNVbml0WWVhcnNcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC51bml0ID0gUkVURU5USU9OX1ZBTElESVRZX1VOSVRTLllFQVJTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnZhbGlkaXR5ID0gcmV0ZW50aW9uUmVzcC5EYXlzXG4gICAgICAgIGxvY2tDb25maWdSZXN1bHQudW5pdCA9IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5EQVlTXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2NrQ29uZmlnUmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2JqZWN0UmV0ZW50aW9uQ29uZmlnKHhtbCkge1xuICBjb25zdCB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIGNvbnN0IHJldGVudGlvbkNvbmZpZyA9IHhtbE9iai5SZXRlbnRpb25cblxuICByZXR1cm4ge1xuICAgIG1vZGU6IHJldGVudGlvbkNvbmZpZy5Nb2RlLFxuICAgIHJldGFpblVudGlsRGF0ZTogcmV0ZW50aW9uQ29uZmlnLlJldGFpblVudGlsRGF0ZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCdWNrZXRFbmNyeXB0aW9uQ29uZmlnKHhtbCkge1xuICBsZXQgZW5jQ29uZmlnID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4gZW5jQ29uZmlnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxlZ2FsSG9sZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkUGFydFBhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXNwRWwgPSB4bWxPYmouQ29weVBhcnRSZXN1bHRcbiAgcmV0dXJuIHJlc3BFbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1BhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoeG1sT2JqLkRlbGV0ZVJlc3VsdCAmJiB4bWxPYmouRGVsZXRlUmVzdWx0LkVycm9yKSB7XG4gICAgLy8gcmV0dXJuIGVycm9ycyBhcyBhcnJheSBhbHdheXMuIGFzIHRoZSByZXNwb25zZSBpcyBvYmplY3QgaW4gY2FzZSBvZiBzaW5nbGUgb2JqZWN0IHBhc3NlZCBpbiByZW1vdmVPYmplY3RzXG4gICAgcmV0dXJuIHRvQXJyYXkoeG1sT2JqLkRlbGV0ZVJlc3VsdC5FcnJvcilcbiAgfVxuICByZXR1cm4gW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKHJlcykge1xuICAvLyBleHRyYWN0SGVhZGVyVHlwZSBleHRyYWN0cyB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaGVhZGVyIG1lc3NhZ2UsIHRoZSBoZWFkZXIgdHlwZS5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclR5cGUoc3RyZWFtKSB7XG4gICAgY29uc3QgaGVhZGVyTmFtZUxlbiA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKDEpKS5yZWFkVUludDgoKVxuICAgIGNvbnN0IGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yID0gQnVmZmVyLmZyb20oc3RyZWFtLnJlYWQoaGVhZGVyTmFtZUxlbikpLnRvU3RyaW5nKClcbiAgICBjb25zdCBzcGxpdEJ5U2VwYXJhdG9yID0gKGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIHx8ICcnKS5zcGxpdCgnOicpXG4gICAgY29uc3QgaGVhZGVyTmFtZSA9IHNwbGl0QnlTZXBhcmF0b3IubGVuZ3RoID49IDEgPyBzcGxpdEJ5U2VwYXJhdG9yWzFdIDogJydcbiAgICByZXR1cm4gaGVhZGVyTmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclZhbHVlKHN0cmVhbSkge1xuICAgIGNvbnN0IGJvZHlMZW4gPSBCdWZmZXIuZnJvbShzdHJlYW0ucmVhZCgyKSkucmVhZFVJbnQxNkJFKClcbiAgICBjb25zdCBib2R5TmFtZSA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKGJvZHlMZW4pKS50b1N0cmluZygpXG4gICAgcmV0dXJuIGJvZHlOYW1lXG4gIH1cblxuICBjb25zdCBzZWxlY3RSZXN1bHRzID0gbmV3IFNlbGVjdFJlc3VsdHMoe30pIC8vIHdpbGwgYmUgcmV0dXJuZWRcblxuICBjb25zdCByZXNwb25zZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHJlcykgLy8gY29udmVydCBieXRlIGFycmF5IHRvIGEgcmVhZGFibGUgcmVzcG9uc2VTdHJlYW1cbiAgd2hpbGUgKHJlc3BvbnNlU3RyZWFtLl9yZWFkYWJsZVN0YXRlLmxlbmd0aCkge1xuICAgIC8vIFRvcCBsZXZlbCByZXNwb25zZVN0cmVhbSByZWFkIHRyYWNrZXIuXG4gICAgbGV0IG1zZ0NyY0FjY3VtdWxhdG9yIC8vIGFjY3VtdWxhdGUgZnJvbSBzdGFydCBvZiB0aGUgbWVzc2FnZSB0aWxsIHRoZSBtZXNzYWdlIGNyYyBzdGFydC5cblxuICAgIGNvbnN0IHRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMih0b3RhbEJ5dGVMZW5ndGhCdWZmZXIpXG5cbiAgICBjb25zdCBoZWFkZXJCeXRlc0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihoZWFkZXJCeXRlc0J1ZmZlciwgbXNnQ3JjQWNjdW11bGF0b3IpXG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUHJlbHVkZUNyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKCkgLy8gdXNlIGl0IHRvIGNoZWNrIGlmIGFueSBDUkMgbWlzbWF0Y2ggaW4gaGVhZGVyIGl0c2VsZi5cblxuICAgIGNvbnN0IHByZWx1ZGVDcmNCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKDQpKSAvLyByZWFkIDQgYnl0ZXMgICAgaS5lIDQrNCA9OCArIDQgPSAxMiAoIHByZWx1ZGUgKyBwcmVsdWRlIGNyYylcbiAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKHByZWx1ZGVDcmNCdWZmZXIsIG1zZ0NyY0FjY3VtdWxhdG9yKVxuXG4gICAgY29uc3QgdG90YWxNc2dMZW5ndGggPSB0b3RhbEJ5dGVMZW5ndGhCdWZmZXIucmVhZEludDMyQkUoKVxuICAgIGNvbnN0IGhlYWRlckxlbmd0aCA9IGhlYWRlckJ5dGVzQnVmZmVyLnJlYWRJbnQzMkJFKClcbiAgICBjb25zdCBwcmVsdWRlQ3JjQnl0ZVZhbHVlID0gcHJlbHVkZUNyY0J1ZmZlci5yZWFkSW50MzJCRSgpXG5cbiAgICBpZiAocHJlbHVkZUNyY0J5dGVWYWx1ZSAhPT0gY2FsY3VsYXRlZFByZWx1ZGVDcmMpIHtcbiAgICAgIC8vIEhhbmRsZSBIZWFkZXIgQ1JDIG1pc21hdGNoIEVycm9yXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBIZWFkZXIgQ2hlY2tzdW0gTWlzbWF0Y2gsIFByZWx1ZGUgQ1JDIG9mICR7cHJlbHVkZUNyY0J5dGVWYWx1ZX0gZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgQ1JDIG9mICR7Y2FsY3VsYXRlZFByZWx1ZGVDcmN9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBpZiAoaGVhZGVyTGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGVhZGVyQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKGhlYWRlckxlbmd0aCkpXG4gICAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKGhlYWRlckJ5dGVzLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIGNvbnN0IGhlYWRlclJlYWRlclN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKGhlYWRlckJ5dGVzKVxuICAgICAgd2hpbGUgKGhlYWRlclJlYWRlclN0cmVhbS5fcmVhZGFibGVTdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGhlYWRlclR5cGVOYW1lID0gZXh0cmFjdEhlYWRlclR5cGUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgICBoZWFkZXJSZWFkZXJTdHJlYW0ucmVhZCgxKSAvLyBqdXN0IHJlYWQgYW5kIGlnbm9yZSBpdC5cbiAgICAgICAgaGVhZGVyc1toZWFkZXJUeXBlTmFtZV0gPSBleHRyYWN0SGVhZGVyVmFsdWUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkU3RyZWFtXG4gICAgY29uc3QgcGF5TG9hZExlbmd0aCA9IHRvdGFsTXNnTGVuZ3RoIC0gaGVhZGVyTGVuZ3RoIC0gMTZcbiAgICBpZiAocGF5TG9hZExlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBheUxvYWRCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpKVxuICAgICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihwYXlMb2FkQnVmZmVyLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIC8vIHJlYWQgdGhlIGNoZWNrc3VtIGVhcmx5IGFuZCBkZXRlY3QgYW55IG1pc21hdGNoIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBmdXJ0aGVyIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBtZXNzYWdlQ3JjQnl0ZVZhbHVlID0gQnVmZmVyLmZyb20ocmVzcG9uc2VTdHJlYW0ucmVhZCg0KSkucmVhZEludDMyQkUoKVxuICAgICAgY29uc3QgY2FsY3VsYXRlZENyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKClcbiAgICAgIC8vIEhhbmRsZSBtZXNzYWdlIENSQyBFcnJvclxuICAgICAgaWYgKG1lc3NhZ2VDcmNCeXRlVmFsdWUgIT09IGNhbGN1bGF0ZWRDcmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIENoZWNrc3VtIE1pc21hdGNoLCBNZXNzYWdlIENSQyBvZiAke21lc3NhZ2VDcmNCeXRlVmFsdWV9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIENSQyBvZiAke2NhbGN1bGF0ZWRDcmN9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcGF5bG9hZFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheUxvYWRCdWZmZXIpXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVR5cGUgPSBoZWFkZXJzWydtZXNzYWdlLXR5cGUnXVxuXG4gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGhlYWRlcnNbJ2Vycm9yLWNvZGUnXSArICc6XCInICsgaGVhZGVyc1snZXJyb3ItbWVzc2FnZSddICsgJ1wiJ1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgfVxuICAgICAgY2FzZSAnZXZlbnQnOiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gaGVhZGVyc1snZXZlbnQtdHlwZSddXG5cbiAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdFbmQnOiB7XG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlc3BvbnNlKHJlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RSZXN1bHRzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnUmVjb3Jkcyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWREYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlY29yZHMocmVhZERhdGEpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ1Byb2dyZXNzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQveG1sJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFByb2dyZXNzKHByb2dyZXNzRGF0YS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFVuZXhwZWN0ZWQgY29udGVudC10eXBlICR7Y29udGVudFR5cGV9IHNlbnQgZm9yIGV2ZW50LXR5cGUgUHJvZ3Jlc3NgXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdTdGF0cyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0L3htbCc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzRGF0YSA9IHBheWxvYWRTdHJlYW0ucmVhZChwYXlMb2FkTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgc2VsZWN0UmVzdWx0cy5zZXRTdGF0cyhzdGF0c0RhdGEudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVbmV4cGVjdGVkIGNvbnRlbnQtdHlwZSAke2NvbnRlbnRUeXBlfSBzZW50IGZvciBldmVudC10eXBlIFN0YXRzYFxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gQ29udGludWF0aW9uIG1lc3NhZ2U6IE5vdCBzdXJlIGlmIGl0IGlzIHN1cHBvcnRlZC4gZGlkIG5vdCBmaW5kIGEgcmVmZXJlbmNlIG9yIGFueSBtZXNzYWdlIGluIHJlc3BvbnNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHBheWxvYWQuXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBVbiBpbXBsZW1lbnRlZCBldmVudCBkZXRlY3RlZCAgJHttZXNzYWdlVHlwZX0uYFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nTWVzc2FnZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gZXZlbnRUeXBlIEVuZFxuICAgICAgfSAvLyBFdmVudCBFbmRcbiAgICB9IC8vIG1lc3NhZ2VUeXBlIEVuZFxuICB9IC8vIFRvcCBMZXZlbCBTdHJlYW0gRW5kXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBU0EsSUFBQU0sS0FBQSxHQUFBTixPQUFBO0FBQTZELFNBQUFPLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFMLHdCQUFBUyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVmZmVyQ3JjIiwicmVxdWlyZSIsIl9mYXN0WG1sUGFyc2VyIiwiX2xvZGFzaCIsImVycm9ycyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2hlbHBlcnMiLCJfaGVscGVyIiwiX3R5cGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiZnhwIiwiWE1MUGFyc2VyIiwicGFyc2VFcnJvciIsInhtbCIsImhlYWRlckluZm8iLCJ4bWxFcnIiLCJ4bWxPYmoiLCJwYXJzZSIsIkVycm9yIiwiZSIsIlMzRXJyb3IiLCJfIiwiZWFjaCIsInZhbHVlIiwidG9Mb3dlckNhc2UiLCJwYXJzZUNvcHlPYmplY3QiLCJyZXN1bHQiLCJldGFnIiwibGFzdE1vZGlmaWVkIiwieG1sb2JqIiwicGFyc2VYbWwiLCJDb3B5T2JqZWN0UmVzdWx0IiwiSW52YWxpZFhNTEVycm9yIiwiRVRhZyIsInJlcGxhY2UiLCJMYXN0TW9kaWZpZWQiLCJEYXRlIiwicGFyc2VMaXN0TXVsdGlwYXJ0IiwidXBsb2FkcyIsInByZWZpeGVzIiwiaXNUcnVuY2F0ZWQiLCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCIsIklzVHJ1bmNhdGVkIiwiTmV4dEtleU1hcmtlciIsIm5leHRLZXlNYXJrZXIiLCJOZXh0VXBsb2FkSWRNYXJrZXIiLCJuZXh0VXBsb2FkSWRNYXJrZXIiLCJDb21tb25QcmVmaXhlcyIsInRvQXJyYXkiLCJmb3JFYWNoIiwicHJlZml4IiwicHVzaCIsInNhbml0aXplT2JqZWN0S2V5IiwiUHJlZml4IiwiVXBsb2FkIiwidXBsb2FkIiwiS2V5IiwidXBsb2FkSWQiLCJVcGxvYWRJZCIsImluaXRpYXRvciIsImlkIiwiSW5pdGlhdG9yIiwiSUQiLCJkaXNwbGF5TmFtZSIsIkRpc3BsYXlOYW1lIiwib3duZXIiLCJPd25lciIsInN0b3JhZ2VDbGFzcyIsIlN0b3JhZ2VDbGFzcyIsImluaXRpYXRlZCIsIkluaXRpYXRlZCIsInBhcnNlTGlzdEJ1Y2tldCIsIkxpc3RBbGxNeUJ1Y2tldHNSZXN1bHQiLCJCdWNrZXRzIiwiQnVja2V0IiwiYnVja2V0IiwibmFtZSIsIk5hbWUiLCJjcmVhdGlvbkRhdGUiLCJDcmVhdGlvbkRhdGUiLCJwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbiIsIlRvcGljQ29uZmlndXJhdGlvbiIsIlF1ZXVlQ29uZmlndXJhdGlvbiIsIkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uIiwiZ2VuRXZlbnRzIiwiZXZlbnRzIiwiczNldmVudCIsImdlbkZpbHRlclJ1bGVzIiwiZmlsdGVycyIsIlMzS2V5IiwiRmlsdGVyUnVsZSIsInJ1bGUiLCJWYWx1ZSIsIk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb24iLCJjb25maWciLCJJZCIsIlRvcGljIiwiRXZlbnQiLCJGaWx0ZXIiLCJRdWV1ZSIsIkNsb3VkRnVuY3Rpb24iLCJwYXJzZUJ1Y2tldFJlZ2lvbiIsIkxvY2F0aW9uQ29uc3RyYWludCIsInBhcnNlTGlzdFBhcnRzIiwicGFydHMiLCJtYXJrZXIiLCJ1bmRlZmluZWQiLCJMaXN0UGFydHNSZXN1bHQiLCJOZXh0UGFydE51bWJlck1hcmtlciIsIlBhcnQiLCJwIiwicGFydCIsIlBhcnROdW1iZXIiLCJwYXJzZUluaXRpYXRlTXVsdGlwYXJ0IiwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0IiwiQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQiLCJMb2NhdGlvbiIsImxvY2F0aW9uIiwiQ29kZSIsIk1lc3NhZ2UiLCJlcnJDb2RlIiwiZXJyTWVzc2FnZSIsImZvcm1hdE9iakluZm8iLCJjb250ZW50Iiwib3B0cyIsIlNpemUiLCJWZXJzaW9uSWQiLCJJc0xhdGVzdCIsImlzT2JqZWN0Iiwic2FuaXRpemVFVGFnIiwic2l6ZSIsInZlcnNpb25JZCIsImlzTGF0ZXN0IiwiaXNEZWxldGVNYXJrZXIiLCJJc0RlbGV0ZU1hcmtlciIsInBhcnNlTGlzdE9iamVjdHMiLCJvYmplY3RzIiwibmV4dE1hcmtlciIsIm5leHRWZXJzaW9uS2V5TWFya2VyIiwicGFyc2VDb21tb25QcmVmaXhlc0VudGl0eSIsInJlc3BvbnNlRW50aXR5IiwiY29tbW9uUHJlZml4IiwibGlzdEJ1Y2tldFJlc3VsdCIsIkxpc3RCdWNrZXRSZXN1bHQiLCJsaXN0VmVyc2lvbnNSZXN1bHQiLCJMaXN0VmVyc2lvbnNSZXN1bHQiLCJDb250ZW50cyIsIk5leHRNYXJrZXIiLCJWZXJzaW9uIiwiRGVsZXRlTWFya2VyIiwiTmV4dFZlcnNpb25JZE1hcmtlciIsInZlcnNpb25JZE1hcmtlciIsInBhcnNlTGlzdE9iamVjdHNWMiIsIk5leHRDb250aW51YXRpb25Ub2tlbiIsIm5leHRDb250aW51YXRpb25Ub2tlbiIsInBhcnNlTGlzdE9iamVjdHNWMldpdGhNZXRhZGF0YSIsIm1ldGFkYXRhIiwiVXNlck1ldGFkYXRhIiwicGFyc2VCdWNrZXRWZXJzaW9uaW5nQ29uZmlnIiwiVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24iLCJwYXJzZVRhZ2dpbmciLCJUYWdnaW5nIiwiVGFnU2V0IiwiVGFnIiwidGFnUmVzdWx0IiwicGFyc2VMaWZlY3ljbGVDb25maWciLCJMaWZlY3ljbGVDb25maWd1cmF0aW9uIiwicGFyc2VPYmplY3RMb2NrQ29uZmlnIiwibG9ja0NvbmZpZ1Jlc3VsdCIsIk9iamVjdExvY2tDb25maWd1cmF0aW9uIiwib2JqZWN0TG9ja0VuYWJsZWQiLCJPYmplY3RMb2NrRW5hYmxlZCIsInJldGVudGlvblJlc3AiLCJSdWxlIiwiRGVmYXVsdFJldGVudGlvbiIsIm1vZGUiLCJNb2RlIiwiaXNVbml0WWVhcnMiLCJZZWFycyIsInZhbGlkaXR5IiwidW5pdCIsIlJFVEVOVElPTl9WQUxJRElUWV9VTklUUyIsIllFQVJTIiwiRGF5cyIsIkRBWVMiLCJwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyIsInJldGVudGlvbkNvbmZpZyIsIlJldGVudGlvbiIsInJldGFpblVudGlsRGF0ZSIsIlJldGFpblVudGlsRGF0ZSIsInBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyIsImVuY0NvbmZpZyIsInBhcnNlUmVwbGljYXRpb25Db25maWciLCJyZXBsaWNhdGlvbkNvbmZpZyIsIlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIsInJvbGUiLCJSb2xlIiwicnVsZXMiLCJwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyIsIkxlZ2FsSG9sZCIsInVwbG9hZFBhcnRQYXJzZXIiLCJyZXNwRWwiLCJDb3B5UGFydFJlc3VsdCIsInJlbW92ZU9iamVjdHNQYXJzZXIiLCJEZWxldGVSZXN1bHQiLCJwYXJzZVNlbGVjdE9iamVjdENvbnRlbnRSZXNwb25zZSIsInJlcyIsImV4dHJhY3RIZWFkZXJUeXBlIiwic3RyZWFtIiwiaGVhZGVyTmFtZUxlbiIsIkJ1ZmZlciIsImZyb20iLCJyZWFkIiwicmVhZFVJbnQ4IiwiaGVhZGVyTmFtZVdpdGhTZXBhcmF0b3IiLCJ0b1N0cmluZyIsInNwbGl0QnlTZXBhcmF0b3IiLCJzcGxpdCIsImhlYWRlck5hbWUiLCJsZW5ndGgiLCJleHRyYWN0SGVhZGVyVmFsdWUiLCJib2R5TGVuIiwicmVhZFVJbnQxNkJFIiwiYm9keU5hbWUiLCJzZWxlY3RSZXN1bHRzIiwiU2VsZWN0UmVzdWx0cyIsInJlc3BvbnNlU3RyZWFtIiwicmVhZGFibGVTdHJlYW0iLCJfcmVhZGFibGVTdGF0ZSIsIm1zZ0NyY0FjY3VtdWxhdG9yIiwidG90YWxCeXRlTGVuZ3RoQnVmZmVyIiwiY3JjMzIiLCJoZWFkZXJCeXRlc0J1ZmZlciIsImNhbGN1bGF0ZWRQcmVsdWRlQ3JjIiwicmVhZEludDMyQkUiLCJwcmVsdWRlQ3JjQnVmZmVyIiwidG90YWxNc2dMZW5ndGgiLCJoZWFkZXJMZW5ndGgiLCJwcmVsdWRlQ3JjQnl0ZVZhbHVlIiwiaGVhZGVycyIsImhlYWRlckJ5dGVzIiwiaGVhZGVyUmVhZGVyU3RyZWFtIiwiaGVhZGVyVHlwZU5hbWUiLCJwYXlsb2FkU3RyZWFtIiwicGF5TG9hZExlbmd0aCIsInBheUxvYWRCdWZmZXIiLCJtZXNzYWdlQ3JjQnl0ZVZhbHVlIiwiY2FsY3VsYXRlZENyYyIsIm1lc3NhZ2VUeXBlIiwiZXJyb3JNZXNzYWdlIiwiY29udGVudFR5cGUiLCJldmVudFR5cGUiLCJzZXRSZXNwb25zZSIsInJlYWREYXRhIiwic2V0UmVjb3JkcyIsInByb2dyZXNzRGF0YSIsInNldFByb2dyZXNzIiwic3RhdHNEYXRhIiwic2V0U3RhdHMiLCJ3YXJuaW5nTWVzc2FnZSIsImNvbnNvbGUiLCJ3YXJuIl0sInNvdXJjZXMiOlsieG1sLXBhcnNlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pbklPIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUgTWluSU8sIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IGNyYzMyIGZyb20gJ2J1ZmZlci1jcmMzMidcbmltcG9ydCB7IFhNTFBhcnNlciB9IGZyb20gJ2Zhc3QteG1sLXBhcnNlcidcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzLnRzJ1xuaW1wb3J0IHsgU2VsZWN0UmVzdWx0cyB9IGZyb20gJy4vaGVscGVycy50cydcbmltcG9ydCB7IGlzT2JqZWN0LCBwYXJzZVhtbCwgcmVhZGFibGVTdHJlYW0sIHNhbml0aXplRVRhZywgc2FuaXRpemVPYmplY3RLZXksIHRvQXJyYXkgfSBmcm9tICcuL2ludGVybmFsL2hlbHBlci50cydcbmltcG9ydCB7IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcblxuLy8gUGFyc2UgWE1MIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gYXMgSmF2YXNjcmlwdCB0eXBlc1xuY29uc3QgZnhwID0gbmV3IFhNTFBhcnNlcigpXG5cbi8vIHBhcnNlIGVycm9yIFhNTCByZXNwb25zZVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXJyb3IoeG1sLCBoZWFkZXJJbmZvKSB7XG4gIHZhciB4bWxFcnIgPSB7fVxuICB2YXIgeG1sT2JqID0gZnhwLnBhcnNlKHhtbClcbiAgaWYgKHhtbE9iai5FcnJvcikge1xuICAgIHhtbEVyciA9IHhtbE9iai5FcnJvclxuICB9XG5cbiAgdmFyIGUgPSBuZXcgZXJyb3JzLlMzRXJyb3IoKVxuICBfLmVhY2goeG1sRXJyLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGVba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWVcbiAgfSlcblxuICBfLmVhY2goaGVhZGVySW5mbywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICBlW2tleV0gPSB2YWx1ZVxuICB9KVxuICByZXR1cm4gZVxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGNvcHkgb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb3B5T2JqZWN0KHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIGV0YWc6ICcnLFxuICAgIGxhc3RNb2RpZmllZDogJycsXG4gIH1cblxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5Db3B5T2JqZWN0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkNvcHlPYmplY3RSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkNvcHlPYmplY3RSZXN1bHRcbiAgaWYgKHhtbG9iai5FVGFnKSB7XG4gICAgcmVzdWx0LmV0YWcgPSB4bWxvYmouRVRhZy5yZXBsYWNlKC9eXCIvZywgJycpXG4gICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgLnJlcGxhY2UoL14mcXVvdDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJnF1b3Q7JC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAucmVwbGFjZSgvJiMzNDskL2csICcnKVxuICB9XG4gIGlmICh4bWxvYmouTGFzdE1vZGlmaWVkKSB7XG4gICAgcmVzdWx0Lmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHhtbG9iai5MYXN0TW9kaWZpZWQpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdGluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE11bHRpcGFydCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB1cGxvYWRzOiBbXSxcbiAgICBwcmVmaXhlczogW10sXG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcblxuICBpZiAoIXhtbG9iai5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdFwiJylcbiAgfVxuICB4bWxvYmogPSB4bWxvYmouTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dEtleU1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0S2V5TWFya2VyID0geG1sb2JqLk5leHRLZXlNYXJrZXJcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRVcGxvYWRJZE1hcmtlcikge1xuICAgIHJlc3VsdC5uZXh0VXBsb2FkSWRNYXJrZXIgPSB4bWxvYmoubmV4dFVwbG9hZElkTWFya2VyXG4gIH1cblxuICBpZiAoeG1sb2JqLkNvbW1vblByZWZpeGVzKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ29tbW9uUHJlZml4ZXMpLmZvckVhY2goKHByZWZpeCkgPT4ge1xuICAgICAgcmVzdWx0LnByZWZpeGVzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkocHJlZml4LlByZWZpeClbMF0pIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh4bWxvYmouVXBsb2FkKSB7XG4gICAgdG9BcnJheSh4bWxvYmouVXBsb2FkKS5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIHZhciBrZXkgPSB1cGxvYWQuS2V5XG4gICAgICB2YXIgdXBsb2FkSWQgPSB1cGxvYWQuVXBsb2FkSWRcbiAgICAgIHZhciBpbml0aWF0b3IgPSB7IGlkOiB1cGxvYWQuSW5pdGlhdG9yLklELCBkaXNwbGF5TmFtZTogdXBsb2FkLkluaXRpYXRvci5EaXNwbGF5TmFtZSB9XG4gICAgICB2YXIgb3duZXIgPSB7IGlkOiB1cGxvYWQuT3duZXIuSUQsIGRpc3BsYXlOYW1lOiB1cGxvYWQuT3duZXIuRGlzcGxheU5hbWUgfVxuICAgICAgdmFyIHN0b3JhZ2VDbGFzcyA9IHVwbG9hZC5TdG9yYWdlQ2xhc3NcbiAgICAgIHZhciBpbml0aWF0ZWQgPSBuZXcgRGF0ZSh1cGxvYWQuSW5pdGlhdGVkKVxuICAgICAgcmVzdWx0LnVwbG9hZHMucHVzaCh7IGtleSwgdXBsb2FkSWQsIGluaXRpYXRvciwgb3duZXIsIHN0b3JhZ2VDbGFzcywgaW5pdGlhdGVkIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB0byBsaXN0IGFsbCB0aGUgb3duZWQgYnVja2V0c1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdEJ1Y2tldCh4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IFtdXG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouTGlzdEFsbE15QnVja2V0c1Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0QWxsTXlCdWNrZXRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5CdWNrZXRzKSB7XG4gICAgaWYgKHhtbG9iai5CdWNrZXRzLkJ1Y2tldCkge1xuICAgICAgdG9BcnJheSh4bWxvYmouQnVja2V0cy5CdWNrZXQpLmZvckVhY2goKGJ1Y2tldCkgPT4ge1xuICAgICAgICB2YXIgbmFtZSA9IGJ1Y2tldC5OYW1lXG4gICAgICAgIHZhciBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZShidWNrZXQuQ3JlYXRpb25EYXRlKVxuICAgICAgICByZXN1bHQucHVzaCh7IG5hbWUsIGNyZWF0aW9uRGF0ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGJ1Y2tldCBub3RpZmljYXRpb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldE5vdGlmaWNhdGlvbih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBUb3BpY0NvbmZpZ3VyYXRpb246IFtdLFxuICAgIFF1ZXVlQ29uZmlndXJhdGlvbjogW10sXG4gICAgQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb246IFtdLFxuICB9XG4gIC8vIFBhcnNlIHRoZSBldmVudHMgbGlzdFxuICB2YXIgZ2VuRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRvQXJyYXkoZXZlbnRzKS5mb3JFYWNoKChzM2V2ZW50KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHMzZXZlbnQpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgLy8gUGFyc2UgYWxsIGZpbHRlciBydWxlc1xuICB2YXIgZ2VuRmlsdGVyUnVsZXMgPSBmdW5jdGlvbiAoZmlsdGVycykge1xuICAgIHZhciByZXN1bHQgPSBbXVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdG9BcnJheShmaWx0ZXJzKVxuICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXkpIHtcbiAgICAgICAgZmlsdGVyc1swXS5TM0tleSA9IHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleSlcbiAgICAgICAgaWYgKGZpbHRlcnNbMF0uUzNLZXlbMF0uRmlsdGVyUnVsZSkge1xuICAgICAgICAgIHRvQXJyYXkoZmlsdGVyc1swXS5TM0tleVswXS5GaWx0ZXJSdWxlKS5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICAgICAgICB2YXIgTmFtZSA9IHRvQXJyYXkocnVsZS5OYW1lKVswXVxuICAgICAgICAgICAgdmFyIFZhbHVlID0gdG9BcnJheShydWxlLlZhbHVlKVswXVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBOYW1lLCBWYWx1ZSB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgeG1sb2JqID0geG1sb2JqLk5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cblxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlRvcGljQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBUb3BpYyA9IHRvQXJyYXkoY29uZmlnLlRvcGljKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlRvcGljQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFRvcGljLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgdG9waWMgY29uZmlndXJhdGlvbnMgaW4gdGhlIHhtbFxuICBpZiAoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikge1xuICAgIHRvQXJyYXkoeG1sb2JqLlF1ZXVlQ29uZmlndXJhdGlvbikuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICB2YXIgSWQgPSB0b0FycmF5KGNvbmZpZy5JZClbMF1cbiAgICAgIHZhciBRdWV1ZSA9IHRvQXJyYXkoY29uZmlnLlF1ZXVlKVswXVxuICAgICAgdmFyIEV2ZW50ID0gZ2VuRXZlbnRzKGNvbmZpZy5FdmVudClcbiAgICAgIHZhciBGaWx0ZXIgPSBnZW5GaWx0ZXJSdWxlcyhjb25maWcuRmlsdGVyKVxuICAgICAgcmVzdWx0LlF1ZXVlQ29uZmlndXJhdGlvbi5wdXNoKHsgSWQsIFF1ZXVlLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuICAvLyBQYXJzZSBhbGwgUXVldWVDb25maWd1cmF0aW9uIGFycmF5c1xuICBpZiAoeG1sb2JqLkNsb3VkRnVuY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgdG9BcnJheSh4bWxvYmouQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24pLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgdmFyIElkID0gdG9BcnJheShjb25maWcuSWQpWzBdXG4gICAgICB2YXIgQ2xvdWRGdW5jdGlvbiA9IHRvQXJyYXkoY29uZmlnLkNsb3VkRnVuY3Rpb24pWzBdXG4gICAgICB2YXIgRXZlbnQgPSBnZW5FdmVudHMoY29uZmlnLkV2ZW50KVxuICAgICAgdmFyIEZpbHRlciA9IGdlbkZpbHRlclJ1bGVzKGNvbmZpZy5GaWx0ZXIpXG4gICAgICByZXN1bHQuQ2xvdWRGdW5jdGlvbkNvbmZpZ3VyYXRpb24ucHVzaCh7IElkLCBDbG91ZEZ1bmN0aW9uLCBFdmVudCwgRmlsdGVyIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIGZvciBidWNrZXQgcmVnaW9uXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCdWNrZXRSZWdpb24oeG1sKSB7XG4gIC8vIHJldHVybiByZWdpb24gaW5mb3JtYXRpb25cbiAgcmV0dXJuIHBhcnNlWG1sKHhtbCkuTG9jYXRpb25Db25zdHJhaW50XG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSBmb3IgbGlzdCBwYXJ0cyBvZiBhbiBpbiBwcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2FkXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0UGFydHMoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICAgIHBhcnRzOiBbXSxcbiAgICBtYXJrZXI6IHVuZGVmaW5lZCxcbiAgfVxuICBpZiAoIXhtbG9iai5MaXN0UGFydHNSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiTGlzdFBhcnRzUmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0UGFydHNSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dFBhcnROdW1iZXJNYXJrZXIpIHtcbiAgICByZXN1bHQubWFya2VyID0gK3RvQXJyYXkoeG1sb2JqLk5leHRQYXJ0TnVtYmVyTWFya2VyKVswXVxuICB9XG4gIGlmICh4bWxvYmouUGFydCkge1xuICAgIHRvQXJyYXkoeG1sb2JqLlBhcnQpLmZvckVhY2goKHApID0+IHtcbiAgICAgIHZhciBwYXJ0ID0gK3RvQXJyYXkocC5QYXJ0TnVtYmVyKVswXVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHAuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBwLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXCIkL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvXiZxdW90Oy9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9eJiMzNDsvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC8mIzM0OyQvZywgJycpXG4gICAgICByZXN1bHQucGFydHMucHVzaCh7IHBhcnQsIGxhc3RNb2RpZmllZCwgZXRhZyB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2Ugd2hlbiBhIG5ldyBtdWx0aXBhcnQgdXBsb2FkIGlzIGluaXRpYXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5pdGlhdGVNdWx0aXBhcnQoeG1sKSB7XG4gIHZhciB4bWxvYmogPSBwYXJzZVhtbCh4bWwpXG5cbiAgaWYgKCF4bWxvYmouSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiSW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0XG5cbiAgaWYgKHhtbG9iai5VcGxvYWRJZCkge1xuICAgIHJldHVybiB4bWxvYmouVXBsb2FkSWRcbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRYTUxFcnJvcignTWlzc2luZyB0YWc6IFwiVXBsb2FkSWRcIicpXG59XG5cbi8vIHBhcnNlIFhNTCByZXNwb25zZSB3aGVuIGEgbXVsdGlwYXJ0IHVwbG9hZCBpcyBjb21wbGV0ZWRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbXBsZXRlTXVsdGlwYXJ0KHhtbCkge1xuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKS5Db21wbGV0ZU11bHRpcGFydFVwbG9hZFJlc3VsdFxuICBpZiAoeG1sb2JqLkxvY2F0aW9uKSB7XG4gICAgdmFyIGxvY2F0aW9uID0gdG9BcnJheSh4bWxvYmouTG9jYXRpb24pWzBdXG4gICAgdmFyIGJ1Y2tldCA9IHRvQXJyYXkoeG1sb2JqLkJ1Y2tldClbMF1cbiAgICB2YXIga2V5ID0geG1sb2JqLktleVxuICAgIHZhciBldGFnID0geG1sb2JqLkVUYWcucmVwbGFjZSgvXlwiL2csICcnKVxuICAgICAgLnJlcGxhY2UoL1wiJC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9eJnF1b3Q7L2csICcnKVxuICAgICAgLnJlcGxhY2UoLyZxdW90OyQvZywgJycpXG4gICAgICAucmVwbGFjZSgvXiYjMzQ7L2csICcnKVxuICAgICAgLnJlcGxhY2UoLyYjMzQ7JC9nLCAnJylcblxuICAgIHJldHVybiB7IGxvY2F0aW9uLCBidWNrZXQsIGtleSwgZXRhZyB9XG4gIH1cbiAgLy8gQ29tcGxldGUgTXVsdGlwYXJ0IGNhbiByZXR1cm4gWE1MIEVycm9yIGFmdGVyIGEgMjAwIE9LIHJlc3BvbnNlXG4gIGlmICh4bWxvYmouQ29kZSAmJiB4bWxvYmouTWVzc2FnZSkge1xuICAgIHZhciBlcnJDb2RlID0gdG9BcnJheSh4bWxvYmouQ29kZSlbMF1cbiAgICB2YXIgZXJyTWVzc2FnZSA9IHRvQXJyYXkoeG1sb2JqLk1lc3NhZ2UpWzBdXG4gICAgcmV0dXJuIHsgZXJyQ29kZSwgZXJyTWVzc2FnZSB9XG4gIH1cbn1cblxuY29uc3QgZm9ybWF0T2JqSW5mbyA9IChjb250ZW50LCBvcHRzID0ge30pID0+IHtcbiAgbGV0IHsgS2V5LCBMYXN0TW9kaWZpZWQsIEVUYWcsIFNpemUsIFZlcnNpb25JZCwgSXNMYXRlc3QgfSA9IGNvbnRlbnRcblxuICBpZiAoIWlzT2JqZWN0KG9wdHMpKSB7XG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICBjb25zdCBuYW1lID0gc2FuaXRpemVPYmplY3RLZXkodG9BcnJheShLZXkpWzBdKVxuICBjb25zdCBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSh0b0FycmF5KExhc3RNb2RpZmllZClbMF0pXG4gIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShFVGFnKVswXSlcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbGFzdE1vZGlmaWVkLFxuICAgIGV0YWcsXG4gICAgc2l6ZTogU2l6ZSxcbiAgICB2ZXJzaW9uSWQ6IFZlcnNpb25JZCxcbiAgICBpc0xhdGVzdDogSXNMYXRlc3QsXG4gICAgaXNEZWxldGVNYXJrZXI6IG9wdHMuSXNEZWxldGVNYXJrZXIgPyBvcHRzLklzRGVsZXRlTWFya2VyIDogZmFsc2UsXG4gIH1cbn1cblxuLy8gcGFyc2UgWE1MIHJlc3BvbnNlIGZvciBsaXN0IG9iamVjdHMgaW4gYSBidWNrZXRcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RPYmplY3RzKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICBsZXQgaXNUcnVuY2F0ZWQgPSBmYWxzZVxuICBsZXQgbmV4dE1hcmtlciwgbmV4dFZlcnNpb25LZXlNYXJrZXJcbiAgY29uc3QgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuXG4gIGNvbnN0IHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkgPSAocmVzcG9uc2VFbnRpdHkpID0+IHtcbiAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHtcbiAgICAgIHRvQXJyYXkocmVzcG9uc2VFbnRpdHkpLmZvckVhY2goKGNvbW1vblByZWZpeCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBsaXN0QnVja2V0UmVzdWx0ID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgY29uc3QgbGlzdFZlcnNpb25zUmVzdWx0ID0geG1sb2JqLkxpc3RWZXJzaW9uc1Jlc3VsdFxuXG4gIGlmIChsaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuSXNUcnVuY2F0ZWQpIHtcbiAgICAgIGlzVHJ1bmNhdGVkID0gbGlzdEJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZFxuICAgIH1cbiAgICBpZiAobGlzdEJ1Y2tldFJlc3VsdC5Db250ZW50cykge1xuICAgICAgdG9BcnJheShsaXN0QnVja2V0UmVzdWx0LkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbnRlbnQuS2V5KVswXSlcbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gbmV3IERhdGUodG9BcnJheShjb250ZW50Lkxhc3RNb2RpZmllZClbMF0pXG4gICAgICAgIGNvbnN0IGV0YWcgPSBzYW5pdGl6ZUVUYWcodG9BcnJheShjb250ZW50LkVUYWcpWzBdKVxuICAgICAgICBjb25zdCBzaXplID0gY29udGVudC5TaXplXG4gICAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGxpc3RCdWNrZXRSZXN1bHQuTmV4dE1hcmtlcikge1xuICAgICAgbmV4dE1hcmtlciA9IGxpc3RCdWNrZXRSZXN1bHQuTmV4dE1hcmtlclxuICAgIH1cbiAgICBwYXJzZUNvbW1vblByZWZpeGVzRW50aXR5KGxpc3RCdWNrZXRSZXN1bHQuQ29tbW9uUHJlZml4ZXMpXG4gIH1cblxuICBpZiAobGlzdFZlcnNpb25zUmVzdWx0KSB7XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5Jc1RydW5jYXRlZCkge1xuICAgICAgaXNUcnVuY2F0ZWQgPSBsaXN0VmVyc2lvbnNSZXN1bHQuSXNUcnVuY2F0ZWRcbiAgICB9XG5cbiAgICBpZiAobGlzdFZlcnNpb25zUmVzdWx0LlZlcnNpb24pIHtcbiAgICAgIHRvQXJyYXkobGlzdFZlcnNpb25zUmVzdWx0LlZlcnNpb24pLmZvckVhY2goKGNvbnRlbnQpID0+IHtcbiAgICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaChmb3JtYXRPYmpJbmZvKGNvbnRlbnQpKVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5EZWxldGVNYXJrZXIpIHtcbiAgICAgIHRvQXJyYXkobGlzdFZlcnNpb25zUmVzdWx0LkRlbGV0ZU1hcmtlcikuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgICByZXN1bHQub2JqZWN0cy5wdXNoKGZvcm1hdE9iakluZm8oY29udGVudCwgeyBJc0RlbGV0ZU1hcmtlcjogdHJ1ZSB9KSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0S2V5TWFya2VyKSB7XG4gICAgICBuZXh0VmVyc2lvbktleU1hcmtlciA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0S2V5TWFya2VyXG4gICAgfVxuICAgIGlmIChsaXN0VmVyc2lvbnNSZXN1bHQuTmV4dFZlcnNpb25JZE1hcmtlcikge1xuICAgICAgcmVzdWx0LnZlcnNpb25JZE1hcmtlciA9IGxpc3RWZXJzaW9uc1Jlc3VsdC5OZXh0VmVyc2lvbklkTWFya2VyXG4gICAgfVxuICAgIHBhcnNlQ29tbW9uUHJlZml4ZXNFbnRpdHkobGlzdFZlcnNpb25zUmVzdWx0LkNvbW1vblByZWZpeGVzKVxuICB9XG5cbiAgcmVzdWx0LmlzVHJ1bmNhdGVkID0gaXNUcnVuY2F0ZWRcbiAgaWYgKGlzVHJ1bmNhdGVkKSB7XG4gICAgcmVzdWx0Lm5leHRNYXJrZXIgPSBuZXh0VmVyc2lvbktleU1hcmtlciB8fCBuZXh0TWFya2VyXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3Qgb2JqZWN0cyB2MiBpbiBhIGJ1Y2tldFxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdE9iamVjdHNWMih4bWwpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBvYmplY3RzOiBbXSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gIH1cbiAgdmFyIHhtbG9iaiA9IHBhcnNlWG1sKHhtbClcbiAgaWYgKCF4bWxvYmouTGlzdEJ1Y2tldFJlc3VsdCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFhNTEVycm9yKCdNaXNzaW5nIHRhZzogXCJMaXN0QnVja2V0UmVzdWx0XCInKVxuICB9XG4gIHhtbG9iaiA9IHhtbG9iai5MaXN0QnVja2V0UmVzdWx0XG4gIGlmICh4bWxvYmouSXNUcnVuY2F0ZWQpIHtcbiAgICByZXN1bHQuaXNUcnVuY2F0ZWQgPSB4bWxvYmouSXNUcnVuY2F0ZWRcbiAgfVxuICBpZiAoeG1sb2JqLk5leHRDb250aW51YXRpb25Ub2tlbikge1xuICAgIHJlc3VsdC5uZXh0Q29udGludWF0aW9uVG9rZW4gPSB4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuXG4gIH1cbiAgaWYgKHhtbG9iai5Db250ZW50cykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbnRlbnRzKS5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgICB2YXIgbmFtZSA9IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29udGVudC5LZXkpWzBdKVxuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGNvbnRlbnQuTGFzdE1vZGlmaWVkKVxuICAgICAgdmFyIGV0YWcgPSBzYW5pdGl6ZUVUYWcoY29udGVudC5FVGFnKVxuICAgICAgdmFyIHNpemUgPSBjb250ZW50LlNpemVcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBuYW1lLCBsYXN0TW9kaWZpZWQsIGV0YWcsIHNpemUgfSlcbiAgICB9KVxuICB9XG4gIGlmICh4bWxvYmouQ29tbW9uUHJlZml4ZXMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db21tb25QcmVmaXhlcykuZm9yRWFjaCgoY29tbW9uUHJlZml4KSA9PiB7XG4gICAgICByZXN1bHQub2JqZWN0cy5wdXNoKHsgcHJlZml4OiBzYW5pdGl6ZU9iamVjdEtleSh0b0FycmF5KGNvbW1vblByZWZpeC5QcmVmaXgpWzBdKSwgc2l6ZTogMCB9KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBwYXJzZSBYTUwgcmVzcG9uc2UgZm9yIGxpc3Qgb2JqZWN0cyB2MiB3aXRoIG1ldGFkYXRhIGluIGEgYnVja2V0XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0T2JqZWN0c1YyV2l0aE1ldGFkYXRhKHhtbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIG9iamVjdHM6IFtdLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgfVxuICB2YXIgeG1sb2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoIXhtbG9iai5MaXN0QnVja2V0UmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkWE1MRXJyb3IoJ01pc3NpbmcgdGFnOiBcIkxpc3RCdWNrZXRSZXN1bHRcIicpXG4gIH1cbiAgeG1sb2JqID0geG1sb2JqLkxpc3RCdWNrZXRSZXN1bHRcbiAgaWYgKHhtbG9iai5Jc1RydW5jYXRlZCkge1xuICAgIHJlc3VsdC5pc1RydW5jYXRlZCA9IHhtbG9iai5Jc1RydW5jYXRlZFxuICB9XG4gIGlmICh4bWxvYmouTmV4dENvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgcmVzdWx0Lm5leHRDb250aW51YXRpb25Ub2tlbiA9IHhtbG9iai5OZXh0Q29udGludWF0aW9uVG9rZW5cbiAgfVxuXG4gIGlmICh4bWxvYmouQ29udGVudHMpIHtcbiAgICB0b0FycmF5KHhtbG9iai5Db250ZW50cykuZm9yRWFjaCgoY29udGVudCkgPT4ge1xuICAgICAgdmFyIG5hbWUgPSBzYW5pdGl6ZU9iamVjdEtleShjb250ZW50LktleSlcbiAgICAgIHZhciBsYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZShjb250ZW50Lkxhc3RNb2RpZmllZClcbiAgICAgIHZhciBldGFnID0gc2FuaXRpemVFVGFnKGNvbnRlbnQuRVRhZylcbiAgICAgIHZhciBzaXplID0gY29udGVudC5TaXplXG4gICAgICB2YXIgbWV0YWRhdGFcbiAgICAgIGlmIChjb250ZW50LlVzZXJNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1ldGFkYXRhID0gdG9BcnJheShjb250ZW50LlVzZXJNZXRhZGF0YSlbMF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFkYXRhID0gbnVsbFxuICAgICAgfVxuICAgICAgcmVzdWx0Lm9iamVjdHMucHVzaCh7IG5hbWUsIGxhc3RNb2RpZmllZCwgZXRhZywgc2l6ZSwgbWV0YWRhdGEgfSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHhtbG9iai5Db21tb25QcmVmaXhlcykge1xuICAgIHRvQXJyYXkoeG1sb2JqLkNvbW1vblByZWZpeGVzKS5mb3JFYWNoKChjb21tb25QcmVmaXgpID0+IHtcbiAgICAgIHJlc3VsdC5vYmplY3RzLnB1c2goeyBwcmVmaXg6IHNhbml0aXplT2JqZWN0S2V5KHRvQXJyYXkoY29tbW9uUHJlZml4LlByZWZpeClbMF0pLCBzaXplOiAwIH0pXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1Y2tldFZlcnNpb25pbmdDb25maWcoeG1sKSB7XG4gIHZhciB4bWxPYmogPSBwYXJzZVhtbCh4bWwpXG4gIHJldHVybiB4bWxPYmouVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFnZ2luZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBsZXQgcmVzdWx0ID0gW11cbiAgaWYgKHhtbE9iai5UYWdnaW5nICYmIHhtbE9iai5UYWdnaW5nLlRhZ1NldCAmJiB4bWxPYmouVGFnZ2luZy5UYWdTZXQuVGFnKSB7XG4gICAgY29uc3QgdGFnUmVzdWx0ID0geG1sT2JqLlRhZ2dpbmcuVGFnU2V0LlRhZ1xuICAgIC8vIGlmIGl0IGlzIGEgc2luZ2xlIHRhZyBjb252ZXJ0IGludG8gYW4gYXJyYXkgc28gdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyBhbiBhcnJheS5cbiAgICBpZiAoaXNPYmplY3QodGFnUmVzdWx0KSkge1xuICAgICAgcmVzdWx0LnB1c2godGFnUmVzdWx0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0YWdSZXN1bHRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaWZlY3ljbGVDb25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIHhtbE9iai5MaWZlY3ljbGVDb25maWd1cmF0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExvY2tDb25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgbGV0IGxvY2tDb25maWdSZXN1bHQgPSB7fVxuICBpZiAoeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uKSB7XG4gICAgbG9ja0NvbmZpZ1Jlc3VsdCA9IHtcbiAgICAgIG9iamVjdExvY2tFbmFibGVkOiB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uT2JqZWN0TG9ja0VuYWJsZWQsXG4gICAgfVxuICAgIGxldCByZXRlbnRpb25SZXNwXG4gICAgaWYgKFxuICAgICAgeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uICYmXG4gICAgICB4bWxPYmouT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24uUnVsZSAmJlxuICAgICAgeG1sT2JqLk9iamVjdExvY2tDb25maWd1cmF0aW9uLlJ1bGUuRGVmYXVsdFJldGVudGlvblxuICAgICkge1xuICAgICAgcmV0ZW50aW9uUmVzcCA9IHhtbE9iai5PYmplY3RMb2NrQ29uZmlndXJhdGlvbi5SdWxlLkRlZmF1bHRSZXRlbnRpb24gfHwge31cbiAgICAgIGxvY2tDb25maWdSZXN1bHQubW9kZSA9IHJldGVudGlvblJlc3AuTW9kZVxuICAgIH1cbiAgICBpZiAocmV0ZW50aW9uUmVzcCkge1xuICAgICAgY29uc3QgaXNVbml0WWVhcnMgPSByZXRlbnRpb25SZXNwLlllYXJzXG4gICAgICBpZiAoaXNVbml0WWVhcnMpIHtcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC52YWxpZGl0eSA9IGlzVW5pdFllYXJzXG4gICAgICAgIGxvY2tDb25maWdSZXN1bHQudW5pdCA9IFJFVEVOVElPTl9WQUxJRElUWV9VTklUUy5ZRUFSU1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9ja0NvbmZpZ1Jlc3VsdC52YWxpZGl0eSA9IHJldGVudGlvblJlc3AuRGF5c1xuICAgICAgICBsb2NrQ29uZmlnUmVzdWx0LnVuaXQgPSBSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMuREFZU1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9ja0NvbmZpZ1Jlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdFJldGVudGlvbkNvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXRlbnRpb25Db25maWcgPSB4bWxPYmouUmV0ZW50aW9uXG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlOiByZXRlbnRpb25Db25maWcuTW9kZSxcbiAgICByZXRhaW5VbnRpbERhdGU6IHJldGVudGlvbkNvbmZpZy5SZXRhaW5VbnRpbERhdGUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVja2V0RW5jcnlwdGlvbkNvbmZpZyh4bWwpIHtcbiAgbGV0IGVuY0NvbmZpZyA9IHBhcnNlWG1sKHhtbClcbiAgcmV0dXJuIGVuY0NvbmZpZ1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVwbGljYXRpb25Db25maWcoeG1sKSB7XG4gIGNvbnN0IHhtbE9iaiA9IHBhcnNlWG1sKHhtbClcbiAgY29uc3QgcmVwbGljYXRpb25Db25maWcgPSB7XG4gICAgUmVwbGljYXRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICByb2xlOiB4bWxPYmouUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJvbGUsXG4gICAgICBydWxlczogdG9BcnJheSh4bWxPYmouUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJ1bGUpLFxuICAgIH0sXG4gIH1cbiAgcmV0dXJuIHJlcGxpY2F0aW9uQ29uZmlnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdExlZ2FsSG9sZENvbmZpZyh4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICByZXR1cm4geG1sT2JqLkxlZ2FsSG9sZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkUGFydFBhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBjb25zdCByZXNwRWwgPSB4bWxPYmouQ29weVBhcnRSZXN1bHRcbiAgcmV0dXJuIHJlc3BFbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT2JqZWN0c1BhcnNlcih4bWwpIHtcbiAgY29uc3QgeG1sT2JqID0gcGFyc2VYbWwoeG1sKVxuICBpZiAoeG1sT2JqLkRlbGV0ZVJlc3VsdCAmJiB4bWxPYmouRGVsZXRlUmVzdWx0LkVycm9yKSB7XG4gICAgLy8gcmV0dXJuIGVycm9ycyBhcyBhcnJheSBhbHdheXMuIGFzIHRoZSByZXNwb25zZSBpcyBvYmplY3QgaW4gY2FzZSBvZiBzaW5nbGUgb2JqZWN0IHBhc3NlZCBpbiByZW1vdmVPYmplY3RzXG4gICAgcmV0dXJuIHRvQXJyYXkoeG1sT2JqLkRlbGV0ZVJlc3VsdC5FcnJvcilcbiAgfVxuICByZXR1cm4gW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0T2JqZWN0Q29udGVudFJlc3BvbnNlKHJlcykge1xuICAvLyBleHRyYWN0SGVhZGVyVHlwZSBleHRyYWN0cyB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaGVhZGVyIG1lc3NhZ2UsIHRoZSBoZWFkZXIgdHlwZS5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclR5cGUoc3RyZWFtKSB7XG4gICAgY29uc3QgaGVhZGVyTmFtZUxlbiA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKDEpKS5yZWFkVUludDgoKVxuICAgIGNvbnN0IGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yID0gQnVmZmVyLmZyb20oc3RyZWFtLnJlYWQoaGVhZGVyTmFtZUxlbikpLnRvU3RyaW5nKClcbiAgICBjb25zdCBzcGxpdEJ5U2VwYXJhdG9yID0gKGhlYWRlck5hbWVXaXRoU2VwYXJhdG9yIHx8ICcnKS5zcGxpdCgnOicpXG4gICAgY29uc3QgaGVhZGVyTmFtZSA9IHNwbGl0QnlTZXBhcmF0b3IubGVuZ3RoID49IDEgPyBzcGxpdEJ5U2VwYXJhdG9yWzFdIDogJydcbiAgICByZXR1cm4gaGVhZGVyTmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdEhlYWRlclZhbHVlKHN0cmVhbSkge1xuICAgIGNvbnN0IGJvZHlMZW4gPSBCdWZmZXIuZnJvbShzdHJlYW0ucmVhZCgyKSkucmVhZFVJbnQxNkJFKClcbiAgICBjb25zdCBib2R5TmFtZSA9IEJ1ZmZlci5mcm9tKHN0cmVhbS5yZWFkKGJvZHlMZW4pKS50b1N0cmluZygpXG4gICAgcmV0dXJuIGJvZHlOYW1lXG4gIH1cblxuICBjb25zdCBzZWxlY3RSZXN1bHRzID0gbmV3IFNlbGVjdFJlc3VsdHMoe30pIC8vIHdpbGwgYmUgcmV0dXJuZWRcblxuICBjb25zdCByZXNwb25zZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHJlcykgLy8gY29udmVydCBieXRlIGFycmF5IHRvIGEgcmVhZGFibGUgcmVzcG9uc2VTdHJlYW1cbiAgd2hpbGUgKHJlc3BvbnNlU3RyZWFtLl9yZWFkYWJsZVN0YXRlLmxlbmd0aCkge1xuICAgIC8vIFRvcCBsZXZlbCByZXNwb25zZVN0cmVhbSByZWFkIHRyYWNrZXIuXG4gICAgbGV0IG1zZ0NyY0FjY3VtdWxhdG9yIC8vIGFjY3VtdWxhdGUgZnJvbSBzdGFydCBvZiB0aGUgbWVzc2FnZSB0aWxsIHRoZSBtZXNzYWdlIGNyYyBzdGFydC5cblxuICAgIGNvbnN0IHRvdGFsQnl0ZUxlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMih0b3RhbEJ5dGVMZW5ndGhCdWZmZXIpXG5cbiAgICBjb25zdCBoZWFkZXJCeXRlc0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyZWFtLnJlYWQoNCkpXG4gICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihoZWFkZXJCeXRlc0J1ZmZlciwgbXNnQ3JjQWNjdW11bGF0b3IpXG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUHJlbHVkZUNyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKCkgLy8gdXNlIGl0IHRvIGNoZWNrIGlmIGFueSBDUkMgbWlzbWF0Y2ggaW4gaGVhZGVyIGl0c2VsZi5cblxuICAgIGNvbnN0IHByZWx1ZGVDcmNCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKDQpKSAvLyByZWFkIDQgYnl0ZXMgICAgaS5lIDQrNCA9OCArIDQgPSAxMiAoIHByZWx1ZGUgKyBwcmVsdWRlIGNyYylcbiAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKHByZWx1ZGVDcmNCdWZmZXIsIG1zZ0NyY0FjY3VtdWxhdG9yKVxuXG4gICAgY29uc3QgdG90YWxNc2dMZW5ndGggPSB0b3RhbEJ5dGVMZW5ndGhCdWZmZXIucmVhZEludDMyQkUoKVxuICAgIGNvbnN0IGhlYWRlckxlbmd0aCA9IGhlYWRlckJ5dGVzQnVmZmVyLnJlYWRJbnQzMkJFKClcbiAgICBjb25zdCBwcmVsdWRlQ3JjQnl0ZVZhbHVlID0gcHJlbHVkZUNyY0J1ZmZlci5yZWFkSW50MzJCRSgpXG5cbiAgICBpZiAocHJlbHVkZUNyY0J5dGVWYWx1ZSAhPT0gY2FsY3VsYXRlZFByZWx1ZGVDcmMpIHtcbiAgICAgIC8vIEhhbmRsZSBIZWFkZXIgQ1JDIG1pc21hdGNoIEVycm9yXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBIZWFkZXIgQ2hlY2tzdW0gTWlzbWF0Y2gsIFByZWx1ZGUgQ1JDIG9mICR7cHJlbHVkZUNyY0J5dGVWYWx1ZX0gZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgQ1JDIG9mICR7Y2FsY3VsYXRlZFByZWx1ZGVDcmN9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICBpZiAoaGVhZGVyTGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGVhZGVyQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKGhlYWRlckxlbmd0aCkpXG4gICAgICBtc2dDcmNBY2N1bXVsYXRvciA9IGNyYzMyKGhlYWRlckJ5dGVzLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIGNvbnN0IGhlYWRlclJlYWRlclN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKGhlYWRlckJ5dGVzKVxuICAgICAgd2hpbGUgKGhlYWRlclJlYWRlclN0cmVhbS5fcmVhZGFibGVTdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGhlYWRlclR5cGVOYW1lID0gZXh0cmFjdEhlYWRlclR5cGUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgICBoZWFkZXJSZWFkZXJTdHJlYW0ucmVhZCgxKSAvLyBqdXN0IHJlYWQgYW5kIGlnbm9yZSBpdC5cbiAgICAgICAgaGVhZGVyc1toZWFkZXJUeXBlTmFtZV0gPSBleHRyYWN0SGVhZGVyVmFsdWUoaGVhZGVyUmVhZGVyU3RyZWFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXlsb2FkU3RyZWFtXG4gICAgY29uc3QgcGF5TG9hZExlbmd0aCA9IHRvdGFsTXNnTGVuZ3RoIC0gaGVhZGVyTGVuZ3RoIC0gMTZcbiAgICBpZiAocGF5TG9hZExlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBheUxvYWRCdWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZVN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpKVxuICAgICAgbXNnQ3JjQWNjdW11bGF0b3IgPSBjcmMzMihwYXlMb2FkQnVmZmVyLCBtc2dDcmNBY2N1bXVsYXRvcilcbiAgICAgIC8vIHJlYWQgdGhlIGNoZWNrc3VtIGVhcmx5IGFuZCBkZXRlY3QgYW55IG1pc21hdGNoIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBmdXJ0aGVyIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBtZXNzYWdlQ3JjQnl0ZVZhbHVlID0gQnVmZmVyLmZyb20ocmVzcG9uc2VTdHJlYW0ucmVhZCg0KSkucmVhZEludDMyQkUoKVxuICAgICAgY29uc3QgY2FsY3VsYXRlZENyYyA9IG1zZ0NyY0FjY3VtdWxhdG9yLnJlYWRJbnQzMkJFKClcbiAgICAgIC8vIEhhbmRsZSBtZXNzYWdlIENSQyBFcnJvclxuICAgICAgaWYgKG1lc3NhZ2VDcmNCeXRlVmFsdWUgIT09IGNhbGN1bGF0ZWRDcmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIENoZWNrc3VtIE1pc21hdGNoLCBNZXNzYWdlIENSQyBvZiAke21lc3NhZ2VDcmNCeXRlVmFsdWV9IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIENSQyBvZiAke2NhbGN1bGF0ZWRDcmN9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcGF5bG9hZFN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtKHBheUxvYWRCdWZmZXIpXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVR5cGUgPSBoZWFkZXJzWydtZXNzYWdlLXR5cGUnXVxuXG4gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGhlYWRlcnNbJ2Vycm9yLWNvZGUnXSArICc6XCInICsgaGVhZGVyc1snZXJyb3ItbWVzc2FnZSddICsgJ1wiJ1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgfVxuICAgICAgY2FzZSAnZXZlbnQnOiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gaGVhZGVyc1snZXZlbnQtdHlwZSddXG5cbiAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdFbmQnOiB7XG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlc3BvbnNlKHJlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RSZXN1bHRzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnUmVjb3Jkcyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWREYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFJlY29yZHMocmVhZERhdGEpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ1Byb2dyZXNzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQveG1sJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0gcGF5bG9hZFN0cmVhbS5yZWFkKHBheUxvYWRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICBzZWxlY3RSZXN1bHRzLnNldFByb2dyZXNzKHByb2dyZXNzRGF0YS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFVuZXhwZWN0ZWQgY29udGVudC10eXBlICR7Y29udGVudFR5cGV9IHNlbnQgZm9yIGV2ZW50LXR5cGUgUHJvZ3Jlc3NgXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdTdGF0cyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0L3htbCc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzRGF0YSA9IHBheWxvYWRTdHJlYW0ucmVhZChwYXlMb2FkTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgc2VsZWN0UmVzdWx0cy5zZXRTdGF0cyhzdGF0c0RhdGEudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVbmV4cGVjdGVkIGNvbnRlbnQtdHlwZSAke2NvbnRlbnRUeXBlfSBzZW50IGZvciBldmVudC10eXBlIFN0YXRzYFxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gQ29udGludWF0aW9uIG1lc3NhZ2U6IE5vdCBzdXJlIGlmIGl0IGlzIHN1cHBvcnRlZC4gZGlkIG5vdCBmaW5kIGEgcmVmZXJlbmNlIG9yIGFueSBtZXNzYWdlIGluIHJlc3BvbnNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHBheWxvYWQuXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBVbiBpbXBsZW1lbnRlZCBldmVudCBkZXRlY3RlZCAgJHttZXNzYWdlVHlwZX0uYFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nTWVzc2FnZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gZXZlbnRUeXBlIEVuZFxuICAgICAgfSAvLyBFdmVudCBFbmRcbiAgICB9IC8vIG1lc3NhZ2VUeXBlIEVuZFxuICB9IC8vIFRvcCBMZXZlbCBTdHJlYW0gRW5kXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sS0FBQSxHQUFBUCxPQUFBO0FBQTZELFNBQUFRLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFMLHdCQUFBUyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsb0JBQUFBLEdBQUEsd0JBQUFBLEdBQUEsNEJBQUFFLE9BQUEsRUFBQUYsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLEdBQUEsSUFBQVgsR0FBQSxRQUFBVyxHQUFBLGtCQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFkLEdBQUEsRUFBQVcsR0FBQSxTQUFBSSxJQUFBLEdBQUFSLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsR0FBQSxFQUFBVyxHQUFBLGNBQUFJLElBQUEsS0FBQUEsSUFBQSxDQUFBVixHQUFBLElBQUFVLElBQUEsQ0FBQUMsR0FBQSxLQUFBUixNQUFBLENBQUFDLGNBQUEsQ0FBQUgsTUFBQSxFQUFBSyxHQUFBLEVBQUFJLElBQUEsWUFBQVQsTUFBQSxDQUFBSyxHQUFBLElBQUFYLEdBQUEsQ0FBQVcsR0FBQSxTQUFBTCxNQUFBLENBQUFKLE9BQUEsR0FBQUYsR0FBQSxNQUFBRyxLQUFBLElBQUFBLEtBQUEsQ0FBQWEsR0FBQSxDQUFBaEIsR0FBQSxFQUFBTSxNQUFBLFlBQUFBLE1BQUE7QUF2QjdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFXQTtBQUNBLE1BQU1XLEdBQUcsR0FBRyxJQUFJQyx3QkFBUyxDQUFDLENBQUM7O0FBRTNCO0FBQ08sU0FBU0MsVUFBVUEsQ0FBQ0MsR0FBRyxFQUFFQyxVQUFVLEVBQUU7RUFDMUMsSUFBSUMsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUlDLE1BQU0sR0FBR04sR0FBRyxDQUFDTyxLQUFLLENBQUNKLEdBQUcsQ0FBQztFQUMzQixJQUFJRyxNQUFNLENBQUNFLEtBQUssRUFBRTtJQUNoQkgsTUFBTSxHQUFHQyxNQUFNLENBQUNFLEtBQUs7RUFDdkI7RUFFQSxJQUFJQyxDQUFDLEdBQUcsSUFBSXBDLE1BQU0sQ0FBQ3FDLE9BQU8sQ0FBQyxDQUFDO0VBQzVCQyxPQUFDLENBQUNDLElBQUksQ0FBQ1AsTUFBTSxFQUFFLENBQUNRLEtBQUssRUFBRW5CLEdBQUcsS0FBSztJQUM3QmUsQ0FBQyxDQUFDZixHQUFHLENBQUNvQixXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUdELEtBQUs7RUFDOUIsQ0FBQyxDQUFDO0VBRUZGLE9BQUMsQ0FBQ0MsSUFBSSxDQUFDUixVQUFVLEVBQUUsQ0FBQ1MsS0FBSyxFQUFFbkIsR0FBRyxLQUFLO0lBQ2pDZSxDQUFDLENBQUNmLEdBQUcsQ0FBQyxHQUFHbUIsS0FBSztFQUNoQixDQUFDLENBQUM7RUFDRixPQUFPSixDQUFDO0FBQ1Y7O0FBRUE7QUFDTyxTQUFTTSxlQUFlQSxDQUFDWixHQUFHLEVBQUU7RUFDbkMsSUFBSWEsTUFBTSxHQUFHO0lBQ1hDLElBQUksRUFBRSxFQUFFO0lBQ1JDLFlBQVksRUFBRTtFQUNoQixDQUFDO0VBRUQsSUFBSUMsTUFBTSxHQUFHLElBQUFDLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDMUIsSUFBSSxDQUFDZ0IsTUFBTSxDQUFDRSxnQkFBZ0IsRUFBRTtJQUM1QixNQUFNLElBQUloRCxNQUFNLENBQUNpRCxlQUFlLENBQUMsaUNBQWlDLENBQUM7RUFDckU7RUFDQUgsTUFBTSxHQUFHQSxNQUFNLENBQUNFLGdCQUFnQjtFQUNoQyxJQUFJRixNQUFNLENBQUNJLElBQUksRUFBRTtJQUNmUCxNQUFNLENBQUNDLElBQUksR0FBR0UsTUFBTSxDQUFDSSxJQUFJLENBQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ3pDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUNsQkEsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FDdkJBLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQ3ZCQSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUN0QkEsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7RUFDM0I7RUFDQSxJQUFJTCxNQUFNLENBQUNNLFlBQVksRUFBRTtJQUN2QlQsTUFBTSxDQUFDRSxZQUFZLEdBQUcsSUFBSVEsSUFBSSxDQUFDUCxNQUFNLENBQUNNLFlBQVksQ0FBQztFQUNyRDtFQUVBLE9BQU9ULE1BQU07QUFDZjs7QUFFQTtBQUNPLFNBQVNXLGtCQUFrQkEsQ0FBQ3hCLEdBQUcsRUFBRTtFQUN0QyxJQUFJYSxNQUFNLEdBQUc7SUFDWFksT0FBTyxFQUFFLEVBQUU7SUFDWEMsUUFBUSxFQUFFLEVBQUU7SUFDWkMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUVELElBQUlYLE1BQU0sR0FBRyxJQUFBQyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBRTFCLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ1ksMEJBQTBCLEVBQUU7SUFDdEMsTUFBTSxJQUFJMUQsTUFBTSxDQUFDaUQsZUFBZSxDQUFDLDJDQUEyQyxDQUFDO0VBQy9FO0VBQ0FILE1BQU0sR0FBR0EsTUFBTSxDQUFDWSwwQkFBMEI7RUFDMUMsSUFBSVosTUFBTSxDQUFDYSxXQUFXLEVBQUU7SUFDdEJoQixNQUFNLENBQUNjLFdBQVcsR0FBR1gsTUFBTSxDQUFDYSxXQUFXO0VBQ3pDO0VBQ0EsSUFBSWIsTUFBTSxDQUFDYyxhQUFhLEVBQUU7SUFDeEJqQixNQUFNLENBQUNrQixhQUFhLEdBQUdmLE1BQU0sQ0FBQ2MsYUFBYTtFQUM3QztFQUNBLElBQUlkLE1BQU0sQ0FBQ2dCLGtCQUFrQixFQUFFO0lBQzdCbkIsTUFBTSxDQUFDb0Isa0JBQWtCLEdBQUdqQixNQUFNLENBQUNpQixrQkFBa0I7RUFDdkQ7RUFFQSxJQUFJakIsTUFBTSxDQUFDa0IsY0FBYyxFQUFFO0lBQ3pCLElBQUFDLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQ2tCLGNBQWMsQ0FBQyxDQUFDRSxPQUFPLENBQUVDLE1BQU0sSUFBSztNQUNqRHhCLE1BQU0sQ0FBQ2EsUUFBUSxDQUFDWSxJQUFJLENBQUM7UUFBRUQsTUFBTSxFQUFFLElBQUFFLHlCQUFpQixFQUFDLElBQUFKLGVBQU8sRUFBQ0UsTUFBTSxDQUFDRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFBRSxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxJQUFJeEIsTUFBTSxDQUFDeUIsTUFBTSxFQUFFO0lBQ2pCLElBQUFOLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQyxDQUFDTCxPQUFPLENBQUVNLE1BQU0sSUFBSztNQUN6QyxJQUFJbkQsR0FBRyxHQUFHbUQsTUFBTSxDQUFDQyxHQUFHO01BQ3BCLElBQUlDLFFBQVEsR0FBR0YsTUFBTSxDQUFDRyxRQUFRO01BQzlCLElBQUlDLFNBQVMsR0FBRztRQUFFQyxFQUFFLEVBQUVMLE1BQU0sQ0FBQ00sU0FBUyxDQUFDQyxFQUFFO1FBQUVDLFdBQVcsRUFBRVIsTUFBTSxDQUFDTSxTQUFTLENBQUNHO01BQVksQ0FBQztNQUN0RixJQUFJQyxLQUFLLEdBQUc7UUFBRUwsRUFBRSxFQUFFTCxNQUFNLENBQUNXLEtBQUssQ0FBQ0osRUFBRTtRQUFFQyxXQUFXLEVBQUVSLE1BQU0sQ0FBQ1csS0FBSyxDQUFDRjtNQUFZLENBQUM7TUFDMUUsSUFBSUcsWUFBWSxHQUFHWixNQUFNLENBQUNhLFlBQVk7TUFDdEMsSUFBSUMsU0FBUyxHQUFHLElBQUlqQyxJQUFJLENBQUNtQixNQUFNLENBQUNlLFNBQVMsQ0FBQztNQUMxQzVDLE1BQU0sQ0FBQ1ksT0FBTyxDQUFDYSxJQUFJLENBQUM7UUFBRS9DLEdBQUc7UUFBRXFELFFBQVE7UUFBRUUsU0FBUztRQUFFTSxLQUFLO1FBQUVFLFlBQVk7UUFBRUU7TUFBVSxDQUFDLENBQUM7SUFDbkYsQ0FBQyxDQUFDO0VBQ0o7RUFDQSxPQUFPM0MsTUFBTTtBQUNmOztBQUVBO0FBQ08sU0FBUzZDLGVBQWVBLENBQUMxRCxHQUFHLEVBQUU7RUFDbkMsSUFBSWEsTUFBTSxHQUFHLEVBQUU7RUFDZixJQUFJRyxNQUFNLEdBQUcsSUFBQUMsZ0JBQVEsRUFBQ2pCLEdBQUcsQ0FBQztFQUUxQixJQUFJLENBQUNnQixNQUFNLENBQUMyQyxzQkFBc0IsRUFBRTtJQUNsQyxNQUFNLElBQUl6RixNQUFNLENBQUNpRCxlQUFlLENBQUMsdUNBQXVDLENBQUM7RUFDM0U7RUFDQUgsTUFBTSxHQUFHQSxNQUFNLENBQUMyQyxzQkFBc0I7RUFFdEMsSUFBSTNDLE1BQU0sQ0FBQzRDLE9BQU8sRUFBRTtJQUNsQixJQUFJNUMsTUFBTSxDQUFDNEMsT0FBTyxDQUFDQyxNQUFNLEVBQUU7TUFDekIsSUFBQTFCLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQzRDLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDLENBQUN6QixPQUFPLENBQUUwQixNQUFNLElBQUs7UUFDakQsSUFBSUMsSUFBSSxHQUFHRCxNQUFNLENBQUNFLElBQUk7UUFDdEIsSUFBSUMsWUFBWSxHQUFHLElBQUkxQyxJQUFJLENBQUN1QyxNQUFNLENBQUNJLFlBQVksQ0FBQztRQUNoRHJELE1BQU0sQ0FBQ3lCLElBQUksQ0FBQztVQUFFeUIsSUFBSTtVQUFFRTtRQUFhLENBQUMsQ0FBQztNQUNyQyxDQUFDLENBQUM7SUFDSjtFQUNGO0VBQ0EsT0FBT3BELE1BQU07QUFDZjs7QUFFQTtBQUNPLFNBQVNzRCx1QkFBdUJBLENBQUNuRSxHQUFHLEVBQUU7RUFDM0MsSUFBSWEsTUFBTSxHQUFHO0lBQ1h1RCxrQkFBa0IsRUFBRSxFQUFFO0lBQ3RCQyxrQkFBa0IsRUFBRSxFQUFFO0lBQ3RCQywwQkFBMEIsRUFBRTtFQUM5QixDQUFDO0VBQ0Q7RUFDQSxJQUFJQyxTQUFTLEdBQUcsU0FBQUEsQ0FBVUMsTUFBTSxFQUFFO0lBQ2hDLElBQUkzRCxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUkyRCxNQUFNLEVBQUU7TUFDVixJQUFBckMsZUFBTyxFQUFDcUMsTUFBTSxDQUFDLENBQUNwQyxPQUFPLENBQUVxQyxPQUFPLElBQUs7UUFDbkM1RCxNQUFNLENBQUN5QixJQUFJLENBQUNtQyxPQUFPLENBQUM7TUFDdEIsQ0FBQyxDQUFDO0lBQ0o7SUFDQSxPQUFPNUQsTUFBTTtFQUNmLENBQUM7RUFDRDtFQUNBLElBQUk2RCxjQUFjLEdBQUcsU0FBQUEsQ0FBVUMsT0FBTyxFQUFFO0lBQ3RDLElBQUk5RCxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUk4RCxPQUFPLEVBQUU7TUFDWEEsT0FBTyxHQUFHLElBQUF4QyxlQUFPLEVBQUN3QyxPQUFPLENBQUM7TUFDMUIsSUFBSUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxLQUFLLEVBQUU7UUFDcEJELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxHQUFHLElBQUF6QyxlQUFPLEVBQUN3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQztRQUM1QyxJQUFJRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsVUFBVSxFQUFFO1VBQ2xDLElBQUExQyxlQUFPLEVBQUN3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsVUFBVSxDQUFDLENBQUN6QyxPQUFPLENBQUUwQyxJQUFJLElBQUs7WUFDeEQsSUFBSWQsSUFBSSxHQUFHLElBQUE3QixlQUFPLEVBQUMyQyxJQUFJLENBQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJZSxLQUFLLEdBQUcsSUFBQTVDLGVBQU8sRUFBQzJDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDbEUsTUFBTSxDQUFDeUIsSUFBSSxDQUFDO2NBQUUwQixJQUFJO2NBQUVlO1lBQU0sQ0FBQyxDQUFDO1VBQzlCLENBQUMsQ0FBQztRQUNKO01BQ0Y7SUFDRjtJQUNBLE9BQU9sRSxNQUFNO0VBQ2YsQ0FBQztFQUVELElBQUlHLE1BQU0sR0FBRyxJQUFBQyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzFCZ0IsTUFBTSxHQUFHQSxNQUFNLENBQUNnRSx5QkFBeUI7O0VBRXpDO0VBQ0EsSUFBSWhFLE1BQU0sQ0FBQ29ELGtCQUFrQixFQUFFO0lBQzdCLElBQUFqQyxlQUFPLEVBQUNuQixNQUFNLENBQUNvRCxrQkFBa0IsQ0FBQyxDQUFDaEMsT0FBTyxDQUFFNkMsTUFBTSxJQUFLO01BQ3JELElBQUlDLEVBQUUsR0FBRyxJQUFBL0MsZUFBTyxFQUFDOEMsTUFBTSxDQUFDQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDOUIsSUFBSUMsS0FBSyxHQUFHLElBQUFoRCxlQUFPLEVBQUM4QyxNQUFNLENBQUNFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNwQyxJQUFJQyxLQUFLLEdBQUdiLFNBQVMsQ0FBQ1UsTUFBTSxDQUFDRyxLQUFLLENBQUM7TUFDbkMsSUFBSUMsTUFBTSxHQUFHWCxjQUFjLENBQUNPLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDO01BQzFDeEUsTUFBTSxDQUFDdUQsa0JBQWtCLENBQUM5QixJQUFJLENBQUM7UUFBRTRDLEVBQUU7UUFBRUMsS0FBSztRQUFFQyxLQUFLO1FBQUVDO01BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQztFQUNKO0VBQ0E7RUFDQSxJQUFJckUsTUFBTSxDQUFDcUQsa0JBQWtCLEVBQUU7SUFDN0IsSUFBQWxDLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQ3FELGtCQUFrQixDQUFDLENBQUNqQyxPQUFPLENBQUU2QyxNQUFNLElBQUs7TUFDckQsSUFBSUMsRUFBRSxHQUFHLElBQUEvQyxlQUFPLEVBQUM4QyxNQUFNLENBQUNDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM5QixJQUFJSSxLQUFLLEdBQUcsSUFBQW5ELGVBQU8sRUFBQzhDLE1BQU0sQ0FBQ0ssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3BDLElBQUlGLEtBQUssR0FBR2IsU0FBUyxDQUFDVSxNQUFNLENBQUNHLEtBQUssQ0FBQztNQUNuQyxJQUFJQyxNQUFNLEdBQUdYLGNBQWMsQ0FBQ08sTUFBTSxDQUFDSSxNQUFNLENBQUM7TUFDMUN4RSxNQUFNLENBQUN3RCxrQkFBa0IsQ0FBQy9CLElBQUksQ0FBQztRQUFFNEMsRUFBRTtRQUFFSSxLQUFLO1FBQUVGLEtBQUs7UUFBRUM7TUFBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0VBQ0o7RUFDQTtFQUNBLElBQUlyRSxNQUFNLENBQUNzRCwwQkFBMEIsRUFBRTtJQUNyQyxJQUFBbkMsZUFBTyxFQUFDbkIsTUFBTSxDQUFDc0QsMEJBQTBCLENBQUMsQ0FBQ2xDLE9BQU8sQ0FBRTZDLE1BQU0sSUFBSztNQUM3RCxJQUFJQyxFQUFFLEdBQUcsSUFBQS9DLGVBQU8sRUFBQzhDLE1BQU0sQ0FBQ0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzlCLElBQUlLLGFBQWEsR0FBRyxJQUFBcEQsZUFBTyxFQUFDOEMsTUFBTSxDQUFDTSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDcEQsSUFBSUgsS0FBSyxHQUFHYixTQUFTLENBQUNVLE1BQU0sQ0FBQ0csS0FBSyxDQUFDO01BQ25DLElBQUlDLE1BQU0sR0FBR1gsY0FBYyxDQUFDTyxNQUFNLENBQUNJLE1BQU0sQ0FBQztNQUMxQ3hFLE1BQU0sQ0FBQ3lELDBCQUEwQixDQUFDaEMsSUFBSSxDQUFDO1FBQUU0QyxFQUFFO1FBQUVLLGFBQWE7UUFBRUgsS0FBSztRQUFFQztNQUFPLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUM7RUFDSjtFQUVBLE9BQU94RSxNQUFNO0FBQ2Y7O0FBRUE7QUFDTyxTQUFTMkUsaUJBQWlCQSxDQUFDeEYsR0FBRyxFQUFFO0VBQ3JDO0VBQ0EsT0FBTyxJQUFBaUIsZ0JBQVEsRUFBQ2pCLEdBQUcsQ0FBQyxDQUFDeUYsa0JBQWtCO0FBQ3pDOztBQUVBO0FBQ08sU0FBU0MsY0FBY0EsQ0FBQzFGLEdBQUcsRUFBRTtFQUNsQyxJQUFJZ0IsTUFBTSxHQUFHLElBQUFDLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDMUIsSUFBSWEsTUFBTSxHQUFHO0lBQ1hjLFdBQVcsRUFBRSxLQUFLO0lBQ2xCZ0UsS0FBSyxFQUFFLEVBQUU7SUFDVEMsTUFBTSxFQUFFQztFQUNWLENBQUM7RUFDRCxJQUFJLENBQUM3RSxNQUFNLENBQUM4RSxlQUFlLEVBQUU7SUFDM0IsTUFBTSxJQUFJNUgsTUFBTSxDQUFDaUQsZUFBZSxDQUFDLGdDQUFnQyxDQUFDO0VBQ3BFO0VBQ0FILE1BQU0sR0FBR0EsTUFBTSxDQUFDOEUsZUFBZTtFQUMvQixJQUFJOUUsTUFBTSxDQUFDYSxXQUFXLEVBQUU7SUFDdEJoQixNQUFNLENBQUNjLFdBQVcsR0FBR1gsTUFBTSxDQUFDYSxXQUFXO0VBQ3pDO0VBQ0EsSUFBSWIsTUFBTSxDQUFDK0Usb0JBQW9CLEVBQUU7SUFDL0JsRixNQUFNLENBQUMrRSxNQUFNLEdBQUcsQ0FBQyxJQUFBekQsZUFBTyxFQUFDbkIsTUFBTSxDQUFDK0Usb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUQ7RUFDQSxJQUFJL0UsTUFBTSxDQUFDZ0YsSUFBSSxFQUFFO0lBQ2YsSUFBQTdELGVBQU8sRUFBQ25CLE1BQU0sQ0FBQ2dGLElBQUksQ0FBQyxDQUFDNUQsT0FBTyxDQUFFNkQsQ0FBQyxJQUFLO01BQ2xDLElBQUlDLElBQUksR0FBRyxDQUFDLElBQUEvRCxlQUFPLEVBQUM4RCxDQUFDLENBQUNFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNwQyxJQUFJcEYsWUFBWSxHQUFHLElBQUlRLElBQUksQ0FBQzBFLENBQUMsQ0FBQzNFLFlBQVksQ0FBQztNQUMzQyxJQUFJUixJQUFJLEdBQUdtRixDQUFDLENBQUM3RSxJQUFJLENBQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ2pDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUNsQkEsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FDdkJBLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQ3ZCQSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUN0QkEsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7TUFDekJSLE1BQU0sQ0FBQzhFLEtBQUssQ0FBQ3JELElBQUksQ0FBQztRQUFFNEQsSUFBSTtRQUFFbkYsWUFBWTtRQUFFRDtNQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUM7RUFDSjtFQUNBLE9BQU9ELE1BQU07QUFDZjs7QUFFQTtBQUNPLFNBQVN1RixzQkFBc0JBLENBQUNwRyxHQUFHLEVBQUU7RUFDMUMsSUFBSWdCLE1BQU0sR0FBRyxJQUFBQyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBRTFCLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ3FGLDZCQUE2QixFQUFFO0lBQ3pDLE1BQU0sSUFBSW5JLE1BQU0sQ0FBQ2lELGVBQWUsQ0FBQyw4Q0FBOEMsQ0FBQztFQUNsRjtFQUNBSCxNQUFNLEdBQUdBLE1BQU0sQ0FBQ3FGLDZCQUE2QjtFQUU3QyxJQUFJckYsTUFBTSxDQUFDNkIsUUFBUSxFQUFFO0lBQ25CLE9BQU83QixNQUFNLENBQUM2QixRQUFRO0VBQ3hCO0VBQ0EsTUFBTSxJQUFJM0UsTUFBTSxDQUFDaUQsZUFBZSxDQUFDLHlCQUF5QixDQUFDO0FBQzdEOztBQUVBO0FBQ08sU0FBU21GLHNCQUFzQkEsQ0FBQ3RHLEdBQUcsRUFBRTtFQUMxQyxJQUFJZ0IsTUFBTSxHQUFHLElBQUFDLGdCQUFRLEVBQUNqQixHQUFHLENBQUMsQ0FBQ3VHLDZCQUE2QjtFQUN4RCxJQUFJdkYsTUFBTSxDQUFDd0YsUUFBUSxFQUFFO0lBQ25CLElBQUlDLFFBQVEsR0FBRyxJQUFBdEUsZUFBTyxFQUFDbkIsTUFBTSxDQUFDd0YsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQUkxQyxNQUFNLEdBQUcsSUFBQTNCLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQzZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJdEUsR0FBRyxHQUFHeUIsTUFBTSxDQUFDMkIsR0FBRztJQUNwQixJQUFJN0IsSUFBSSxHQUFHRSxNQUFNLENBQUNJLElBQUksQ0FBQ0MsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDdENBLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ2xCQSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUN2QkEsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FDdkJBLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQ3RCQSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUV6QixPQUFPO01BQUVvRixRQUFRO01BQUUzQyxNQUFNO01BQUV2RSxHQUFHO01BQUV1QjtJQUFLLENBQUM7RUFDeEM7RUFDQTtFQUNBLElBQUlFLE1BQU0sQ0FBQzBGLElBQUksSUFBSTFGLE1BQU0sQ0FBQzJGLE9BQU8sRUFBRTtJQUNqQyxJQUFJQyxPQUFPLEdBQUcsSUFBQXpFLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQzBGLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJRyxVQUFVLEdBQUcsSUFBQTFFLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQzJGLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPO01BQUVDLE9BQU87TUFBRUM7SUFBVyxDQUFDO0VBQ2hDO0FBQ0Y7QUFFQSxNQUFNQyxhQUFhLEdBQUdBLENBQUNDLE9BQU8sRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLO0VBQzVDLElBQUk7SUFBRXJFLEdBQUc7SUFBRXJCLFlBQVk7SUFBRUYsSUFBSTtJQUFFNkYsSUFBSTtJQUFFQyxTQUFTO0lBQUVDO0VBQVMsQ0FBQyxHQUFHSixPQUFPO0VBRXBFLElBQUksQ0FBQyxJQUFBSyxnQkFBUSxFQUFDSixJQUFJLENBQUMsRUFBRTtJQUNuQkEsSUFBSSxHQUFHLENBQUMsQ0FBQztFQUNYO0VBRUEsTUFBTWpELElBQUksR0FBRyxJQUFBeEIseUJBQWlCLEVBQUMsSUFBQUosZUFBTyxFQUFDUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMvQyxNQUFNNUIsWUFBWSxHQUFHLElBQUlRLElBQUksQ0FBQyxJQUFBWSxlQUFPLEVBQUNiLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3ZELE1BQU1SLElBQUksR0FBRyxJQUFBdUcsb0JBQVksRUFBQyxJQUFBbEYsZUFBTyxFQUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUUzQyxPQUFPO0lBQ0wyQyxJQUFJO0lBQ0poRCxZQUFZO0lBQ1pELElBQUk7SUFDSndHLElBQUksRUFBRUwsSUFBSTtJQUNWTSxTQUFTLEVBQUVMLFNBQVM7SUFDcEJNLFFBQVEsRUFBRUwsUUFBUTtJQUNsQk0sY0FBYyxFQUFFVCxJQUFJLENBQUNVLGNBQWMsR0FBR1YsSUFBSSxDQUFDVSxjQUFjLEdBQUc7RUFDOUQsQ0FBQztBQUNILENBQUM7O0FBRUQ7QUFDTyxTQUFTQyxnQkFBZ0JBLENBQUMzSCxHQUFHLEVBQUU7RUFDcEMsSUFBSWEsTUFBTSxHQUFHO0lBQ1grRyxPQUFPLEVBQUUsRUFBRTtJQUNYakcsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNELElBQUlBLFdBQVcsR0FBRyxLQUFLO0VBQ3ZCLElBQUlrRyxVQUFVLEVBQUVDLG9CQUFvQjtFQUNwQyxNQUFNOUcsTUFBTSxHQUFHLElBQUFDLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFFNUIsTUFBTStILHlCQUF5QixHQUFJQyxjQUFjLElBQUs7SUFDcEQsSUFBSUEsY0FBYyxFQUFFO01BQ2xCLElBQUE3RixlQUFPLEVBQUM2RixjQUFjLENBQUMsQ0FBQzVGLE9BQU8sQ0FBRTZGLFlBQVksSUFBSztRQUNoRHBILE1BQU0sQ0FBQytHLE9BQU8sQ0FBQ3RGLElBQUksQ0FBQztVQUFFRCxNQUFNLEVBQUUsSUFBQUUseUJBQWlCLEVBQUMsSUFBQUosZUFBTyxFQUFDOEYsWUFBWSxDQUFDekYsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFBRThFLElBQUksRUFBRTtRQUFFLENBQUMsQ0FBQztNQUM5RixDQUFDLENBQUM7SUFDSjtFQUNGLENBQUM7RUFFRCxNQUFNWSxnQkFBZ0IsR0FBR2xILE1BQU0sQ0FBQ21ILGdCQUFnQjtFQUNoRCxNQUFNQyxrQkFBa0IsR0FBR3BILE1BQU0sQ0FBQ3FILGtCQUFrQjtFQUVwRCxJQUFJSCxnQkFBZ0IsRUFBRTtJQUNwQixJQUFJQSxnQkFBZ0IsQ0FBQ3JHLFdBQVcsRUFBRTtNQUNoQ0YsV0FBVyxHQUFHdUcsZ0JBQWdCLENBQUNyRyxXQUFXO0lBQzVDO0lBQ0EsSUFBSXFHLGdCQUFnQixDQUFDSSxRQUFRLEVBQUU7TUFDN0IsSUFBQW5HLGVBQU8sRUFBQytGLGdCQUFnQixDQUFDSSxRQUFRLENBQUMsQ0FBQ2xHLE9BQU8sQ0FBRTJFLE9BQU8sSUFBSztRQUN0RCxNQUFNaEQsSUFBSSxHQUFHLElBQUF4Qix5QkFBaUIsRUFBQyxJQUFBSixlQUFPLEVBQUM0RSxPQUFPLENBQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNNUIsWUFBWSxHQUFHLElBQUlRLElBQUksQ0FBQyxJQUFBWSxlQUFPLEVBQUM0RSxPQUFPLENBQUN6RixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNUixJQUFJLEdBQUcsSUFBQXVHLG9CQUFZLEVBQUMsSUFBQWxGLGVBQU8sRUFBQzRFLE9BQU8sQ0FBQzNGLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU1rRyxJQUFJLEdBQUdQLE9BQU8sQ0FBQ0UsSUFBSTtRQUN6QnBHLE1BQU0sQ0FBQytHLE9BQU8sQ0FBQ3RGLElBQUksQ0FBQztVQUFFeUIsSUFBSTtVQUFFaEQsWUFBWTtVQUFFRCxJQUFJO1VBQUV3RztRQUFLLENBQUMsQ0FBQztNQUN6RCxDQUFDLENBQUM7SUFDSjtJQUVBLElBQUlZLGdCQUFnQixDQUFDSyxVQUFVLEVBQUU7TUFDL0JWLFVBQVUsR0FBR0ssZ0JBQWdCLENBQUNLLFVBQVU7SUFDMUM7SUFDQVIseUJBQXlCLENBQUNHLGdCQUFnQixDQUFDaEcsY0FBYyxDQUFDO0VBQzVEO0VBRUEsSUFBSWtHLGtCQUFrQixFQUFFO0lBQ3RCLElBQUlBLGtCQUFrQixDQUFDdkcsV0FBVyxFQUFFO01BQ2xDRixXQUFXLEdBQUd5RyxrQkFBa0IsQ0FBQ3ZHLFdBQVc7SUFDOUM7SUFFQSxJQUFJdUcsa0JBQWtCLENBQUNJLE9BQU8sRUFBRTtNQUM5QixJQUFBckcsZUFBTyxFQUFDaUcsa0JBQWtCLENBQUNJLE9BQU8sQ0FBQyxDQUFDcEcsT0FBTyxDQUFFMkUsT0FBTyxJQUFLO1FBQ3ZEbEcsTUFBTSxDQUFDK0csT0FBTyxDQUFDdEYsSUFBSSxDQUFDd0UsYUFBYSxDQUFDQyxPQUFPLENBQUMsQ0FBQztNQUM3QyxDQUFDLENBQUM7SUFDSjtJQUNBLElBQUlxQixrQkFBa0IsQ0FBQ0ssWUFBWSxFQUFFO01BQ25DLElBQUF0RyxlQUFPLEVBQUNpRyxrQkFBa0IsQ0FBQ0ssWUFBWSxDQUFDLENBQUNyRyxPQUFPLENBQUUyRSxPQUFPLElBQUs7UUFDNURsRyxNQUFNLENBQUMrRyxPQUFPLENBQUN0RixJQUFJLENBQUN3RSxhQUFhLENBQUNDLE9BQU8sRUFBRTtVQUFFVyxjQUFjLEVBQUU7UUFBSyxDQUFDLENBQUMsQ0FBQztNQUN2RSxDQUFDLENBQUM7SUFDSjtJQUVBLElBQUlVLGtCQUFrQixDQUFDdEcsYUFBYSxFQUFFO01BQ3BDZ0csb0JBQW9CLEdBQUdNLGtCQUFrQixDQUFDdEcsYUFBYTtJQUN6RDtJQUNBLElBQUlzRyxrQkFBa0IsQ0FBQ00sbUJBQW1CLEVBQUU7TUFDMUM3SCxNQUFNLENBQUM4SCxlQUFlLEdBQUdQLGtCQUFrQixDQUFDTSxtQkFBbUI7SUFDakU7SUFDQVgseUJBQXlCLENBQUNLLGtCQUFrQixDQUFDbEcsY0FBYyxDQUFDO0VBQzlEO0VBRUFyQixNQUFNLENBQUNjLFdBQVcsR0FBR0EsV0FBVztFQUNoQyxJQUFJQSxXQUFXLEVBQUU7SUFDZmQsTUFBTSxDQUFDZ0gsVUFBVSxHQUFHQyxvQkFBb0IsSUFBSUQsVUFBVTtFQUN4RDtFQUNBLE9BQU9oSCxNQUFNO0FBQ2Y7O0FBRUE7QUFDTyxTQUFTK0gsa0JBQWtCQSxDQUFDNUksR0FBRyxFQUFFO0VBQ3RDLElBQUlhLE1BQU0sR0FBRztJQUNYK0csT0FBTyxFQUFFLEVBQUU7SUFDWGpHLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDRCxJQUFJWCxNQUFNLEdBQUcsSUFBQUMsZ0JBQVEsRUFBQ2pCLEdBQUcsQ0FBQztFQUMxQixJQUFJLENBQUNnQixNQUFNLENBQUNtSCxnQkFBZ0IsRUFBRTtJQUM1QixNQUFNLElBQUlqSyxNQUFNLENBQUNpRCxlQUFlLENBQUMsaUNBQWlDLENBQUM7RUFDckU7RUFDQUgsTUFBTSxHQUFHQSxNQUFNLENBQUNtSCxnQkFBZ0I7RUFDaEMsSUFBSW5ILE1BQU0sQ0FBQ2EsV0FBVyxFQUFFO0lBQ3RCaEIsTUFBTSxDQUFDYyxXQUFXLEdBQUdYLE1BQU0sQ0FBQ2EsV0FBVztFQUN6QztFQUNBLElBQUliLE1BQU0sQ0FBQzZILHFCQUFxQixFQUFFO0lBQ2hDaEksTUFBTSxDQUFDaUkscUJBQXFCLEdBQUc5SCxNQUFNLENBQUM2SCxxQkFBcUI7RUFDN0Q7RUFDQSxJQUFJN0gsTUFBTSxDQUFDc0gsUUFBUSxFQUFFO0lBQ25CLElBQUFuRyxlQUFPLEVBQUNuQixNQUFNLENBQUNzSCxRQUFRLENBQUMsQ0FBQ2xHLE9BQU8sQ0FBRTJFLE9BQU8sSUFBSztNQUM1QyxJQUFJaEQsSUFBSSxHQUFHLElBQUF4Qix5QkFBaUIsRUFBQyxJQUFBSixlQUFPLEVBQUM0RSxPQUFPLENBQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNyRCxJQUFJNUIsWUFBWSxHQUFHLElBQUlRLElBQUksQ0FBQ3dGLE9BQU8sQ0FBQ3pGLFlBQVksQ0FBQztNQUNqRCxJQUFJUixJQUFJLEdBQUcsSUFBQXVHLG9CQUFZLEVBQUNOLE9BQU8sQ0FBQzNGLElBQUksQ0FBQztNQUNyQyxJQUFJa0csSUFBSSxHQUFHUCxPQUFPLENBQUNFLElBQUk7TUFDdkJwRyxNQUFNLENBQUMrRyxPQUFPLENBQUN0RixJQUFJLENBQUM7UUFBRXlCLElBQUk7UUFBRWhELFlBQVk7UUFBRUQsSUFBSTtRQUFFd0c7TUFBSyxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDO0VBQ0o7RUFDQSxJQUFJdEcsTUFBTSxDQUFDa0IsY0FBYyxFQUFFO0lBQ3pCLElBQUFDLGVBQU8sRUFBQ25CLE1BQU0sQ0FBQ2tCLGNBQWMsQ0FBQyxDQUFDRSxPQUFPLENBQUU2RixZQUFZLElBQUs7TUFDdkRwSCxNQUFNLENBQUMrRyxPQUFPLENBQUN0RixJQUFJLENBQUM7UUFBRUQsTUFBTSxFQUFFLElBQUFFLHlCQUFpQixFQUFDLElBQUFKLGVBQU8sRUFBQzhGLFlBQVksQ0FBQ3pGLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUU4RSxJQUFJLEVBQUU7TUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDO0VBQ0o7RUFDQSxPQUFPekcsTUFBTTtBQUNmOztBQUVBO0FBQ08sU0FBU2tJLDhCQUE4QkEsQ0FBQy9JLEdBQUcsRUFBRTtFQUNsRCxJQUFJYSxNQUFNLEdBQUc7SUFDWCtHLE9BQU8sRUFBRSxFQUFFO0lBQ1hqRyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0QsSUFBSVgsTUFBTSxHQUFHLElBQUFDLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDMUIsSUFBSSxDQUFDZ0IsTUFBTSxDQUFDbUgsZ0JBQWdCLEVBQUU7SUFDNUIsTUFBTSxJQUFJakssTUFBTSxDQUFDaUQsZUFBZSxDQUFDLGlDQUFpQyxDQUFDO0VBQ3JFO0VBQ0FILE1BQU0sR0FBR0EsTUFBTSxDQUFDbUgsZ0JBQWdCO0VBQ2hDLElBQUluSCxNQUFNLENBQUNhLFdBQVcsRUFBRTtJQUN0QmhCLE1BQU0sQ0FBQ2MsV0FBVyxHQUFHWCxNQUFNLENBQUNhLFdBQVc7RUFDekM7RUFDQSxJQUFJYixNQUFNLENBQUM2SCxxQkFBcUIsRUFBRTtJQUNoQ2hJLE1BQU0sQ0FBQ2lJLHFCQUFxQixHQUFHOUgsTUFBTSxDQUFDNkgscUJBQXFCO0VBQzdEO0VBRUEsSUFBSTdILE1BQU0sQ0FBQ3NILFFBQVEsRUFBRTtJQUNuQixJQUFBbkcsZUFBTyxFQUFDbkIsTUFBTSxDQUFDc0gsUUFBUSxDQUFDLENBQUNsRyxPQUFPLENBQUUyRSxPQUFPLElBQUs7TUFDNUMsSUFBSWhELElBQUksR0FBRyxJQUFBeEIseUJBQWlCLEVBQUN3RSxPQUFPLENBQUNwRSxHQUFHLENBQUM7TUFDekMsSUFBSTVCLFlBQVksR0FBRyxJQUFJUSxJQUFJLENBQUN3RixPQUFPLENBQUN6RixZQUFZLENBQUM7TUFDakQsSUFBSVIsSUFBSSxHQUFHLElBQUF1RyxvQkFBWSxFQUFDTixPQUFPLENBQUMzRixJQUFJLENBQUM7TUFDckMsSUFBSWtHLElBQUksR0FBR1AsT0FBTyxDQUFDRSxJQUFJO01BQ3ZCLElBQUkrQixRQUFRO01BQ1osSUFBSWpDLE9BQU8sQ0FBQ2tDLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDaENELFFBQVEsR0FBRyxJQUFBN0csZUFBTyxFQUFDNEUsT0FBTyxDQUFDa0MsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzdDLENBQUMsTUFBTTtRQUNMRCxRQUFRLEdBQUcsSUFBSTtNQUNqQjtNQUNBbkksTUFBTSxDQUFDK0csT0FBTyxDQUFDdEYsSUFBSSxDQUFDO1FBQUV5QixJQUFJO1FBQUVoRCxZQUFZO1FBQUVELElBQUk7UUFBRXdHLElBQUk7UUFBRTBCO01BQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQztFQUNKO0VBRUEsSUFBSWhJLE1BQU0sQ0FBQ2tCLGNBQWMsRUFBRTtJQUN6QixJQUFBQyxlQUFPLEVBQUNuQixNQUFNLENBQUNrQixjQUFjLENBQUMsQ0FBQ0UsT0FBTyxDQUFFNkYsWUFBWSxJQUFLO01BQ3ZEcEgsTUFBTSxDQUFDK0csT0FBTyxDQUFDdEYsSUFBSSxDQUFDO1FBQUVELE1BQU0sRUFBRSxJQUFBRSx5QkFBaUIsRUFBQyxJQUFBSixlQUFPLEVBQUM4RixZQUFZLENBQUN6RixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFOEUsSUFBSSxFQUFFO01BQUUsQ0FBQyxDQUFDO0lBQzlGLENBQUMsQ0FBQztFQUNKO0VBQ0EsT0FBT3pHLE1BQU07QUFDZjtBQUVPLFNBQVNxSSwyQkFBMkJBLENBQUNsSixHQUFHLEVBQUU7RUFDL0MsSUFBSUcsTUFBTSxHQUFHLElBQUFjLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDMUIsT0FBT0csTUFBTSxDQUFDZ0osdUJBQXVCO0FBQ3ZDO0FBRU8sU0FBU0MsWUFBWUEsQ0FBQ3BKLEdBQUcsRUFBRTtFQUNoQyxNQUFNRyxNQUFNLEdBQUcsSUFBQWMsZ0JBQVEsRUFBQ2pCLEdBQUcsQ0FBQztFQUM1QixJQUFJYSxNQUFNLEdBQUcsRUFBRTtFQUNmLElBQUlWLE1BQU0sQ0FBQ2tKLE9BQU8sSUFBSWxKLE1BQU0sQ0FBQ2tKLE9BQU8sQ0FBQ0MsTUFBTSxJQUFJbkosTUFBTSxDQUFDa0osT0FBTyxDQUFDQyxNQUFNLENBQUNDLEdBQUcsRUFBRTtJQUN4RSxNQUFNQyxTQUFTLEdBQUdySixNQUFNLENBQUNrSixPQUFPLENBQUNDLE1BQU0sQ0FBQ0MsR0FBRztJQUMzQztJQUNBLElBQUksSUFBQW5DLGdCQUFRLEVBQUNvQyxTQUFTLENBQUMsRUFBRTtNQUN2QjNJLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ2tILFNBQVMsQ0FBQztJQUN4QixDQUFDLE1BQU07TUFDTDNJLE1BQU0sR0FBRzJJLFNBQVM7SUFDcEI7RUFDRjtFQUNBLE9BQU8zSSxNQUFNO0FBQ2Y7QUFFTyxTQUFTNEksb0JBQW9CQSxDQUFDekosR0FBRyxFQUFFO0VBQ3hDLE1BQU1HLE1BQU0sR0FBRyxJQUFBYyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzVCLE9BQU9HLE1BQU0sQ0FBQ3VKLHNCQUFzQjtBQUN0QztBQUVPLFNBQVNDLHFCQUFxQkEsQ0FBQzNKLEdBQUcsRUFBRTtFQUN6QyxNQUFNRyxNQUFNLEdBQUcsSUFBQWMsZ0JBQVEsRUFBQ2pCLEdBQUcsQ0FBQztFQUM1QixJQUFJNEosZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLElBQUl6SixNQUFNLENBQUMwSix1QkFBdUIsRUFBRTtJQUNsQ0QsZ0JBQWdCLEdBQUc7TUFDakJFLGlCQUFpQixFQUFFM0osTUFBTSxDQUFDMEosdUJBQXVCLENBQUNFO0lBQ3BELENBQUM7SUFDRCxJQUFJQyxhQUFhO0lBQ2pCLElBQ0U3SixNQUFNLENBQUMwSix1QkFBdUIsSUFDOUIxSixNQUFNLENBQUMwSix1QkFBdUIsQ0FBQ0ksSUFBSSxJQUNuQzlKLE1BQU0sQ0FBQzBKLHVCQUF1QixDQUFDSSxJQUFJLENBQUNDLGdCQUFnQixFQUNwRDtNQUNBRixhQUFhLEdBQUc3SixNQUFNLENBQUMwSix1QkFBdUIsQ0FBQ0ksSUFBSSxDQUFDQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7TUFDMUVOLGdCQUFnQixDQUFDTyxJQUFJLEdBQUdILGFBQWEsQ0FBQ0ksSUFBSTtJQUM1QztJQUNBLElBQUlKLGFBQWEsRUFBRTtNQUNqQixNQUFNSyxXQUFXLEdBQUdMLGFBQWEsQ0FBQ00sS0FBSztNQUN2QyxJQUFJRCxXQUFXLEVBQUU7UUFDZlQsZ0JBQWdCLENBQUNXLFFBQVEsR0FBR0YsV0FBVztRQUN2Q1QsZ0JBQWdCLENBQUNZLElBQUksR0FBR0MsOEJBQXdCLENBQUNDLEtBQUs7TUFDeEQsQ0FBQyxNQUFNO1FBQ0xkLGdCQUFnQixDQUFDVyxRQUFRLEdBQUdQLGFBQWEsQ0FBQ1csSUFBSTtRQUM5Q2YsZ0JBQWdCLENBQUNZLElBQUksR0FBR0MsOEJBQXdCLENBQUNHLElBQUk7TUFDdkQ7SUFDRjtJQUNBLE9BQU9oQixnQkFBZ0I7RUFDekI7QUFDRjtBQUVPLFNBQVNpQiwwQkFBMEJBLENBQUM3SyxHQUFHLEVBQUU7RUFDOUMsTUFBTUcsTUFBTSxHQUFHLElBQUFjLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDNUIsTUFBTThLLGVBQWUsR0FBRzNLLE1BQU0sQ0FBQzRLLFNBQVM7RUFFeEMsT0FBTztJQUNMWixJQUFJLEVBQUVXLGVBQWUsQ0FBQ1YsSUFBSTtJQUMxQlksZUFBZSxFQUFFRixlQUFlLENBQUNHO0VBQ25DLENBQUM7QUFDSDtBQUVPLFNBQVNDLDJCQUEyQkEsQ0FBQ2xMLEdBQUcsRUFBRTtFQUMvQyxJQUFJbUwsU0FBUyxHQUFHLElBQUFsSyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzdCLE9BQU9tTCxTQUFTO0FBQ2xCO0FBQ08sU0FBU0Msc0JBQXNCQSxDQUFDcEwsR0FBRyxFQUFFO0VBQzFDLE1BQU1HLE1BQU0sR0FBRyxJQUFBYyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzVCLE1BQU1xTCxpQkFBaUIsR0FBRztJQUN4QkMsd0JBQXdCLEVBQUU7TUFDeEJDLElBQUksRUFBRXBMLE1BQU0sQ0FBQ21MLHdCQUF3QixDQUFDRSxJQUFJO01BQzFDQyxLQUFLLEVBQUUsSUFBQXRKLGVBQU8sRUFBQ2hDLE1BQU0sQ0FBQ21MLHdCQUF3QixDQUFDckIsSUFBSTtJQUNyRDtFQUNGLENBQUM7RUFDRCxPQUFPb0IsaUJBQWlCO0FBQzFCO0FBRU8sU0FBU0ssMEJBQTBCQSxDQUFDMUwsR0FBRyxFQUFFO0VBQzlDLE1BQU1HLE1BQU0sR0FBRyxJQUFBYyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzVCLE9BQU9HLE1BQU0sQ0FBQ3dMLFNBQVM7QUFDekI7QUFFTyxTQUFTQyxnQkFBZ0JBLENBQUM1TCxHQUFHLEVBQUU7RUFDcEMsTUFBTUcsTUFBTSxHQUFHLElBQUFjLGdCQUFRLEVBQUNqQixHQUFHLENBQUM7RUFDNUIsTUFBTTZMLE1BQU0sR0FBRzFMLE1BQU0sQ0FBQzJMLGNBQWM7RUFDcEMsT0FBT0QsTUFBTTtBQUNmO0FBRU8sU0FBU0UsbUJBQW1CQSxDQUFDL0wsR0FBRyxFQUFFO0VBQ3ZDLE1BQU1HLE1BQU0sR0FBRyxJQUFBYyxnQkFBUSxFQUFDakIsR0FBRyxDQUFDO0VBQzVCLElBQUlHLE1BQU0sQ0FBQzZMLFlBQVksSUFBSTdMLE1BQU0sQ0FBQzZMLFlBQVksQ0FBQzNMLEtBQUssRUFBRTtJQUNwRDtJQUNBLE9BQU8sSUFBQThCLGVBQU8sRUFBQ2hDLE1BQU0sQ0FBQzZMLFlBQVksQ0FBQzNMLEtBQUssQ0FBQztFQUMzQztFQUNBLE9BQU8sRUFBRTtBQUNYO0FBRU8sU0FBUzRMLGdDQUFnQ0EsQ0FBQ0MsR0FBRyxFQUFFO0VBQ3BEO0VBQ0EsU0FBU0MsaUJBQWlCQSxDQUFDQyxNQUFNLEVBQUU7SUFDakMsTUFBTUMsYUFBYSxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ0gsTUFBTSxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTUMsdUJBQXVCLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxNQUFNLENBQUNJLElBQUksQ0FBQ0gsYUFBYSxDQUFDLENBQUMsQ0FBQ00sUUFBUSxDQUFDLENBQUM7SUFDbEYsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQ0YsdUJBQXVCLElBQUksRUFBRSxFQUFFRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ25FLE1BQU1DLFVBQVUsR0FBR0YsZ0JBQWdCLENBQUNHLE1BQU0sSUFBSSxDQUFDLEdBQUdILGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFDMUUsT0FBT0UsVUFBVTtFQUNuQjtFQUVBLFNBQVNFLGtCQUFrQkEsQ0FBQ1osTUFBTSxFQUFFO0lBQ2xDLE1BQU1hLE9BQU8sR0FBR1gsTUFBTSxDQUFDQyxJQUFJLENBQUNILE1BQU0sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNVLFlBQVksQ0FBQyxDQUFDO0lBQzFELE1BQU1DLFFBQVEsR0FBR2IsTUFBTSxDQUFDQyxJQUFJLENBQUNILE1BQU0sQ0FBQ0ksSUFBSSxDQUFDUyxPQUFPLENBQUMsQ0FBQyxDQUFDTixRQUFRLENBQUMsQ0FBQztJQUM3RCxPQUFPUSxRQUFRO0VBQ2pCO0VBRUEsTUFBTUMsYUFBYSxHQUFHLElBQUlDLHNCQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQzs7RUFFNUMsTUFBTUMsY0FBYyxHQUFHLElBQUFDLHNCQUFjLEVBQUNyQixHQUFHLENBQUMsRUFBQztFQUMzQyxPQUFPb0IsY0FBYyxDQUFDRSxjQUFjLENBQUNULE1BQU0sRUFBRTtJQUMzQztJQUNBLElBQUlVLGlCQUFpQixFQUFDOztJQUV0QixNQUFNQyxxQkFBcUIsR0FBR3BCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZSxjQUFjLENBQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRWlCLGlCQUFpQixHQUFHRSxVQUFLLENBQUNELHFCQUFxQixDQUFDO0lBRWhELE1BQU1FLGlCQUFpQixHQUFHdEIsTUFBTSxDQUFDQyxJQUFJLENBQUNlLGNBQWMsQ0FBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdEaUIsaUJBQWlCLEdBQUdFLFVBQUssQ0FBQ0MsaUJBQWlCLEVBQUVILGlCQUFpQixDQUFDO0lBRS9ELE1BQU1JLG9CQUFvQixHQUFHSixpQkFBaUIsQ0FBQ0ssV0FBVyxDQUFDLENBQUMsRUFBQzs7SUFFN0QsTUFBTUMsZ0JBQWdCLEdBQUd6QixNQUFNLENBQUNDLElBQUksQ0FBQ2UsY0FBYyxDQUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztJQUM3RGlCLGlCQUFpQixHQUFHRSxVQUFLLENBQUNJLGdCQUFnQixFQUFFTixpQkFBaUIsQ0FBQztJQUU5RCxNQUFNTyxjQUFjLEdBQUdOLHFCQUFxQixDQUFDSSxXQUFXLENBQUMsQ0FBQztJQUMxRCxNQUFNRyxZQUFZLEdBQUdMLGlCQUFpQixDQUFDRSxXQUFXLENBQUMsQ0FBQztJQUNwRCxNQUFNSSxtQkFBbUIsR0FBR0gsZ0JBQWdCLENBQUNELFdBQVcsQ0FBQyxDQUFDO0lBRTFELElBQUlJLG1CQUFtQixLQUFLTCxvQkFBb0IsRUFBRTtNQUNoRDtNQUNBLE1BQU0sSUFBSXhOLEtBQUssQ0FDWiw0Q0FBMkM2TixtQkFBb0IsbUNBQWtDTCxvQkFBcUIsRUFDekgsQ0FBQztJQUNIO0lBRUEsTUFBTU0sT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJRixZQUFZLEdBQUcsQ0FBQyxFQUFFO01BQ3BCLE1BQU1HLFdBQVcsR0FBRzlCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZSxjQUFjLENBQUNkLElBQUksQ0FBQ3lCLFlBQVksQ0FBQyxDQUFDO01BQ2xFUixpQkFBaUIsR0FBR0UsVUFBSyxDQUFDUyxXQUFXLEVBQUVYLGlCQUFpQixDQUFDO01BQ3pELE1BQU1ZLGtCQUFrQixHQUFHLElBQUFkLHNCQUFjLEVBQUNhLFdBQVcsQ0FBQztNQUN0RCxPQUFPQyxrQkFBa0IsQ0FBQ2IsY0FBYyxDQUFDVCxNQUFNLEVBQUU7UUFDL0MsSUFBSXVCLGNBQWMsR0FBR25DLGlCQUFpQixDQUFDa0Msa0JBQWtCLENBQUM7UUFDMURBLGtCQUFrQixDQUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDO1FBQzNCMkIsT0FBTyxDQUFDRyxjQUFjLENBQUMsR0FBR3RCLGtCQUFrQixDQUFDcUIsa0JBQWtCLENBQUM7TUFDbEU7SUFDRjtJQUVBLElBQUlFLGFBQWE7SUFDakIsTUFBTUMsYUFBYSxHQUFHUixjQUFjLEdBQUdDLFlBQVksR0FBRyxFQUFFO0lBQ3hELElBQUlPLGFBQWEsR0FBRyxDQUFDLEVBQUU7TUFDckIsTUFBTUMsYUFBYSxHQUFHbkMsTUFBTSxDQUFDQyxJQUFJLENBQUNlLGNBQWMsQ0FBQ2QsSUFBSSxDQUFDZ0MsYUFBYSxDQUFDLENBQUM7TUFDckVmLGlCQUFpQixHQUFHRSxVQUFLLENBQUNjLGFBQWEsRUFBRWhCLGlCQUFpQixDQUFDO01BQzNEO01BQ0EsTUFBTWlCLG1CQUFtQixHQUFHcEMsTUFBTSxDQUFDQyxJQUFJLENBQUNlLGNBQWMsQ0FBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNzQixXQUFXLENBQUMsQ0FBQztNQUM3RSxNQUFNYSxhQUFhLEdBQUdsQixpQkFBaUIsQ0FBQ0ssV0FBVyxDQUFDLENBQUM7TUFDckQ7TUFDQSxJQUFJWSxtQkFBbUIsS0FBS0MsYUFBYSxFQUFFO1FBQ3pDLE1BQU0sSUFBSXRPLEtBQUssQ0FDWiw2Q0FBNENxTyxtQkFBb0IsbUNBQWtDQyxhQUFjLEVBQ25ILENBQUM7TUFDSDtNQUNBSixhQUFhLEdBQUcsSUFBQWhCLHNCQUFjLEVBQUNrQixhQUFhLENBQUM7SUFDL0M7SUFFQSxNQUFNRyxXQUFXLEdBQUdULE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFFM0MsUUFBUVMsV0FBVztNQUNqQixLQUFLLE9BQU87UUFBRTtVQUNaLE1BQU1DLFlBQVksR0FBR1YsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksR0FBR0EsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUc7VUFDbEYsTUFBTSxJQUFJOU4sS0FBSyxDQUFDd08sWUFBWSxDQUFDO1FBQy9CO01BQ0EsS0FBSyxPQUFPO1FBQUU7VUFDWixNQUFNQyxXQUFXLEdBQUdYLE9BQU8sQ0FBQyxjQUFjLENBQUM7VUFDM0MsTUFBTVksU0FBUyxHQUFHWixPQUFPLENBQUMsWUFBWSxDQUFDO1VBRXZDLFFBQVFZLFNBQVM7WUFDZixLQUFLLEtBQUs7Y0FBRTtnQkFDVjNCLGFBQWEsQ0FBQzRCLFdBQVcsQ0FBQzlDLEdBQUcsQ0FBQztnQkFDOUIsT0FBT2tCLGFBQWE7Y0FDdEI7WUFFQSxLQUFLLFNBQVM7Y0FBRTtnQkFDZCxNQUFNNkIsUUFBUSxHQUFHVixhQUFhLENBQUMvQixJQUFJLENBQUNnQyxhQUFhLENBQUM7Z0JBQ2xEcEIsYUFBYSxDQUFDOEIsVUFBVSxDQUFDRCxRQUFRLENBQUM7Z0JBQ2xDO2NBQ0Y7WUFFQSxLQUFLLFVBQVU7Y0FDYjtnQkFDRSxRQUFRSCxXQUFXO2tCQUNqQixLQUFLLFVBQVU7b0JBQUU7c0JBQ2YsTUFBTUssWUFBWSxHQUFHWixhQUFhLENBQUMvQixJQUFJLENBQUNnQyxhQUFhLENBQUM7c0JBQ3REcEIsYUFBYSxDQUFDZ0MsV0FBVyxDQUFDRCxZQUFZLENBQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDO3NCQUNsRDtvQkFDRjtrQkFDQTtvQkFBUztzQkFDUCxNQUFNa0MsWUFBWSxHQUFJLDJCQUEwQkMsV0FBWSwrQkFBOEI7c0JBQzFGLE1BQU0sSUFBSXpPLEtBQUssQ0FBQ3dPLFlBQVksQ0FBQztvQkFDL0I7Z0JBQ0Y7Y0FDRjtjQUNBO1lBQ0YsS0FBSyxPQUFPO2NBQ1Y7Z0JBQ0UsUUFBUUMsV0FBVztrQkFDakIsS0FBSyxVQUFVO29CQUFFO3NCQUNmLE1BQU1PLFNBQVMsR0FBR2QsYUFBYSxDQUFDL0IsSUFBSSxDQUFDZ0MsYUFBYSxDQUFDO3NCQUNuRHBCLGFBQWEsQ0FBQ2tDLFFBQVEsQ0FBQ0QsU0FBUyxDQUFDMUMsUUFBUSxDQUFDLENBQUMsQ0FBQztzQkFDNUM7b0JBQ0Y7a0JBQ0E7b0JBQVM7c0JBQ1AsTUFBTWtDLFlBQVksR0FBSSwyQkFBMEJDLFdBQVksNEJBQTJCO3NCQUN2RixNQUFNLElBQUl6TyxLQUFLLENBQUN3TyxZQUFZLENBQUM7b0JBQy9CO2dCQUNGO2NBQ0Y7Y0FDQTtZQUNGO2NBQVM7Z0JBQ1A7Z0JBQ0E7Z0JBQ0EsTUFBTVUsY0FBYyxHQUFJLGtDQUFpQ1gsV0FBWSxHQUFFO2dCQUN2RTtnQkFDQVksT0FBTyxDQUFDQyxJQUFJLENBQUNGLGNBQWMsQ0FBQztjQUM5QjtVQUNGLENBQUMsQ0FBQztRQUNKO01BQUU7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSiJ9 + +/***/ }), + +/***/ 7962: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +/*! + * mime-db + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module exports. + */ + +module.exports = __nccwpck_require__(2639) + + +/***/ }), + +/***/ 7920: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; +/*! + * mime-types + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + + + +/** + * Module dependencies. + * @private + */ + +var db = __nccwpck_require__(7962) +var extname = (__nccwpck_require__(1017).extname) + +/** + * Module variables. + * @private + */ + +var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ +var TEXT_TYPE_REGEXP = /^text\//i + +/** + * Module exports. + * @public + */ + +exports.charset = charset +exports.charsets = { lookup: charset } +exports.contentType = contentType +exports.extension = extension +exports.extensions = Object.create(null) +exports.lookup = lookup +exports.types = Object.create(null) + +// Populate the extensions/types maps +populateMaps(exports.extensions, exports.types) + +/** + * Get the default charset for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function charset (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + var mime = match && db[match[1].toLowerCase()] + + if (mime && mime.charset) { + return mime.charset + } + + // default text/* to utf-8 + if (match && TEXT_TYPE_REGEXP.test(match[1])) { + return 'UTF-8' + } + + return false +} + +/** + * Create a full Content-Type header given a MIME type or extension. + * + * @param {string} str + * @return {boolean|string} + */ + +function contentType (str) { + // TODO: should this even be in this module? + if (!str || typeof str !== 'string') { + return false + } + + var mime = str.indexOf('/') === -1 + ? exports.lookup(str) + : str + + if (!mime) { + return false + } + + // TODO: use content-type or other module + if (mime.indexOf('charset') === -1) { + var charset = exports.charset(mime) + if (charset) mime += '; charset=' + charset.toLowerCase() + } + + return mime +} + +/** + * Get the default extension for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function extension (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + + // get extensions + var exts = match && exports.extensions[match[1].toLowerCase()] + + if (!exts || !exts.length) { + return false + } + + return exts[0] +} + +/** + * Lookup the MIME type for a file path/extension. + * + * @param {string} path + * @return {boolean|string} + */ + +function lookup (path) { + if (!path || typeof path !== 'string') { + return false + } + + // get the extension ("ext" or ".ext" or full path) + var extension = extname('x.' + path) + .toLowerCase() + .substr(1) + + if (!extension) { + return false + } + + return exports.types[extension] || false +} + +/** + * Populate the extensions and types maps. + * @private + */ + +function populateMaps (extensions, types) { + // source preference (least -> most) + var preference = ['nginx', 'apache', undefined, 'iana'] + + Object.keys(db).forEach(function forEachMimeType (type) { + var mime = db[type] + var exts = mime.extensions + + if (!exts || !exts.length) { + return + } + + // mime -> extensions + extensions[type] = exts + + // extension -> mime + for (var i = 0; i < exts.length; i++) { + var extension = exts[i] + + if (types[extension]) { + var from = preference.indexOf(db[types[extension]].source) + var to = preference.indexOf(mime.source) + + if (types[extension] !== 'application/octet-stream' && + (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { + // skip the remapping + continue + } + } + + // set the extension -> mime + types[extension] = type + } + }) +} + /***/ }), @@ -88743,60 +92333,48 @@ module.exports.q = codes; // 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 duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. -/**/ + +/**/ var objectKeys = Object.keys || function (obj) { var keys = []; - - for (var key in obj) { - keys.push(key); - } - + for (var key in obj) keys.push(key); return keys; }; /**/ - module.exports = Duplex; - var Readable = __nccwpck_require__(1433); - var Writable = __nccwpck_require__(2094); - __nccwpck_require__(4124)(Duplex, Readable); - { // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { var method = keys[v]; 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); this.allowHalfOpen = true; - if (options) { if (options.readable === false) this.readable = false; if (options.writable === false) this.writable = false; - if (options.allowHalfOpen === false) { this.allowHalfOpen = false; this.once('end', onend); } } } - Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -88823,20 +92401,20 @@ Object.defineProperty(Duplex.prototype, 'writableLength', { get: function get() { return this._writableState.length; } -}); // the no-half-open enforcer +}); +// the no-half-open enforcer function onend() { // If the writable side ended, then we're ok. - if (this._writableState.ended) return; // no more data can be written. - // But allow more writes to happen in this tick. + if (this._writableState.ended) return; + // no more data can be written. + // But allow more writes to happen in this tick. process.nextTick(onEndNT, this); } - function onEndNT(self) { self.end(); } - Object.defineProperty(Duplex.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -88846,7 +92424,6 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { if (this._readableState === undefined || this._writableState === undefined) { return false; } - return this._readableState.destroyed && this._writableState.destroyed; }, set: function set(value) { @@ -88854,10 +92431,10 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._readableState.destroyed = value; this._writableState.destroyed = value; } @@ -88889,22 +92466,20 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { // 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 passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. -module.exports = PassThrough; +module.exports = PassThrough; var Transform = __nccwpck_require__(4415); - __nccwpck_require__(4124)(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); }; @@ -88937,47 +92512,38 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { // USE OR OTHER DEALINGS IN THE SOFTWARE. + module.exports = Readable; -/**/ +/**/ var Duplex; /**/ Readable.ReadableState = ReadableState; -/**/ +/**/ var EE = (__nccwpck_require__(2361).EventEmitter); - var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ - - var Stream = __nccwpck_require__(2387); /**/ - var Buffer = (__nccwpck_require__(4300).Buffer); - -var OurUint8Array = global.Uint8Array || function () {}; - +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } - function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -/**/ - +/**/ var debugUtil = __nccwpck_require__(3837); - var debug; - if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { @@ -88985,60 +92551,57 @@ if (debugUtil && debugUtil.debuglog) { } /**/ - var BufferList = __nccwpck_require__(2746); - var destroyImpl = __nccwpck_require__(7049); - var _require = __nccwpck_require__(9948), - getHighWaterMark = _require.getHighWaterMark; - + getHighWaterMark = _require.getHighWaterMark; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, - ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. - + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; +// Lazy loaded to improve the startup performance. var StringDecoder; var createReadableStreamAsyncIterator; var from; - __nccwpck_require__(4124)(Readable, Stream); - var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - 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 + 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 (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } - function ReadableState(options, stream, isDuplex) { Duplex = Duplex || __nccwpck_require__(1359); - options = options || {}; // Duplex streams are both readable and writable, but share + options = options || {}; + + // 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 Duplex; - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // 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.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); - this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // 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 = null; @@ -89046,61 +92609,66 @@ function ReadableState(options, stream, isDuplex) { this.flowing = null; this.ended = false; this.endEmitted = false; - this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + this.reading = false; + + // 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; - this.sync = true; // whenever we return null, then we set a flag to say + // 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.paused = true; // Should close be emitted on destroy. Defaults to true. + this.paused = true; - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + // Should close be emitted on destroy. Defaults to true. + this.emitClose = options.emitClose !== false; - this.autoDestroy = !!options.autoDestroy; // has it been destroyed + // Should .destroy() be called after 'end' (and potentially 'finish') + this.autoDestroy = !!options.autoDestroy; - this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // has it been destroyed + this.destroyed = 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.defaultEncoding || 'utf8'; - this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s - - this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; - if (options.encoding) { if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } - function Readable(options) { Duplex = Duplex || __nccwpck_require__(1359); - 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 + 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 var isDuplex = this instanceof Duplex; - this._readableState = new ReadableState(options, this, isDuplex); // legacy + this._readableState = new ReadableState(options, this, isDuplex); + // legacy this.readable = true; - if (options) { if (typeof options.read === 'function') this._read = options.read; if (typeof options.destroy === 'function') this._destroy = options.destroy; } - Stream.call(this); } - Object.defineProperty(Readable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -89110,7 +92678,6 @@ Object.defineProperty(Readable.prototype, 'destroyed', { if (this._readableState === undefined) { return false; } - return this._readableState.destroyed; }, set: function set(value) { @@ -89118,69 +92685,60 @@ Object.defineProperty(Readable.prototype, 'destroyed', { // has not been initialized yet if (!this._readableState) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._readableState.destroyed = value; } }); Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; - Readable.prototype._destroy = function (err, cb) { cb(err); -}; // Manually shove something into the read() buffer. +}; + +// 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) { var state = this._readableState; var skipChunkCheck; - if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } - skipChunkCheck = true; } } else { skipChunkCheck = true; } - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; // Unshift should *always* be something directly out of read() - +}; +// Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; - function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { debug('readableAddChunk', chunk); var state = stream._readableState; - if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { errorOrDestroy(stream, er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = _uint8ArrayToBuffer(chunk); } - if (addToFront) { if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { @@ -89189,7 +92747,6 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { 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); @@ -89201,14 +92758,13 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { state.reading = false; maybeReadMore(stream, state); } - } // We can push more data if we are below the highWaterMark. + } + + // 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) { state.awaitDrain = 0; @@ -89219,50 +92775,42 @@ function addChunk(stream, state, chunk, addToFront) { if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } - maybeReadMore(stream, state); } - function chunkInvalid(state, chunk) { var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } - return er; } - Readable.prototype.isPaused = function () { return this._readableState.flowing === false; -}; // backwards compatibility. - +}; +// backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = (__nccwpck_require__(4841)/* .StringDecoder */ .s); var decoder = new StringDecoder(enc); - this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 - - this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + this._readableState.decoder = decoder; + // If setEncoding(null), decoder.encoding equals utf8 + this._readableState.encoding = this._readableState.decoder.encoding; + // Iterate over current buffer to convert already stored Buffers: var p = this._readableState.buffer.head; var content = ''; - while (p !== null) { content += decoder.write(p.data); p = p.next; } - this._readableState.buffer.clear(); - if (content !== '') this._readableState.buffer.push(content); this._readableState.length = content.length; return this; -}; // Don't raise the hwm > 1GB - +}; +// Don't raise the hwm > 1GB var MAX_HWM = 0x40000000; - function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. @@ -89278,55 +92826,54 @@ function computeNewHighWaterMark(n) { n |= n >>> 16; n++; } - return n; -} // This function is designed to be inlinable, so please take care when making -// changes to the function body. - +} +// 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 (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } // If we're asking for more than the current hwm, then raise the hwm. - - + } + // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; // Don't have enough - + if (n <= state.length) return n; + // Don't have enough if (!state.ended) { state.needReadable = true; return 0; } - return state.length; -} // you can override either this method, or the async _read(n) below. - +} +// you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; - if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + 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); - n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. - + // 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 + } + + // 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 @@ -89347,40 +92894,37 @@ Readable.prototype.read = function (n) { // '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. - + // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; - debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + 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, and if we're already - // reading, then it's unnecessary. - + } + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', 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 - + 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 this._read(state.highWaterMark); - - state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + 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); } - var ret; if (n > 0) ret = fromList(n, state);else ret = null; - if (ret === null) { state.needReadable = state.length <= state.highWaterMark; n = 0; @@ -89388,34 +92932,28 @@ Readable.prototype.read = function (n) { state.length -= n; state.awaitDrain = 0; } - 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 (!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) this.emit('data', ret); return ret; }; - function onEofChunk(stream, state) { debug('onEofChunk'); if (state.ended) return; - if (state.decoder) { var 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() @@ -89424,61 +92962,56 @@ function onEofChunk(stream, state) { } else { // emit 'readable' now to make sure it gets picked up. state.needReadable = false; - if (!state.emittedReadable) { state.emittedReadable = true; emitReadable_(stream); } } -} // Don't emit readable right away in sync mode, because this can trigger +} + +// 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) { var 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) { var state = stream._readableState; debug('emitReadable_', state.destroyed, state.length, state.ended); - if (!state.destroyed && (state.length || state.ended)) { stream.emit('readable'); state.emittedReadable = false; - } // The stream needs another readable event if + } + + // 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, +} + +// 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.readingMore = true; process.nextTick(maybeReadMore_, stream, state); } } - function maybeReadMore_(stream, state) { // Attempt to read more data if we should. // @@ -89507,49 +93040,42 @@ function maybeReadMore_(stream, state) { var len = state.length; debug('maybeReadMore read 0'); stream.read(0); - if (len === state.length) // didn't get any data, stop spinning. + if (len === state.length) + // didn't get any data, stop spinning. break; } - state.readingMore = false; -} // abstract method. to be overridden in specific implementation classes. +} + +// 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) { errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; - Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; - switch (state.pipesCount) { case 0: state.pipes = dest; break; - case 1: state.pipes = [state.pipes, dest]; break; - default: state.pipes.push(dest); break; } - state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var 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; @@ -89557,23 +93083,21 @@ Readable.prototype.pipe = function (dest, pipeOpts) { } } } - function onend() { debug('onend'); dest.end(); - } // when the dest drains, it reduces the awaitDrain counter + } + + // 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. - - var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; - function cleanup() { - debug('cleanup'); // cleanup event handlers once the pipe is broken - + debug('cleanup'); + // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); @@ -89582,22 +93106,20 @@ Readable.prototype.pipe = function (dest, pipeOpts) { 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 + 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } - src.on('data', ondata); - function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); debug('dest.write', ret); - if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write @@ -89607,87 +93129,84 @@ Readable.prototype.pipe = function (dest, pipeOpts) { debug('false write response, pause', state.awaitDrain); state.awaitDrain++; } - src.pause(); } - } // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - + } + // 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 (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, 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. + // 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. + // tell the dest that it's being piped to + dest.emit('pipe', src); + // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } - return dest; }; - function pipeOnDrain(src) { return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } - Readable.prototype.unpipe = function (dest) { var state = this._readableState; var unpipeInfo = { hasUnpiped: false - }; // if we're not piping anywhere, then do nothing. + }; - if (state.pipesCount === 0) return this; // just one destination. most common case. + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; - if (!dest) dest = state.pipes; // got a match. + if (!dest) dest = state.pipes; + // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; - } // slow case. multiple pipe destinations. + } + // slow case. multiple pipe destinations. if (!dest) { // remove all. @@ -89696,17 +93215,13 @@ Readable.prototype.unpipe = function (dest) { state.pipes = null; state.pipesCount = 0; state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, { - hasUnpiped: false - }); - } - + for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, { + hasUnpiped: false + }); return this; - } // try to find the right one. - + } + // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; state.pipes.splice(index, 1); @@ -89714,19 +93229,19 @@ Readable.prototype.unpipe = function (dest) { if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this, unpipeInfo); return this; -}; // set up data events if they are asked for -// Ensure readable listeners eventually get something - +}; +// set up data events if they are asked for +// Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); var 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 + 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) { @@ -89734,7 +93249,6 @@ Readable.prototype.on = function (ev, fn) { state.flowing = false; state.emittedReadable = false; debug('on readable', state.length, state.reading); - if (state.length) { emitReadable(this); } else if (!state.reading) { @@ -89742,15 +93256,11 @@ Readable.prototype.on = function (ev, fn) { } } } - return res; }; - Readable.prototype.addListener = Readable.prototype.on; - Readable.prototype.removeListener = function (ev, fn) { var 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 @@ -89760,13 +93270,10 @@ Readable.prototype.removeListener = function (ev, fn) { // effect. process.nextTick(updateReadableListening, this); } - return res; }; - Readable.prototype.removeAllListeners = function (ev) { var 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 @@ -89776,121 +93283,103 @@ Readable.prototype.removeAllListeners = function (ev) { // effect. process.nextTick(updateReadableListening, this); } - return res; }; - function updateReadableListening(self) { var state = self._readableState; state.readableListening = self.listenerCount('readable') > 0; - if (state.resumeScheduled && !state.paused) { // 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 + state.flowing = true; + + // crude way to check if we should resume } else if (self.listenerCount('data') > 0) { self.resume(); } } - 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. - +} +// 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 () { var state = this._readableState; - if (!state.flowing) { - debug('resume'); // we flow only if there is no one listening + 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.paused = 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.paused = true; return this; }; - function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); + while (state.flowing && stream.read() !== null); +} - while (state.flowing && stream.read() !== null) { - ; - } -} // wrap an old-style stream as the async data source. +// 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) { var _this = this; - var state = this._readableState; var paused = false; stream.on('end', function () { debug('wrapped end'); - if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); } - _this.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + if (state.decoder) chunk = state.decoder.write(chunk); + // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - var ret = _this.push(chunk); - if (!ret) { paused = true; stream.pause(); } - }); // proxy all the other methods. - // important when wrapping filters and duplexes. + }); + // proxy all the other methods. + // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function methodWrap(method) { @@ -89899,37 +93388,32 @@ Readable.prototype.wrap = function (stream) { }; }(i); } - } // proxy certain important events. - + } + // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } // when we try to consume some more bytes, simply unpause the - // underlying stream. - + } + // when we try to consume some more bytes, simply unpause the + // underlying stream. this._read = function (n) { debug('wrapped _read', n); - if (paused) { paused = false; stream.resume(); } }; - return this; }; - if (typeof Symbol === 'function') { Readable.prototype[Symbol.asyncIterator] = function () { if (createReadableStreamAsyncIterator === undefined) { createReadableStreamAsyncIterator = __nccwpck_require__(3306); } - return createReadableStreamAsyncIterator(this); }; } - Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -89961,8 +93445,9 @@ Object.defineProperty(Readable.prototype, 'readableFlowing', { this._readableState.flowing = state; } } -}); // exposed for testing purposes only. +}); +// exposed for testing purposes only. Readable._fromList = fromList; Object.defineProperty(Readable.prototype, 'readableLength', { // making it explicit this property is not enumerable @@ -89972,11 +93457,12 @@ Object.defineProperty(Readable.prototype, 'readableLength', { get: function get() { return this._readableState.length; } -}); // Pluck off n bytes from an array of buffers. +}); + +// 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; @@ -89991,52 +93477,44 @@ function fromList(n, state) { } return ret; } - function endReadable(stream) { var 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. + debug('endReadableNT', state.endEmitted, state.length); + // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); - if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the writable side is ready for autoDestroy as well var wState = stream._writableState; - if (!wState || wState.autoDestroy && wState.finished) { stream.destroy(); } } } } - if (typeof Symbol === 'function') { Readable.from = function (iterable, opts) { if (from === undefined) { from = __nccwpck_require__(9082); } - return from(Readable, iterable, opts); }; } - function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } - return -1; } @@ -90066,6 +93544,7 @@ function indexOf(xs, x) { // 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 transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -90109,40 +93588,34 @@ function indexOf(xs, x) { // the results of the previous transformed chunk were consumed. -module.exports = Transform; +module.exports = Transform; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, - ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, - ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; - + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; var Duplex = __nccwpck_require__(1359); - __nccwpck_require__(4124)(Transform, Duplex); - function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; var cb = ts.writecb; - if (cb === null) { return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } - ts.writechunk = null; ts.writecb = null; - if (data != null) // single equals check for both `null` and `undefined` + if (data != null) + // single equals check for both `null` and `undefined` this.push(data); cb(er); var rs = this._readableState; rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } } - function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); @@ -90153,26 +93626,25 @@ function Transform(options) { writecb: null, writechunk: null, writeencoding: null - }; // start out asking for a readable event once data is transformed. + }; - this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // 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; - 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. - + } + // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } - function prefinish() { var _this = this; - if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); @@ -90181,11 +93653,12 @@ function prefinish() { done(this, null, null); } } - Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); -}; // This is the part where you do stuff! +}; + +// This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // @@ -90195,33 +93668,27 @@ Transform.prototype.push = function (chunk, encoding) { // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. - - Transform.prototype._transform = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; - Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; - if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } -}; // Doesn't matter what the args are here. +}; + +// Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. - - Transform.prototype._read = function (n) { var ts = this._transformState; - if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in @@ -90229,20 +93696,20 @@ Transform.prototype._read = function (n) { ts.needTransform = true; } }; - Transform.prototype._destroy = function (err, cb) { Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); }); }; - function done(stream, er, data) { if (er) return stream.emit('error', er); - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + if (data != null) + // single equals check for both `null` and `undefined` + stream.push(data); + + // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided - if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); @@ -90274,29 +93741,29 @@ function done(stream, er, data) { // 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. + module.exports = Writable; -/* */ +/* */ function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; -} // It seems a linked list but it is not -// there will be only 2 of these for each stream - +} +// It seems a linked list but it is not +// there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; - this.next = null; this.entry = null; - this.finish = function () { onCorkedFinish(_this, state); }; @@ -90304,155 +93771,159 @@ function CorkedRequest(state) { /* */ /**/ - - var Duplex; /**/ Writable.WritableState = WritableState; -/**/ +/**/ var internalUtil = { deprecate: __nccwpck_require__(7127) }; /**/ /**/ - var Stream = __nccwpck_require__(2387); /**/ - var Buffer = (__nccwpck_require__(4300).Buffer); - -var OurUint8Array = global.Uint8Array || function () {}; - +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } - function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - var destroyImpl = __nccwpck_require__(7049); - var _require = __nccwpck_require__(9948), - getHighWaterMark = _require.getHighWaterMark; - + getHighWaterMark = _require.getHighWaterMark; var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, - ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, - ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, - ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, - ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, - ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, - ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; - + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; var errorOrDestroy = destroyImpl.errorOrDestroy; - __nccwpck_require__(4124)(Writable, Stream); - function nop() {} - function WritableState(options, stream, isDuplex) { Duplex = Duplex || __nccwpck_require__(1359); - options = options || {}; // Duplex streams are both readable and writable, but share + options = options || {}; + + // 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 Duplex; - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // object stream flag to indicate whether or not this stream // contains buffers or objects. - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + if (isDuplex) this.objectMode = this.objectMode || !!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 = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); - this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called - - this.finalCalled = false; // drain event flag. + // if _final has been called + this.finalCalled = false; - 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 + // 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; - this.finished = false; // has it been destroyed + // has it been destroyed + this.destroyed = false; - this.destroyed = false; // should we decode strings into buffers before passing to _write? + // 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. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + 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.defaultEncoding || 'utf8'; - this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // 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; - this.length = 0; // a flag to see when we're in the middle of a write. + // a flag to see when we're in the middle of a write. + this.writing = false; - this.writing = false; // when true all writes will be buffered until .uncork() call + // when true all writes will be buffered until .uncork() call + this.corked = 0; - this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // 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; - this.sync = true; // a flag to know if we're processing previously buffered items, which + // 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; - this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - + // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); - }; // the callback that the user supplies to write(chunk,encoding,cb) - + }; - this.writecb = null; // the amount that is being written when _write is called. + // 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; this.bufferedRequest = null; - this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; - this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams + this.prefinished = false; - this.prefinished = false; // True if the error was already emitted and should not be thrown again + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; - this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + // Should close be emitted on destroy. Defaults to true. + this.emitClose = options.emitClose !== false; - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + // Should .destroy() be called after 'finish' (and potentially 'end') + this.autoDestroy = !!options.autoDestroy; - this.autoDestroy = !!options.autoDestroy; // count buffered requests + // count buffered requests + this.bufferedRequestCount = 0; - this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); } - WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; - while (current) { out.push(current); current = current.next; } - return out; }; - (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { @@ -90461,12 +93932,11 @@ WritableState.prototype.getBuffer = function getBuffer() { }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} -})(); // Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. - +})(); +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. var realHasInstance; - if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { @@ -90481,81 +93951,73 @@ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.protot return object instanceof this; }; } - function Writable(options) { - Duplex = Duplex || __nccwpck_require__(1359); // Writable ctor is applied to Duplexes, too. + Duplex = Duplex || __nccwpck_require__(1359); + + // 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 - var isDuplex = this instanceof Duplex; if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); - this._writableState = new WritableState(options, this, isDuplex); // legacy. + this._writableState = new WritableState(options, this, isDuplex); + // legacy. this.writable = true; - 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; } - Stream.call(this); -} // Otherwise people can pipe Writable streams, which is just wrong. - +} +// Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); }; - function writeAfterEnd(stream, cb) { - var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb - + var er = new ERR_STREAM_WRITE_AFTER_END(); + // TODO: defer error events consistently everywhere, not just the cb errorOrDestroy(stream, er); process.nextTick(cb, er); -} // Checks that a user-supplied chunk is valid, especially for the particular +} + +// Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. - - function validChunk(stream, state, chunk, cb) { var er; - if (chunk === null) { er = new ERR_STREAM_NULL_VALUES(); } else if (typeof chunk !== 'string' && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } - if (er) { errorOrDestroy(stream, er); process.nextTick(cb, er); return false; } - return true; } - Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - if (isBuf && !Buffer.isBuffer(chunk)) { chunk = _uint8ArrayToBuffer(chunk); } - if (typeof encoding === 'function') { cb = encoding; encoding = null; } - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { @@ -90564,20 +94026,16 @@ Writable.prototype.write = function (chunk, encoding, cb) { } return ret; }; - Writable.prototype.cork = function () { this._writableState.corked++; }; - Writable.prototype.uncork = function () { var state = this._writableState; - if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; - Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); @@ -90585,7 +94043,6 @@ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { this._writableState.defaultEncoding = encoding; return this; }; - Object.defineProperty(Writable.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90595,15 +94052,12 @@ Object.defineProperty(Writable.prototype, 'writableBuffer', { return this._writableState && this._writableState.getBuffer(); } }); - function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } - return chunk; } - Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90612,27 +94066,25 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { get: function get() { return this._writableState.highWaterMark; } -}); // if we're already writing something, then just put 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, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } - var len = state.objectMode ? 1 : chunk.length; state.length += len; - var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - + var 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) { var last = state.lastBufferedRequest; state.lastBufferedRequest = { @@ -90642,21 +94094,17 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { callback: cb, next: null }; - if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } - state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } - return ret; } - function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; @@ -90665,16 +94113,14 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) { 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, sync, er, cb) { --state.pendingcb; - if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - process.nextTick(cb, er); // this can emit finish, and it will always happen + process.nextTick(cb, er); + // this can emit finish, and it will always happen // after error - process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); @@ -90683,20 +94129,18 @@ function onwriteError(stream, state, sync, er, cb) { // it is async cb(er); stream._writableState.errorEmitted = true; - errorOrDestroy(stream, er); // this can emit finish, but finish must + errorOrDestroy(stream, er); + // this can emit finish, but finish must // always follow error - finishMaybe(stream, state); } } - function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } - function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; @@ -90706,11 +94150,9 @@ function onwrite(stream, er) { if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state) || stream.destroyed; - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } - if (sync) { process.nextTick(afterWrite, stream, state, finished, cb); } else { @@ -90718,29 +94160,27 @@ function onwrite(stream, er) { } } } - function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); -} // Must force callback to be called on nextTick, so that we don't +} + +// Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. - - function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } -} // if there's something in the buffer waiting, then process it - +} +// if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; - if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; @@ -90749,28 +94189,25 @@ function clearBuffer(stream, state) { holder.entry = entry; var count = 0; var allBuffers = true; - while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } - buffer.allBuffers = allBuffers; - doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; - if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } - state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one @@ -90781,32 +94218,26 @@ function clearBuffer(stream, state) { var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; - state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. - if (state.writing) { break; } } - if (entry === null) state.lastBufferedRequest = null; } - state.bufferedRequest = entry; state.bufferProcessing = false; } - Writable.prototype._write = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; - Writable.prototype._writev = null; - Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; - if (typeof chunk === 'function') { cb = chunk; chunk = null; @@ -90815,19 +94246,18 @@ Writable.prototype.end = function (chunk, encoding, cb) { cb = encoding; encoding = null; } + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - + // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); - } // ignore unnecessary end() calls. - + } + // ignore unnecessary end() calls. if (!state.ending) endWritable(this, state, cb); return this; }; - Object.defineProperty(Writable.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90837,25 +94267,20 @@ Object.defineProperty(Writable.prototype, 'writableLength', { return this._writableState.length; } }); - function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } - function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; - if (err) { errorOrDestroy(stream, err); } - state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } - function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { if (typeof stream._final === 'function' && !state.destroyed) { @@ -90868,59 +94293,47 @@ function prefinish(stream, state) { } } } - function finishMaybe(stream, state) { var need = needFinish(state); - if (need) { prefinish(stream, state); - if (state.pendingcb === 0) { state.finished = true; 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 var rState = stream._readableState; - if (!rState || rState.autoDestroy && rState.endEmitted) { stream.destroy(); } } } } - return need; } - function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); - if (cb) { if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } - state.ended = true; stream.writable = false; } - function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; - while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; - } // reuse the free corkReq. - + } + // reuse the free corkReq. state.corkedRequestsFree.next = corkReq; } - Object.defineProperty(Writable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in @@ -90930,7 +94343,6 @@ Object.defineProperty(Writable.prototype, 'destroyed', { if (this._writableState === undefined) { return false; } - return this._writableState.destroyed; }, set: function set(value) { @@ -90938,16 +94350,15 @@ Object.defineProperty(Writable.prototype, 'destroyed', { // has not been initialized yet if (!this._writableState) { return; - } // backward compatibility, the user is explicitly - // managing destroyed - + } + // backward compatibility, the user is explicitly + // managing destroyed this._writableState.destroyed = value; } }); Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; - Writable.prototype._destroy = function (err, cb) { cb(err); }; @@ -90961,11 +94372,10 @@ Writable.prototype._destroy = function (err, cb) { var _Object$setPrototypeO; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var finished = __nccwpck_require__(6080); - var kLastResolve = Symbol('lastResolve'); var kLastReject = Symbol('lastReject'); var kError = Symbol('error'); @@ -90973,22 +94383,19 @@ var kEnded = Symbol('ended'); var kLastPromise = Symbol('lastPromise'); var kHandlePromise = Symbol('handlePromise'); var kStream = Symbol('stream'); - function createIterResult(value, done) { return { value: value, done: done }; } - function readAndResolve(iter) { var resolve = iter[kLastResolve]; - if (resolve !== null) { - var data = iter[kStream].read(); // we defer if data is null + var data = iter[kStream].read(); + // we defer if data is null // we can be expecting either 'end' or // 'error' - if (data !== null) { iter[kLastPromise] = null; iter[kLastResolve] = null; @@ -90997,13 +94404,11 @@ function readAndResolve(iter) { } } } - function onReadable(iter) { // we wait for the next tick, because it might // emit an error with process.nextTick process.nextTick(readAndResolve, iter); } - function wrapForNext(lastPromise, iter) { return function (resolve, reject) { lastPromise.then(function () { @@ -91011,33 +94416,26 @@ function wrapForNext(lastPromise, iter) { resolve(createIterResult(undefined, true)); return; } - iter[kHandlePromise](resolve, reject); }, reject); }; } - var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { get stream() { return this[kStream]; }, - next: function next() { var _this = this; - // if we have detected an error in the meanwhile // reject straight away var error = this[kError]; - if (error !== null) { return Promise.reject(error); } - if (this[kEnded]) { return Promise.resolve(createIterResult(undefined, true)); } - if (this[kStream].destroyed) { // We need to defer via nextTick because if .destroy(err) is // called, the error will be emitted via nextTick, and @@ -91052,29 +94450,25 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro } }); }); - } // if we have multiple next() calls + } + + // if we have multiple next() calls // we will wait for the previous Promise to finish // this logic is optimized to support for await loops, // where next() is only called once at a time - - var lastPromise = this[kLastPromise]; var promise; - if (lastPromise) { promise = new Promise(wrapForNext(lastPromise, this)); } else { // fast path needed to support multiple this.push() // without triggering the next() queue var data = this[kStream].read(); - if (data !== null) { return Promise.resolve(createIterResult(data, false)); } - promise = new Promise(this[kHandlePromise]); } - this[kLastPromise] = promise; return promise; } @@ -91082,7 +94476,6 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro return this; }), _defineProperty(_Object$setPrototypeO, "return", function _return() { var _this2 = this; - // destroy(err, cb) is a private API // we can guarantee we have that here, because we control the // Readable class this is attached to @@ -91092,15 +94485,12 @@ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPro reject(err); return; } - resolve(createIterResult(undefined, true)); }); }); }), _Object$setPrototypeO), AsyncIteratorPrototype); - var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { var _Object$create; - var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { value: stream, writable: true @@ -91119,7 +94509,6 @@ var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterat }), _defineProperty(_Object$create, kHandlePromise, { value: function value(resolve, reject) { var data = iterator[kStream].read(); - if (data) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; @@ -91135,35 +94524,30 @@ var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterat iterator[kLastPromise] = null; finished(stream, function (err) { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { - var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + var reject = iterator[kLastReject]; + // reject if we are waiting for data in the Promise // returned by next() and store the error - if (reject !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; reject(err); } - iterator[kError] = err; return; } - var resolve = iterator[kLastResolve]; - if (resolve !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(undefined, true)); } - iterator[kEnded] = true; }); stream.on('readable', onReadable.bind(null, iterator)); return iterator; }; - module.exports = createReadableStreamAsyncIterator; /***/ }), @@ -91174,41 +94558,29 @@ module.exports = createReadableStreamAsyncIterator; "use strict"; -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var _require = __nccwpck_require__(4300), - Buffer = _require.Buffer; - + Buffer = _require.Buffer; var _require2 = __nccwpck_require__(3837), - inspect = _require2.inspect; - + inspect = _require2.inspect; var custom = inspect && inspect.custom || 'inspect'; - function copyBuffer(src, target, offset) { Buffer.prototype.copy.call(src, target, offset); } - -module.exports = -/*#__PURE__*/ -function () { +module.exports = /*#__PURE__*/function () { function BufferList() { _classCallCheck(this, BufferList); - this.head = null; this.tail = null; this.length = 0; } - _createClass(BufferList, [{ key: "push", value: function push(v) { @@ -91252,11 +94624,7 @@ function () { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; - - while (p = p.next) { - ret += s + p.data; - } - + while (p = p.next) ret += s + p.data; return ret; } }, { @@ -91266,21 +94634,19 @@ function () { var ret = Buffer.allocUnsafe(n >>> 0); var p = this.head; var i = 0; - while (p) { copyBuffer(p.data, ret, i); i += p.data.length; p = p.next; } - return ret; - } // Consumes a specified amount of bytes or characters from the buffered data. + } + // Consumes a specified amount of bytes or characters from the buffered data. }, { key: "consume", value: function consume(n, hasStrings) { var ret; - if (n < this.head.data.length) { // `slice` is the same for buffers and strings. ret = this.head.data.slice(0, n); @@ -91292,15 +94658,15 @@ function () { // Result spans more than one buffer. ret = hasStrings ? this._getString(n) : this._getBuffer(n); } - return ret; } }, { key: "first", value: function first() { return this.head.data; - } // Consumes a specified amount of characters from the buffered data. + } + // Consumes a specified amount of characters from the buffered data. }, { key: "_getString", value: function _getString(n) { @@ -91308,13 +94674,11 @@ function () { var c = 1; var ret = p.data; n -= ret.length; - while (p = p.next) { var str = p.data; var nb = n > str.length ? str.length : n; if (nb === str.length) ret += str;else ret += str.slice(0, n); n -= nb; - if (n === 0) { if (nb === str.length) { ++c; @@ -91323,17 +94687,15 @@ function () { this.head = p; p.data = str.slice(nb); } - break; } - ++c; } - this.length -= c; return ret; - } // Consumes a specified amount of bytes from the buffered data. + } + // Consumes a specified amount of bytes from the buffered data. }, { key: "_getBuffer", value: function _getBuffer(n) { @@ -91342,13 +94704,11 @@ function () { var c = 1; p.data.copy(ret); n -= p.data.length; - while (p = p.next) { var buf = p.data; var nb = n > buf.length ? buf.length : n; buf.copy(ret, ret.length - n, 0, nb); n -= nb; - if (n === 0) { if (nb === buf.length) { ++c; @@ -91357,21 +94717,19 @@ function () { this.head = p; p.data = buf.slice(nb); } - break; } - ++c; } - this.length -= c; return ret; - } // Make sure the linked list only shows the minimal necessary information. + } + // Make sure the linked list only shows the minimal necessary information. }, { key: custom, value: function value(_, options) { - return inspect(this, _objectSpread({}, options, { + return inspect(this, _objectSpread(_objectSpread({}, options), {}, { // Only inspect one level. depth: 0, // It should not recurse. @@ -91379,7 +94737,6 @@ function () { })); } }]); - return BufferList; }(); @@ -91389,14 +94746,13 @@ function () { /***/ ((module) => { "use strict"; - // undocumented cb() API, needed for core, not for public API + +// undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; - var readableDestroyed = this._readableState && this._readableState.destroyed; var writableDestroyed = this._writableState && this._writableState.destroyed; - if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); @@ -91408,21 +94764,20 @@ function destroy(err, cb) { process.nextTick(emitErrorNT, this, err); } } - 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 + } + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks if (this._readableState) { this._readableState.destroyed = true; - } // if this is a duplex stream mark the writable part as destroyed as well - + } + // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } - this._destroy(err || null, function (err) { if (!cb && err) { if (!_this._writableState) { @@ -91440,21 +94795,17 @@ function destroy(err, cb) { process.nextTick(emitCloseNT, _this); } }); - return this; } - function emitErrorAndCloseNT(self, err) { emitErrorNT(self, err); emitCloseNT(self); } - function emitCloseNT(self) { if (self._writableState && !self._writableState.emitClose) return; if (self._readableState && !self._readableState.emitClose) return; self.emit('close'); } - function undestroy() { if (this._readableState) { this._readableState.destroyed = false; @@ -91462,7 +94813,6 @@ function undestroy() { this._readableState.ended = false; this._readableState.endEmitted = false; } - if (this._writableState) { this._writableState.destroyed = false; this._writableState.ended = false; @@ -91473,22 +94823,20 @@ function undestroy() { this._writableState.errorEmitted = false; } } - function emitErrorNT(self, err) { self.emit('error', err); } - function errorOrDestroy(stream, err) { // 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. + var rState = stream._readableState; var wState = stream._writableState; if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); } - module.exports = { destroy: destroy, undestroy: undestroy, @@ -91505,77 +94853,61 @@ module.exports = { // permission from the author, Mathias Buus (@mafintosh). -var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(7214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); +var ERR_STREAM_PREMATURE_CLOSE = (__nccwpck_require__(7214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE); function once(callback) { var called = false; return function () { if (called) return; called = true; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - callback.apply(this, args); }; } - function noop() {} - function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } - function eos(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var readable = opts.readable || opts.readable !== false && stream.readable; var writable = opts.writable || opts.writable !== false && stream.writable; - var onlegacyfinish = function onlegacyfinish() { if (!stream.writable) onfinish(); }; - var writableEnded = stream._writableState && stream._writableState.finished; - var onfinish = function onfinish() { writable = false; writableEnded = true; if (!readable) callback.call(stream); }; - var readableEnded = stream._readableState && stream._readableState.endEmitted; - var onend = function onend() { readable = false; readableEnded = true; if (!writable) callback.call(stream); }; - var onerror = function onerror(err) { callback.call(stream, err); }; - var onclose = function onclose() { var err; - if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } - if (writable && !writableEnded) { if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } }; - var onrequest = function onrequest() { stream.req.on('finish', onfinish); }; - if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); @@ -91585,7 +94917,6 @@ function eos(stream, opts, callback) { stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } - stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', onerror); @@ -91603,7 +94934,6 @@ function eos(stream, opts, callback) { stream.removeListener('close', onclose); }; } - module.exports = eos; /***/ }), @@ -91615,52 +94945,42 @@ module.exports = eos; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var ERR_INVALID_ARG_TYPE = (__nccwpck_require__(7214)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE); - function from(Readable, iterable, opts) { var iterator; - if (iterable && typeof iterable.next === 'function') { iterator = iterable; } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); - var readable = new Readable(_objectSpread({ objectMode: true - }, opts)); // Reading boolean to protect against _read + }, opts)); + // Reading boolean to protect against _read // being called before last iteration completion. - var reading = false; - readable._read = function () { if (!reading) { reading = true; next(); } }; - function next() { return _next2.apply(this, arguments); } - function _next2() { _next2 = _asyncToGenerator(function* () { try { - var _ref = yield iterator.next(), - value = _ref.value, - done = _ref.done; - + var _yield$iterator$next = yield iterator.next(), + value = _yield$iterator$next.value, + done = _yield$iterator$next.done; if (done) { readable.push(null); - } else if (readable.push((yield value))) { + } else if (readable.push(yield value)) { next(); } else { reading = false; @@ -91671,12 +94991,11 @@ function from(Readable, iterable, opts) { }); return _next2.apply(this, arguments); } - return readable; } - module.exports = from; + /***/ }), /***/ 6989: @@ -91687,8 +95006,8 @@ module.exports = from; // permission from the author, Mathias Buus (@mafintosh). -var eos; +var eos; function once(callback) { var called = false; return function () { @@ -91697,20 +95016,16 @@ function once(callback) { callback.apply(void 0, arguments); }; } - var _require$codes = (__nccwpck_require__(7214)/* .codes */ .q), - ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, - ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; - + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; function noop(err) { // Rethrow the error if it exists to avoid swallowing it if (err) throw err; } - function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } - function destroyer(stream, reading, writing, callback) { callback = once(callback); var closed = false; @@ -91730,40 +95045,34 @@ function destroyer(stream, reading, writing, callback) { return function (err) { if (closed) return; if (destroyed) return; - destroyed = true; // request.destroy just do .end - .abort is what we want + destroyed = true; + // request.destroy just do .end - .abort is what we want if (isRequest(stream)) return stream.abort(); if (typeof stream.destroy === 'function') return stream.destroy(); callback(err || new ERR_STREAM_DESTROYED('pipe')); }; } - function call(fn) { fn(); } - function pipe(from, to) { return from.pipe(to); } - function popCallback(streams) { if (!streams.length) return noop; if (typeof streams[streams.length - 1] !== 'function') return noop; return streams.pop(); } - function pipeline() { for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { streams[_key] = arguments[_key]; } - var callback = popCallback(streams); if (Array.isArray(streams[0])) streams = streams[0]; - if (streams.length < 2) { throw new ERR_MISSING_ARGS('streams'); } - var error; var destroys = streams.map(function (stream, i) { var reading = i < streams.length - 1; @@ -91778,7 +95087,6 @@ function pipeline() { }); return streams.reduce(pipe); } - module.exports = pipeline; /***/ }), @@ -91790,27 +95098,22 @@ module.exports = pipeline; var ERR_INVALID_OPT_VALUE = (__nccwpck_require__(7214)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE); - function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; } - function getHighWaterMark(state, options, duplexKey, isDuplex) { var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); - if (hwm != null) { if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { var name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } - return Math.floor(hwm); - } // Default value - + } + // Default value return state.objectMode ? 16 : 16 * 1024; } - module.exports = { getHighWaterMark: getHighWaterMark }; @@ -104178,7 +107481,7 @@ var State; State["SecretKey"] = "secret-key"; State["SessionToken"] = "session-token"; State["LocalHit"] = "local-hit"; -})(State || (exports.State = State = {})); +})(State = exports.State || (exports.State = {})); /***/ }), @@ -104534,6 +107837,14 @@ module.exports = require("zlib"); /***/ 3765: /***/ ((module) => { +"use strict"; +module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana"},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana"},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana"},"image/avcs":{"source":"iana"},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}'); + +/***/ }), + +/***/ 2639: +/***/ ((module) => { + "use strict"; module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hl7cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/step":{"source":"iana"},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}'); diff --git a/src/restore.ts b/src/restore.ts index 3791cb7..763fda8 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -27,6 +27,7 @@ async function restoreCache() { const paths = getInputAsArray("path"); const restoreKeys = getInputAsArray("restore-keys"); const local = core.getInput("local"); + const errorOnS3Exception = getInputAsBoolean("error-on-s3-exception"); try { const compressionMethod = await utils.getCompressionMethod(); @@ -43,18 +44,18 @@ async function restoreCache() { core.saveState(State.SessionToken, core.getInput("sessionToken")); if (local) { - core.info('Local cache is enabled') + core.info("Local cache is enabled"); - const localKey = path.join(local, key, cacheFileName) + const localKey = path.join(local, key, cacheFileName); core.info(`Looking for exact match: ${localKey}`); if (fs.existsSync(localKey)) { - core.info('Local cache HIT! ✅') - await fs.copy(localKey, archivePath) - core.info('Local cache copied!') - - core.info('Extracting cache file...') + core.info("Local cache HIT! ✅"); + await fs.copy(localKey, archivePath); + core.info("Local cache copied!"); + + core.info("Extracting cache file..."); await extractTar(archivePath, compressionMethod); saveMatchedKey(key); @@ -62,10 +63,10 @@ async function restoreCache() { setCacheHitLocal(true); core.info("Cache restored from local successfully"); - return + return; } else { setCacheHitLocal(false); - core.info('Local cache MISS! ❌') + core.info("Local cache MISS! ❌"); } } @@ -98,8 +99,12 @@ async function restoreCache() { setCacheHitOutput(matchingKey === key); core.info("Cache restored from s3 successfully"); } catch (e: any) { - core.info("Restore s3 cache failed: " + e.message); setCacheHitOutput(false); + if (errorOnS3Exception) { + core.setFailed("Restore s3 cache failed: " + e.message); + } else { + core.info("Restore s3 cache failed: " + e.message); + } if (useFallback) { if (isGhes()) { core.warning("Cache fallback is not supported on Github Enterpise.");