Skip to content

Instantly share code, notes, and snippets.

@maxhoffmann
Last active May 26, 2016 16:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxhoffmann/6cbb9322be8891d5cb04845bb375f671 to your computer and use it in GitHub Desktop.
Save maxhoffmann/6cbb9322be8891d5cb04845bb375f671 to your computer and use it in GitHub Desktop.
requirebin sketch
const most = require('most');
const stream = most.just(Array(170000));
const dest = [];
stream.forEach(bigArray =>
dest.push.apply(dest, bigArray)
);
console.log(dest);
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canMutationObserver = typeof window !== 'undefined'
&& window.MutationObserver;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
var queue = [];
if (canMutationObserver) {
var hiddenDiv = document.createElement("div");
var observer = new MutationObserver(function () {
var queueList = queue.slice();
queue.length = 0;
queueList.forEach(function (fn) {
fn();
});
});
observer.observe(hiddenDiv, { attributes: true });
return function nextTick(fn) {
if (!queue.length) {
hiddenDiv.setAttribute('yes', 'no');
}
queue.push(fn);
};
}
if (canPost) {
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
},{}],2:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = LinkedList;
/**
* Doubly linked list
* @constructor
*/
function LinkedList() {
this.head = null;
this.length = 0;
}
/**
* Add a node to the end of the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add
*/
LinkedList.prototype.add = function(x) {
if(this.head !== null) {
this.head.prev = x;
x.next = this.head;
}
this.head = x;
++this.length;
};
/**
* Remove the provided node from the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove
*/
LinkedList.prototype.remove = function(x) {
--this.length;
if(x === this.head) {
this.head = this.head.next;
}
if(x.next !== null) {
x.next.prev = x.prev;
x.next = null;
}
if(x.prev !== null) {
x.prev.next = x.next;
x.prev = null;
}
};
/**
* @returns {boolean} true iff there are no nodes in the list
*/
LinkedList.prototype.isEmpty = function() {
return this.length === 0;
};
/**
* Dispose all nodes
* @returns {Promise} promise that fulfills when all nodes have been disposed,
* or rejects if an error occurs while disposing
*/
LinkedList.prototype.dispose = function() {
if(this.isEmpty()) {
return Promise.resolve();
}
var promises = [];
var x = this.head;
this.head = null;
this.length = 0;
while(x !== null) {
promises.push(x.dispose());
x = x.next;
}
return Promise.all(promises);
};
},{}],3:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.isPromise = isPromise;
function isPromise(p) {
return p !== null && typeof p === 'object' && typeof p.then === 'function';
}
},{}],4:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
// Based on https://github.com/petkaantonov/deque
module.exports = Queue;
function Queue(capPow2) {
this._capacity = capPow2||32;
this._length = 0;
this._head = 0;
}
Queue.prototype.push = function (x) {
var len = this._length;
this._checkCapacity(len + 1);
var i = (this._head + len) & (this._capacity - 1);
this[i] = x;
this._length = len + 1;
};
Queue.prototype.shift = function () {
var head = this._head;
var x = this[head];
this[head] = void 0;
this._head = (head + 1) & (this._capacity - 1);
this._length--;
return x;
};
Queue.prototype.isEmpty = function() {
return this._length === 0;
};
Queue.prototype.length = function () {
return this._length;
};
Queue.prototype._checkCapacity = function (size) {
if (this._capacity < size) {
this._ensureCapacity(this._capacity << 1);
}
};
Queue.prototype._ensureCapacity = function (capacity) {
var oldCapacity = this._capacity;
this._capacity = capacity;
var last = this._head + this._length;
if (last > oldCapacity) {
copy(this, 0, this, oldCapacity, last & (oldCapacity - 1));
}
};
function copy(src, srcIndex, dst, dstIndex, len) {
for (var j = 0; j < len; ++j) {
dst[j + dstIndex] = src[j + srcIndex];
src[j + srcIndex] = void 0;
}
}
},{}],5:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Stream;
function Stream(source) {
this.source = source;
}
},{}],6:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var runSource = require('../runSource');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.scan = scan;
exports.reduce = reduce;
/**
* Create a stream containing successive reduce results of applying f to
* the previous reduce result and the current stream item.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @param {Stream} stream stream to scan
* @returns {Stream} new stream containing successive reduce results
*/
function scan(f, initial, stream) {
return new Stream(new Scan(f, initial, stream.source));
}
function Scan(f, z, source) {
this.source = source;
this.f = f;
this.value = z;
}
Scan.prototype.run = function(sink, scheduler) {
var d1 = scheduler.asap(PropagateTask.event(this.value, sink));
var d2 = this.source.run(new ScanSink(this.f, this.value, sink), scheduler);
return dispose.all([d1, d2]);
};
function ScanSink(f, z, sink) {
this.f = f;
this.value = z;
this.sink = sink;
}
ScanSink.prototype.event = function(t, x) {
var f = this.f;
this.value = f(this.value, x);
this.sink.event(t, this.value);
};
ScanSink.prototype.error = Pipe.prototype.error;
ScanSink.prototype.end = Pipe.prototype.end;
/**
* Reduce a stream to produce a single result. Note that reducing an infinite
* stream will return a Promise that never fulfills, but that may reject if an error
* occurs.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @param {Stream} stream to reduce
* @returns {Promise} promise for the file result of the reduce
*/
function reduce(f, initial, stream) {
return runSource.withDefaultScheduler(noop, new Reduce(f, initial, stream.source));
}
function Reduce(f, z, source) {
this.source = source;
this.f = f;
this.value = z;
}
Reduce.prototype.run = function(sink, scheduler) {
return this.source.run(new ReduceSink(this.f, this.value, sink), scheduler);
};
function ReduceSink(f, z, sink) {
this.f = f;
this.value = z;
this.sink = sink;
}
ReduceSink.prototype.event = function(t, x) {
var f = this.f;
this.value = f(this.value, x);
this.sink.event(t, this.value);
};
ReduceSink.prototype.error = Pipe.prototype.error;
ReduceSink.prototype.end = function(t) {
this.sink.end(t, this.value);
};
function noop() {}
},{"../Stream":5,"../disposable/dispose":34,"../runSource":44,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],7:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var combine = require('./combine').combine;
var apply = require('@most/prelude').apply;
exports.ap = ap;
/**
* Assume fs is a stream containing functions, and apply the latest function
* in fs to the latest value in xs.
* fs: --f---------g--------h------>
* xs: -a-------b-------c-------d-->
* ap(fs, xs): --fa-----fb-gb---gc--hc--hd->
* @param {Stream} fs stream of functions to apply to the latest x
* @param {Stream} xs stream of values to which to apply all the latest f
* @returns {Stream} stream containing all the applications of fs to xs
*/
function ap(fs, xs) {
return combine(apply, fs, xs);
}
},{"./combine":9,"@most/prelude":69}],8:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var streamOf = require('../source/core').of;
var continueWith = require('./continueWith').continueWith;
exports.concat = concat;
exports.cycle = cycle;
exports.cons = cons;
/**
* @param {*} x value to prepend
* @param {Stream} stream
* @returns {Stream} new stream with x prepended
*/
function cons(x, stream) {
return concat(streamOf(x), stream);
}
/**
* @param {Stream} left
* @param {Stream} right
* @returns {Stream} new stream containing all events in left followed by all
* events in right. This *timeshifts* right to the end of left.
*/
function concat(left, right) {
return continueWith(function() {
return right;
}, left);
}
/**
* @deprecated
* Tie stream into a circle, creating an infinite stream
* @param {Stream} stream
* @returns {Stream} new infinite stream
*/
function cycle(stream) {
return continueWith(function cycleNext() {
return cycle(stream);
}, stream);
}
},{"../source/core":57,"./continueWith":11}],9:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var transform = require('./transform');
var core = require('../source/core');
var Pipe = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var dispose = require('../disposable/dispose');
var base = require('@most/prelude');
var invoke = require('../invoke');
var map = base.map;
var tail = base.tail;
exports.combineArray = combineArray;
exports.combine = combine;
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
function combine(f /*, ...streams */) {
return combineArray(f, tail(arguments));
}
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @param {[Stream]} streams most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
function combineArray(f, streams) {
var l = streams.length;
return l === 0 ? core.empty()
: l === 1 ? transform.map(f, streams[0])
: new Stream(combineSources(f, streams));
}
function combineSources(f, streams) {
return new Combine(f, map(getSource, streams))
}
function getSource(stream) {
return stream.source;
}
function Combine(f, sources) {
this.f = f;
this.sources = sources;
}
Combine.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l);
var sinks = new Array(l);
var mergeSink = new CombineSink(disposables, sinks, sink, this.f);
for(var indexSink, i=0; i<l; ++i) {
indexSink = sinks[i] = new IndexSink(i, mergeSink);
disposables[i] = this.sources[i].run(indexSink, scheduler);
}
return dispose.all(disposables);
};
function CombineSink(disposables, sinks, sink, f) {
this.sink = sink;
this.disposables = disposables;
this.sinks = sinks;
this.f = f;
var l = sinks.length;
this.awaiting = l;
this.values = new Array(l);
this.hasValue = new Array(l);
for(var i = 0; i < l; ++i) {
this.hasValue[i] = false;
}
this.activeCount = sinks.length;
}
CombineSink.prototype.error = Pipe.prototype.error;
CombineSink.prototype.event = function(t, indexedValue) {
var i = indexedValue.index;
var awaiting = this._updateReady(i);
this.values[i] = indexedValue.value;
if(awaiting === 0) {
this.sink.event(t, invoke(this.f, this.values));
}
};
CombineSink.prototype._updateReady = function(index) {
if(this.awaiting > 0) {
if(!this.hasValue[index]) {
this.hasValue[index] = true
this.awaiting -= 1
}
}
return this.awaiting;
}
CombineSink.prototype.end = function(t, indexedValue) {
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);
if(--this.activeCount === 0) {
this.sink.end(t, indexedValue.value);
}
};
},{"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"./transform":29,"@most/prelude":69}],10:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var mergeMapConcurrently = require('./mergeConcurrently').mergeMapConcurrently;
exports.concatMap = concatMap;
/**
* Map each value in stream to a new stream, and concatenate them all
* stream: -a---b---cX
* f(a): 1-1-1-1X
* f(b): -2-2-2-2X
* f(c): -3-3-3-3X
* stream.concatMap(f): -1-1-1-1-2-2-2-2-3-3-3-3X
* @param {function(x:*):Stream} f function to map each value to a stream
* @param {Stream} stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
function concatMap(f, stream) {
return mergeMapConcurrently(f, 1, stream);
}
},{"./mergeConcurrently":19}],11:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var isPromise = require('../Promise').isPromise;
exports.continueWith = continueWith;
function continueWith(f, stream) {
return new Stream(new ContinueWith(f, stream.source));
}
function ContinueWith(f, source) {
this.f = f;
this.source = source;
}
ContinueWith.prototype.run = function(sink, scheduler) {
return new ContinueWithSink(this.f, this.source, sink, scheduler);
};
function ContinueWithSink(f, source, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
this.disposable = dispose.once(source.run(this, scheduler));
}
ContinueWithSink.prototype.error = Sink.prototype.error;
ContinueWithSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
this.sink.event(t, x);
};
ContinueWithSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
dispose.tryDispose(t, this.disposable, this.sink);
this._startNext(t, x, this.sink);
};
ContinueWithSink.prototype._startNext = function(t, x, sink) {
try {
this.disposable = this._continue(this.f, x, sink);
} catch(e) {
sink.error(t, e);
}
};
ContinueWithSink.prototype._continue = function(f, x, sink) {
return f(x).source.run(sink, this.scheduler);
};
ContinueWithSink.prototype.dispose = function() {
this.active = false;
return this.disposable.dispose();
};
},{"../Promise":3,"../Stream":5,"../disposable/dispose":34,"../sink/Pipe":53}],12:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.delay = delay;
/**
* @param {Number} delayTime milliseconds to delay each item
* @param {Stream} stream
* @returns {Stream} new stream containing the same items, but delayed by ms
*/
function delay(delayTime, stream) {
return delayTime <= 0 ? stream
: new Stream(new Delay(delayTime, stream.source));
}
function Delay(dt, source) {
this.dt = dt;
this.source = source;
}
Delay.prototype.run = function(sink, scheduler) {
var delaySink = new DelaySink(this.dt, sink, scheduler);
return dispose.all([delaySink, this.source.run(delaySink, scheduler)]);
};
function DelaySink(dt, sink, scheduler) {
this.dt = dt;
this.sink = sink;
this.scheduler = scheduler;
}
DelaySink.prototype.dispose = function() {
var self = this;
this.scheduler.cancelAll(function(task) {
return task.sink === self.sink;
});
};
DelaySink.prototype.event = function(t, x) {
this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink));
};
DelaySink.prototype.end = function(t, x) {
this.scheduler.delay(this.dt, PropagateTask.end(x, this.sink));
};
DelaySink.prototype.error = Sink.prototype.error;
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],13:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var SafeSink = require('../sink/SafeSink');
var Pipe = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var tryEvent = require('../source/tryEvent');
var isPromise = require('../Promise').isPromise;
var PropagateTask = require('../scheduler/PropagateTask');
exports.flatMapError = recoverWith;
exports.recoverWith = recoverWith;
exports.throwError = throwError;
/**
* If stream encounters an error, recover and continue with items from stream
* returned by f.
* @param {function(error:*):Stream} f function which returns a new stream
* @param {Stream} stream
* @returns {Stream} new stream which will recover from an error by calling f
*/
function recoverWith(f, stream) {
return new Stream(new RecoverWith(f, stream.source));
}
/**
* Create a stream containing only an error
* @param {*} e error value, preferably an Error or Error subtype
* @returns {Stream} new stream containing only an error
*/
function throwError(e) {
return new Stream(new ErrorSource(e));
}
function ErrorSource(e) {
this.value = e;
}
ErrorSource.prototype.run = function(sink, scheduler) {
return scheduler.asap(new PropagateTask(runError, this.value, sink));
};
function runError(t, e, sink) {
sink.error(t, e);
}
function RecoverWith(f, source) {
this.f = f;
this.source = source;
}
RecoverWith.prototype.run = function(sink, scheduler) {
return new RecoverWithSink(this.f, this.source, sink, scheduler);
};
function RecoverWithSink(f, source, sink, scheduler) {
this.f = f;
this.sink = new SafeSink(sink);
this.scheduler = scheduler;
this.disposable = source.run(this, scheduler);
}
RecoverWithSink.prototype.event = function(t, x) {
tryEvent.tryEvent(t, x, this.sink);
}
RecoverWithSink.prototype.end = function(t, x) {
tryEvent.tryEnd(t, x, this.sink);
}
RecoverWithSink.prototype.error = function(t, e) {
var nextSink = this.sink.disable();
dispose.tryDispose(t, this.disposable, this.sink);
this._startNext(t, e, nextSink);
};
RecoverWithSink.prototype._startNext = function(t, x, sink) {
try {
this.disposable = this._continue(this.f, x, sink);
} catch(e) {
sink.error(t, e);
}
};
RecoverWithSink.prototype._continue = function(f, x, sink) {
var stream = f(x);
return stream.source.run(sink, this.scheduler);
};
RecoverWithSink.prototype.dispose = function() {
return this.disposable.dispose();
};
},{"../Promise":3,"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"../sink/Pipe":53,"../sink/SafeSink":54,"../source/tryEvent":66}],14:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var Filter = require('../fusion/Filter');
exports.filter = filter;
exports.skipRepeats = skipRepeats;
exports.skipRepeatsWith = skipRepeatsWith;
/**
* Retain only items matching a predicate
* @param {function(x:*):boolean} p filtering predicate called for each item
* @param {Stream} stream stream to filter
* @returns {Stream} stream containing only items for which predicate returns truthy
*/
function filter(p, stream) {
return new Stream(Filter.create(p, stream.source));
}
/**
* Skip repeated events, using === to detect duplicates
* @param {Stream} stream stream from which to omit repeated events
* @returns {Stream} stream without repeated events
*/
function skipRepeats(stream) {
return skipRepeatsWith(same, stream);
}
/**
* Skip repeated events using the provided equals function to detect duplicates
* @param {function(a:*, b:*):boolean} equals optional function to compare items
* @param {Stream} stream stream from which to omit repeated events
* @returns {Stream} stream without repeated events
*/
function skipRepeatsWith(equals, stream) {
return new Stream(new SkipRepeats(equals, stream.source));
}
function SkipRepeats(equals, source) {
this.equals = equals;
this.source = source;
}
SkipRepeats.prototype.run = function(sink, scheduler) {
return this.source.run(new SkipRepeatsSink(this.equals, sink), scheduler);
};
function SkipRepeatsSink(equals, sink) {
this.equals = equals;
this.sink = sink;
this.value = void 0;
this.init = true;
}
SkipRepeatsSink.prototype.end = Sink.prototype.end;
SkipRepeatsSink.prototype.error = Sink.prototype.error;
SkipRepeatsSink.prototype.event = function(t, x) {
if(this.init) {
this.init = false;
this.value = x;
this.sink.event(t, x);
} else if(!this.equals(this.value, x)) {
this.value = x;
this.sink.event(t, x);
}
};
function same(a, b) {
return a === b;
}
},{"../Stream":5,"../fusion/Filter":36,"../sink/Pipe":53}],15:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently;
var mergeMapConcurrently = require('./mergeConcurrently').mergeMapConcurrently;
exports.flatMap = flatMap;
exports.join = join;
/**
* Map each value in the stream to a new stream, and merge it into the
* returned outer stream. Event arrival times are preserved.
* @param {function(x:*):Stream} f chaining function, must return a Stream
* @param {Stream} stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
function flatMap(f, stream) {
return mergeMapConcurrently(f, Infinity, stream);
}
/**
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer. Event arrival times are preserved.
* @param {Stream<Stream<X>>} stream stream of streams
* @returns {Stream<X>} new stream containing all events of all inner streams
*/
function join(stream) {
return mergeConcurrently(Infinity, stream);
}
},{"./mergeConcurrently":19}],16:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
var Map = require('../fusion/Map');
exports.throttle = throttle;
exports.debounce = debounce;
/**
* Limit the rate of events by suppressing events that occur too often
* @param {Number} period time to suppress events
* @param {Stream} stream
* @returns {Stream}
*/
function throttle(period, stream) {
return new Stream(throttleSource(period, stream.source));
}
function throttleSource(period, source) {
return source instanceof Map ? commuteMapThrottle(period, source)
: source instanceof Throttle ? fuseThrottle(period, source)
: new Throttle(period, source)
}
function commuteMapThrottle(period, source) {
return Map.create(source.f, throttleSource(period, source.source))
}
function fuseThrottle(period, source) {
return new Throttle(Math.max(period, source.period), source.source)
}
function Throttle(period, source) {
this.period = period;
this.source = source;
}
Throttle.prototype.run = function(sink, scheduler) {
return this.source.run(new ThrottleSink(this.period, sink), scheduler);
};
function ThrottleSink(period, sink) {
this.time = 0;
this.period = period;
this.sink = sink;
}
ThrottleSink.prototype.event = function(t, x) {
if(t >= this.time) {
this.time = t + this.period;
this.sink.event(t, x);
}
};
ThrottleSink.prototype.end = Sink.prototype.end;
ThrottleSink.prototype.error = Sink.prototype.error;
/**
* Wait for a burst of events to subside and emit only the last event in the burst
* @param {Number} period events occuring more frequently than this
* will be suppressed
* @param {Stream} stream stream to debounce
* @returns {Stream} new debounced stream
*/
function debounce(period, stream) {
return new Stream(new Debounce(period, stream.source));
}
function Debounce(dt, source) {
this.dt = dt;
this.source = source;
}
Debounce.prototype.run = function(sink, scheduler) {
return new DebounceSink(this.dt, this.source, sink, scheduler);
};
function DebounceSink(dt, source, sink, scheduler) {
this.dt = dt;
this.sink = sink;
this.scheduler = scheduler;
this.value = void 0;
this.timer = null;
var sourceDisposable = source.run(this, scheduler);
this.disposable = dispose.all([this, sourceDisposable]);
}
DebounceSink.prototype.event = function(t, x) {
this._clearTimer();
this.value = x;
this.timer = this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink));
};
DebounceSink.prototype.end = function(t, x) {
if(this._clearTimer()) {
this.sink.event(t, this.value);
this.value = void 0;
}
this.sink.end(t, x);
};
DebounceSink.prototype.error = function(t, x) {
this._clearTimer();
this.sink.error(t, x);
};
DebounceSink.prototype.dispose = function() {
this._clearTimer();
};
DebounceSink.prototype._clearTimer = function() {
if(this.timer === null) {
return false;
}
this.timer.dispose();
this.timer = null;
return true;
};
},{"../Stream":5,"../disposable/dispose":34,"../fusion/Map":38,"../scheduler/PropagateTask":45,"../sink/Pipe":53}],17:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
exports.loop = loop;
/**
* Generalized feedback loop. Call a stepper function for each event. The stepper
* will be called with 2 params: the current seed and the an event value. It must
* return a new { seed, value } pair. The `seed` will be fed back into the next
* invocation of stepper, and the `value` will be propagated as the event value.
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function
* @param {*} seed initial seed value passed to first stepper call
* @param {Stream} stream event stream
* @returns {Stream} new stream whose values are the `value` field of the objects
* returned by the stepper
*/
function loop(stepper, seed, stream) {
return new Stream(new Loop(stepper, seed, stream.source));
}
function Loop(stepper, seed, source) {
this.step = stepper;
this.seed = seed;
this.source = source;
}
Loop.prototype.run = function(sink, scheduler) {
return this.source.run(new LoopSink(this.step, this.seed, sink), scheduler);
};
function LoopSink(stepper, seed, sink) {
this.step = stepper;
this.seed = seed;
this.sink = sink;
}
LoopSink.prototype.error = Pipe.prototype.error;
LoopSink.prototype.event = function(t, x) {
var result = this.step(this.seed, x);
this.seed = result.seed;
this.sink.event(t, result.value);
};
LoopSink.prototype.end = function(t) {
this.sink.end(t, this.seed);
};
},{"../Stream":5,"../sink/Pipe":53}],18:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var empty = require('../source/core').empty;
var dispose = require('../disposable/dispose');
var base = require('@most/prelude');
var copy = base.copy;
var reduce = base.reduce;
exports.merge = merge;
exports.mergeArray = mergeArray;
/**
* @returns {Stream} stream containing events from all streams in the argument
* list in time order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
function merge(/*...streams*/) {
return mergeArray(copy(arguments));
}
/**
* @param {Array} streams array of stream to merge
* @returns {Stream} stream containing events from all input observables
* in time order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
function mergeArray(streams) {
var l = streams.length;
return l === 0 ? empty()
: l === 1 ? streams[0]
: new Stream(mergeSources(streams));
}
/**
* This implements fusion/flattening for merge. It will
* fuse adjacent merge operations. For example:
* - a.merge(b).merge(c) effectively becomes merge(a, b, c)
* - merge(a, merge(b, c)) effectively becomes merge(a, b, c)
* It does this by concatenating the sources arrays of
* any nested Merge sources, in effect "flattening" nested
* merge operations into a single merge.
*/
function mergeSources(streams) {
return new Merge(reduce(appendSources, [], streams))
}
function appendSources(sources, stream) {
var source = stream.source;
return source instanceof Merge
? sources.concat(source.sources)
: sources.concat(source)
}
function Merge(sources) {
this.sources = sources;
}
Merge.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l);
var sinks = new Array(l);
var mergeSink = new MergeSink(disposables, sinks, sink);
for(var indexSink, i=0; i<l; ++i) {
indexSink = sinks[i] = new IndexSink(i, mergeSink);
disposables[i] = this.sources[i].run(indexSink, scheduler);
}
return dispose.all(disposables);
};
function MergeSink(disposables, sinks, sink) {
this.sink = sink;
this.disposables = disposables;
this.activeCount = sinks.length;
}
MergeSink.prototype.error = Pipe.prototype.error;
MergeSink.prototype.event = function(t, indexValue) {
this.sink.event(t, indexValue.value);
};
MergeSink.prototype.end = function(t, indexedValue) {
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);
if(--this.activeCount === 0) {
this.sink.end(t, indexedValue.value);
}
};
},{"../Stream":5,"../disposable/dispose":34,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"@most/prelude":69}],19:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
var LinkedList = require('../LinkedList');
var identity = require('@most/prelude').id;
exports.mergeConcurrently = mergeConcurrently;
exports.mergeMapConcurrently = mergeMapConcurrently;
function mergeConcurrently(concurrency, stream) {
return mergeMapConcurrently(identity, concurrency, stream);
}
function mergeMapConcurrently(f, concurrency, stream) {
return new Stream(new MergeConcurrently(f, concurrency, stream.source));
}
function MergeConcurrently(f, concurrency, source) {
this.f = f;
this.concurrency = concurrency;
this.source = source;
}
MergeConcurrently.prototype.run = function(sink, scheduler) {
return new Outer(this.f, this.concurrency, this.source, sink, scheduler);
};
function Outer(f, concurrency, source, sink, scheduler) {
this.f = f;
this.concurrency = concurrency;
this.sink = sink;
this.scheduler = scheduler;
this.pending = [];
this.current = new LinkedList();
this.disposable = dispose.once(source.run(this, scheduler));
this.active = true;
}
Outer.prototype.event = function(t, x) {
this._addInner(t, x);
};
Outer.prototype._addInner = function(t, x) {
if(this.current.length < this.concurrency) {
this._startInner(t, x);
} else {
this.pending.push(x);
}
};
Outer.prototype._startInner = function(t, x) {
try {
this._initInner(t, x);
} catch(e) {
this.error(t, e);
}
};
Outer.prototype._initInner = function(t, x) {
var innerSink = new Inner(t, this, this.sink);
innerSink.disposable = mapAndRun(this.f, x, innerSink, this.scheduler);
this.current.add(innerSink);
}
function mapAndRun(f, x, sink, scheduler) {
return f(x).source.run(sink, scheduler);
}
Outer.prototype.end = function(t, x) {
this.active = false;
dispose.tryDispose(t, this.disposable, this.sink);
this._checkEnd(t, x);
};
Outer.prototype.error = function(t, e) {
this.active = false;
this.sink.error(t, e);
};
Outer.prototype.dispose = function() {
this.active = false;
this.pending.length = 0;
return Promise.all([this.disposable.dispose(), this.current.dispose()]);
};
Outer.prototype._endInner = function(t, x, inner) {
this.current.remove(inner);
dispose.tryDispose(t, inner, this);
if(this.pending.length === 0) {
this._checkEnd(t, x);
} else {
this._startInner(t, this.pending.shift());
}
};
Outer.prototype._checkEnd = function(t, x) {
if(!this.active && this.current.isEmpty()) {
this.sink.end(t, x);
}
};
function Inner(time, outer, sink) {
this.prev = this.next = null;
this.time = time;
this.outer = outer;
this.sink = sink;
this.disposable = void 0;
}
Inner.prototype.event = function(t, x) {
this.sink.event(Math.max(t, this.time), x);
};
Inner.prototype.end = function(t, x) {
this.outer._endInner(Math.max(t, this.time), x, this);
};
Inner.prototype.error = function(t, e) {
this.outer.error(Math.max(t, this.time), e);
};
Inner.prototype.dispose = function() {
return this.disposable.dispose();
};
},{"../LinkedList":2,"../Stream":5,"../disposable/dispose":34,"@most/prelude":69}],20:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var runSource = require('../runSource');
exports.observe = observe;
exports.drain = drain;
/**
* Observe all the event values in the stream in time order. The
* provided function `f` will be called for each event value
* @param {function(x:T):*} f function to call with each event value
* @param {Stream<T>} stream stream to observe
* @return {Promise} promise that fulfills after the stream ends without
* an error, or rejects if the stream ends with an error.
*/
function observe(f, stream) {
return runSource.withDefaultScheduler(f, stream.source);
}
/**
* "Run" a stream by
* @param stream
* @return {*}
*/
function drain(stream) {
return runSource.withDefaultScheduler(noop, stream.source);
}
function noop() {}
},{"../runSource":44}],21:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var fatal = require('../fatalError');
var just = require('../source/core').of;
exports.fromPromise = fromPromise;
exports.awaitPromises = awaitPromises;
/**
* Create a stream containing only the promise's fulfillment
* value at the time it fulfills.
* @param {Promise<T>} p promise
* @return {Stream<T>} stream containing promise's fulfillment value.
* If the promise rejects, the stream will error
*/
function fromPromise(p) {
return awaitPromises(just(p));
}
/**
* Turn a Stream<Promise<T>> into Stream<T> by awaiting each promise.
* Event order is preserved.
* @param {Stream<Promise<T>>} stream
* @return {Stream<T>} stream of fulfillment values. The stream will
* error if any promise rejects.
*/
function awaitPromises(stream) {
return new Stream(new Await(stream.source));
}
function Await(source) {
this.source = source;
}
Await.prototype.run = function(sink, scheduler) {
return this.source.run(new AwaitSink(sink, scheduler), scheduler);
};
function AwaitSink(sink, scheduler) {
this.sink = sink;
this.scheduler = scheduler;
this.queue = Promise.resolve();
var self = this;
// Pre-create closures, to avoid creating them per event
this._eventBound = function(x) {
self.sink.event(self.scheduler.now(), x);
};
this._endBound = function(x) {
self.sink.end(self.scheduler.now(), x);
};
this._errorBound = function(e) {
self.sink.error(self.scheduler.now(), e);
};
}
AwaitSink.prototype.event = function(t, promise) {
var self = this;
this.queue = this.queue.then(function() {
return self._event(promise);
}).catch(this._errorBound);
};
AwaitSink.prototype.end = function(t, x) {
var self = this;
this.queue = this.queue.then(function() {
return self._end(x);
}).catch(this._errorBound);
};
AwaitSink.prototype.error = function(t, e) {
var self = this;
// Don't resolve error values, propagate directly
this.queue = this.queue.then(function() {
return self._errorBound(e);
}).catch(fatal);
};
AwaitSink.prototype._event = function(promise) {
return promise.then(this._eventBound);
};
AwaitSink.prototype._end = function(x) {
return Promise.resolve(x).then(this._endBound);
};
},{"../Stream":5,"../fatalError":35,"../source/core":57}],22:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var base = require('@most/prelude');
var invoke = require('../invoke');
exports.sample = sample;
exports.sampleWith = sampleWith;
exports.sampleArray = sampleArray;
/**
* When an event arrives on sampler, emit the result of calling f with the latest
* values of all streams being sampled
* @param {function(...values):*} f function to apply to each set of sampled values
* @param {Stream} sampler streams will be sampled whenever an event arrives
* on sampler
* @returns {Stream} stream of sampled and transformed values
*/
function sample(f, sampler /*, ...streams */) {
return sampleArray(f, sampler, base.drop(2, arguments));
}
/**
* When an event arrives on sampler, emit the latest event value from stream.
* @param {Stream} sampler stream of events at whose arrival time
* stream's latest value will be propagated
* @param {Stream} stream stream of values
* @returns {Stream} sampled stream of values
*/
function sampleWith(sampler, stream) {
return new Stream(new Sampler(base.id, sampler.source, [stream.source]));
}
function sampleArray(f, sampler, streams) {
return new Stream(new Sampler(f, sampler.source, base.map(getSource, streams)));
}
function getSource(stream) {
return stream.source;
}
function Sampler(f, sampler, sources) {
this.f = f;
this.sampler = sampler;
this.sources = sources;
}
Sampler.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l+1);
var sinks = new Array(l);
var sampleSink = new SampleSink(this.f, sinks, sink);
for(var hold, i=0; i<l; ++i) {
hold = sinks[i] = new Hold(sampleSink);
disposables[i] = this.sources[i].run(hold, scheduler);
}
disposables[i] = this.sampler.run(sampleSink, scheduler);
return dispose.all(disposables);
};
function Hold(sink) {
this.sink = sink;
this.hasValue = false;
}
Hold.prototype.event = function(t, x) {
this.value = x;
this.hasValue = true;
this.sink._notify(this);
};
Hold.prototype.end = function () {};
Hold.prototype.error = Pipe.prototype.error;
function SampleSink(f, sinks, sink) {
this.f = f;
this.sinks = sinks;
this.sink = sink;
this.active = false;
}
SampleSink.prototype._notify = function() {
if(!this.active) {
this.active = this.sinks.every(hasValue);
}
};
SampleSink.prototype.event = function(t) {
if(this.active) {
this.sink.event(t, invoke(this.f, base.map(getValue, this.sinks)));
}
};
SampleSink.prototype.end = Pipe.prototype.end;
SampleSink.prototype.error = Pipe.prototype.error;
function hasValue(hold) {
return hold.hasValue;
}
function getValue(hold) {
return hold.value;
}
},{"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/Pipe":53,"@most/prelude":69}],23:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var core = require('../source/core');
var dispose = require('../disposable/dispose');
var Map = require('../fusion/Map');
exports.take = take;
exports.skip = skip;
exports.slice = slice;
exports.takeWhile = takeWhile;
exports.skipWhile = skipWhile;
/**
* @param {number} n
* @param {Stream} stream
* @returns {Stream} new stream containing only up to the first n items from stream
*/
function take(n, stream) {
return slice(0, n, stream);
}
/**
* @param {number} n
* @param {Stream} stream
* @returns {Stream} new stream with the first n items removed
*/
function skip(n, stream) {
return slice(n, Infinity, stream);
}
/**
* Slice a stream by index. Negative start/end indexes are not supported
* @param {number} start
* @param {number} end
* @param {Stream} stream
* @returns {Stream} stream containing items where start <= index < end
*/
function slice(start, end, stream) {
return end <= start ? core.empty()
: new Stream(sliceSource(start, end, stream.source));
}
function sliceSource(start, end, source) {
return source instanceof Map ? commuteMapSlice(start, end, source)
: source instanceof Slice ? fuseSlice(start, end, source)
: new Slice(start, end, source);
}
function commuteMapSlice(start, end, source) {
return Map.create(source.f, sliceSource(start, end, source.source))
}
function fuseSlice(start, end, source) {
start += source.min;
end = Math.min(end + source.min, source.max);
return new Slice(start, end, source.source);
}
function Slice(min, max, source) {
this.source = source;
this.min = min;
this.max = max;
}
Slice.prototype.run = function(sink, scheduler) {
return new SliceSink(this.min, this.max - this.min, this.source, sink, scheduler);
};
function SliceSink(skip, take, source, sink, scheduler) {
this.sink = sink;
this.skip = skip;
this.take = take;
this.disposable = dispose.once(source.run(this, scheduler));
}
SliceSink.prototype.end = Sink.prototype.end;
SliceSink.prototype.error = Sink.prototype.error;
SliceSink.prototype.event = function(t, x) {
if(this.skip > 0) {
this.skip -= 1;
return;
}
if(this.take === 0) {
return;
}
this.take -= 1;
this.sink.event(t, x);
if(this.take === 0) {
this.dispose();
this.sink.end(t, x);
}
};
SliceSink.prototype.dispose = function() {
return this.disposable.dispose();
};
function takeWhile(p, stream) {
return new Stream(new TakeWhile(p, stream.source));
}
function TakeWhile(p, source) {
this.p = p;
this.source = source;
}
TakeWhile.prototype.run = function(sink, scheduler) {
return new TakeWhileSink(this.p, this.source, sink, scheduler);
};
function TakeWhileSink(p, source, sink, scheduler) {
this.p = p;
this.sink = sink;
this.active = true;
this.disposable = dispose.once(source.run(this, scheduler));
}
TakeWhileSink.prototype.end = Sink.prototype.end;
TakeWhileSink.prototype.error = Sink.prototype.error;
TakeWhileSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
var p = this.p;
this.active = p(x);
if(this.active) {
this.sink.event(t, x);
} else {
this.dispose();
this.sink.end(t, x);
}
};
TakeWhileSink.prototype.dispose = function() {
return this.disposable.dispose();
};
function skipWhile(p, stream) {
return new Stream(new SkipWhile(p, stream.source));
}
function SkipWhile(p, source) {
this.p = p;
this.source = source;
}
SkipWhile.prototype.run = function(sink, scheduler) {
return this.source.run(new SkipWhileSink(this.p, sink), scheduler);
};
function SkipWhileSink(p, sink) {
this.p = p;
this.sink = sink;
this.skipping = true;
}
SkipWhileSink.prototype.end = Sink.prototype.end;
SkipWhileSink.prototype.error = Sink.prototype.error;
SkipWhileSink.prototype.event = function(t, x) {
if(this.skipping) {
var p = this.p;
this.skipping = p(x);
if(this.skipping) {
return;
}
}
this.sink.event(t, x);
};
},{"../Stream":5,"../disposable/dispose":34,"../fusion/Map":38,"../sink/Pipe":53,"../source/core":57}],24:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
exports.switch = switchLatest;
/**
* Given a stream of streams, return a new stream that adopts the behavior
* of the most recent inner stream.
* @param {Stream} stream of streams on which to switch
* @returns {Stream} switching stream
*/
function switchLatest(stream) {
return new Stream(new Switch(stream.source));
}
function Switch(source) {
this.source = source;
}
Switch.prototype.run = function(sink, scheduler) {
var switchSink = new SwitchSink(sink, scheduler);
return dispose.all(switchSink, this.source.run(switchSink, scheduler));
};
function SwitchSink(sink, scheduler) {
this.sink = sink;
this.scheduler = scheduler;
this.current = null;
this.ended = false;
}
SwitchSink.prototype.event = function(t, stream) {
this._disposeCurrent(t); // TODO: capture the result of this dispose
this.current = new Segment(t, Infinity, this, this.sink);
this.current.disposable = stream.source.run(this.current, this.scheduler);
};
SwitchSink.prototype.end = function(t, x) {
this.ended = true;
this._checkEnd(t, x);
};
SwitchSink.prototype.error = function(t, e) {
this.ended = true;
this.sink.error(t, e);
};
SwitchSink.prototype.dispose = function() {
return this._disposeCurrent(0);
};
SwitchSink.prototype._disposeCurrent = function(t) {
if(this.current !== null) {
return this.current._dispose(t);
}
};
SwitchSink.prototype._disposeInner = function(t, inner) {
inner._dispose(t); // TODO: capture the result of this dispose
if(inner === this.current) {
this.current = null;
}
};
SwitchSink.prototype._checkEnd = function(t, x) {
if(this.ended && this.current === null) {
this.sink.end(t, x);
}
};
SwitchSink.prototype._endInner = function(t, x, inner) {
this._disposeInner(t, inner);
this._checkEnd(t, x);
};
SwitchSink.prototype._errorInner = function(t, e, inner) {
this._disposeInner(t, inner);
this.sink.error(t, e);
};
function Segment(min, max, outer, sink) {
this.min = min;
this.max = max;
this.outer = outer;
this.sink = sink;
this.disposable = dispose.empty();
}
Segment.prototype.event = function(t, x) {
if(t < this.max) {
this.sink.event(Math.max(t, this.min), x);
}
};
Segment.prototype.end = function(t, x) {
this.outer._endInner(Math.max(t, this.min), x, this);
};
Segment.prototype.error = function(t, e) {
this.outer._errorInner(Math.max(t, this.min), e, this);
};
Segment.prototype._dispose = function(t) {
this.max = t;
dispose.tryDispose(t, this.disposable, this.sink)
};
},{"../Stream":5,"../disposable/dispose":34}],25:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.thru = function thru(f, stream) {
return f(stream);
}
},{}],26:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var join = require('../combinator/flatMap').join;
exports.during = during;
exports.takeUntil = takeUntil;
exports.skipUntil = skipUntil;
function takeUntil(signal, stream) {
return new Stream(new Until(signal.source, stream.source));
}
function skipUntil(signal, stream) {
return new Stream(new Since(signal.source, stream.source));
}
function during(timeWindow, stream) {
return takeUntil(join(timeWindow), skipUntil(timeWindow, stream));
}
function Until(maxSignal, source) {
this.maxSignal = maxSignal;
this.source = source;
}
Until.prototype.run = function(sink, scheduler) {
var min = new Bound(-Infinity, sink);
var max = new UpperBound(this.maxSignal, sink, scheduler);
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);
return dispose.all([min, max, disposable]);
};
function Since(minSignal, source) {
this.minSignal = minSignal;
this.source = source;
}
Since.prototype.run = function(sink, scheduler) {
var min = new LowerBound(this.minSignal, sink, scheduler);
var max = new Bound(Infinity, sink);
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);
return dispose.all([min, max, disposable]);
};
function Bound(value, sink) {
this.value = value;
this.sink = sink;
}
Bound.prototype.error = Pipe.prototype.error;
Bound.prototype.event = noop;
Bound.prototype.end = noop;
Bound.prototype.dispose = noop;
function TimeWindowSink(min, max, sink) {
this.min = min;
this.max = max;
this.sink = sink;
}
TimeWindowSink.prototype.event = function(t, x) {
if(t >= this.min.value && t < this.max.value) {
this.sink.event(t, x);
}
};
TimeWindowSink.prototype.error = Pipe.prototype.error;
TimeWindowSink.prototype.end = Pipe.prototype.end;
function LowerBound(signal, sink, scheduler) {
this.value = Infinity;
this.sink = sink;
this.disposable = signal.run(this, scheduler);
}
LowerBound.prototype.event = function(t /*, x */) {
if(t < this.value) {
this.value = t;
}
};
LowerBound.prototype.end = noop;
LowerBound.prototype.error = Pipe.prototype.error;
LowerBound.prototype.dispose = function() {
return this.disposable.dispose();
};
function UpperBound(signal, sink, scheduler) {
this.value = Infinity;
this.sink = sink;
this.disposable = signal.run(this, scheduler);
}
UpperBound.prototype.event = function(t, x) {
if(t < this.value) {
this.value = t;
this.sink.end(t, x);
}
};
UpperBound.prototype.end = noop;
UpperBound.prototype.error = Pipe.prototype.error;
UpperBound.prototype.dispose = function() {
return this.disposable.dispose();
};
function noop() {}
},{"../Stream":5,"../combinator/flatMap":15,"../disposable/dispose":34,"../sink/Pipe":53}],27:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
exports.timestamp = timestamp;
function timestamp(stream) {
return new Stream(new Timestamp(stream.source));
}
function Timestamp(source) {
this.source = source;
}
Timestamp.prototype.run = function(sink, scheduler) {
return this.source.run(new TimestampSink(sink), scheduler);
};
function TimestampSink(sink) {
this.sink = sink;
}
TimestampSink.prototype.end = Sink.prototype.end;
TimestampSink.prototype.error = Sink.prototype.error;
TimestampSink.prototype.event = function(t, x) {
this.sink.event(t, { time: t, value: x });
};
},{"../Stream":5,"../sink/Pipe":53}],28:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.transduce = transduce;
/**
* Transform a stream by passing its events through a transducer.
* @param {function} transducer transducer function
* @param {Stream} stream stream whose events will be passed through the
* transducer
* @return {Stream} stream of events transformed by the transducer
*/
function transduce(transducer, stream) {
return new Stream(new Transduce(transducer, stream.source));
}
function Transduce(transducer, source) {
this.transducer = transducer;
this.source = source;
}
Transduce.prototype.run = function(sink, scheduler) {
var xf = this.transducer(new Transformer(sink));
return this.source.run(new TransduceSink(getTxHandler(xf), sink), scheduler);
};
function TransduceSink(adapter, sink) {
this.xf = adapter;
this.sink = sink;
}
TransduceSink.prototype.event = function(t, x) {
var next = this.xf.step(t, x);
return this.xf.isReduced(next)
? this.sink.end(t, this.xf.getResult(next))
: next;
};
TransduceSink.prototype.end = function(t, x) {
return this.xf.result(x);
};
TransduceSink.prototype.error = function(t, e) {
return this.sink.error(t, e);
};
function Transformer(sink) {
this.time = -Infinity;
this.sink = sink;
}
Transformer.prototype['@@transducer/init'] = Transformer.prototype.init = function() {};
Transformer.prototype['@@transducer/step'] = Transformer.prototype.step = function(t, x) {
if(!isNaN(t)) {
this.time = Math.max(t, this.time);
}
return this.sink.event(this.time, x);
};
Transformer.prototype['@@transducer/result'] = Transformer.prototype.result = function(x) {
return this.sink.end(this.time, x);
};
/**
* Given an object supporting the new or legacy transducer protocol,
* create an adapter for it.
* @param {object} tx transform
* @returns {TxAdapter|LegacyTxAdapter}
*/
function getTxHandler(tx) {
return typeof tx['@@transducer/step'] === 'function'
? new TxAdapter(tx)
: new LegacyTxAdapter(tx);
}
/**
* Adapter for new official transducer protocol
* @param {object} tx transform
* @constructor
*/
function TxAdapter(tx) {
this.tx = tx;
}
TxAdapter.prototype.step = function(t, x) {
return this.tx['@@transducer/step'](t, x);
};
TxAdapter.prototype.result = function(x) {
return this.tx['@@transducer/result'](x);
};
TxAdapter.prototype.isReduced = function(x) {
return x != null && x['@@transducer/reduced'];
};
TxAdapter.prototype.getResult = function(x) {
return x['@@transducer/value'];
};
/**
* Adapter for older transducer protocol
* @param {object} tx transform
* @constructor
*/
function LegacyTxAdapter(tx) {
this.tx = tx;
}
LegacyTxAdapter.prototype.step = function(t, x) {
return this.tx.step(t, x);
};
LegacyTxAdapter.prototype.result = function(x) {
return this.tx.result(x);
};
LegacyTxAdapter.prototype.isReduced = function(x) {
return x != null && x.__transducers_reduced__;
};
LegacyTxAdapter.prototype.getResult = function(x) {
return x.value;
};
},{"../Stream":5}],29:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Map = require('../fusion/Map');
exports.map = map;
exports.constant = constant;
exports.tap = tap;
/**
* Transform each value in the stream by applying f to each
* @param {function(*):*} f mapping function
* @param {Stream} stream stream to map
* @returns {Stream} stream containing items transformed by f
*/
function map(f, stream) {
return new Stream(Map.create(f, stream.source));
}
/**
* Replace each value in the stream with x
* @param {*} x
* @param {Stream} stream
* @returns {Stream} stream containing items replaced with x
*/
function constant(x, stream) {
return map(function() {
return x;
}, stream);
}
/**
* Perform a side effect for each item in the stream
* @param {function(x:*):*} f side effect to execute for each item. The
* return value will be discarded.
* @param {Stream} stream stream to tap
* @returns {Stream} new stream containing the same items as this stream
*/
function tap(f, stream) {
return map(function(x) {
f(x);
return x;
}, stream);
}
},{"../Stream":5,"../fusion/Map":38}],30:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var transform = require('./transform');
var core = require('../source/core');
var Sink = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var dispose = require('../disposable/dispose');
var base = require('@most/prelude');
var invoke = require('../invoke');
var Queue = require('../Queue');
var map = base.map;
var tail = base.tail;
exports.zip = zip;
exports.zipArray = zipArray;
/**
* Combine streams pairwise (or tuple-wise) by index by applying f to values
* at corresponding indices. The returned stream ends when any of the input
* streams ends.
* @param {function} f function to combine values
* @returns {Stream} new stream with items at corresponding indices combined
* using f
*/
function zip(f /*,...streams */) {
return zipArray(f, tail(arguments));
}
/**
* Combine streams pairwise (or tuple-wise) by index by applying f to values
* at corresponding indices. The returned stream ends when any of the input
* streams ends.
* @param {function} f function to combine values
* @param {[Stream]} streams streams to zip using f
* @returns {Stream} new stream with items at corresponding indices combined
* using f
*/
function zipArray(f, streams) {
return streams.length === 0 ? core.empty()
: streams.length === 1 ? transform.map(f, streams[0])
: new Stream(new Zip(f, map(getSource, streams)));
}
function getSource(stream) {
return stream.source;
}
function Zip(f, sources) {
this.f = f;
this.sources = sources;
}
Zip.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l);
var sinks = new Array(l);
var buffers = new Array(l);
var zipSink = new ZipSink(this.f, buffers, sinks, sink);
for(var indexSink, i=0; i<l; ++i) {
buffers[i] = new Queue();
indexSink = sinks[i] = new IndexSink(i, zipSink);
disposables[i] = this.sources[i].run(indexSink, scheduler);
}
return dispose.all(disposables);
};
function ZipSink(f, buffers, sinks, sink) {
this.f = f;
this.sinks = sinks;
this.sink = sink;
this.buffers = buffers;
}
ZipSink.prototype.event = function(t, indexedValue) {
var buffers = this.buffers;
var buffer = buffers[indexedValue.index];
buffer.push(indexedValue.value);
if(buffer.length() === 1) {
if(!ready(this.buffers)) {
return;
}
emitZipped(this.f, t, buffers, this.sink);
if (ended(this.buffers, this.sinks)) {
this.sink.end(t, void 0);
}
}
};
ZipSink.prototype.end = function(t, indexedValue) {
var buffer = this.buffers[indexedValue.index];
if(buffer.isEmpty()) {
this.sink.end(t, indexedValue.value);
}
};
ZipSink.prototype.error = Sink.prototype.error;
function emitZipped (f, t, buffers, sink) {
sink.event(t, invoke(f, map(head, buffers)));
}
function head(buffer) {
return buffer.shift();
}
function ended(buffers, sinks) {
for(var i=0, l=buffers.length; i<l; ++i) {
if(buffers[i].isEmpty() && !sinks[i].active) {
return true;
}
}
return false;
}
function ready(buffers) {
for(var i=0, l=buffers.length; i<l; ++i) {
if(buffers[i].isEmpty()) {
return false;
}
}
return true;
}
},{"../Queue":4,"../Stream":5,"../disposable/dispose":34,"../invoke":39,"../sink/IndexSink":51,"../sink/Pipe":53,"../source/core":57,"./transform":29,"@most/prelude":69}],31:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = defer;
function defer(task) {
return Promise.resolve(task).then(runTask);
}
function runTask(task) {
try {
return task.run();
} catch(e) {
return task.error(e);
}
}
},{}],32:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Disposable;
/**
* Create a new Disposable which will dispose its underlying resource.
* @param {function} dispose function
* @param {*?} data any data to be passed to disposer function
* @constructor
*/
function Disposable(dispose, data) {
this._dispose = dispose;
this._data = data;
}
Disposable.prototype.dispose = function() {
return this._dispose(this._data);
};
},{}],33:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = SettableDisposable;
function SettableDisposable() {
this.disposable = void 0;
this.disposed = false;
this._resolve = void 0;
var self = this;
this.result = new Promise(function(resolve) {
self._resolve = resolve;
});
}
SettableDisposable.prototype.setDisposable = function(disposable) {
if(this.disposable !== void 0) {
throw new Error('setDisposable called more than once');
}
this.disposable = disposable;
if(this.disposed) {
this._resolve(disposable.dispose());
}
};
SettableDisposable.prototype.dispose = function() {
if(this.disposed) {
return this.result;
}
this.disposed = true;
if(this.disposable !== void 0) {
this.result = this.disposable.dispose();
}
return this.result;
};
},{}],34:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Disposable = require('./Disposable');
var SettableDisposable = require('./SettableDisposable');
var isPromise = require('../Promise').isPromise;
var base = require('@most/prelude');
var map = base.map;
var identity = base.id;
exports.tryDispose = tryDispose;
exports.create = create;
exports.once = once;
exports.empty = empty;
exports.all = all;
exports.settable = settable;
exports.promised = promised;
/**
* Call disposable.dispose. If it returns a promise, catch promise
* error and forward it through the provided sink.
* @param {number} t time
* @param {{dispose: function}} disposable
* @param {{error: function}} sink
* @return {*} result of disposable.dispose
*/
function tryDispose(t, disposable, sink) {
var result = disposeSafely(disposable);
return isPromise(result)
? result.catch(function (e) {
sink.error(t, e);
})
: result;
}
/**
* Create a new Disposable which will dispose its underlying resource
* at most once.
* @param {function} dispose function
* @param {*?} data any data to be passed to disposer function
* @return {Disposable}
*/
function create(dispose, data) {
return once(new Disposable(dispose, data));
}
/**
* Create a noop disposable. Can be used to satisfy a Disposable
* requirement when no actual resource needs to be disposed.
* @return {Disposable|exports|module.exports}
*/
function empty() {
return new Disposable(identity, void 0);
}
/**
* Create a disposable that will dispose all input disposables in parallel.
* @param {Array<Disposable>} disposables
* @return {Disposable}
*/
function all(disposables) {
return create(disposeAll, disposables);
}
function disposeAll(disposables) {
return Promise.all(map(disposeSafely, disposables));
}
function disposeSafely(disposable) {
try {
return disposable.dispose();
} catch(e) {
return Promise.reject(e);
}
}
/**
* Create a disposable from a promise for another disposable
* @param {Promise<Disposable>} disposablePromise
* @return {Disposable}
*/
function promised(disposablePromise) {
return create(disposePromise, disposablePromise);
}
function disposePromise(disposablePromise) {
return disposablePromise.then(disposeOne);
}
function disposeOne(disposable) {
return disposable.dispose();
}
/**
* Create a disposable proxy that allows its underlying disposable to
* be set later.
* @return {SettableDisposable}
*/
function settable() {
return new SettableDisposable();
}
/**
* Wrap an existing disposable (which may not already have been once()d)
* so that it will only dispose its underlying resource at most once.
* @param {{ dispose: function() }} disposable
* @return {Disposable} wrapped disposable
*/
function once(disposable) {
return new Disposable(disposeMemoized, memoized(disposable));
}
function disposeMemoized(memoized) {
if(!memoized.disposed) {
memoized.disposed = true;
memoized.value = disposeSafely(memoized.disposable);
memoized.disposable = void 0;
}
return memoized.value;
}
function memoized(disposable) {
return { disposed: false, disposable: disposable, value: void 0 };
}
},{"../Promise":3,"./Disposable":32,"./SettableDisposable":33,"@most/prelude":69}],35:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = fatalError;
function fatalError (e) {
setTimeout(function() {
throw e;
}, 0);
}
},{}],36:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
module.exports = Filter;
function Filter(p, source) {
this.p = p;
this.source = source;
}
/**
* Create a filtered source, fusing adjacent filter.filter if possible
* @param {function(x:*):boolean} p filtering predicate
* @param {{run:function}} source source to filter
* @returns {Filter} filtered source
*/
Filter.create = function createFilter(p, source) {
if (source instanceof Filter) {
return new Filter(and(source.p, p), source.source);
}
return new Filter(p, source);
};
Filter.prototype.run = function(sink, scheduler) {
return this.source.run(new FilterSink(this.p, sink), scheduler);
};
function FilterSink(p, sink) {
this.p = p;
this.sink = sink;
}
FilterSink.prototype.end = Pipe.prototype.end;
FilterSink.prototype.error = Pipe.prototype.error;
FilterSink.prototype.event = function(t, x) {
var p = this.p;
p(x) && this.sink.event(t, x);
};
function and(p, q) {
return function(x) {
return p(x) && q(x);
};
}
},{"../sink/Pipe":53}],37:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
module.exports = FilterMap;
function FilterMap(p, f, source) {
this.p = p;
this.f = f;
this.source = source;
}
FilterMap.prototype.run = function(sink, scheduler) {
return this.source.run(new FilterMapSink(this.p, this.f, sink), scheduler);
};
function FilterMapSink(p, f, sink) {
this.p = p;
this.f = f;
this.sink = sink;
}
FilterMapSink.prototype.event = function(t, x) {
var f = this.f;
var p = this.p;
p(x) && this.sink.event(t, f(x));
};
FilterMapSink.prototype.end = Pipe.prototype.end;
FilterMapSink.prototype.error = Pipe.prototype.error;
},{"../sink/Pipe":53}],38:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
var Filter = require('./Filter');
var FilterMap = require('./FilterMap');
var base = require('@most/prelude');
module.exports = Map;
function Map(f, source) {
this.f = f;
this.source = source;
}
/**
* Create a mapped source, fusing adjacent map.map, filter.map,
* and filter.map.map if possible
* @param {function(*):*} f mapping function
* @param {{run:function}} source source to map
* @returns {Map|FilterMap} mapped source, possibly fused
*/
Map.create = function createMap(f, source) {
if(source instanceof Map) {
return new Map(base.compose(f, source.f), source.source);
}
if(source instanceof Filter) {
return new FilterMap(source.p, f, source.source);
}
return new Map(f, source);
};
Map.prototype.run = function(sink, scheduler) {
return this.source.run(new MapSink(this.f, sink), scheduler);
};
function MapSink(f, sink) {
this.f = f;
this.sink = sink;
}
MapSink.prototype.end = Pipe.prototype.end;
MapSink.prototype.error = Pipe.prototype.error;
MapSink.prototype.event = function(t, x) {
var f = this.f;
this.sink.event(t, f(x));
};
},{"../sink/Pipe":53,"./Filter":36,"./FilterMap":37,"@most/prelude":69}],39:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = invoke;
function invoke(f, args) {
/*eslint complexity: [2,7]*/
switch(args.length) {
case 0: return f();
case 1: return f(args[0]);
case 2: return f(args[0], args[1]);
case 3: return f(args[0], args[1], args[2]);
case 4: return f(args[0], args[1], args[2], args[3]);
case 5: return f(args[0], args[1], args[2], args[3], args[4]);
default:
return f.apply(void 0, args);
}
}
},{}],40:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.isIterable = isIterable;
exports.getIterator = getIterator;
exports.makeIterable = makeIterable;
/*global Set, Symbol*/
var iteratorSymbol;
// Firefox ships a partial implementation using the name @@iterator.
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14
if (typeof Set === 'function' && typeof new Set()['@@iterator'] === 'function') {
iteratorSymbol = '@@iterator';
} else {
iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator ||
'_es6shim_iterator_';
}
function isIterable(o) {
return typeof o[iteratorSymbol] === 'function';
}
function getIterator(o) {
return o[iteratorSymbol]();
}
function makeIterable(f, o) {
o[iteratorSymbol] = f;
return o;
}
},{}],41:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
exports.fromObservable = fromObservable;
exports.ObservableSource = ObservableSource;
exports.SubscriberSink = SubscriberSink;
function fromObservable(observable) {
return new Stream(new ObservableSource(observable));
}
function ObservableSource(observable) {
this.observable = observable;
}
ObservableSource.prototype.run = function(sink, scheduler) {
var sub = this.observable.subscribe(new SubscriberSink(sink, scheduler));
if(typeof sub === 'function') {
return dispose.create(sub);
} else if(sub && typeof sub.unsubscribe === 'function') {
return dispose.create(unsubscribe, sub);
}
throw new TypeError('Observable returned invalid subscription ' + String(sub));
}
function SubscriberSink(sink, scheduler) {
this.sink = sink;
this.scheduler = scheduler;
}
SubscriberSink.prototype.next = function(x) {
this.sink.event(this.scheduler.now(), x);
}
SubscriberSink.prototype.complete = function(x) {
this.sink.end(this.scheduler.now(), x);
}
SubscriberSink.prototype.error = function(e) {
this.sink.error(this.scheduler.now(), e);
}
function unsubscribe(subscription) {
return subscription.unsubscribe();
}
},{"../Stream":5,"../disposable/dispose":34}],42:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var symbolObservable = require('symbol-observable');
module.exports = getObservable;
function getObservable(o) {
var obs = null;
if(o != null && typeof o === 'object') {
var method = o[symbolObservable];
if(typeof method === 'function') {
obs = method.call(o);
if(obs == null || typeof obs !== 'object') {
throw new TypeError('invalid observable ' + obs);
}
}
}
return obs;
}
},{"symbol-observable":70}],43:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var defaultScheduler = require('../scheduler/defaultScheduler');
var dispose = require('../disposable/dispose');
var fatalError = require('../fatalError');
exports.subscribe = subscribe;
exports.SubscribeObserver = SubscribeObserver;
exports.Subscription = Subscription;
function subscribe(subscriber, stream) {
if(subscriber == null || typeof subscriber !== 'object') {
throw new TypeError('subscriber must be an object');
}
var disposable = dispose.settable();
var observer = new SubscribeObserver(fatalError, subscriber, disposable);
disposable.setDisposable(stream.source.run(observer, defaultScheduler));
return new Subscription(disposable);
}
function SubscribeObserver(fatalError, subscriber, disposable) {
this.fatalError = fatalError;
this.subscriber = subscriber;
this.disposable = disposable;
}
SubscribeObserver.prototype.event = function(t, x) {
if(typeof this.subscriber.next === 'function') {
this.subscriber.next(x);
}
};
SubscribeObserver.prototype.end = function(t, x) {
var s = this.subscriber;
doDispose(this.fatalError, s, s.complete, s.error, this.disposable, x);
};
SubscribeObserver.prototype.error = function(t, e) {
var s = this.subscriber;
doDispose(this.fatalError, s, s.error, s.error, this.disposable, e);
};
function Subscription(disposable) {
this.disposable = disposable;
}
Subscription.prototype.unsubscribe = function() {
this.disposable.dispose();
}
function doDispose(fatal, subscriber, complete, error, disposable, x) {
Promise.resolve(disposable.dispose()).then(function () {
if(typeof complete === 'function') {
complete.call(subscriber, x);
}
}).catch(function(e) {
if(typeof error === 'function') {
error.call(subscriber, e);
}
}).catch(fatal);
}
},{"../disposable/dispose":34,"../fatalError":35,"../scheduler/defaultScheduler":47}],44:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Observer = require('./sink/Observer');
var dispose = require('./disposable/dispose');
var defaultScheduler = require('./scheduler/defaultScheduler');
exports.withDefaultScheduler = withDefaultScheduler;
exports.withScheduler = withScheduler;
function withDefaultScheduler(f, source) {
return withScheduler(f, source, defaultScheduler);
}
function withScheduler(f, source, scheduler) {
return new Promise(function (resolve, reject) {
runSource(f, source, scheduler, resolve, reject);
});
}
function runSource(f, source, scheduler, resolve, reject) {
var disposable = dispose.settable();
var observer = new Observer(f, resolve, reject, disposable);
disposable.setDisposable(source.run(observer, scheduler));
}
},{"./disposable/dispose":34,"./scheduler/defaultScheduler":47,"./sink/Observer":52}],45:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var fatal = require('../fatalError');
module.exports = PropagateTask;
function PropagateTask(run, value, sink) {
this._run = run;
this.value = value;
this.sink = sink;
this.active = true;
}
PropagateTask.event = function(value, sink) {
return new PropagateTask(emit, value, sink);
};
PropagateTask.end = function(value, sink) {
return new PropagateTask(end, value, sink);
};
PropagateTask.error = function(value, sink) {
return new PropagateTask(error, value, sink);
};
PropagateTask.prototype.dispose = function() {
this.active = false;
};
PropagateTask.prototype.run = function(t) {
if(!this.active) {
return;
}
this._run(t, this.value, this.sink);
};
PropagateTask.prototype.error = function(t, e) {
if(!this.active) {
return fatal(e);
}
this.sink.error(t, e);
};
function error(t, e, sink) {
sink.error(t, e);
}
function emit(t, x, sink) {
sink.event(t, x);
}
function end(t, x, sink) {
sink.end(t, x);
}
},{"../fatalError":35}],46:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var base = require('@most/prelude');
module.exports = Scheduler;
function ScheduledTask(delay, period, task, scheduler) {
this.time = delay;
this.period = period;
this.task = task;
this.scheduler = scheduler;
this.active = true;
}
ScheduledTask.prototype.run = function() {
return this.task.run(this.time);
};
ScheduledTask.prototype.error = function(e) {
return this.task.error(this.time, e);
};
ScheduledTask.prototype.dispose = function() {
this.scheduler.cancel(this);
return this.task.dispose();
};
function runTask(task) {
try {
return task.run();
} catch(e) {
return task.error(e);
}
}
function Scheduler(timer) {
this.timer = timer;
this._timer = null;
this._nextArrival = 0;
this._tasks = [];
var self = this;
this._runReadyTasksBound = function() {
self._runReadyTasks(self.now());
};
}
Scheduler.prototype.now = function() {
return this.timer.now();
};
Scheduler.prototype.asap = function(task) {
return this.schedule(0, -1, task);
};
Scheduler.prototype.delay = function(delay, task) {
return this.schedule(delay, -1, task);
};
Scheduler.prototype.periodic = function(period, task) {
return this.schedule(0, period, task);
};
Scheduler.prototype.schedule = function(delay, period, task) {
var now = this.now();
var st = new ScheduledTask(now + Math.max(0, delay), period, task, this);
insertByTime(st, this._tasks);
this._scheduleNextRun(now);
return st;
};
Scheduler.prototype.cancel = function(task) {
task.active = false;
var i = binarySearch(task.time, this._tasks);
if(i >= 0 && i < this._tasks.length) {
var at = base.findIndex(task, this._tasks[i].events);
if(at >= 0) {
this._tasks[i].events.splice(at, 1);
this._reschedule();
}
}
};
Scheduler.prototype.cancelAll = function(f) {
for(var i=0; i<this._tasks.length; ++i) {
removeAllFrom(f, this._tasks[i]);
}
this._reschedule();
};
function removeAllFrom(f, timeslot) {
timeslot.events = base.removeAll(f, timeslot.events);
}
Scheduler.prototype._reschedule = function() {
if(this._tasks.length === 0) {
this._unschedule();
} else {
this._scheduleNextRun(this.now());
}
};
Scheduler.prototype._unschedule = function() {
this.timer.clearTimer(this._timer);
this._timer = null;
};
Scheduler.prototype._scheduleNextRun = function(now) {
if(this._tasks.length === 0) {
return;
}
var nextArrival = this._tasks[0].time;
if(this._timer === null) {
this._scheduleNextArrival(nextArrival, now);
} else if(nextArrival < this._nextArrival) {
this._unschedule();
this._scheduleNextArrival(nextArrival, now);
}
};
Scheduler.prototype._scheduleNextArrival = function(nextArrival, now) {
this._nextArrival = nextArrival;
var delay = Math.max(0, nextArrival - now);
this._timer = this.timer.setTimer(this._runReadyTasksBound, delay);
};
Scheduler.prototype._runReadyTasks = function(now) {
this._timer = null;
this._tasks = this._findAndRunTasks(now);
this._scheduleNextRun(this.now());
};
Scheduler.prototype._findAndRunTasks = function(now) {
var tasks = this._tasks;
var l = tasks.length;
var i = 0;
while(i < l && tasks[i].time <= now) {
++i;
}
this._tasks = tasks.slice(i);
// Run all ready tasks
for (var j = 0; j < i; ++j) {
this._tasks = runTasks(tasks[j], this._tasks);
}
return this._tasks;
};
function runTasks(timeslot, tasks) {
var events = timeslot.events;
for(var i=0; i<events.length; ++i) {
var task = events[i];
if(task.active) {
runTask(task);
// Reschedule periodic repeating tasks
// Check active again, since a task may have canceled itself
if(task.period >= 0) {
task.time = task.time + task.period;
insertByTime(task, tasks);
}
}
}
return tasks;
}
function insertByTime(task, timeslots) {
var l = timeslots.length;
if(l === 0) {
timeslots.push(newTimeslot(task.time, [task]));
return;
}
var i = binarySearch(task.time, timeslots);
if(i >= l) {
timeslots.push(newTimeslot(task.time, [task]));
} else if(task.time === timeslots[i].time) {
timeslots[i].events.push(task);
} else {
timeslots.splice(i, 0, newTimeslot(task.time, [task]));
}
}
function binarySearch(t, sortedArray) {
var lo = 0;
var hi = sortedArray.length;
var mid, y;
while (lo < hi) {
mid = Math.floor((lo + hi) / 2);
y = sortedArray[mid];
if (t === y.time) {
return mid;
} else if (t < y.time) {
hi = mid;
} else {
lo = mid + 1;
}
}
return hi;
}
function newTimeslot(t, events) {
return { time: t, events: events };
}
},{"@most/prelude":69}],47:[function(require,module,exports){
(function (process){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Scheduler = require('./Scheduler');
var setTimeoutTimer = require('./timeoutTimer');
var nodeTimer = require('./nodeTimer');
var isNode = typeof process === 'object'
&& typeof process.nextTick === 'function';
module.exports = new Scheduler(isNode ? nodeTimer : setTimeoutTimer);
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlZHVsZXIvZGVmYXVsdFNjaGVkdWxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnLi9TY2hlZHVsZXInKTtcbnZhciBzZXRUaW1lb3V0VGltZXIgPSByZXF1aXJlKCcuL3RpbWVvdXRUaW1lcicpO1xudmFyIG5vZGVUaW1lciA9IHJlcXVpcmUoJy4vbm9kZVRpbWVyJyk7XG5cbnZhciBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCdcblx0XHQmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZWR1bGVyKGlzTm9kZSA/IG5vZGVUaW1lciA6IHNldFRpbWVvdXRUaW1lcik7XG4iXX0=
},{"./Scheduler":46,"./nodeTimer":48,"./timeoutTimer":49,"_process":1}],48:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var defer = require('../defer');
/*global setTimeout, clearTimeout*/
function Task(f) {
this.f = f;
this.active = true;
}
Task.prototype.run = function() {
if(!this.active) {
return;
}
var f = this.f;
return f();
};
Task.prototype.error = function(e) {
throw e;
};
Task.prototype.cancel = function() {
this.active = false;
};
function runAsTask(f) {
var task = new Task(f);
defer(task);
return task;
}
module.exports = {
now: Date.now,
setTimer: function(f, dt) {
return dt <= 0 ? runAsTask(f) : setTimeout(f, dt);
},
clearTimer: function(t) {
return t instanceof Task ? t.cancel() : clearTimeout(t);
}
};
},{"../defer":31}],49:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
/*global setTimeout, clearTimeout*/
module.exports = {
now: Date.now,
setTimer: function(f, dt) {
return setTimeout(f, dt);
},
clearTimer: function(t) {
return clearTimeout(t);
}
};
},{}],50:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var defer = require('../defer');
module.exports = DeferredSink;
function DeferredSink(sink) {
this.sink = sink;
this.events = [];
this.active = true;
}
DeferredSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
if(this.events.length === 0) {
defer(new PropagateAllTask(this.sink, this.events));
}
this.events.push({ time: t, value: x });
};
DeferredSink.prototype.error = function(t, e) {
this._end(new ErrorTask(t, e, this.sink));
};
DeferredSink.prototype.end = function(t, x) {
this._end(new EndTask(t, x, this.sink));
};
DeferredSink.prototype._end = function(task) {
this.active = false;
this.events = void 0;
defer(task);
}
function PropagateAllTask(sink, events) {
this.sink = sink;
this.events = events;
}
PropagateAllTask.prototype.run = function() {
var events = this.events;
var sink = this.sink;
var event;
for(var i = 0, l = events.length; i<l; ++i) {
event = events[i];
sink.event(event.time, event.value);
}
events.length = 0;
};
PropagateAllTask.prototype.error = function(e) {
this.sink.error(0, e);
};
function EndTask(t, x, sink) {
this.time = t;
this.value = x;
this.sink = sink;
}
EndTask.prototype.run = function() {
this.sink.end(this.time, this.value);
};
EndTask.prototype.error = function(e) {
this.sink.error(this.time, e);
};
function ErrorTask(t, e, sink) {
this.time = t;
this.value = e;
this.sink = sink;
}
ErrorTask.prototype.run = function() {
this.sink.error(this.time, this.value);
};
ErrorTask.prototype.error = function(e) {
throw e;
};
},{"../defer":31}],51:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Sink = require('./Pipe');
module.exports = IndexSink;
function IndexSink(i, sink) {
this.sink = sink;
this.index = i;
this.active = true;
this.value = void 0;
}
IndexSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
this.value = x;
this.sink.event(t, this);
};
IndexSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
this.active = false;
this.sink.end(t, { index: this.index, value: x });
};
IndexSink.prototype.error = Sink.prototype.error;
},{"./Pipe":53}],52:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Observer;
/**
* Sink that accepts functions to apply to each event, and to end, and error
* signals.
* @constructor
*/
function Observer(event, end, error, disposable) {
this._event = event;
this._end = end;
this._error = error;
this._disposable = disposable;
this.active = true;
}
Observer.prototype.event = function(t, x) {
if (!this.active) {
return;
}
this._event(x);
};
Observer.prototype.end = function(t, x) {
if (!this.active) {
return;
}
this.active = false;
disposeThen(this._end, this._error, this._disposable, x);
};
Observer.prototype.error = function(t, e) {
this.active = false;
disposeThen(this._error, this._error, this._disposable, e);
};
function disposeThen(end, error, disposable, x) {
Promise.resolve(disposable.dispose()).then(function () {
end(x);
}, error);
}
},{}],53:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Pipe;
/**
* A sink mixin that simply forwards event, end, and error to
* another sink.
* @param sink
* @constructor
*/
function Pipe(sink) {
this.sink = sink;
}
Pipe.prototype.event = function(t, x) {
return this.sink.event(t, x);
};
Pipe.prototype.end = function(t, x) {
return this.sink.end(t, x);
};
Pipe.prototype.error = function(t, e) {
return this.sink.error(t, e);
};
},{}],54:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = SafeSink;
function SafeSink(sink) {
this.sink = sink;
this.active = true;
}
SafeSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
this.sink.event(t, x);
};
SafeSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
this.disable();
this.sink.end(t, x);
};
SafeSink.prototype.error = function(t, e) {
this.disable();
this.sink.error(t, e);
};
SafeSink.prototype.disable = function() {
this.active = false;
return this.sink;
}
},{}],55:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var DeferredSink = require('../sink/DeferredSink');
var dispose = require('../disposable/dispose');
var tryEvent = require('./tryEvent');
module.exports = EventEmitterSource;
function EventEmitterSource(event, source) {
this.event = event;
this.source = source;
}
EventEmitterSource.prototype.run = function(sink, scheduler) {
// NOTE: Because EventEmitter allows events in the same call stack as
// a listener is added, use a DeferredSink to buffer events
// until the stack clears, then propagate. This maintains most.js's
// invariant that no event will be delivered in the same call stack
// as an observer begins observing.
var dsink = new DeferredSink(sink);
function addEventVariadic(a) {
var l = arguments.length;
if(l > 1) {
var arr = new Array(l);
for(var i=0; i<l; ++i) {
arr[i] = arguments[i];
}
tryEvent.tryEvent(scheduler.now(), arr, dsink);
} else {
tryEvent.tryEvent(scheduler.now(), a, dsink);
}
}
this.source.addListener(this.event, addEventVariadic);
return dispose.create(disposeEventEmitter, { target: this, addEvent: addEventVariadic });
};
function disposeEventEmitter(info) {
var target = info.target;
target.source.removeListener(target.event, info.addEvent);
}
},{"../disposable/dispose":34,"../sink/DeferredSink":50,"./tryEvent":66}],56:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var dispose = require('../disposable/dispose');
var tryEvent = require('./tryEvent');
module.exports = EventTargetSource;
function EventTargetSource(event, source, capture) {
this.event = event;
this.source = source;
this.capture = capture;
}
EventTargetSource.prototype.run = function(sink, scheduler) {
function addEvent(e) {
tryEvent.tryEvent(scheduler.now(), e, sink);
}
this.source.addEventListener(this.event, addEvent, this.capture);
return dispose.create(disposeEventTarget,
{ target: this, addEvent: addEvent });
};
function disposeEventTarget(info) {
var target = info.target;
target.source.removeEventListener(target.event, info.addEvent, target.capture);
}
},{"../disposable/dispose":34,"./tryEvent":66}],57:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.of = streamOf;
exports.empty = empty;
exports.never = never;
/**
* Stream containing only x
* @param {*} x
* @returns {Stream}
*/
function streamOf(x) {
return new Stream(new Just(x));
}
function Just(x) {
this.value = x;
}
Just.prototype.run = function(sink, scheduler) {
return scheduler.asap(new PropagateTask(runJust, this.value, sink));
};
function runJust(t, x, sink) {
sink.event(t, x);
sink.end(t, void 0);
}
/**
* Stream containing no events and ends immediately
* @returns {Stream}
*/
function empty() {
return EMPTY;
}
function EmptySource() {}
EmptySource.prototype.run = function(sink, scheduler) {
var task = PropagateTask.end(void 0, sink);
scheduler.asap(task);
return dispose.create(disposeEmpty, task);
};
function disposeEmpty(task) {
return task.dispose();
}
var EMPTY = new Stream(new EmptySource());
/**
* Stream containing no events and never ends
* @returns {Stream}
*/
function never() {
return NEVER;
}
function NeverSource() {}
NeverSource.prototype.run = function() {
return dispose.empty();
};
var NEVER = new Stream(new NeverSource());
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45}],58:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var MulticastSource = require('@most/multicast').MulticastSource;
var DeferredSink = require('../sink/DeferredSink');
var tryEvent = require('./tryEvent');
exports.create = create;
/**
* @deprecated
*/
function create(run) {
return new Stream(new MulticastSource(new SubscriberSource(run)));
}
function SubscriberSource(subscribe) {
this._subscribe = subscribe;
}
SubscriberSource.prototype.run = function(sink, scheduler) {
return new Subscription(new DeferredSink(sink), scheduler, this._subscribe);
};
function Subscription(sink, scheduler, subscribe) {
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
this._unsubscribe = this._init(subscribe);
}
Subscription.prototype._init = function(subscribe) {
var s = this;
try {
return subscribe(add, end, error);
} catch(e) {
error(e);
}
function add(x) {
s._add(x);
}
function end(x) {
s._end(x);
}
function error(e) {
s._error(e);
}
};
Subscription.prototype._add = function(x) {
if(!this.active) {
return;
}
tryEvent.tryEvent(this.scheduler.now(), x, this.sink);
};
Subscription.prototype._end = function(x) {
if(!this.active) {
return;
}
this.active = false;
tryEvent.tryEnd(this.scheduler.now(), x, this.sink);
};
Subscription.prototype._error = function(x) {
this.active = false;
this.sink.error(this.scheduler.now(), x);
};
Subscription.prototype.dispose = function() {
this.active = false;
if(typeof this._unsubscribe === 'function') {
return this._unsubscribe.call(void 0);
}
};
},{"../Stream":5,"../sink/DeferredSink":50,"./tryEvent":66,"@most/multicast":68}],59:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var fromArray = require('./fromArray').fromArray;
var isIterable = require('../iterable').isIterable;
var fromIterable = require('./fromIterable').fromIterable;
var getObservable = require('../observable/getObservable');
var fromObservable = require('../observable/fromObservable').fromObservable;
var isArrayLike = require('@most/prelude').isArrayLike;
exports.from = from;
function from(a) { // eslint-disable-line complexity
if(a instanceof Stream) {
return a;
}
var observable = getObservable(a);
if(observable != null) {
return fromObservable(observable);
}
if(Array.isArray(a) || isArrayLike(a)) {
return fromArray(a);
}
if(isIterable(a)) {
return fromIterable(a);
}
throw new TypeError('from(x) must be observable, iterable, or array-like: ' + a);
}
},{"../Stream":5,"../iterable":40,"../observable/fromObservable":41,"../observable/getObservable":42,"./fromArray":60,"./fromIterable":62,"@most/prelude":69}],60:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var PropagateTask = require('../scheduler/PropagateTask');
exports.fromArray = fromArray;
function fromArray (a) {
return new Stream(new ArraySource(a));
}
function ArraySource(a) {
this.array = a;
}
ArraySource.prototype.run = function(sink, scheduler) {
return scheduler.asap(new PropagateTask(runProducer, this.array, sink));
};
function runProducer(t, array, sink) {
for(var i=0, l=array.length; i<l && this.active; ++i) {
sink.event(t, array[i]);
}
this.active && end(t);
function end(t) {
sink.end(t);
}
}
},{"../Stream":5,"../scheduler/PropagateTask":45}],61:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var MulticastSource = require('@most/multicast').MulticastSource;
var EventTargetSource = require('./EventTargetSource');
var EventEmitterSource = require('./EventEmitterSource');
exports.fromEvent = fromEvent;
/**
* Create a stream from an EventTarget, such as a DOM Node, or EventEmitter.
* @param {String} event event type name, e.g. 'click'
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter
* @param {boolean?} useCapture for DOM events, whether to use
* capturing--passed as 3rd parameter to addEventListener.
* @returns {Stream} stream containing all events of the specified type
* from the source.
*/
function fromEvent(event, source /*, useCapture = false */) {
var s;
if(typeof source.addEventListener === 'function' && typeof source.removeEventListener === 'function') {
var capture = arguments.length > 2 && !!arguments[2];
s = new MulticastSource(new EventTargetSource(event, source, capture));
} else if(typeof source.addListener === 'function' && typeof source.removeListener === 'function') {
s = new EventEmitterSource(event, source);
} else {
throw new Error('source must support addEventListener/removeEventListener or addListener/removeListener');
}
return new Stream(s);
}
},{"../Stream":5,"./EventEmitterSource":55,"./EventTargetSource":56,"@most/multicast":68}],62:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var getIterator = require('../iterable').getIterator;
var PropagateTask = require('../scheduler/PropagateTask');
exports.fromIterable = fromIterable;
function fromIterable(iterable) {
return new Stream(new IterableSource(iterable));
}
function IterableSource(iterable) {
this.iterable = iterable;
}
IterableSource.prototype.run = function(sink, scheduler) {
return new IteratorProducer(getIterator(this.iterable), sink, scheduler);
};
function IteratorProducer(iterator, sink, scheduler) {
this.scheduler = scheduler;
this.iterator = iterator;
this.task = new PropagateTask(runProducer, this, sink);
scheduler.asap(this.task);
}
IteratorProducer.prototype.dispose = function() {
return this.task.dispose();
};
function runProducer(t, producer, sink) {
var x = producer.iterator.next();
if(x.done) {
sink.end(t, x.value);
} else {
sink.event(t, x.value);
}
producer.scheduler.asap(producer.task);
}
},{"../Stream":5,"../iterable":40,"../scheduler/PropagateTask":45}],63:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2014 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var base = require('@most/prelude');
exports.generate = generate;
/**
* Compute a stream using an *async* generator, which yields promises
* to control event times.
* @param f
* @returns {Stream}
*/
function generate(f /*, ...args */) {
return new Stream(new GenerateSource(f, base.tail(arguments)));
}
function GenerateSource(f, args) {
this.f = f;
this.args = args;
}
GenerateSource.prototype.run = function(sink, scheduler) {
return new Generate(this.f.apply(void 0, this.args), sink, scheduler);
};
function Generate(iterator, sink, scheduler) {
this.iterator = iterator;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
Promise.resolve(this).then(next).catch(err);
}
function next(generate, x) {
return generate.active ? handle(generate, generate.iterator.next(x)) : x;
}
function handle(generate, result) {
if (result.done) {
return generate.sink.end(generate.scheduler.now(), result.value);
}
return Promise.resolve(result.value).then(function (x) {
return emit(generate, x);
}, function(e) {
return error(generate, e);
});
}
function emit(generate, x) {
generate.sink.event(generate.scheduler.now(), x);
return next(generate, x);
}
function error(generate, e) {
return handle(generate, generate.iterator.throw(e));
}
Generate.prototype.dispose = function() {
this.active = false;
};
},{"../Stream":5,"@most/prelude":69}],64:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.iterate = iterate;
/**
* Compute a stream by iteratively calling f to produce values
* Event times may be controlled by returning a Promise from f
* @param {function(x:*):*|Promise<*>} f
* @param {*} x initial value
* @returns {Stream}
*/
function iterate(f, x) {
return new Stream(new IterateSource(f, x));
}
function IterateSource(f, x) {
this.f = f;
this.value = x;
}
IterateSource.prototype.run = function(sink, scheduler) {
return new Iterate(this.f, this.value, sink, scheduler);
};
function Iterate(f, initial, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var x = initial;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
function start(iterate) {
return stepIterate(iterate, x);
}
Promise.resolve(this).then(start).catch(err);
}
Iterate.prototype.dispose = function() {
this.active = false;
};
function stepIterate(iterate, x) {
iterate.sink.event(iterate.scheduler.now(), x);
if(!iterate.active) {
return x;
}
var f = iterate.f;
return Promise.resolve(f(x)).then(function(y) {
return continueIterate(iterate, y);
});
}
function continueIterate(iterate, x) {
return !iterate.active ? iterate.value : stepIterate(iterate, x);
}
},{"../Stream":5}],65:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
var MulticastSource = require('@most/multicast').MulticastSource;
var PropagateTask = require('../scheduler/PropagateTask');
exports.periodic = periodic;
/**
* Create a stream that emits the current time periodically
* @param {Number} period periodicity of events in millis
* @param {*) value value to emit each period
* @returns {Stream} new stream that emits the current time every period
*/
function periodic(period, value) {
return new Stream(new MulticastSource(new Periodic(period, value)));
}
function Periodic(period, value) {
this.period = period;
this.value = value;
}
Periodic.prototype.run = function(sink, scheduler) {
return scheduler.periodic(this.period, new PropagateTask(emit, this.value, sink));
};
function emit(t, x, sink) {
sink.event(t, x);
}
},{"../Stream":5,"../disposable/dispose":34,"../scheduler/PropagateTask":45,"@most/multicast":68}],66:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.tryEvent = tryEvent;
exports.tryEnd = tryEnd;
function tryEvent(t, x, sink) {
try {
sink.event(t, x);
} catch(e) {
sink.error(t, e);
}
}
function tryEnd(t, x, sink) {
try {
sink.end(t, x);
} catch(e) {
sink.error(t, e);
}
}
},{}],67:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.unfold = unfold;
/**
* Compute a stream by unfolding tuples of future values from a seed value
* Event times may be controlled by returning a Promise from f
* @param {function(seed:*):{value:*, seed:*, done:boolean}|Promise<{value:*, seed:*, done:boolean}>} f unfolding function accepts
* a seed and returns a new tuple with a value, new seed, and boolean done flag.
* If tuple.done is true, the stream will end.
* @param {*} seed seed value
* @returns {Stream} stream containing all value of all tuples produced by the
* unfolding function.
*/
function unfold(f, seed) {
return new Stream(new UnfoldSource(f, seed));
}
function UnfoldSource(f, seed) {
this.f = f;
this.value = seed;
}
UnfoldSource.prototype.run = function(sink, scheduler) {
return new Unfold(this.f, this.value, sink, scheduler);
};
function Unfold(f, x, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
function start(unfold) {
return stepUnfold(unfold, x);
}
Promise.resolve(this).then(start).catch(err);
}
Unfold.prototype.dispose = function() {
this.active = false;
};
function stepUnfold(unfold, x) {
var f = unfold.f;
return Promise.resolve(f(x)).then(function(tuple) {
return continueUnfold(unfold, tuple);
});
}
function continueUnfold(unfold, tuple) {
if(tuple.done) {
unfold.sink.end(unfold.scheduler.now(), tuple.value);
return tuple.value;
}
unfold.sink.event(unfold.scheduler.now(), tuple.value);
if(!unfold.active) {
return tuple.value;
}
return stepUnfold(unfold, tuple.seed);
}
},{"../Stream":5}],68:[function(require,module,exports){
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define('@most/multicast', ['exports', '@most/prelude'], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require('@most/prelude'));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.prelude);
global.mostMulticast = mod.exports;
}
})(this, function (exports, _prelude) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MulticastSource = undefined;
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var _createClass = 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);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var MulticastDisposable = function () {
function MulticastDisposable(source, sink) {
_classCallCheck(this, MulticastDisposable);
this.source = source;
this.sink = sink;
this.disposed = false;
}
_createClass(MulticastDisposable, [{
key: 'dispose',
value: function dispose() {
if (this.disposed) {
return;
}
this.disposed = true;
var remaining = this.source.remove(this.sink);
return remaining === 0 && this.source._dispose();
}
}]);
return MulticastDisposable;
}();
function tryEvent(t, x, sink) {
try {
sink.event(t, x);
} catch (e) {
sink.error(t, e);
}
}
function tryEnd(t, x, sink) {
try {
sink.end(t, x);
} catch (e) {
sink.error(t, e);
}
}
var dispose = function dispose(disposable) {
return disposable.dispose();
};
var emptyDisposable = {
dispose: function dispose() {}
};
var MulticastSource = function () {
function MulticastSource(source) {
_classCallCheck(this, MulticastSource);
this.source = source;
this.sinks = [];
this._disposable = emptyDisposable;
}
_createClass(MulticastSource, [{
key: 'run',
value: function run(sink, scheduler) {
var n = this.add(sink);
if (n === 1) {
this._disposable = this.source.run(this, scheduler);
}
return new MulticastDisposable(this, sink);
}
}, {
key: '_dispose',
value: function _dispose() {
var disposable = this._disposable;
this._disposable = emptyDisposable;
return Promise.resolve(disposable).then(dispose);
}
}, {
key: 'add',
value: function add(sink) {
this.sinks = (0, _prelude.append)(sink, this.sinks);
return this.sinks.length;
}
}, {
key: 'remove',
value: function remove(sink) {
var i = (0, _prelude.findIndex)(sink, this.sinks);
// istanbul ignore next
if (i >= 0) {
this.sinks = (0, _prelude.remove)(i, this.sinks);
}
return this.sinks.length;
}
}, {
key: 'event',
value: function event(time, value) {
var s = this.sinks;
if (s.length === 1) {
return s[0].event(time, value);
}
for (var i = 0; i < s.length; ++i) {
tryEvent(time, value, s[i]);
}
}
}, {
key: 'end',
value: function end(time, value) {
var s = this.sinks;
for (var i = 0; i < s.length; ++i) {
tryEnd(time, value, s[i]);
}
}
}, {
key: 'error',
value: function error(time, err) {
var s = this.sinks;
for (var i = 0; i < s.length; ++i) {
s[i].error(time, err);
}
}
}]);
return MulticastSource;
}();
function multicast(stream) {
var source = stream.source;
return source instanceof MulticastSource ? stream : new stream.constructor(new MulticastSource(source));
}
exports.MulticastSource = MulticastSource;
exports.default = multicast;
});
},{"@most/prelude":69}],69:[function(require,module,exports){
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define('@most/prelude', ['exports'], factory);
} else if (typeof exports !== "undefined") {
factory(exports);
} else {
var mod = {
exports: {}
};
factory(mod.exports);
global.mostPrelude = mod.exports;
}
})(this, function (exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
/** @license MIT License (c) copyright 2010-2016 original author or authors */
// Non-mutating array operations
// cons :: a -> [a] -> [a]
// a with x prepended
function cons(x, a) {
var l = a.length;
var b = new Array(l + 1);
b[0] = x;
for (var i = 0; i < l; ++i) {
b[i + 1] = a[i];
}
return b;
}
// append :: a -> [a] -> [a]
// a with x appended
function append(x, a) {
var l = a.length;
var b = new Array(l + 1);
for (var i = 0; i < l; ++i) {
b[i] = a[i];
}
b[l] = x;
return b;
}
// drop :: Int -> [a] -> [a]
// drop first n elements
function drop(n, a) {
// eslint-disable-line complexity
if (n < 0) {
throw new TypeError('n must be >= 0');
}
var l = a.length;
if (n === 0 || l === 0) {
return a;
}
if (n >= l) {
return [];
}
return unsafeDrop(n, a, l - n);
}
// unsafeDrop :: Int -> [a] -> Int -> [a]
// Internal helper for drop
function unsafeDrop(n, a, l) {
var b = new Array(l);
for (var i = 0; i < l; ++i) {
b[i] = a[n + i];
}
return b;
}
// tail :: [a] -> [a]
// drop head element
function tail(a) {
return drop(1, a);
}
// copy :: [a] -> [a]
// duplicate a (shallow duplication)
function copy(a) {
var l = a.length;
var b = new Array(l);
for (var i = 0; i < l; ++i) {
b[i] = a[i];
}
return b;
}
// map :: (a -> b) -> [a] -> [b]
// transform each element with f
function map(f, a) {
var l = a.length;
var b = new Array(l);
for (var i = 0; i < l; ++i) {
b[i] = f(a[i]);
}
return b;
}
// reduce :: (a -> b -> a) -> a -> [b] -> a
// accumulate via left-fold
function reduce(f, z, a) {
var r = z;
for (var i = 0, l = a.length; i < l; ++i) {
r = f(r, a[i], i);
}
return r;
}
// replace :: a -> Int -> [a]
// replace element at index
function replace(x, i, a) {
// eslint-disable-line complexity
if (i < 0) {
throw new TypeError('i must be >= 0');
}
var l = a.length;
var b = new Array(l);
for (var j = 0; j < l; ++j) {
b[j] = i === j ? x : a[j];
}
return b;
}
// remove :: Int -> [a] -> [a]
// remove element at index
function remove(i, a) {
// eslint-disable-line complexity
if (i < 0) {
throw new TypeError('i must be >= 0');
}
var l = a.length;
if (l === 0 || i >= l) {
// exit early if index beyond end of array
return a;
}
if (l === 1) {
// exit early if index in bounds and length === 1
return [];
}
return unsafeRemove(i, a, l - 1);
}
// unsafeRemove :: Int -> [a] -> Int -> [a]
// Internal helper to remove element at index
function unsafeRemove(i, a, l) {
var b = new Array(l);
var j = undefined;
for (j = 0; j < i; ++j) {
b[j] = a[j];
}
for (j = i; j < l; ++j) {
b[j] = a[j + 1];
}
return b;
}
// removeAll :: (a -> boolean) -> [a] -> [a]
// remove all elements matching a predicate
function removeAll(f, a) {
var l = a.length;
var b = new Array(l);
var j = 0;
for (var x, i = 0; i < l; ++i) {
x = a[i];
if (!f(x)) {
b[j] = x;
++j;
}
}
b.length = j;
return b;
}
// findIndex :: a -> [a] -> Int
// find index of x in a, from the left
function findIndex(x, a) {
for (var i = 0, l = a.length; i < l; ++i) {
if (x === a[i]) {
return i;
}
}
return -1;
}
// isArrayLike :: * -> boolean
// Return true iff x is array-like
function isArrayLike(x) {
return x != null && typeof x.length === 'number' && typeof x !== 'function';
}
/** @license MIT License (c) copyright 2010-2016 original author or authors */
// id :: a -> a
var id = function id(x) {
return x;
};
// compose :: (b -> c) -> (a -> b) -> (a -> c)
var compose = function compose(f, g) {
return function (x) {
return f(g(x));
};
};
// apply :: (a -> b) -> a -> b
var apply = function apply(f, x) {
return f(x);
};
// curry2 :: ((a, b) -> c) -> (a -> b -> c)
function curry2(f) {
function curried(a, b) {
switch (arguments.length) {
case 0:
return curried;
case 1:
return function (b) {
return f(a, b);
};
default:
return f(a, b);
}
}
return curried;
}
// curry3 :: ((a, b, c) -> d) -> (a -> b -> c -> d)
function curry3(f) {
function curried(a, b, c) {
// eslint-disable-line complexity
switch (arguments.length) {
case 0:
return curried;
case 1:
return curry2(function (b, c) {
return f(a, b, c);
});
case 2:
return function (c) {
return f(a, b, c);
};
default:
return f(a, b, c);
}
}
return curried;
}
exports.cons = cons;
exports.append = append;
exports.drop = drop;
exports.tail = tail;
exports.copy = copy;
exports.map = map;
exports.reduce = reduce;
exports.replace = replace;
exports.remove = remove;
exports.removeAll = removeAll;
exports.findIndex = findIndex;
exports.isArrayLike = isArrayLike;
exports.id = id;
exports.compose = compose;
exports.apply = apply;
exports.curry2 = curry2;
exports.curry3 = curry3;
});
},{}],70:[function(require,module,exports){
(function (global){
/* global window */
'use strict';
module.exports = require('./ponyfill')(global || window || this);
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcG9ueWZpbGwnKShnbG9iYWwgfHwgd2luZG93IHx8IHRoaXMpO1xuIl19
},{"./ponyfill":71}],71:[function(require,module,exports){
'use strict';
module.exports = function symbolObservablePonyfill(root) {
var result;
var Symbol = root.Symbol;
if (typeof Symbol === 'function') {
if (Symbol.observable) {
result = Symbol.observable;
} else {
result = Symbol('observable');
Symbol.observable = result;
}
} else {
result = '@@observable';
}
return result;
};
},{}],"most":[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('./lib/Stream');
var base = require('@most/prelude');
var core = require('./lib/source/core');
var from = require('./lib/source/from').from;
var periodic = require('./lib/source/periodic').periodic;
var symbolObservable = require('symbol-observable');
/**
* Core stream type
* @type {Stream}
*/
exports.Stream = Stream;
// Add of and empty to constructor for fantasy-land compat
exports.of = Stream.of = core.of;
exports.just = core.of; // easier ES6 import alias
exports.empty = Stream.empty = core.empty;
exports.never = core.never;
exports.from = from;
exports.periodic = periodic;
//-----------------------------------------------------------------------
// Draft ES Observable proposal interop
// https://github.com/zenparsing/es-observable
var subscribe = require('./lib/observable/subscribe').subscribe;
Stream.prototype.subscribe = function(subscriber) {
return subscribe(subscriber, this);
};
Stream.prototype[symbolObservable] = function() {
return this;
}
//-----------------------------------------------------------------------
// Fluent adapter
var thru = require('./lib/combinator/thru').thru;
/**
* Adapt a functional stream transform to fluent style.
* It applies f to the this stream object
* @param {function(s: Stream): Stream} f function that
* receives the stream itself and must return a new stream
* @return {Stream}
*/
Stream.prototype.thru = function(f) {
return thru(f, this);
}
//-----------------------------------------------------------------------
// Creating
var create = require('./lib/source/create');
/**
* @deprecated
* Create a stream by imperatively pushing events.
* @param {function(add:function(x), end:function(e)):function} run function
* that will receive 2 functions as arguments, the first to add new values to the
* stream and the second to end the stream. It may *return* a function that
* will be called once all consumers have stopped observing the stream.
* @returns {Stream} stream containing all events added by run before end
*/
exports.create = create.create;
//-----------------------------------------------------------------------
// Adapting other sources
var events = require('./lib/source/fromEvent');
/**
* Create a stream of events from the supplied EventTarget or EventEmitter
* @param {String} event event name
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter. The source
* must support either addEventListener/removeEventListener (w3c EventTarget:
* http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget),
* or addListener/removeListener (node EventEmitter: http://nodejs.org/api/events.html)
* @returns {Stream} stream of events of the specified type from the source
*/
exports.fromEvent = events.fromEvent;
//-----------------------------------------------------------------------
// Observing
var observe = require('./lib/combinator/observe');
exports.observe = observe.observe;
exports.forEach = observe.observe;
exports.drain = observe.drain;
/**
* Process all the events in the stream
* @returns {Promise} promise that fulfills when the stream ends, or rejects
* if the stream fails with an unhandled error.
*/
Stream.prototype.observe = Stream.prototype.forEach = function(f) {
return observe.observe(f, this);
};
/**
* Consume all events in the stream, without providing a function to process each.
* This causes a stream to become active and begin emitting events, and is useful
* in cases where all processing has been setup upstream via other combinators, and
* there is no need to process the terminal events.
* @returns {Promise} promise that fulfills when the stream ends, or rejects
* if the stream fails with an unhandled error.
*/
Stream.prototype.drain = function() {
return observe.drain(this);
};
//-------------------------------------------------------
var loop = require('./lib/combinator/loop').loop;
exports.loop = loop;
/**
* Generalized feedback loop. Call a stepper function for each event. The stepper
* will be called with 2 params: the current seed and the an event value. It must
* return a new { seed, value } pair. The `seed` will be fed back into the next
* invocation of stepper, and the `value` will be propagated as the event value.
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function
* @param {*} seed initial seed value passed to first stepper call
* @returns {Stream} new stream whose values are the `value` field of the objects
* returned by the stepper
*/
Stream.prototype.loop = function(stepper, seed) {
return loop(stepper, seed, this);
};
//-------------------------------------------------------
var accumulate = require('./lib/combinator/accumulate');
exports.scan = accumulate.scan;
exports.reduce = accumulate.reduce;
/**
* Create a stream containing successive reduce results of applying f to
* the previous reduce result and the current stream item.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @returns {Stream} new stream containing successive reduce results
*/
Stream.prototype.scan = function(f, initial) {
return accumulate.scan(f, initial, this);
};
/**
* Reduce the stream to produce a single result. Note that reducing an infinite
* stream will return a Promise that never fulfills, but that may reject if an error
* occurs.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial optional initial value
* @returns {Promise} promise for the file result of the reduce
*/
Stream.prototype.reduce = function(f, initial) {
return accumulate.reduce(f, initial, this);
};
//-----------------------------------------------------------------------
// Building and extending
var unfold = require('./lib/source/unfold');
var iterate = require('./lib/source/iterate');
var generate = require('./lib/source/generate');
var build = require('./lib/combinator/build');
exports.unfold = unfold.unfold;
exports.iterate = iterate.iterate;
exports.generate = generate.generate;
exports.cycle = build.cycle;
exports.concat = build.concat;
exports.startWith = build.cons;
/**
* @deprecated
* Tie this stream into a circle, thus creating an infinite stream
* @returns {Stream} new infinite stream
*/
Stream.prototype.cycle = function() {
return build.cycle(this);
};
/**
* @param {Stream} tail
* @returns {Stream} new stream containing all items in this followed by
* all items in tail
*/
Stream.prototype.concat = function(tail) {
return build.concat(this, tail);
};
/**
* @param {*} x value to prepend
* @returns {Stream} a new stream with x prepended
*/
Stream.prototype.startWith = function(x) {
return build.cons(x, this);
};
//-----------------------------------------------------------------------
// Transforming
var transform = require('./lib/combinator/transform');
var applicative = require('./lib/combinator/applicative');
exports.map = transform.map;
exports.constant = transform.constant;
exports.tap = transform.tap;
exports.ap = applicative.ap;
/**
* Transform each value in the stream by applying f to each
* @param {function(*):*} f mapping function
* @returns {Stream} stream containing items transformed by f
*/
Stream.prototype.map = function(f) {
return transform.map(f, this);
};
/**
* Assume this stream contains functions, and apply each function to each item
* in the provided stream. This generates, in effect, a cross product.
* @param {Stream} xs stream of items to which
* @returns {Stream} stream containing the cross product of items
*/
Stream.prototype.ap = function(xs) {
return applicative.ap(this, xs);
};
/**
* Replace each value in the stream with x
* @param {*} x
* @returns {Stream} stream containing items replaced with x
*/
Stream.prototype.constant = function(x) {
return transform.constant(x, this);
};
/**
* Perform a side effect for each item in the stream
* @param {function(x:*):*} f side effect to execute for each item. The
* return value will be discarded.
* @returns {Stream} new stream containing the same items as this stream
*/
Stream.prototype.tap = function(f) {
return transform.tap(f, this);
};
//-----------------------------------------------------------------------
// Transducer support
var transduce = require('./lib/combinator/transduce');
exports.transduce = transduce.transduce;
/**
* Transform this stream by passing its events through a transducer.
* @param {function} transducer transducer function
* @return {Stream} stream of events transformed by the transducer
*/
Stream.prototype.transduce = function(transducer) {
return transduce.transduce(transducer, this);
};
//-----------------------------------------------------------------------
// FlatMapping
var flatMap = require('./lib/combinator/flatMap');
exports.flatMap = exports.chain = flatMap.flatMap;
exports.join = flatMap.join;
/**
* Map each value in the stream to a new stream, and merge it into the
* returned outer stream. Event arrival times are preserved.
* @param {function(x:*):Stream} f chaining function, must return a Stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
Stream.prototype.flatMap = Stream.prototype.chain = function(f) {
return flatMap.flatMap(f, this);
};
/**
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer. Event arrival times are preserved.
* @returns {Stream<X>} new stream containing all events of all inner streams
*/
Stream.prototype.join = function() {
return flatMap.join(this);
};
var continueWith = require('./lib/combinator/continueWith').continueWith;
exports.continueWith = continueWith;
exports.flatMapEnd = continueWith;
/**
* Map the end event to a new stream, and begin emitting its values.
* @param {function(x:*):Stream} f function that receives the end event value,
* and *must* return a new Stream to continue with.
* @returns {Stream} new stream that emits all events from the original stream,
* followed by all events from the stream returned by f.
*/
Stream.prototype.continueWith = Stream.prototype.flatMapEnd = function(f) {
return continueWith(f, this);
};
var concatMap = require('./lib/combinator/concatMap').concatMap;
exports.concatMap = concatMap;
Stream.prototype.concatMap = function(f) {
return concatMap(f, this);
};
//-----------------------------------------------------------------------
// Concurrent merging
var mergeConcurrently = require('./lib/combinator/mergeConcurrently');
exports.mergeConcurrently = mergeConcurrently.mergeConcurrently;
/**
* Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer, limiting the number of inner streams that may
* be active concurrently.
* @param {number} concurrency at most this many inner streams will be
* allowed to be active concurrently.
* @return {Stream<X>} new stream containing all events of all inner
* streams, with limited concurrency.
*/
Stream.prototype.mergeConcurrently = function(concurrency) {
return mergeConcurrently.mergeConcurrently(concurrency, this);
};
//-----------------------------------------------------------------------
// Merging
var merge = require('./lib/combinator/merge');
exports.merge = merge.merge;
exports.mergeArray = merge.mergeArray;
/**
* Merge this stream and all the provided streams
* @returns {Stream} stream containing items from this stream and s in time
* order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
Stream.prototype.merge = function(/*...streams*/) {
return merge.mergeArray(base.cons(this, arguments));
};
//-----------------------------------------------------------------------
// Combining
var combine = require('./lib/combinator/combine');
exports.combine = combine.combine;
exports.combineArray = combine.combineArray;
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
Stream.prototype.combine = function(f /*, ...streams*/) {
return combine.combineArray(f, base.replace(this, 0, arguments));
};
//-----------------------------------------------------------------------
// Sampling
var sample = require('./lib/combinator/sample');
exports.sample = sample.sample;
exports.sampleWith = sample.sampleWith;
/**
* When an event arrives on sampler, emit the latest event value from stream.
* @param {Stream} sampler stream of events at whose arrival time
* signal's latest value will be propagated
* @returns {Stream} sampled stream of values
*/
Stream.prototype.sampleWith = function(sampler) {
return sample.sampleWith(sampler, this);
};
/**
* When an event arrives on this stream, emit the result of calling f with the latest
* values of all streams being sampled
* @param {function(...values):*} f function to apply to each set of sampled values
* @returns {Stream} stream of sampled and transformed values
*/
Stream.prototype.sample = function(f /* ...streams */) {
return sample.sampleArray(f, this, base.tail(arguments));
};
//-----------------------------------------------------------------------
// Zipping
var zip = require('./lib/combinator/zip');
exports.zip = zip.zip;
/**
* Pair-wise combine items with those in s. Given 2 streams:
* [1,2,3] zipWith f [4,5,6] -> [f(1,4),f(2,5),f(3,6)]
* Note: zip causes fast streams to buffer and wait for slow streams.
* @param {function(a:Stream, b:Stream, ...):*} f function to combine items
* @returns {Stream} new stream containing pairs
*/
Stream.prototype.zip = function(f /*, ...streams*/) {
return zip.zipArray(f, base.replace(this, 0, arguments));
};
//-----------------------------------------------------------------------
// Switching
var switchLatest = require('./lib/combinator/switch').switch;
exports.switch = switchLatest;
exports.switchLatest = switchLatest;
/**
* Given a stream of streams, return a new stream that adopts the behavior
* of the most recent inner stream.
* @returns {Stream} switching stream
*/
Stream.prototype.switch = Stream.prototype.switchLatest = function() {
return switchLatest(this);
};
//-----------------------------------------------------------------------
// Filtering
var filter = require('./lib/combinator/filter');
exports.filter = filter.filter;
exports.skipRepeats = exports.distinct = filter.skipRepeats;
exports.skipRepeatsWith = exports.distinctBy = filter.skipRepeatsWith;
/**
* Retain only items matching a predicate
* stream: -12345678-
* filter(x => x % 2 === 0, stream): --2-4-6-8-
* @param {function(x:*):boolean} p filtering predicate called for each item
* @returns {Stream} stream containing only items for which predicate returns truthy
*/
Stream.prototype.filter = function(p) {
return filter.filter(p, this);
};
/**
* Skip repeated events, using === to compare items
* stream: -abbcd-
* distinct(stream): -ab-cd-
* @returns {Stream} stream with no repeated events
*/
Stream.prototype.skipRepeats = function() {
return filter.skipRepeats(this);
};
/**
* Skip repeated events, using supplied equals function to compare items
* @param {function(a:*, b:*):boolean} equals function to compare items
* @returns {Stream} stream with no repeated events
*/
Stream.prototype.skipRepeatsWith = function(equals) {
return filter.skipRepeatsWith(equals, this);
};
//-----------------------------------------------------------------------
// Slicing
var slice = require('./lib/combinator/slice');
exports.take = slice.take;
exports.skip = slice.skip;
exports.slice = slice.slice;
exports.takeWhile = slice.takeWhile;
exports.skipWhile = slice.skipWhile;
/**
* stream: -abcd-
* take(2, stream): -ab|
* @param {Number} n take up to this many events
* @returns {Stream} stream containing at most the first n items from this stream
*/
Stream.prototype.take = function(n) {
return slice.take(n, this);
};
/**
* stream: -abcd->
* skip(2, stream): ---cd->
* @param {Number} n skip this many events
* @returns {Stream} stream not containing the first n events
*/
Stream.prototype.skip = function(n) {
return slice.skip(n, this);
};
/**
* Slice a stream by event index. Equivalent to, but more efficient than
* stream.take(end).skip(start);
* NOTE: Negative start and end are not supported
* @param {Number} start skip all events before the start index
* @param {Number} end allow all events from the start index to the end index
* @returns {Stream} stream containing items where start <= index < end
*/
Stream.prototype.slice = function(start, end) {
return slice.slice(start, end, this);
};
/**
* stream: -123451234->
* takeWhile(x => x < 5, stream): -1234|
* @param {function(x:*):boolean} p predicate
* @returns {Stream} stream containing items up to, but not including, the
* first item for which p returns falsy.
*/
Stream.prototype.takeWhile = function(p) {
return slice.takeWhile(p, this);
};
/**
* stream: -123451234->
* skipWhile(x => x < 5, stream): -----51234->
* @param {function(x:*):boolean} p predicate
* @returns {Stream} stream containing items following *and including* the
* first item for which p returns falsy.
*/
Stream.prototype.skipWhile = function(p) {
return slice.skipWhile(p, this);
};
//-----------------------------------------------------------------------
// Time slicing
var timeslice = require('./lib/combinator/timeslice');
exports.until = exports.takeUntil = timeslice.takeUntil;
exports.since = exports.skipUntil = timeslice.skipUntil;
exports.during = timeslice.during;
/**
* stream: -a-b-c-d-e-f-g->
* signal: -------x
* takeUntil(signal, stream): -a-b-c-|
* @param {Stream} signal retain only events in stream before the first
* event in signal
* @returns {Stream} new stream containing only events that occur before
* the first event in signal.
*/
Stream.prototype.until = Stream.prototype.takeUntil = function(signal) {
return timeslice.takeUntil(signal, this);
};
/**
* stream: -a-b-c-d-e-f-g->
* signal: -------x
* takeUntil(signal, stream): -------d-e-f-g->
* @param {Stream} signal retain only events in stream at or after the first
* event in signal
* @returns {Stream} new stream containing only events that occur after
* the first event in signal.
*/
Stream.prototype.since = Stream.prototype.skipUntil = function(signal) {
return timeslice.skipUntil(signal, this);
};
/**
* stream: -a-b-c-d-e-f-g->
* timeWindow: -----s
* s: -----t
* stream.during(timeWindow): -----c-d-e-|
* @param {Stream<Stream>} timeWindow a stream whose first event (s) represents
* the window start time. That event (s) is itself a stream whose first event (t)
* represents the window end time
* @returns {Stream} new stream containing only events within the provided timespan
*/
Stream.prototype.during = function(timeWindow) {
return timeslice.during(timeWindow, this);
};
//-----------------------------------------------------------------------
// Delaying
var delay = require('./lib/combinator/delay').delay;
exports.delay = delay;
/**
* @param {Number} delayTime milliseconds to delay each item
* @returns {Stream} new stream containing the same items, but delayed by ms
*/
Stream.prototype.delay = function(delayTime) {
return delay(delayTime, this);
};
//-----------------------------------------------------------------------
// Getting event timestamp
var timestamp = require('./lib/combinator/timestamp').timestamp;
exports.timestamp = timestamp;
/**
* Expose event timestamps into the stream. Turns a Stream<X> into
* Stream<{time:t, value:X}>
* @returns {Stream<{time:number, value:*}>}
*/
Stream.prototype.timestamp = function() {
return timestamp(this);
};
//-----------------------------------------------------------------------
// Rate limiting
var limit = require('./lib/combinator/limit');
exports.throttle = limit.throttle;
exports.debounce = limit.debounce;
/**
* Limit the rate of events
* stream: abcd----abcd----
* throttle(2, stream): a-c-----a-c-----
* @param {Number} period time to suppress events
* @returns {Stream} new stream that skips events for throttle period
*/
Stream.prototype.throttle = function(period) {
return limit.throttle(period, this);
};
/**
* Wait for a burst of events to subside and emit only the last event in the burst
* stream: abcd----abcd----
* debounce(2, stream): -----d-------d--
* @param {Number} period events occuring more frequently than this
* on the provided scheduler will be suppressed
* @returns {Stream} new debounced stream
*/
Stream.prototype.debounce = function(period) {
return limit.debounce(period, this);
};
//-----------------------------------------------------------------------
// Awaiting Promises
var promises = require('./lib/combinator/promises');
exports.fromPromise = promises.fromPromise;
exports.await = promises.awaitPromises;
/**
* Await promises, turning a Stream<Promise<X>> into Stream<X>. Preserves
* event order, but timeshifts events based on promise resolution time.
* @returns {Stream<X>} stream containing non-promise values
*/
Stream.prototype.await = function() {
return promises.awaitPromises(this);
};
//-----------------------------------------------------------------------
// Error handling
var errors = require('./lib/combinator/errors');
exports.recoverWith = errors.flatMapError;
exports.flatMapError = errors.flatMapError;
exports.throwError = errors.throwError;
/**
* If this stream encounters an error, recover and continue with items from stream
* returned by f.
* stream: -a-b-c-X-
* f(X): d-e-f-g-
* flatMapError(f, stream): -a-b-c-d-e-f-g-
* @param {function(error:*):Stream} f function which returns a new stream
* @returns {Stream} new stream which will recover from an error by calling f
*/
Stream.prototype.recoverWith = Stream.prototype.flatMapError = function(f) {
return errors.flatMapError(f, this);
};
//-----------------------------------------------------------------------
// Multicasting
var multicast = require('@most/multicast').default;
exports.multicast = multicast;
/**
* Transform the stream into multicast stream. That means that many subscribers
* to the stream will not cause multiple invocations of the internal machinery.
* @returns {Stream} new stream which will multicast events to all observers.
*/
Stream.prototype.multicast = function() {
return multicast(this);
};
},{"./lib/Stream":5,"./lib/combinator/accumulate":6,"./lib/combinator/applicative":7,"./lib/combinator/build":8,"./lib/combinator/combine":9,"./lib/combinator/concatMap":10,"./lib/combinator/continueWith":11,"./lib/combinator/delay":12,"./lib/combinator/errors":13,"./lib/combinator/filter":14,"./lib/combinator/flatMap":15,"./lib/combinator/limit":16,"./lib/combinator/loop":17,"./lib/combinator/merge":18,"./lib/combinator/mergeConcurrently":19,"./lib/combinator/observe":20,"./lib/combinator/promises":21,"./lib/combinator/sample":22,"./lib/combinator/slice":23,"./lib/combinator/switch":24,"./lib/combinator/thru":25,"./lib/combinator/timeslice":26,"./lib/combinator/timestamp":27,"./lib/combinator/transduce":28,"./lib/combinator/transform":29,"./lib/combinator/zip":30,"./lib/observable/subscribe":43,"./lib/source/core":57,"./lib/source/create":58,"./lib/source/from":59,"./lib/source/fromEvent":61,"./lib/source/generate":63,"./lib/source/iterate":64,"./lib/source/periodic":65,"./lib/source/unfold":67,"@most/multicast":68,"@most/prelude":69,"symbol-observable":70}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImxpYi9MaW5rZWRMaXN0LmpzIiwibGliL1Byb21pc2UuanMiLCJsaWIvUXVldWUuanMiLCJsaWIvU3RyZWFtLmpzIiwibGliL2NvbWJpbmF0b3IvYWNjdW11bGF0ZS5qcyIsImxpYi9jb21iaW5hdG9yL2FwcGxpY2F0aXZlLmpzIiwibGliL2NvbWJpbmF0b3IvYnVpbGQuanMiLCJsaWIvY29tYmluYXRvci9jb21iaW5lLmpzIiwibGliL2NvbWJpbmF0b3IvY29uY2F0TWFwLmpzIiwibGliL2NvbWJpbmF0b3IvY29udGludWVXaXRoLmpzIiwibGliL2NvbWJpbmF0b3IvZGVsYXkuanMiLCJsaWIvY29tYmluYXRvci9lcnJvcnMuanMiLCJsaWIvY29tYmluYXRvci9maWx0ZXIuanMiLCJsaWIvY29tYmluYXRvci9mbGF0TWFwLmpzIiwibGliL2NvbWJpbmF0b3IvbGltaXQuanMiLCJsaWIvY29tYmluYXRvci9sb29wLmpzIiwibGliL2NvbWJpbmF0b3IvbWVyZ2UuanMiLCJsaWIvY29tYmluYXRvci9tZXJnZUNvbmN1cnJlbnRseS5qcyIsImxpYi9jb21iaW5hdG9yL29ic2VydmUuanMiLCJsaWIvY29tYmluYXRvci9wcm9taXNlcy5qcyIsImxpYi9jb21iaW5hdG9yL3NhbXBsZS5qcyIsImxpYi9jb21iaW5hdG9yL3NsaWNlLmpzIiwibGliL2NvbWJpbmF0b3Ivc3dpdGNoLmpzIiwibGliL2NvbWJpbmF0b3IvdGhydS5qcyIsImxpYi9jb21iaW5hdG9yL3RpbWVzbGljZS5qcyIsImxpYi9jb21iaW5hdG9yL3RpbWVzdGFtcC5qcyIsImxpYi9jb21iaW5hdG9yL3RyYW5zZHVjZS5qcyIsImxpYi9jb21iaW5hdG9yL3RyYW5zZm9ybS5qcyIsImxpYi9jb21iaW5hdG9yL3ppcC5qcyIsImxpYi9kZWZlci5qcyIsImxpYi9kaXNwb3NhYmxlL0Rpc3Bvc2FibGUuanMiLCJsaWIvZGlzcG9zYWJsZS9TZXR0YWJsZURpc3Bvc2FibGUuanMiLCJsaWIvZGlzcG9zYWJsZS9kaXNwb3NlLmpzIiwibGliL2ZhdGFsRXJyb3IuanMiLCJsaWIvZnVzaW9uL0ZpbHRlci5qcyIsImxpYi9mdXNpb24vRmlsdGVyTWFwLmpzIiwibGliL2Z1c2lvbi9NYXAuanMiLCJsaWIvaW52b2tlLmpzIiwibGliL2l0ZXJhYmxlLmpzIiwibGliL29ic2VydmFibGUvZnJvbU9ic2VydmFibGUuanMiLCJsaWIvb2JzZXJ2YWJsZS9nZXRPYnNlcnZhYmxlLmpzIiwibGliL29ic2VydmFibGUvc3Vic2NyaWJlLmpzIiwibGliL3J1blNvdXJjZS5qcyIsImxpYi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzay5qcyIsImxpYi9zY2hlZHVsZXIvU2NoZWR1bGVyLmpzIiwibGliL3NjaGVkdWxlci9kZWZhdWx0U2NoZWR1bGVyLmpzIiwibGliL3NjaGVkdWxlci9ub2RlVGltZXIuanMiLCJsaWIvc2NoZWR1bGVyL3RpbWVvdXRUaW1lci5qcyIsImxpYi9zaW5rL0RlZmVycmVkU2luay5qcyIsImxpYi9zaW5rL0luZGV4U2luay5qcyIsImxpYi9zaW5rL09ic2VydmVyLmpzIiwibGliL3NpbmsvUGlwZS5qcyIsImxpYi9zaW5rL1NhZmVTaW5rLmpzIiwibGliL3NvdXJjZS9FdmVudEVtaXR0ZXJTb3VyY2UuanMiLCJsaWIvc291cmNlL0V2ZW50VGFyZ2V0U291cmNlLmpzIiwibGliL3NvdXJjZS9jb3JlLmpzIiwibGliL3NvdXJjZS9jcmVhdGUuanMiLCJsaWIvc291cmNlL2Zyb20uanMiLCJsaWIvc291cmNlL2Zyb21BcnJheS5qcyIsImxpYi9zb3VyY2UvZnJvbUV2ZW50LmpzIiwibGliL3NvdXJjZS9mcm9tSXRlcmFibGUuanMiLCJsaWIvc291cmNlL2dlbmVyYXRlLmpzIiwibGliL3NvdXJjZS9pdGVyYXRlLmpzIiwibGliL3NvdXJjZS9wZXJpb2RpYy5qcyIsImxpYi9zb3VyY2UvdHJ5RXZlbnQuanMiLCJsaWIvc291cmNlL3VuZm9sZC5qcyIsIm5vZGVfbW9kdWxlcy9AbW9zdC9tdWx0aWNhc3QvZGlzdC9tdWx0aWNhc3QuanMiLCJub2RlX21vZHVsZXMvQG1vc3QvcHJlbHVkZS9kaXN0L3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvcG9ueWZpbGwuanMiLCJtb3N0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuTXV0YXRpb25PYnNlcnZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICBpZiAoY2FuTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICB2YXIgaGlkZGVuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXVlTGlzdCA9IHF1ZXVlLnNsaWNlKCk7XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgcXVldWVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGhpZGRlbkRpdiwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaWRkZW5EaXYuc2V0QXR0cmlidXRlKCd5ZXMnLCAnbm8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmtlZExpc3Q7XG5cbi8qKlxuICogRG91Ymx5IGxpbmtlZCBsaXN0XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTGlua2VkTGlzdCgpIHtcblx0dGhpcy5oZWFkID0gbnVsbDtcblx0dGhpcy5sZW5ndGggPSAwO1xufVxuXG4vKipcbiAqIEFkZCBhIG5vZGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICogQHBhcmFtIHt7cHJldjpPYmplY3R8bnVsbCwgbmV4dDpPYmplY3R8bnVsbCwgZGlzcG9zZTpmdW5jdGlvbn19IHggbm9kZSB0byBhZGRcbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oeCkge1xuXHRpZih0aGlzLmhlYWQgIT09IG51bGwpIHtcblx0XHR0aGlzLmhlYWQucHJldiA9IHg7XG5cdFx0eC5uZXh0ID0gdGhpcy5oZWFkO1xuXHR9XG5cdHRoaXMuaGVhZCA9IHg7XG5cdCsrdGhpcy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgcHJvdmlkZWQgbm9kZSBmcm9tIHRoZSBsaXN0XG4gKiBAcGFyYW0ge3twcmV2Ok9iamVjdHxudWxsLCBuZXh0Ok9iamVjdHxudWxsLCBkaXNwb3NlOmZ1bmN0aW9ufX0geCBub2RlIHRvIHJlbW92ZVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih4KSB7XG5cdC0tdGhpcy5sZW5ndGg7XG5cdGlmKHggPT09IHRoaXMuaGVhZCkge1xuXHRcdHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuXHR9XG5cdGlmKHgubmV4dCAhPT0gbnVsbCkge1xuXHRcdHgubmV4dC5wcmV2ID0geC5wcmV2O1xuXHRcdHgubmV4dCA9IG51bGw7XG5cdH1cblx0aWYoeC5wcmV2ICE9PSBudWxsKSB7XG5cdFx0eC5wcmV2Lm5leHQgPSB4Lm5leHQ7XG5cdFx0eC5wcmV2ID0gbnVsbDtcblx0fVxufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZmYgdGhlcmUgYXJlIG5vIG5vZGVzIGluIHRoZSBsaXN0XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xufTtcblxuLyoqXG4gKiBEaXNwb3NlIGFsbCBub2Rlc1xuICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCBmdWxmaWxscyB3aGVuIGFsbCBub2RlcyBoYXZlIGJlZW4gZGlzcG9zZWQsXG4gKiAgb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGlzcG9zaW5nXG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0aWYodGhpcy5pc0VtcHR5KCkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHR2YXIgcHJvbWlzZXMgPSBbXTtcblx0dmFyIHggPSB0aGlzLmhlYWQ7XG5cdHRoaXMuaGVhZCA9IG51bGw7XG5cdHRoaXMubGVuZ3RoID0gMDtcblxuXHR3aGlsZSh4ICE9PSBudWxsKSB7XG5cdFx0cHJvbWlzZXMucHVzaCh4LmRpc3Bvc2UoKSk7XG5cdFx0eCA9IHgubmV4dDtcblx0fVxuXG5cdHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbmV4cG9ydHMuaXNQcm9taXNlID0gaXNQcm9taXNlO1xuXG5mdW5jdGlvbiBpc1Byb21pc2UocCkge1xuXHRyZXR1cm4gcCAhPT0gbnVsbCAmJiB0eXBlb2YgcCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2RlcXVlXG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG5cbmZ1bmN0aW9uIFF1ZXVlKGNhcFBvdzIpIHtcblx0dGhpcy5fY2FwYWNpdHkgPSBjYXBQb3cyfHwzMjtcblx0dGhpcy5fbGVuZ3RoID0gMDtcblx0dGhpcy5faGVhZCA9IDA7XG59XG5cblF1ZXVlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIGxlbiA9IHRoaXMuX2xlbmd0aDtcblx0dGhpcy5fY2hlY2tDYXBhY2l0eShsZW4gKyAxKTtcblxuXHR2YXIgaSA9ICh0aGlzLl9oZWFkICsgbGVuKSAmICh0aGlzLl9jYXBhY2l0eSAtIDEpO1xuXHR0aGlzW2ldID0geDtcblx0dGhpcy5fbGVuZ3RoID0gbGVuICsgMTtcbn07XG5cblF1ZXVlLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuXHR2YXIgeCA9IHRoaXNbaGVhZF07XG5cblx0dGhpc1toZWFkXSA9IHZvaWQgMDtcblx0dGhpcy5faGVhZCA9IChoZWFkICsgMSkgJiAodGhpcy5fY2FwYWNpdHkgLSAxKTtcblx0dGhpcy5fbGVuZ3RoLS07XG5cdHJldHVybiB4O1xufTtcblxuUXVldWUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuX2xlbmd0aCA9PT0gMDtcbn07XG5cblF1ZXVlLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB0aGlzLl9sZW5ndGg7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUuX2NoZWNrQ2FwYWNpdHkgPSBmdW5jdGlvbiAoc2l6ZSkge1xuXHRpZiAodGhpcy5fY2FwYWNpdHkgPCBzaXplKSB7XG5cdFx0dGhpcy5fZW5zdXJlQ2FwYWNpdHkodGhpcy5fY2FwYWNpdHkgPDwgMSk7XG5cdH1cbn07XG5cblF1ZXVlLnByb3RvdHlwZS5fZW5zdXJlQ2FwYWNpdHkgPSBmdW5jdGlvbiAoY2FwYWNpdHkpIHtcblx0dmFyIG9sZENhcGFjaXR5ID0gdGhpcy5fY2FwYWNpdHk7XG5cdHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG5cblx0dmFyIGxhc3QgPSB0aGlzLl9oZWFkICsgdGhpcy5fbGVuZ3RoO1xuXG5cdGlmIChsYXN0ID4gb2xkQ2FwYWNpdHkpIHtcblx0XHRjb3B5KHRoaXMsIDAsIHRoaXMsIG9sZENhcGFjaXR5LCBsYXN0ICYgKG9sZENhcGFjaXR5IC0gMSkpO1xuXHR9XG59O1xuXG5mdW5jdGlvbiBjb3B5KHNyYywgc3JjSW5kZXgsIGRzdCwgZHN0SW5kZXgsIGxlbikge1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgKytqKSB7XG5cdFx0ZHN0W2ogKyBkc3RJbmRleF0gPSBzcmNbaiArIHNyY0luZGV4XTtcblx0XHRzcmNbaiArIHNyY0luZGV4XSA9IHZvaWQgMDtcblx0fVxufVxuXG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbmZ1bmN0aW9uIFN0cmVhbShzb3VyY2UpIHtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBydW5Tb3VyY2UgPSByZXF1aXJlKCcuLi9ydW5Tb3VyY2UnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgUHJvcGFnYXRlVGFzayA9IHJlcXVpcmUoJy4uL3NjaGVkdWxlci9Qcm9wYWdhdGVUYXNrJyk7XG5cbmV4cG9ydHMuc2NhbiA9IHNjYW47XG5leHBvcnRzLnJlZHVjZSA9IHJlZHVjZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJlYW0gY29udGFpbmluZyBzdWNjZXNzaXZlIHJlZHVjZSByZXN1bHRzIG9mIGFwcGx5aW5nIGYgdG9cbiAqIHRoZSBwcmV2aW91cyByZWR1Y2UgcmVzdWx0IGFuZCB0aGUgY3VycmVudCBzdHJlYW0gaXRlbS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ocmVzdWx0OiosIHg6Kik6Kn0gZiByZWR1Y2VyIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IGluaXRpYWwgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gdG8gc2NhblxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHN1Y2Nlc3NpdmUgcmVkdWNlIHJlc3VsdHNcbiAqL1xuZnVuY3Rpb24gc2NhbihmLCBpbml0aWFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNjYW4oZiwgaW5pdGlhbCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTY2FuKGYsIHosIHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0dGhpcy5mID0gZjtcblx0dGhpcy52YWx1ZSA9IHo7XG59XG5cblNjYW4ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgZDEgPSBzY2hlZHVsZXIuYXNhcChQcm9wYWdhdGVUYXNrLmV2ZW50KHRoaXMudmFsdWUsIHNpbmspKTtcblx0dmFyIGQyID0gdGhpcy5zb3VyY2UucnVuKG5ldyBTY2FuU2luayh0aGlzLmYsIHRoaXMudmFsdWUsIHNpbmspLCBzY2hlZHVsZXIpO1xuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW2QxLCBkMl0pO1xufTtcblxuZnVuY3Rpb24gU2NhblNpbmsoZiwgeiwgc2luaykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gejtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuU2NhblNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgZiA9IHRoaXMuZjtcblx0dGhpcy52YWx1ZSA9IGYodGhpcy52YWx1ZSwgeCk7XG5cdHRoaXMuc2luay5ldmVudCh0LCB0aGlzLnZhbHVlKTtcbn07XG5cblNjYW5TaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuU2NhblNpbmsucHJvdG90eXBlLmVuZCA9IFBpcGUucHJvdG90eXBlLmVuZDtcblxuLyoqXG4gKiBSZWR1Y2UgYSBzdHJlYW0gdG8gcHJvZHVjZSBhIHNpbmdsZSByZXN1bHQuICBOb3RlIHRoYXQgcmVkdWNpbmcgYW4gaW5maW5pdGVcbiAqIHN0cmVhbSB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCBuZXZlciBmdWxmaWxscywgYnV0IHRoYXQgbWF5IHJlamVjdCBpZiBhbiBlcnJvclxuICogb2NjdXJzLlxuICogQHBhcmFtIHtmdW5jdGlvbihyZXN1bHQ6KiwgeDoqKToqfSBmIHJlZHVjZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gaW5pdGlhbCBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRvIHJlZHVjZVxuICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgZm9yIHRoZSBmaWxlIHJlc3VsdCBvZiB0aGUgcmVkdWNlXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShmLCBpbml0aWFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIHJ1blNvdXJjZS53aXRoRGVmYXVsdFNjaGVkdWxlcihub29wLCBuZXcgUmVkdWNlKGYsIGluaXRpYWwsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gUmVkdWNlKGYsIHosIHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0dGhpcy5mID0gZjtcblx0dGhpcy52YWx1ZSA9IHo7XG59XG5cblJlZHVjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFJlZHVjZVNpbmsodGhpcy5mLCB0aGlzLnZhbHVlLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFJlZHVjZVNpbmsoZiwgeiwgc2luaykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gejtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuUmVkdWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBmID0gdGhpcy5mO1xuXHR0aGlzLnZhbHVlID0gZih0aGlzLnZhbHVlLCB4KTtcblx0dGhpcy5zaW5rLmV2ZW50KHQsIHRoaXMudmFsdWUpO1xufTtcblxuUmVkdWNlU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuUmVkdWNlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCkge1xuXHR0aGlzLnNpbmsuZW5kKHQsIHRoaXMudmFsdWUpO1xufTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGNvbWJpbmUgPSByZXF1aXJlKCcuL2NvbWJpbmUnKS5jb21iaW5lO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmFwcGx5O1xuXG5leHBvcnRzLmFwICA9IGFwO1xuXG4vKipcbiAqIEFzc3VtZSBmcyBpcyBhIHN0cmVhbSBjb250YWluaW5nIGZ1bmN0aW9ucywgYW5kIGFwcGx5IHRoZSBsYXRlc3QgZnVuY3Rpb25cbiAqIGluIGZzIHRvIHRoZSBsYXRlc3QgdmFsdWUgaW4geHMuXG4gKiBmczogICAgICAgICAtLWYtLS0tLS0tLS1nLS0tLS0tLS1oLS0tLS0tPlxuICogeHM6ICAgICAgICAgLWEtLS0tLS0tYi0tLS0tLS1jLS0tLS0tLWQtLT5cbiAqIGFwKGZzLCB4cyk6IC0tZmEtLS0tLWZiLWdiLS0tZ2MtLWhjLS1oZC0+XG4gKiBAcGFyYW0ge1N0cmVhbX0gZnMgc3RyZWFtIG9mIGZ1bmN0aW9ucyB0byBhcHBseSB0byB0aGUgbGF0ZXN0IHhcbiAqIEBwYXJhbSB7U3RyZWFtfSB4cyBzdHJlYW0gb2YgdmFsdWVzIHRvIHdoaWNoIHRvIGFwcGx5IGFsbCB0aGUgbGF0ZXN0IGZcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGFsbCB0aGUgYXBwbGljYXRpb25zIG9mIGZzIHRvIHhzXG4gKi9cbmZ1bmN0aW9uIGFwKGZzLCB4cykge1xuXHRyZXR1cm4gY29tYmluZShhcHBseSwgZnMsIHhzKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgc3RyZWFtT2YgPSByZXF1aXJlKCcuLi9zb3VyY2UvY29yZScpLm9mO1xudmFyIGNvbnRpbnVlV2l0aCA9IHJlcXVpcmUoJy4vY29udGludWVXaXRoJykuY29udGludWVXaXRoO1xuXG5leHBvcnRzLmNvbmNhdCA9IGNvbmNhdDtcbmV4cG9ydHMuY3ljbGUgPSBjeWNsZTtcbmV4cG9ydHMuY29ucyA9IGNvbnM7XG5cbi8qKlxuICogQHBhcmFtIHsqfSB4IHZhbHVlIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2l0aCB4IHByZXBlbmRlZFxuICovXG5mdW5jdGlvbiBjb25zKHgsIHN0cmVhbSkge1xuXHRyZXR1cm4gY29uY2F0KHN0cmVhbU9mKHgpLCBzdHJlYW0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U3RyZWFtfSBsZWZ0XG4gKiBAcGFyYW0ge1N0cmVhbX0gcmlnaHRcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGluIGxlZnQgZm9sbG93ZWQgYnkgYWxsXG4gKiAgZXZlbnRzIGluIHJpZ2h0LiAgVGhpcyAqdGltZXNoaWZ0cyogcmlnaHQgdG8gdGhlIGVuZCBvZiBsZWZ0LlxuICovXG5mdW5jdGlvbiBjb25jYXQobGVmdCwgcmlnaHQpIHtcblx0cmV0dXJuIGNvbnRpbnVlV2l0aChmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmlnaHQ7XG5cdH0sIGxlZnQpO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBUaWUgc3RyZWFtIGludG8gYSBjaXJjbGUsIGNyZWF0aW5nIGFuIGluZmluaXRlIHN0cmVhbVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGluZmluaXRlIHN0cmVhbVxuICovXG5mdW5jdGlvbiBjeWNsZShzdHJlYW0pIHtcblx0cmV0dXJuIGNvbnRpbnVlV2l0aChmdW5jdGlvbiBjeWNsZU5leHQoKSB7XG5cdFx0cmV0dXJuIGN5Y2xlKHN0cmVhbSk7XG5cdH0sIHN0cmVhbSk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIHRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9jb3JlJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIEluZGV4U2luayA9IHJlcXVpcmUoJy4uL3NpbmsvSW5kZXhTaW5rJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGJhc2UgPSByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi4vaW52b2tlJyk7XG5cbnZhciBtYXAgPSBiYXNlLm1hcDtcbnZhciB0YWlsID0gYmFzZS50YWlsO1xuXG5leHBvcnRzLmNvbWJpbmVBcnJheSA9IGNvbWJpbmVBcnJheTtcbmV4cG9ydHMuY29tYmluZSA9IGNvbWJpbmU7XG5cbi8qKlxuICogQ29tYmluZSBsYXRlc3QgZXZlbnRzIGZyb20gYWxsIGlucHV0IHN0cmVhbXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uZXZlbnRzKToqfSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgbW9zdCByZWNlbnQgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGYgdG8gdGhlIG1vc3QgcmVjZW50XG4gKiAgZXZlbnQgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIHdoZW5ldmVyIGEgbmV3IGV2ZW50IGFycml2ZXMgb24gYW55IHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZShmIC8qLCAuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiBjb21iaW5lQXJyYXkoZiwgdGFpbChhcmd1bWVudHMpKTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIGxhdGVzdCBldmVudHMgZnJvbSBhbGwgaW5wdXQgc3RyZWFtc1xuICogQHBhcmFtIHtmdW5jdGlvbiguLi5ldmVudHMpOip9IGYgZnVuY3Rpb24gdG8gY29tYmluZSBtb3N0IHJlY2VudCBldmVudHNcbiAqIEBwYXJhbSB7W1N0cmVhbV19IHN0cmVhbXMgbW9zdCByZWNlbnQgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGYgdG8gdGhlIG1vc3QgcmVjZW50XG4gKiAgZXZlbnQgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIHdoZW5ldmVyIGEgbmV3IGV2ZW50IGFycml2ZXMgb24gYW55IHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZUFycmF5KGYsIHN0cmVhbXMpIHtcblx0dmFyIGwgPSBzdHJlYW1zLmxlbmd0aDtcblx0cmV0dXJuIGwgPT09IDAgPyBjb3JlLmVtcHR5KClcblx0XHQgOiBsID09PSAxID8gdHJhbnNmb3JtLm1hcChmLCBzdHJlYW1zWzBdKVxuXHRcdCA6IG5ldyBTdHJlYW0oY29tYmluZVNvdXJjZXMoZiwgc3RyZWFtcykpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lU291cmNlcyhmLCBzdHJlYW1zKSB7XG5cdHJldHVybiBuZXcgQ29tYmluZShmLCBtYXAoZ2V0U291cmNlLCBzdHJlYW1zKSlcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gQ29tYmluZShmLCBzb3VyY2VzKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG59XG5cbkNvbWJpbmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgbCA9IHRoaXMuc291cmNlcy5sZW5ndGg7XG5cdHZhciBkaXNwb3NhYmxlcyA9IG5ldyBBcnJheShsKTtcblx0dmFyIHNpbmtzID0gbmV3IEFycmF5KGwpO1xuXG5cdHZhciBtZXJnZVNpbmsgPSBuZXcgQ29tYmluZVNpbmsoZGlzcG9zYWJsZXMsIHNpbmtzLCBzaW5rLCB0aGlzLmYpO1xuXG5cdGZvcih2YXIgaW5kZXhTaW5rLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aW5kZXhTaW5rID0gc2lua3NbaV0gPSBuZXcgSW5kZXhTaW5rKGksIG1lcmdlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBDb21iaW5lU2luayhkaXNwb3NhYmxlcywgc2lua3MsIHNpbmssIGYpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5kaXNwb3NhYmxlcyA9IGRpc3Bvc2FibGVzO1xuXHR0aGlzLnNpbmtzID0gc2lua3M7XG5cdHRoaXMuZiA9IGY7XG5cblx0dmFyIGwgPSBzaW5rcy5sZW5ndGg7XG5cdHRoaXMuYXdhaXRpbmcgPSBsO1xuXHR0aGlzLnZhbHVlcyA9IG5ldyBBcnJheShsKTtcblx0dGhpcy5oYXNWYWx1ZSA9IG5ldyBBcnJheShsKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuXHRcdHRoaXMuaGFzVmFsdWVbaV0gPSBmYWxzZTtcblx0fVxuXG5cdHRoaXMuYWN0aXZlQ291bnQgPSBzaW5rcy5sZW5ndGg7XG59XG5cbkNvbWJpbmVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5Db21iaW5lU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCBpbmRleGVkVmFsdWUpIHtcblx0dmFyIGkgPSBpbmRleGVkVmFsdWUuaW5kZXg7XG5cdHZhciBhd2FpdGluZyA9IHRoaXMuX3VwZGF0ZVJlYWR5KGkpO1xuXG5cdHRoaXMudmFsdWVzW2ldID0gaW5kZXhlZFZhbHVlLnZhbHVlO1xuXHRpZihhd2FpdGluZyA9PT0gMCkge1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCBpbnZva2UodGhpcy5mLCB0aGlzLnZhbHVlcykpO1xuXHR9XG59O1xuXG5Db21iaW5lU2luay5wcm90b3R5cGUuX3VwZGF0ZVJlYWR5ID0gZnVuY3Rpb24oaW5kZXgpIHtcblx0aWYodGhpcy5hd2FpdGluZyA+IDApIHtcblx0XHRpZighdGhpcy5oYXNWYWx1ZVtpbmRleF0pIHtcblx0XHRcdHRoaXMuaGFzVmFsdWVbaW5kZXhdID0gdHJ1ZVxuXHRcdFx0dGhpcy5hd2FpdGluZyAtPSAxXG5cdFx0fVxuXHR9XG5cdHJldHVybiB0aGlzLmF3YWl0aW5nO1xufVxuXG5Db21iaW5lU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgaW5kZXhlZFZhbHVlKSB7XG5cdGRpc3Bvc2UudHJ5RGlzcG9zZSh0LCB0aGlzLmRpc3Bvc2FibGVzW2luZGV4ZWRWYWx1ZS5pbmRleF0sIHRoaXMuc2luayk7XG5cdGlmKC0tdGhpcy5hY3RpdmVDb3VudCA9PT0gMCkge1xuXHRcdHRoaXMuc2luay5lbmQodCwgaW5kZXhlZFZhbHVlLnZhbHVlKTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgbWVyZ2VNYXBDb25jdXJyZW50bHkgPSByZXF1aXJlKCcuL21lcmdlQ29uY3VycmVudGx5JykubWVyZ2VNYXBDb25jdXJyZW50bHk7XG5cbmV4cG9ydHMuY29uY2F0TWFwID0gY29uY2F0TWFwO1xuXG4vKipcbiAqIE1hcCBlYWNoIHZhbHVlIGluIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBjb25jYXRlbmF0ZSB0aGVtIGFsbFxuICogc3RyZWFtOiAgICAgICAgICAgICAgLWEtLS1iLS0tY1hcbiAqIGYoYSk6ICAgICAgICAgICAgICAgICAxLTEtMS0xWFxuICogZihiKTogICAgICAgICAgICAgICAgICAgICAgICAtMi0yLTItMlhcbiAqIGYoYyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy0zLTMtM1hcbiAqIHN0cmVhbS5jb25jYXRNYXAoZik6IC0xLTEtMS0xLTItMi0yLTItMy0zLTMtM1hcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpTdHJlYW19IGYgZnVuY3Rpb24gdG8gbWFwIGVhY2ggdmFsdWUgdG8gYSBzdHJlYW1cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGZyb20gZWFjaCBzdHJlYW0gcmV0dXJuZWQgYnkgZlxuICovXG5mdW5jdGlvbiBjb25jYXRNYXAoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBtZXJnZU1hcENvbmN1cnJlbnRseShmLCAxLCBzdHJlYW0pO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJy4uL1Byb21pc2UnKS5pc1Byb21pc2U7XG5cbmV4cG9ydHMuY29udGludWVXaXRoID0gY29udGludWVXaXRoO1xuXG5mdW5jdGlvbiBjb250aW51ZVdpdGgoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBDb250aW51ZVdpdGgoZiwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBDb250aW51ZVdpdGgoZiwgc291cmNlKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Db250aW51ZVdpdGgucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IENvbnRpbnVlV2l0aFNpbmsodGhpcy5mLCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIENvbnRpbnVlV2l0aFNpbmsoZiwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG59XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dGhpcy5zaW5rLmV2ZW50KHQsIHgpO1xufTtcblxuQ29udGludWVXaXRoU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlLCB0aGlzLnNpbmspO1xuXHR0aGlzLl9zdGFydE5leHQodCwgeCwgdGhpcy5zaW5rKTtcbn07XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLl9zdGFydE5leHQgPSBmdW5jdGlvbih0LCB4LCBzaW5rKSB7XG5cdHRyeSB7XG5cdFx0dGhpcy5kaXNwb3NhYmxlID0gdGhpcy5fY29udGludWUodGhpcy5mLCB4LCBzaW5rKTtcblx0fSBjYXRjaChlKSB7XG5cdFx0c2luay5lcnJvcih0LCBlKTtcblx0fVxufTtcblxuQ29udGludWVXaXRoU2luay5wcm90b3R5cGUuX2NvbnRpbnVlID0gZnVuY3Rpb24oZiwgeCwgc2luaykge1xuXHRyZXR1cm4gZih4KS5zb3VyY2UucnVuKHNpbmssIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cbkNvbnRpbnVlV2l0aFNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLmRlbGF5ID0gZGVsYXk7XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5VGltZSBtaWxsaXNlY29uZHMgdG8gZGVsYXkgZWFjaCBpdGVtXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHNhbWUgaXRlbXMsIGJ1dCBkZWxheWVkIGJ5IG1zXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KGRlbGF5VGltZSwgc3RyZWFtKSB7XG5cdHJldHVybiBkZWxheVRpbWUgPD0gMCA/IHN0cmVhbVxuXHRcdCA6IG5ldyBTdHJlYW0obmV3IERlbGF5KGRlbGF5VGltZSwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBEZWxheShkdCwgc291cmNlKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkRlbGF5LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGRlbGF5U2luayA9IG5ldyBEZWxheVNpbmsodGhpcy5kdCwgc2luaywgc2NoZWR1bGVyKTtcblx0cmV0dXJuIGRpc3Bvc2UuYWxsKFtkZWxheVNpbmssIHRoaXMuc291cmNlLnJ1bihkZWxheVNpbmssIHNjaGVkdWxlcildKTtcbn07XG5cbmZ1bmN0aW9uIERlbGF5U2luayhkdCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG59XG5cbkRlbGF5U2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdHRoaXMuc2NoZWR1bGVyLmNhbmNlbEFsbChmdW5jdGlvbih0YXNrKSB7XG5cdFx0cmV0dXJuIHRhc2suc2luayA9PT0gc2VsZi5zaW5rO1xuXHR9KTtcbn07XG5cbkRlbGF5U2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHRoaXMuc2NoZWR1bGVyLmRlbGF5KHRoaXMuZHQsIFByb3BhZ2F0ZVRhc2suZXZlbnQoeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWxheVNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5zY2hlZHVsZXIuZGVsYXkodGhpcy5kdCwgUHJvcGFnYXRlVGFzay5lbmQoeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWxheVNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFNhZmVTaW5rID0gcmVxdWlyZSgnLi4vc2luay9TYWZlU2luaycpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgdHJ5RXZlbnQgPSByZXF1aXJlKCcuLi9zb3VyY2UvdHJ5RXZlbnQnKTtcbnZhciBpc1Byb21pc2UgPSByZXF1aXJlKCcuLi9Qcm9taXNlJykuaXNQcm9taXNlO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLmZsYXRNYXBFcnJvciA9IHJlY292ZXJXaXRoO1xuZXhwb3J0cy5yZWNvdmVyV2l0aCAgPSByZWNvdmVyV2l0aDtcbmV4cG9ydHMudGhyb3dFcnJvciAgID0gdGhyb3dFcnJvcjtcblxuLyoqXG4gKiBJZiBzdHJlYW0gZW5jb3VudGVycyBhbiBlcnJvciwgcmVjb3ZlciBhbmQgY29udGludWUgd2l0aCBpdGVtcyBmcm9tIHN0cmVhbVxuICogcmV0dXJuZWQgYnkgZi5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZXJyb3I6Kik6U3RyZWFtfSBmIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBuZXcgc3RyZWFtXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIHdoaWNoIHdpbGwgcmVjb3ZlciBmcm9tIGFuIGVycm9yIGJ5IGNhbGxpbmcgZlxuICovXG5mdW5jdGlvbiByZWNvdmVyV2l0aChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFJlY292ZXJXaXRoKGYsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJlYW0gY29udGFpbmluZyBvbmx5IGFuIGVycm9yXG4gKiBAcGFyYW0geyp9IGUgZXJyb3IgdmFsdWUsIHByZWZlcmFibHkgYW4gRXJyb3Igb3IgRXJyb3Igc3VidHlwZVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIG9ubHkgYW4gZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dFcnJvcihlKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBFcnJvclNvdXJjZShlKSk7XG59XG5cbmZ1bmN0aW9uIEVycm9yU291cmNlKGUpIHtcblx0dGhpcy52YWx1ZSA9IGU7XG59XG5cbkVycm9yU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHNjaGVkdWxlci5hc2FwKG5ldyBQcm9wYWdhdGVUYXNrKHJ1bkVycm9yLCB0aGlzLnZhbHVlLCBzaW5rKSk7XG59O1xuXG5mdW5jdGlvbiBydW5FcnJvcih0LCBlLCBzaW5rKSB7XG5cdHNpbmsuZXJyb3IodCwgZSk7XG59XG5cbmZ1bmN0aW9uIFJlY292ZXJXaXRoKGYsIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuUmVjb3ZlcldpdGgucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFJlY292ZXJXaXRoU2luayh0aGlzLmYsIHRoaXMuc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gUmVjb3ZlcldpdGhTaW5rKGYsIHNvdXJjZSwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IG5ldyBTYWZlU2luayhzaW5rKTtcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0XHR0cnlFdmVudC50cnlFdmVudCh0LCB4LCB0aGlzLnNpbmspO1xufVxuXG5SZWNvdmVyV2l0aFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0XHR0cnlFdmVudC50cnlFbmQodCwgeCwgdGhpcy5zaW5rKTtcbn1cblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dmFyIG5leHRTaW5rID0gdGhpcy5zaW5rLmRpc2FibGUoKTtcblxuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlLCB0aGlzLnNpbmspO1xuXHR0aGlzLl9zdGFydE5leHQodCwgZSwgbmV4dFNpbmspO1xufTtcblxuUmVjb3ZlcldpdGhTaW5rLnByb3RvdHlwZS5fc3RhcnROZXh0ID0gZnVuY3Rpb24odCwgeCwgc2luaykge1xuXHR0cnkge1xuXHRcdHRoaXMuZGlzcG9zYWJsZSA9IHRoaXMuX2NvbnRpbnVlKHRoaXMuZiwgeCwgc2luayk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHNpbmsuZXJyb3IodCwgZSk7XG5cdH1cbn07XG5cblJlY292ZXJXaXRoU2luay5wcm90b3R5cGUuX2NvbnRpbnVlID0gZnVuY3Rpb24oZiwgeCwgc2luaykge1xuXHR2YXIgc3RyZWFtID0gZih4KTtcblx0cmV0dXJuIHN0cmVhbS5zb3VyY2UucnVuKHNpbmssIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cblJlY292ZXJXaXRoU2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBGaWx0ZXIgPSByZXF1aXJlKCcuLi9mdXNpb24vRmlsdGVyJyk7XG5cbmV4cG9ydHMuZmlsdGVyID0gZmlsdGVyO1xuZXhwb3J0cy5za2lwUmVwZWF0cyA9IHNraXBSZXBlYXRzO1xuZXhwb3J0cy5za2lwUmVwZWF0c1dpdGggPSBza2lwUmVwZWF0c1dpdGg7XG5cbi8qKlxuICogUmV0YWluIG9ubHkgaXRlbXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpib29sZWFufSBwIGZpbHRlcmluZyBwcmVkaWNhdGUgY2FsbGVkIGZvciBlYWNoIGl0ZW1cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHRvIGZpbHRlclxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgb25seSBpdGVtcyBmb3Igd2hpY2ggcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5XG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihwLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0oRmlsdGVyLmNyZWF0ZShwLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMsIHVzaW5nID09PSB0byBkZXRlY3QgZHVwbGljYXRlc1xuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gZnJvbSB3aGljaCB0byBvbWl0IHJlcGVhdGVkIGV2ZW50c1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIHdpdGhvdXQgcmVwZWF0ZWQgZXZlbnRzXG4gKi9cbmZ1bmN0aW9uIHNraXBSZXBlYXRzKHN0cmVhbSkge1xuXHRyZXR1cm4gc2tpcFJlcGVhdHNXaXRoKHNhbWUsIHN0cmVhbSk7XG59XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMgdXNpbmcgdGhlIHByb3ZpZGVkIGVxdWFscyBmdW5jdGlvbiB0byBkZXRlY3QgZHVwbGljYXRlc1xuICogQHBhcmFtIHtmdW5jdGlvbihhOiosIGI6Kik6Ym9vbGVhbn0gZXF1YWxzIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNvbXBhcmUgaXRlbXNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIGZyb20gd2hpY2ggdG8gb21pdCByZXBlYXRlZCBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSB3aXRob3V0IHJlcGVhdGVkIGV2ZW50c1xuICovXG5mdW5jdGlvbiBza2lwUmVwZWF0c1dpdGgoZXF1YWxzLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNraXBSZXBlYXRzKGVxdWFscywgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTa2lwUmVwZWF0cyhlcXVhbHMsIHNvdXJjZSkge1xuXHR0aGlzLmVxdWFscyA9IGVxdWFscztcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNraXBSZXBlYXRzLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgU2tpcFJlcGVhdHNTaW5rKHRoaXMuZXF1YWxzLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFNraXBSZXBlYXRzU2luayhlcXVhbHMsIHNpbmspIHtcblx0dGhpcy5lcXVhbHMgPSBlcXVhbHM7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMudmFsdWUgPSB2b2lkIDA7XG5cdHRoaXMuaW5pdCA9IHRydWU7XG59XG5cblNraXBSZXBlYXRzU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5Ta2lwUmVwZWF0c1NpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblNraXBSZXBlYXRzU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuaW5pdCkge1xuXHRcdHRoaXMuaW5pdCA9IGZhbHNlO1xuXHRcdHRoaXMudmFsdWUgPSB4O1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCB4KTtcblx0fSBlbHNlIGlmKCF0aGlzLmVxdWFscyh0aGlzLnZhbHVlLCB4KSkge1xuXHRcdHRoaXMudmFsdWUgPSB4O1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCB4KTtcblx0fVxufTtcblxuZnVuY3Rpb24gc2FtZShhLCBiKSB7XG5cdHJldHVybiBhID09PSBiO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBtZXJnZUNvbmN1cnJlbnRseSA9IHJlcXVpcmUoJy4vbWVyZ2VDb25jdXJyZW50bHknKS5tZXJnZUNvbmN1cnJlbnRseTtcbnZhciBtZXJnZU1hcENvbmN1cnJlbnRseSA9IHJlcXVpcmUoJy4vbWVyZ2VDb25jdXJyZW50bHknKS5tZXJnZU1hcENvbmN1cnJlbnRseTtcblxuZXhwb3J0cy5mbGF0TWFwID0gZmxhdE1hcDtcbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbi8qKlxuICogTWFwIGVhY2ggdmFsdWUgaW4gdGhlIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBtZXJnZSBpdCBpbnRvIHRoZVxuICogcmV0dXJuZWQgb3V0ZXIgc3RyZWFtLiBFdmVudCBhcnJpdmFsIHRpbWVzIGFyZSBwcmVzZXJ2ZWQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGNoYWluaW5nIGZ1bmN0aW9uLCBtdXN0IHJldHVybiBhIFN0cmVhbVxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgZnJvbSBlYWNoIHN0cmVhbSByZXR1cm5lZCBieSBmXG4gKi9cbmZ1bmN0aW9uIGZsYXRNYXAoZiwgc3RyZWFtKSB7XG5cdHJldHVybiBtZXJnZU1hcENvbmN1cnJlbnRseShmLCBJbmZpbml0eSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBNb25hZGljIGpvaW4uIEZsYXR0ZW4gYSBTdHJlYW08U3RyZWFtPFg+PiB0byBTdHJlYW08WD4gYnkgbWVyZ2luZyBpbm5lclxuICogc3RyZWFtcyB0byB0aGUgb3V0ZXIuIEV2ZW50IGFycml2YWwgdGltZXMgYXJlIHByZXNlcnZlZC5cbiAqIEBwYXJhbSB7U3RyZWFtPFN0cmVhbTxYPj59IHN0cmVhbSBzdHJlYW0gb2Ygc3RyZWFtc1xuICogQHJldHVybnMge1N0cmVhbTxYPn0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgb2YgYWxsIGlubmVyIHN0cmVhbXNcbiAqL1xuZnVuY3Rpb24gam9pbihzdHJlYW0pIHtcblx0cmV0dXJuIG1lcmdlQ29uY3VycmVudGx5KEluZmluaXR5LCBzdHJlYW0pO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xudmFyIE1hcCA9IHJlcXVpcmUoJy4uL2Z1c2lvbi9NYXAnKTtcblxuZXhwb3J0cy50aHJvdHRsZSA9IHRocm90dGxlO1xuZXhwb3J0cy5kZWJvdW5jZSA9IGRlYm91bmNlO1xuXG4vKipcbiAqIExpbWl0IHRoZSByYXRlIG9mIGV2ZW50cyBieSBzdXBwcmVzc2luZyBldmVudHMgdGhhdCBvY2N1ciB0b28gb2Z0ZW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgdGltZSB0byBzdXBwcmVzcyBldmVudHNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKHBlcmlvZCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKHRocm90dGxlU291cmNlKHBlcmlvZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZVNvdXJjZShwZXJpb2QsIHNvdXJjZSkge1xuXHRyZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gY29tbXV0ZU1hcFRocm90dGxlKHBlcmlvZCwgc291cmNlKVxuXHRcdDogc291cmNlIGluc3RhbmNlb2YgVGhyb3R0bGUgPyBmdXNlVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpXG5cdFx0OiBuZXcgVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpXG59XG5cbmZ1bmN0aW9uIGNvbW11dGVNYXBUaHJvdHRsZShwZXJpb2QsIHNvdXJjZSkge1xuXHRyZXR1cm4gTWFwLmNyZWF0ZShzb3VyY2UuZiwgdGhyb3R0bGVTb3VyY2UocGVyaW9kLCBzb3VyY2Uuc291cmNlKSlcbn1cblxuZnVuY3Rpb24gZnVzZVRocm90dGxlKHBlcmlvZCwgc291cmNlKSB7XG5cdHJldHVybiBuZXcgVGhyb3R0bGUoTWF0aC5tYXgocGVyaW9kLCBzb3VyY2UucGVyaW9kKSwgc291cmNlLnNvdXJjZSlcbn1cblxuZnVuY3Rpb24gVGhyb3R0bGUocGVyaW9kLCBzb3VyY2UpIHtcblx0dGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UaHJvdHRsZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFRocm90dGxlU2luayh0aGlzLnBlcmlvZCwgc2luayksIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBUaHJvdHRsZVNpbmsocGVyaW9kLCBzaW5rKSB7XG5cdHRoaXMudGltZSA9IDA7XG5cdHRoaXMucGVyaW9kID0gcGVyaW9kO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5UaHJvdHRsZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0ID49IHRoaXMudGltZSkge1xuXHRcdHRoaXMudGltZSA9IHQgKyB0aGlzLnBlcmlvZDtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH1cbn07XG5cblRocm90dGxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5cblRocm90dGxlU2luay5wcm90b3R5cGUuZXJyb3IgPSBTaW5rLnByb3RvdHlwZS5lcnJvcjtcblxuLyoqXG4gKiBXYWl0IGZvciBhIGJ1cnN0IG9mIGV2ZW50cyB0byBzdWJzaWRlIGFuZCBlbWl0IG9ubHkgdGhlIGxhc3QgZXZlbnQgaW4gdGhlIGJ1cnN0XG4gKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIGV2ZW50cyBvY2N1cmluZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiB0aGlzXG4gKiAgd2lsbCBiZSBzdXBwcmVzc2VkXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHN0cmVhbSB0byBkZWJvdW5jZVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGRlYm91bmNlZCBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UocGVyaW9kLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IERlYm91bmNlKHBlcmlvZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBEZWJvdW5jZShkdCwgc291cmNlKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkRlYm91bmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBEZWJvdW5jZVNpbmsodGhpcy5kdCwgdGhpcy5zb3VyY2UsIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBEZWJvdW5jZVNpbmsoZHQsIHNvdXJjZSwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZHQgPSBkdDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMudmFsdWUgPSB2b2lkIDA7XG5cdHRoaXMudGltZXIgPSBudWxsO1xuXG5cdHZhciBzb3VyY2VEaXNwb3NhYmxlID0gc291cmNlLnJ1bih0aGlzLCBzY2hlZHVsZXIpO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLmFsbChbdGhpcywgc291cmNlRGlzcG9zYWJsZV0pO1xufVxuXG5EZWJvdW5jZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9jbGVhclRpbWVyKCk7XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLnRpbWVyID0gdGhpcy5zY2hlZHVsZXIuZGVsYXkodGhpcy5kdCwgUHJvcGFnYXRlVGFzay5ldmVudCh4LCB0aGlzLnNpbmspKTtcbn07XG5cbkRlYm91bmNlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0aGlzLl9jbGVhclRpbWVyKCkpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgdGhpcy52YWx1ZSk7XG5cdFx0dGhpcy52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHR0aGlzLnNpbmsuZW5kKHQsIHgpO1xufTtcblxuRGVib3VuY2VTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5fY2xlYXJUaW1lcigpO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgeCk7XG59O1xuXG5EZWJvdW5jZVNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5fY2xlYXJUaW1lcigpO1xufTtcblxuRGVib3VuY2VTaW5rLnByb3RvdHlwZS5fY2xlYXJUaW1lciA9IGZ1bmN0aW9uKCkge1xuXHRpZih0aGlzLnRpbWVyID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRoaXMudGltZXIuZGlzcG9zZSgpO1xuXHR0aGlzLnRpbWVyID0gbnVsbDtcblx0cmV0dXJuIHRydWU7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBQaXBlID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG5cbmV4cG9ydHMubG9vcCA9IGxvb3A7XG5cbi8qKlxuICogR2VuZXJhbGl6ZWQgZmVlZGJhY2sgbG9vcC4gQ2FsbCBhIHN0ZXBwZXIgZnVuY3Rpb24gZm9yIGVhY2ggZXZlbnQuIFRoZSBzdGVwcGVyXG4gKiB3aWxsIGJlIGNhbGxlZCB3aXRoIDIgcGFyYW1zOiB0aGUgY3VycmVudCBzZWVkIGFuZCB0aGUgYW4gZXZlbnQgdmFsdWUuICBJdCBtdXN0XG4gKiByZXR1cm4gYSBuZXcgeyBzZWVkLCB2YWx1ZSB9IHBhaXIuIFRoZSBgc2VlZGAgd2lsbCBiZSBmZWQgYmFjayBpbnRvIHRoZSBuZXh0XG4gKiBpbnZvY2F0aW9uIG9mIHN0ZXBwZXIsIGFuZCB0aGUgYHZhbHVlYCB3aWxsIGJlIHByb3BhZ2F0ZWQgYXMgdGhlIGV2ZW50IHZhbHVlLlxuICogQHBhcmFtIHtmdW5jdGlvbihzZWVkOiosIHZhbHVlOiopOntzZWVkOiosIHZhbHVlOip9fSBzdGVwcGVyIGxvb3Agc3RlcCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBzZWVkIGluaXRpYWwgc2VlZCB2YWx1ZSBwYXNzZWQgdG8gZmlyc3Qgc3RlcHBlciBjYWxsXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIGV2ZW50IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBgdmFsdWVgIGZpZWxkIG9mIHRoZSBvYmplY3RzXG4gKiByZXR1cm5lZCBieSB0aGUgc3RlcHBlclxuICovXG5mdW5jdGlvbiBsb29wKHN0ZXBwZXIsIHNlZWQsIHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgTG9vcChzdGVwcGVyLCBzZWVkLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIExvb3Aoc3RlcHBlciwgc2VlZCwgc291cmNlKSB7XG5cdHRoaXMuc3RlcCA9IHN0ZXBwZXI7XG5cdHRoaXMuc2VlZCA9IHNlZWQ7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Mb29wLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgTG9vcFNpbmsodGhpcy5zdGVwLCB0aGlzLnNlZWQsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gTG9vcFNpbmsoc3RlcHBlciwgc2VlZCwgc2luaykge1xuXHR0aGlzLnN0ZXAgPSBzdGVwcGVyO1xuXHR0aGlzLnNlZWQgPSBzZWVkO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5Mb29wU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuTG9vcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgcmVzdWx0ID0gdGhpcy5zdGVwKHRoaXMuc2VlZCwgeCk7XG5cdHRoaXMuc2VlZCA9IHJlc3VsdC5zZWVkO1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgcmVzdWx0LnZhbHVlKTtcbn07XG5cbkxvb3BTaW5rLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0KSB7XG5cdHRoaXMuc2luay5lbmQodCwgdGhpcy5zZWVkKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcbnZhciBJbmRleFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL0luZGV4U2luaycpO1xudmFyIGVtcHR5ID0gcmVxdWlyZSgnLi4vc291cmNlL2NvcmUnKS5lbXB0eTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcblxudmFyIGNvcHkgPSBiYXNlLmNvcHk7XG52YXIgcmVkdWNlID0gYmFzZS5yZWR1Y2U7XG5cbmV4cG9ydHMubWVyZ2UgPSBtZXJnZTtcbmV4cG9ydHMubWVyZ2VBcnJheSA9IG1lcmdlQXJyYXk7XG5cbi8qKlxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgZXZlbnRzIGZyb20gYWxsIHN0cmVhbXMgaW4gdGhlIGFyZ3VtZW50XG4gKiBsaXN0IGluIHRpbWUgb3JkZXIuICBJZiB0d28gZXZlbnRzIGFyZSBzaW11bHRhbmVvdXMgdGhleSB3aWxsIGJlIG1lcmdlZCBpblxuICogYXJiaXRyYXJ5IG9yZGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZSgvKi4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gbWVyZ2VBcnJheShjb3B5KGFyZ3VtZW50cykpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHN0cmVhbXMgYXJyYXkgb2Ygc3RyZWFtIHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBldmVudHMgZnJvbSBhbGwgaW5wdXQgb2JzZXJ2YWJsZXNcbiAqIGluIHRpbWUgb3JkZXIuICBJZiB0d28gZXZlbnRzIGFyZSBzaW11bHRhbmVvdXMgdGhleSB3aWxsIGJlIG1lcmdlZCBpblxuICogYXJiaXRyYXJ5IG9yZGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZUFycmF5KHN0cmVhbXMpIHtcbiAgICB2YXIgbCA9IHN0cmVhbXMubGVuZ3RoO1xuICAgIHJldHVybiBsID09PSAwID8gZW1wdHkoKVxuXHRcdCA6IGwgPT09IDEgPyBzdHJlYW1zWzBdXG5cdFx0IDogbmV3IFN0cmVhbShtZXJnZVNvdXJjZXMoc3RyZWFtcykpO1xufVxuXG4vKipcbiAqIFRoaXMgaW1wbGVtZW50cyBmdXNpb24vZmxhdHRlbmluZyBmb3IgbWVyZ2UuICBJdCB3aWxsXG4gKiBmdXNlIGFkamFjZW50IG1lcmdlIG9wZXJhdGlvbnMuICBGb3IgZXhhbXBsZTpcbiAqIC0gYS5tZXJnZShiKS5tZXJnZShjKSBlZmZlY3RpdmVseSBiZWNvbWVzIG1lcmdlKGEsIGIsIGMpXG4gKiAtIG1lcmdlKGEsIG1lcmdlKGIsIGMpKSBlZmZlY3RpdmVseSBiZWNvbWVzIG1lcmdlKGEsIGIsIGMpXG4gKiBJdCBkb2VzIHRoaXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgc291cmNlcyBhcnJheXMgb2ZcbiAqIGFueSBuZXN0ZWQgTWVyZ2Ugc291cmNlcywgaW4gZWZmZWN0IFwiZmxhdHRlbmluZ1wiIG5lc3RlZFxuICogbWVyZ2Ugb3BlcmF0aW9ucyBpbnRvIGEgc2luZ2xlIG1lcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNvdXJjZXMoc3RyZWFtcykge1xuXHRyZXR1cm4gbmV3IE1lcmdlKHJlZHVjZShhcHBlbmRTb3VyY2VzLCBbXSwgc3RyZWFtcykpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZFNvdXJjZXMoc291cmNlcywgc3RyZWFtKSB7XG5cdHZhciBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHRyZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWVyZ2Vcblx0XHQ/IHNvdXJjZXMuY29uY2F0KHNvdXJjZS5zb3VyY2VzKVxuXHRcdDogc291cmNlcy5jb25jYXQoc291cmNlKVxufVxuXG5mdW5jdGlvbiBNZXJnZShzb3VyY2VzKSB7XG5cdHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG59XG5cbk1lcmdlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCk7XG5cdHZhciBzaW5rcyA9IG5ldyBBcnJheShsKTtcblxuXHR2YXIgbWVyZ2VTaW5rID0gbmV3IE1lcmdlU2luayhkaXNwb3NhYmxlcywgc2lua3MsIHNpbmspO1xuXG5cdGZvcih2YXIgaW5kZXhTaW5rLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aW5kZXhTaW5rID0gc2lua3NbaV0gPSBuZXcgSW5kZXhTaW5rKGksIG1lcmdlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBNZXJnZVNpbmsoZGlzcG9zYWJsZXMsIHNpbmtzLCBzaW5rKSB7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZXMgPSBkaXNwb3NhYmxlcztcblx0dGhpcy5hY3RpdmVDb3VudCA9IHNpbmtzLmxlbmd0aDtcbn1cblxuTWVyZ2VTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5NZXJnZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgaW5kZXhWYWx1ZSkge1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgaW5kZXhWYWx1ZS52YWx1ZSk7XG59O1xuXG5NZXJnZVNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIGluZGV4ZWRWYWx1ZSkge1xuXHRkaXNwb3NlLnRyeURpc3Bvc2UodCwgdGhpcy5kaXNwb3NhYmxlc1tpbmRleGVkVmFsdWUuaW5kZXhdLCB0aGlzLnNpbmspO1xuXHRpZigtLXRoaXMuYWN0aXZlQ291bnQgPT09IDApIHtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIGluZGV4ZWRWYWx1ZS52YWx1ZSk7XG5cdH1cbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBMaW5rZWRMaXN0ID0gcmVxdWlyZSgnLi4vTGlua2VkTGlzdCcpO1xudmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmlkO1xuXG5leHBvcnRzLm1lcmdlQ29uY3VycmVudGx5ID0gbWVyZ2VDb25jdXJyZW50bHk7XG5leHBvcnRzLm1lcmdlTWFwQ29uY3VycmVudGx5ID0gbWVyZ2VNYXBDb25jdXJyZW50bHk7XG5cbmZ1bmN0aW9uIG1lcmdlQ29uY3VycmVudGx5KGNvbmN1cnJlbmN5LCBzdHJlYW0pIHtcblx0cmV0dXJuIG1lcmdlTWFwQ29uY3VycmVudGx5KGlkZW50aXR5LCBjb25jdXJyZW5jeSwgc3RyZWFtKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgTWVyZ2VDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gTWVyZ2VDb25jdXJyZW50bHkoZiwgY29uY3VycmVuY3ksIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5NZXJnZUNvbmN1cnJlbnRseS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgT3V0ZXIodGhpcy5mLCB0aGlzLmNvbmN1cnJlbmN5LCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIE91dGVyKGYsIGNvbmN1cnJlbmN5LCBzb3VyY2UsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLnBlbmRpbmcgPSBbXTtcblx0dGhpcy5jdXJyZW50ID0gbmV3IExpbmtlZExpc3QoKTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuT3V0ZXIucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9hZGRJbm5lcih0LCB4KTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5fYWRkSW5uZXIgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuY3VycmVudC5sZW5ndGggPCB0aGlzLmNvbmN1cnJlbmN5KSB7XG5cdFx0dGhpcy5fc3RhcnRJbm5lcih0LCB4KTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnBlbmRpbmcucHVzaCh4KTtcblx0fVxufTtcblxuT3V0ZXIucHJvdG90eXBlLl9zdGFydElubmVyID0gZnVuY3Rpb24odCwgeCkge1xuXHR0cnkge1xuXHRcdHRoaXMuX2luaXRJbm5lcih0LCB4KTtcblx0fSBjYXRjaChlKSB7XG5cdFx0dGhpcy5lcnJvcih0LCBlKTtcblx0fVxufTtcblxuT3V0ZXIucHJvdG90eXBlLl9pbml0SW5uZXIgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBpbm5lclNpbmsgPSBuZXcgSW5uZXIodCwgdGhpcywgdGhpcy5zaW5rKTtcblx0aW5uZXJTaW5rLmRpc3Bvc2FibGUgPSBtYXBBbmRSdW4odGhpcy5mLCB4LCBpbm5lclNpbmssIHRoaXMuc2NoZWR1bGVyKTtcblx0dGhpcy5jdXJyZW50LmFkZChpbm5lclNpbmspO1xufVxuXG5mdW5jdGlvbiBtYXBBbmRSdW4oZiwgeCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBmKHgpLnNvdXJjZS5ydW4oc2luaywgc2NoZWR1bGVyKTtcbn1cblxuT3V0ZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0ZGlzcG9zZS50cnlEaXNwb3NlKHQsIHRoaXMuZGlzcG9zYWJsZSwgdGhpcy5zaW5rKTtcblx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG59O1xuXG5PdXRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuc2luay5lcnJvcih0LCBlKTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMucGVuZGluZy5sZW5ndGggPSAwO1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCksIHRoaXMuY3VycmVudC5kaXNwb3NlKCldKTtcbn07XG5cbk91dGVyLnByb3RvdHlwZS5fZW5kSW5uZXIgPSBmdW5jdGlvbih0LCB4LCBpbm5lcikge1xuXHR0aGlzLmN1cnJlbnQucmVtb3ZlKGlubmVyKTtcblx0ZGlzcG9zZS50cnlEaXNwb3NlKHQsIGlubmVyLCB0aGlzKTtcblxuXHRpZih0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5fc3RhcnRJbm5lcih0LCB0aGlzLnBlbmRpbmcuc2hpZnQoKSk7XG5cdH1cbn07XG5cbk91dGVyLnByb3RvdHlwZS5fY2hlY2tFbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSAmJiB0aGlzLmN1cnJlbnQuaXNFbXB0eSgpKSB7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuZnVuY3Rpb24gSW5uZXIodGltZSwgb3V0ZXIsIHNpbmspIHtcblx0dGhpcy5wcmV2ID0gdGhpcy5uZXh0ID0gbnVsbDtcblx0dGhpcy50aW1lID0gdGltZTtcblx0dGhpcy5vdXRlciA9IG91dGVyO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSB2b2lkIDA7XG59XG5cbklubmVyLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5zaW5rLmV2ZW50KE1hdGgubWF4KHQsIHRoaXMudGltZSksIHgpO1xufTtcblxuSW5uZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5vdXRlci5fZW5kSW5uZXIoTWF0aC5tYXgodCwgdGhpcy50aW1lKSwgeCwgdGhpcyk7XG59O1xuXG5Jbm5lci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMub3V0ZXIuZXJyb3IoTWF0aC5tYXgodCwgdGhpcy50aW1lKSwgZSk7XG59O1xuXG5Jbm5lci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIHJ1blNvdXJjZSA9IHJlcXVpcmUoJy4uL3J1blNvdXJjZScpO1xuXG5leHBvcnRzLm9ic2VydmUgPSBvYnNlcnZlO1xuZXhwb3J0cy5kcmFpbiA9IGRyYWluO1xuXG4vKipcbiAqIE9ic2VydmUgYWxsIHRoZSBldmVudCB2YWx1ZXMgaW4gdGhlIHN0cmVhbSBpbiB0aW1lIG9yZGVyLiBUaGVcbiAqIHByb3ZpZGVkIGZ1bmN0aW9uIGBmYCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBldmVudCB2YWx1ZVxuICogQHBhcmFtIHtmdW5jdGlvbih4OlQpOip9IGYgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIGVhY2ggZXZlbnQgdmFsdWVcbiAqIEBwYXJhbSB7U3RyZWFtPFQ+fSBzdHJlYW0gc3RyZWFtIHRvIG9ic2VydmVcbiAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBmdWxmaWxscyBhZnRlciB0aGUgc3RyZWFtIGVuZHMgd2l0aG91dFxuICogIGFuIGVycm9yLCBvciByZWplY3RzIGlmIHRoZSBzdHJlYW0gZW5kcyB3aXRoIGFuIGVycm9yLlxuICovXG5mdW5jdGlvbiBvYnNlcnZlKGYsIHN0cmVhbSkge1xuXHRyZXR1cm4gcnVuU291cmNlLndpdGhEZWZhdWx0U2NoZWR1bGVyKGYsIHN0cmVhbS5zb3VyY2UpO1xufVxuXG4vKipcbiAqIFwiUnVuXCIgYSBzdHJlYW0gYnlcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGRyYWluKHN0cmVhbSkge1xuXHRyZXR1cm4gcnVuU291cmNlLndpdGhEZWZhdWx0U2NoZWR1bGVyKG5vb3AsIHN0cmVhbS5zb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZmF0YWwgPSByZXF1aXJlKCcuLi9mYXRhbEVycm9yJyk7XG52YXIganVzdCA9IHJlcXVpcmUoJy4uL3NvdXJjZS9jb3JlJykub2Y7XG5cbmV4cG9ydHMuZnJvbVByb21pc2UgPSBmcm9tUHJvbWlzZTtcbmV4cG9ydHMuYXdhaXRQcm9taXNlcyA9IGF3YWl0UHJvbWlzZXM7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyZWFtIGNvbnRhaW5pbmcgb25seSB0aGUgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gKiB2YWx1ZSBhdCB0aGUgdGltZSBpdCBmdWxmaWxscy5cbiAqIEBwYXJhbSB7UHJvbWlzZTxUPn0gcCBwcm9taXNlXG4gKiBAcmV0dXJuIHtTdHJlYW08VD59IHN0cmVhbSBjb250YWluaW5nIHByb21pc2UncyBmdWxmaWxsbWVudCB2YWx1ZS5cbiAqICBJZiB0aGUgcHJvbWlzZSByZWplY3RzLCB0aGUgc3RyZWFtIHdpbGwgZXJyb3JcbiAqL1xuZnVuY3Rpb24gZnJvbVByb21pc2UocCkge1xuXHRyZXR1cm4gYXdhaXRQcm9taXNlcyhqdXN0KHApKTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgU3RyZWFtPFByb21pc2U8VD4+IGludG8gU3RyZWFtPFQ+IGJ5IGF3YWl0aW5nIGVhY2ggcHJvbWlzZS5cbiAqIEV2ZW50IG9yZGVyIGlzIHByZXNlcnZlZC5cbiAqIEBwYXJhbSB7U3RyZWFtPFByb21pc2U8VD4+fSBzdHJlYW1cbiAqIEByZXR1cm4ge1N0cmVhbTxUPn0gc3RyZWFtIG9mIGZ1bGZpbGxtZW50IHZhbHVlcy4gIFRoZSBzdHJlYW0gd2lsbFxuICogZXJyb3IgaWYgYW55IHByb21pc2UgcmVqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXdhaXRQcm9taXNlcyhzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IEF3YWl0KHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gQXdhaXQoc291cmNlKSB7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Bd2FpdC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEF3YWl0U2luayhzaW5rLCBzY2hlZHVsZXIpLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gQXdhaXRTaW5rKHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5xdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0Ly8gUHJlLWNyZWF0ZSBjbG9zdXJlcywgdG8gYXZvaWQgY3JlYXRpbmcgdGhlbSBwZXIgZXZlbnRcblx0dGhpcy5fZXZlbnRCb3VuZCA9IGZ1bmN0aW9uKHgpIHtcblx0XHRzZWxmLnNpbmsuZXZlbnQoc2VsZi5zY2hlZHVsZXIubm93KCksIHgpO1xuXHR9O1xuXG5cdHRoaXMuX2VuZEJvdW5kID0gZnVuY3Rpb24oeCkge1xuXHRcdHNlbGYuc2luay5lbmQoc2VsZi5zY2hlZHVsZXIubm93KCksIHgpO1xuXHR9O1xuXG5cdHRoaXMuX2Vycm9yQm91bmQgPSBmdW5jdGlvbihlKSB7XG5cdFx0c2VsZi5zaW5rLmVycm9yKHNlbGYuc2NoZWR1bGVyLm5vdygpLCBlKTtcblx0fTtcbn1cblxuQXdhaXRTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHByb21pc2UpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZWxmLl9ldmVudChwcm9taXNlKTtcblx0fSkuY2F0Y2godGhpcy5fZXJyb3JCb3VuZCk7XG59O1xuXG5Bd2FpdFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZWxmLl9lbmQoeCk7XG5cdH0pLmNhdGNoKHRoaXMuX2Vycm9yQm91bmQpO1xufTtcblxuQXdhaXRTaW5rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHQvLyBEb24ndCByZXNvbHZlIGVycm9yIHZhbHVlcywgcHJvcGFnYXRlIGRpcmVjdGx5XG5cdHRoaXMucXVldWUgPSB0aGlzLnF1ZXVlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNlbGYuX2Vycm9yQm91bmQoZSk7XG5cdH0pLmNhdGNoKGZhdGFsKTtcbn07XG5cbkF3YWl0U2luay5wcm90b3R5cGUuX2V2ZW50ID0gZnVuY3Rpb24ocHJvbWlzZSkge1xuXHRyZXR1cm4gcHJvbWlzZS50aGVuKHRoaXMuX2V2ZW50Qm91bmQpO1xufTtcblxuQXdhaXRTaW5rLnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4odGhpcy5fZW5kQm91bmQpO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4uL2ludm9rZScpO1xuXG5leHBvcnRzLnNhbXBsZSA9IHNhbXBsZTtcbmV4cG9ydHMuc2FtcGxlV2l0aCA9IHNhbXBsZVdpdGg7XG5leHBvcnRzLnNhbXBsZUFycmF5ID0gc2FtcGxlQXJyYXk7XG5cbi8qKlxuICogV2hlbiBhbiBldmVudCBhcnJpdmVzIG9uIHNhbXBsZXIsIGVtaXQgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGYgd2l0aCB0aGUgbGF0ZXN0XG4gKiB2YWx1ZXMgb2YgYWxsIHN0cmVhbXMgYmVpbmcgc2FtcGxlZFxuICogQHBhcmFtIHtmdW5jdGlvbiguLi52YWx1ZXMpOip9IGYgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzZXQgb2Ygc2FtcGxlZCB2YWx1ZXNcbiAqIEBwYXJhbSB7U3RyZWFtfSBzYW1wbGVyIHN0cmVhbXMgd2lsbCBiZSBzYW1wbGVkIHdoZW5ldmVyIGFuIGV2ZW50IGFycml2ZXNcbiAqICBvbiBzYW1wbGVyXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gb2Ygc2FtcGxlZCBhbmQgdHJhbnNmb3JtZWQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHNhbXBsZShmLCBzYW1wbGVyIC8qLCAuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiBzYW1wbGVBcnJheShmLCBzYW1wbGVyLCBiYXNlLmRyb3AoMiwgYXJndW1lbnRzKSk7XG59XG5cbi8qKlxuICogV2hlbiBhbiBldmVudCBhcnJpdmVzIG9uIHNhbXBsZXIsIGVtaXQgdGhlIGxhdGVzdCBldmVudCB2YWx1ZSBmcm9tIHN0cmVhbS5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzYW1wbGVyIHN0cmVhbSBvZiBldmVudHMgYXQgd2hvc2UgYXJyaXZhbCB0aW1lXG4gKiAgc3RyZWFtJ3MgbGF0ZXN0IHZhbHVlIHdpbGwgYmUgcHJvcGFnYXRlZFxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gb2YgdmFsdWVzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzYW1wbGVkIHN0cmVhbSBvZiB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gc2FtcGxlV2l0aChzYW1wbGVyLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNhbXBsZXIoYmFzZS5pZCwgc2FtcGxlci5zb3VyY2UsIFtzdHJlYW0uc291cmNlXSkpO1xufVxuXG5mdW5jdGlvbiBzYW1wbGVBcnJheShmLCBzYW1wbGVyLCBzdHJlYW1zKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTYW1wbGVyKGYsIHNhbXBsZXIuc291cmNlLCBiYXNlLm1hcChnZXRTb3VyY2UsIHN0cmVhbXMpKSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZShzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zb3VyY2U7XG59XG5cbmZ1bmN0aW9uIFNhbXBsZXIoZiwgc2FtcGxlciwgc291cmNlcykge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNhbXBsZXIgPSBzYW1wbGVyO1xuXHR0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xufVxuXG5TYW1wbGVyLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCsxKTtcblx0dmFyIHNpbmtzID0gbmV3IEFycmF5KGwpO1xuXG5cdHZhciBzYW1wbGVTaW5rID0gbmV3IFNhbXBsZVNpbmsodGhpcy5mLCBzaW5rcywgc2luayk7XG5cblx0Zm9yKHZhciBob2xkLCBpPTA7IGk8bDsgKytpKSB7XG5cdFx0aG9sZCA9IHNpbmtzW2ldID0gbmV3IEhvbGQoc2FtcGxlU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGhvbGQsIHNjaGVkdWxlcik7XG5cdH1cblxuXHRkaXNwb3NhYmxlc1tpXSA9IHRoaXMuc2FtcGxlci5ydW4oc2FtcGxlU2luaywgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoZGlzcG9zYWJsZXMpO1xufTtcblxuZnVuY3Rpb24gSG9sZChzaW5rKSB7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbn1cblxuSG9sZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcblx0dGhpcy5zaW5rLl9ub3RpZnkodGhpcyk7XG59O1xuXG5Ib2xkLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTtcbkhvbGQucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cbmZ1bmN0aW9uIFNhbXBsZVNpbmsoZiwgc2lua3MsIHNpbmspIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zaW5rcyA9IHNpbmtzO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xufVxuXG5TYW1wbGVTaW5rLnByb3RvdHlwZS5fbm90aWZ5ID0gZnVuY3Rpb24oKSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHRoaXMuYWN0aXZlID0gdGhpcy5zaW5rcy5ldmVyeShoYXNWYWx1ZSk7XG5cdH1cbn07XG5cblNhbXBsZVNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCkge1xuXHRpZih0aGlzLmFjdGl2ZSkge1xuXHRcdHRoaXMuc2luay5ldmVudCh0LCBpbnZva2UodGhpcy5mLCBiYXNlLm1hcChnZXRWYWx1ZSwgdGhpcy5zaW5rcykpKTtcblx0fVxufTtcblxuU2FtcGxlU2luay5wcm90b3R5cGUuZW5kID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuU2FtcGxlU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuZnVuY3Rpb24gaGFzVmFsdWUoaG9sZCkge1xuXHRyZXR1cm4gaG9sZC5oYXNWYWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoaG9sZCkge1xuXHRyZXR1cm4gaG9sZC52YWx1ZTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuLi9zb3VyY2UvY29yZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBNYXAgPSByZXF1aXJlKCcuLi9mdXNpb24vTWFwJyk7XG5cbmV4cG9ydHMudGFrZSA9IHRha2U7XG5leHBvcnRzLnNraXAgPSBza2lwO1xuZXhwb3J0cy5zbGljZSA9IHNsaWNlO1xuZXhwb3J0cy50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG5leHBvcnRzLnNraXBXaGlsZSA9IHNraXBXaGlsZTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIG9ubHkgdXAgdG8gdGhlIGZpcnN0IG4gaXRlbXMgZnJvbSBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gdGFrZShuLCBzdHJlYW0pIHtcblx0cmV0dXJuIHNsaWNlKDAsIG4sIHN0cmVhbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2l0aCB0aGUgZmlyc3QgbiBpdGVtcyByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIHNraXAobiwgc3RyZWFtKSB7XG5cdHJldHVybiBzbGljZShuLCBJbmZpbml0eSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBTbGljZSBhIHN0cmVhbSBieSBpbmRleC4gTmVnYXRpdmUgc3RhcnQvZW5kIGluZGV4ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgaXRlbXMgd2hlcmUgc3RhcnQgPD0gaW5kZXggPCBlbmRcbiAqL1xuZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCwgc3RyZWFtKSB7XG5cdHJldHVybiBlbmQgPD0gc3RhcnQgPyBjb3JlLmVtcHR5KClcblx0XHQ6IG5ldyBTdHJlYW0oc2xpY2VTb3VyY2Uoc3RhcnQsIGVuZCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBzbGljZVNvdXJjZShzdGFydCwgZW5kLCBzb3VyY2UpIHtcblx0cmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IGNvbW11dGVNYXBTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpXG5cdFx0OiBzb3VyY2UgaW5zdGFuY2VvZiBTbGljZSA/IGZ1c2VTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpXG5cdFx0OiBuZXcgU2xpY2Uoc3RhcnQsIGVuZCwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gY29tbXV0ZU1hcFNsaWNlKHN0YXJ0LCBlbmQsIHNvdXJjZSkge1xuXHRyZXR1cm4gTWFwLmNyZWF0ZShzb3VyY2UuZiwgc2xpY2VTb3VyY2Uoc3RhcnQsIGVuZCwgc291cmNlLnNvdXJjZSkpXG59XG5cbmZ1bmN0aW9uIGZ1c2VTbGljZShzdGFydCwgZW5kLCBzb3VyY2UpIHtcblx0c3RhcnQgKz0gc291cmNlLm1pbjtcblx0ZW5kID0gTWF0aC5taW4oZW5kICsgc291cmNlLm1pbiwgc291cmNlLm1heCk7XG5cdHJldHVybiBuZXcgU2xpY2Uoc3RhcnQsIGVuZCwgc291cmNlLnNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIFNsaWNlKG1pbiwgbWF4LCBzb3VyY2UpIHtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdHRoaXMubWluID0gbWluO1xuXHR0aGlzLm1heCA9IG1heDtcbn1cblxuU2xpY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFNsaWNlU2luayh0aGlzLm1pbiwgdGhpcy5tYXggLSB0aGlzLm1pbiwgdGhpcy5zb3VyY2UsIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBTbGljZVNpbmsoc2tpcCwgdGFrZSwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5za2lwID0gc2tpcDtcblx0dGhpcy50YWtlID0gdGFrZTtcblx0dGhpcy5kaXNwb3NhYmxlID0gZGlzcG9zZS5vbmNlKHNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKSk7XG59XG5cblNsaWNlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5TbGljZVNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblNsaWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuc2tpcCA+IDApIHtcblx0XHR0aGlzLnNraXAgLT0gMTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZih0aGlzLnRha2UgPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLnRha2UgLT0gMTtcblx0dGhpcy5zaW5rLmV2ZW50KHQsIHgpO1xuXHRpZih0aGlzLnRha2UgPT09IDApIHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIHgpO1xuXHR9XG59O1xuXG5TbGljZVNpbmsucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiB0YWtlV2hpbGUocCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBUYWtlV2hpbGUocCwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBUYWtlV2hpbGUocCwgc291cmNlKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UYWtlV2hpbGUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IFRha2VXaGlsZVNpbmsodGhpcy5wLCB0aGlzLnNvdXJjZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRha2VXaGlsZVNpbmsocCwgc291cmNlLCBzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLm9uY2Uoc291cmNlLnJ1bih0aGlzLCBzY2hlZHVsZXIpKTtcbn1cblxuVGFrZVdoaWxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5UYWtlV2hpbGVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFNpbmsucHJvdG90eXBlLmVycm9yO1xuXG5UYWtlV2hpbGVTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHAgPSB0aGlzLnA7XG5cdHRoaXMuYWN0aXZlID0gcCh4KTtcblx0aWYodGhpcy5hY3RpdmUpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5kaXNwb3NlKCk7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuVGFrZVdoaWxlU2luay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn07XG5cbmZ1bmN0aW9uIHNraXBXaGlsZShwLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFNraXBXaGlsZShwLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIFNraXBXaGlsZShwLCBzb3VyY2UpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNraXBXaGlsZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IFNraXBXaGlsZVNpbmsodGhpcy5wLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFNraXBXaGlsZVNpbmsocCwgc2luaykge1xuXHR0aGlzLnAgPSBwO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNraXBwaW5nID0gdHJ1ZTtcbn1cblxuU2tpcFdoaWxlU2luay5wcm90b3R5cGUuZW5kICAgPSBTaW5rLnByb3RvdHlwZS5lbmQ7XG5Ta2lwV2hpbGVTaW5rLnByb3RvdHlwZS5lcnJvciA9IFNpbmsucHJvdG90eXBlLmVycm9yO1xuXG5Ta2lwV2hpbGVTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodGhpcy5za2lwcGluZykge1xuXHRcdHZhciBwID0gdGhpcy5wO1xuXHRcdHRoaXMuc2tpcHBpbmcgPSBwKHgpO1xuXHRcdGlmKHRoaXMuc2tpcHBpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG5cbmV4cG9ydHMuc3dpdGNoID0gc3dpdGNoTGF0ZXN0O1xuXG4vKipcbiAqIEdpdmVuIGEgc3RyZWFtIG9mIHN0cmVhbXMsIHJldHVybiBhIG5ldyBzdHJlYW0gdGhhdCBhZG9wdHMgdGhlIGJlaGF2aW9yXG4gKiBvZiB0aGUgbW9zdCByZWNlbnQgaW5uZXIgc3RyZWFtLlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBvZiBzdHJlYW1zIG9uIHdoaWNoIHRvIHN3aXRjaFxuICogQHJldHVybnMge1N0cmVhbX0gc3dpdGNoaW5nIHN0cmVhbVxuICovXG5mdW5jdGlvbiBzd2l0Y2hMYXRlc3Qoc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTd2l0Y2goc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBTd2l0Y2goc291cmNlKSB7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5Td2l0Y2gucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgc3dpdGNoU2luayA9IG5ldyBTd2l0Y2hTaW5rKHNpbmssIHNjaGVkdWxlcik7XG5cdHJldHVybiBkaXNwb3NlLmFsbChzd2l0Y2hTaW5rLCB0aGlzLnNvdXJjZS5ydW4oc3dpdGNoU2luaywgc2NoZWR1bGVyKSk7XG59O1xuXG5mdW5jdGlvbiBTd2l0Y2hTaW5rKHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5jdXJyZW50ID0gbnVsbDtcblx0dGhpcy5lbmRlZCA9IGZhbHNlO1xufVxuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHN0cmVhbSkge1xuXHR0aGlzLl9kaXNwb3NlQ3VycmVudCh0KTsgLy8gVE9ETzogY2FwdHVyZSB0aGUgcmVzdWx0IG9mIHRoaXMgZGlzcG9zZVxuXHR0aGlzLmN1cnJlbnQgPSBuZXcgU2VnbWVudCh0LCBJbmZpbml0eSwgdGhpcywgdGhpcy5zaW5rKTtcblx0dGhpcy5jdXJyZW50LmRpc3Bvc2FibGUgPSBzdHJlYW0uc291cmNlLnJ1bih0aGlzLmN1cnJlbnQsIHRoaXMuc2NoZWR1bGVyKTtcbn07XG5cblN3aXRjaFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0dGhpcy5lbmRlZCA9IHRydWU7XG5cdHRoaXMuX2NoZWNrRW5kKHQsIHgpO1xufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuZW5kZWQgPSB0cnVlO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLl9kaXNwb3NlQ3VycmVudCgwKTtcbn07XG5cblN3aXRjaFNpbmsucHJvdG90eXBlLl9kaXNwb3NlQ3VycmVudCA9IGZ1bmN0aW9uKHQpIHtcblx0aWYodGhpcy5jdXJyZW50ICE9PSBudWxsKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3VycmVudC5fZGlzcG9zZSh0KTtcblx0fVxufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuX2Rpc3Bvc2VJbm5lciA9IGZ1bmN0aW9uKHQsIGlubmVyKSB7XG5cdGlubmVyLl9kaXNwb3NlKHQpOyAvLyBUT0RPOiBjYXB0dXJlIHRoZSByZXN1bHQgb2YgdGhpcyBkaXNwb3NlXG5cdGlmKGlubmVyID09PSB0aGlzLmN1cnJlbnQpIHtcblx0XHR0aGlzLmN1cnJlbnQgPSBudWxsO1xuXHR9XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5fY2hlY2tFbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHRoaXMuZW5kZWQgJiYgdGhpcy5jdXJyZW50ID09PSBudWxsKSB7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuU3dpdGNoU2luay5wcm90b3R5cGUuX2VuZElubmVyID0gZnVuY3Rpb24odCwgeCwgaW5uZXIpIHtcblx0dGhpcy5fZGlzcG9zZUlubmVyKHQsIGlubmVyKTtcblx0dGhpcy5fY2hlY2tFbmQodCwgeCk7XG59O1xuXG5Td2l0Y2hTaW5rLnByb3RvdHlwZS5fZXJyb3JJbm5lciA9IGZ1bmN0aW9uKHQsIGUsIGlubmVyKSB7XG5cdHRoaXMuX2Rpc3Bvc2VJbm5lcih0LCBpbm5lcik7XG5cdHRoaXMuc2luay5lcnJvcih0LCBlKTtcbn07XG5cbmZ1bmN0aW9uIFNlZ21lbnQobWluLCBtYXgsIG91dGVyLCBzaW5rKSB7XG5cdHRoaXMubWluID0gbWluO1xuXHR0aGlzLm1heCA9IG1heDtcblx0dGhpcy5vdXRlciA9IG91dGVyO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NlLmVtcHR5KCk7XG59XG5cblNlZ21lbnQucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZih0IDwgdGhpcy5tYXgpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQoTWF0aC5tYXgodCwgdGhpcy5taW4pLCB4KTtcblx0fVxufTtcblxuU2VnbWVudC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLm91dGVyLl9lbmRJbm5lcihNYXRoLm1heCh0LCB0aGlzLm1pbiksIHgsIHRoaXMpO1xufTtcblxuU2VnbWVudC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMub3V0ZXIuX2Vycm9ySW5uZXIoTWF0aC5tYXgodCwgdGhpcy5taW4pLCBlLCB0aGlzKTtcbn07XG5cblNlZ21lbnQucHJvdG90eXBlLl9kaXNwb3NlID0gZnVuY3Rpb24odCkge1xuXHR0aGlzLm1heCA9IHQ7XG5cdGRpc3Bvc2UudHJ5RGlzcG9zZSh0LCB0aGlzLmRpc3Bvc2FibGUsIHRoaXMuc2luaylcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxuZXhwb3J0cy50aHJ1ID0gZnVuY3Rpb24gdGhydShmLCBzdHJlYW0pIHtcblx0cmV0dXJuIGYoc3RyZWFtKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBqb2luID0gcmVxdWlyZSgnLi4vY29tYmluYXRvci9mbGF0TWFwJykuam9pbjtcblxuZXhwb3J0cy5kdXJpbmcgICAgPSBkdXJpbmc7XG5leHBvcnRzLnRha2VVbnRpbCA9IHRha2VVbnRpbDtcbmV4cG9ydHMuc2tpcFVudGlsID0gc2tpcFVudGlsO1xuXG5mdW5jdGlvbiB0YWtlVW50aWwoc2lnbmFsLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IFVudGlsKHNpZ25hbC5zb3VyY2UsIHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc2tpcFVudGlsKHNpZ25hbCwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBTaW5jZShzaWduYWwuc291cmNlLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIGR1cmluZyh0aW1lV2luZG93LCBzdHJlYW0pIHtcblx0cmV0dXJuIHRha2VVbnRpbChqb2luKHRpbWVXaW5kb3cpLCBza2lwVW50aWwodGltZVdpbmRvdywgc3RyZWFtKSk7XG59XG5cbmZ1bmN0aW9uIFVudGlsKG1heFNpZ25hbCwgc291cmNlKSB7XG5cdHRoaXMubWF4U2lnbmFsID0gbWF4U2lnbmFsO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuVW50aWwucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgbWluID0gbmV3IEJvdW5kKC1JbmZpbml0eSwgc2luayk7XG5cdHZhciBtYXggPSBuZXcgVXBwZXJCb3VuZCh0aGlzLm1heFNpZ25hbCwgc2luaywgc2NoZWR1bGVyKTtcblx0dmFyIGRpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4obmV3IFRpbWVXaW5kb3dTaW5rKG1pbiwgbWF4LCBzaW5rKSwgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW21pbiwgbWF4LCBkaXNwb3NhYmxlXSk7XG59O1xuXG5mdW5jdGlvbiBTaW5jZShtaW5TaWduYWwsIHNvdXJjZSkge1xuXHR0aGlzLm1pblNpZ25hbCA9IG1pblNpZ25hbDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cblNpbmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIG1pbiA9IG5ldyBMb3dlckJvdW5kKHRoaXMubWluU2lnbmFsLCBzaW5rLCBzY2hlZHVsZXIpO1xuXHR2YXIgbWF4ID0gbmV3IEJvdW5kKEluZmluaXR5LCBzaW5rKTtcblx0dmFyIGRpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4obmV3IFRpbWVXaW5kb3dTaW5rKG1pbiwgbWF4LCBzaW5rKSwgc2NoZWR1bGVyKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5hbGwoW21pbiwgbWF4LCBkaXNwb3NhYmxlXSk7XG59O1xuXG5mdW5jdGlvbiBCb3VuZCh2YWx1ZSwgc2luaykge1xuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkJvdW5kLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuQm91bmQucHJvdG90eXBlLmV2ZW50ID0gbm9vcDtcbkJvdW5kLnByb3RvdHlwZS5lbmQgPSBub29wO1xuQm91bmQucHJvdG90eXBlLmRpc3Bvc2UgPSBub29wO1xuXG5mdW5jdGlvbiBUaW1lV2luZG93U2luayhtaW4sIG1heCwgc2luaykge1xuXHR0aGlzLm1pbiA9IG1pbjtcblx0dGhpcy5tYXggPSBtYXg7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cblRpbWVXaW5kb3dTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodCA+PSB0aGlzLm1pbi52YWx1ZSAmJiB0IDwgdGhpcy5tYXgudmFsdWUpIHtcblx0XHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG5cdH1cbn07XG5cblRpbWVXaW5kb3dTaW5rLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuVGltZVdpbmRvd1NpbmsucHJvdG90eXBlLmVuZCA9IFBpcGUucHJvdG90eXBlLmVuZDtcblxuZnVuY3Rpb24gTG93ZXJCb3VuZChzaWduYWwsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnZhbHVlID0gSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNpZ25hbC5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuTG93ZXJCb3VuZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0IC8qLCB4ICovKSB7XG5cdGlmKHQgPCB0aGlzLnZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHQ7XG5cdH1cbn07XG5cbkxvd2VyQm91bmQucHJvdG90eXBlLmVuZCA9IG5vb3A7XG5Mb3dlckJvdW5kLnByb3RvdHlwZS5lcnJvciA9IFBpcGUucHJvdG90eXBlLmVycm9yO1xuXG5Mb3dlckJvdW5kLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmRpc3Bvc2FibGUuZGlzcG9zZSgpO1xufTtcblxuZnVuY3Rpb24gVXBwZXJCb3VuZChzaWduYWwsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnZhbHVlID0gSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IHNpZ25hbC5ydW4odGhpcywgc2NoZWR1bGVyKTtcbn1cblxuVXBwZXJCb3VuZC5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKHQgPCB0aGlzLnZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHQ7XG5cdFx0dGhpcy5zaW5rLmVuZCh0LCB4KTtcblx0fVxufTtcblxuVXBwZXJCb3VuZC5wcm90b3R5cGUuZW5kID0gbm9vcDtcblVwcGVyQm91bmQucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cblVwcGVyQm91bmQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMuZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xuXG5leHBvcnRzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdGltZXN0YW1wKHN0cmVhbSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgVGltZXN0YW1wKHN0cmVhbS5zb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gVGltZXN0YW1wKHNvdXJjZSkge1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuVGltZXN0YW1wLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgVGltZXN0YW1wU2luayhzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRpbWVzdGFtcFNpbmsoc2luaykge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5UaW1lc3RhbXBTaW5rLnByb3RvdHlwZS5lbmQgICA9IFNpbmsucHJvdG90eXBlLmVuZDtcblRpbWVzdGFtcFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cblRpbWVzdGFtcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgeyB0aW1lOiB0LCB2YWx1ZTogeCB9KTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xuXG5leHBvcnRzLnRyYW5zZHVjZSA9IHRyYW5zZHVjZTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBzdHJlYW0gYnkgcGFzc2luZyBpdHMgZXZlbnRzIHRocm91Z2ggYSB0cmFuc2R1Y2VyLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IHRyYW5zZHVjZXIgdHJhbnNkdWNlciBmdW5jdGlvblxuICogQHBhcmFtICB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHdob3NlIGV2ZW50cyB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogIHRyYW5zZHVjZXJcbiAqIEByZXR1cm4ge1N0cmVhbX0gc3RyZWFtIG9mIGV2ZW50cyB0cmFuc2Zvcm1lZCBieSB0aGUgdHJhbnNkdWNlclxuICovXG5mdW5jdGlvbiB0cmFuc2R1Y2UodHJhbnNkdWNlciwgc3RyZWFtKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBUcmFuc2R1Y2UodHJhbnNkdWNlciwgc3RyZWFtLnNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBUcmFuc2R1Y2UodHJhbnNkdWNlciwgc291cmNlKSB7XG5cdHRoaXMudHJhbnNkdWNlciA9IHRyYW5zZHVjZXI7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG5UcmFuc2R1Y2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgeGYgPSB0aGlzLnRyYW5zZHVjZXIobmV3IFRyYW5zZm9ybWVyKHNpbmspKTtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgVHJhbnNkdWNlU2luayhnZXRUeEhhbmRsZXIoeGYpLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIFRyYW5zZHVjZVNpbmsoYWRhcHRlciwgc2luaykge1xuXHR0aGlzLnhmID0gYWRhcHRlcjtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuVHJhbnNkdWNlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBuZXh0ID0gdGhpcy54Zi5zdGVwKHQsIHgpO1xuXG5cdHJldHVybiB0aGlzLnhmLmlzUmVkdWNlZChuZXh0KVxuXHRcdD8gdGhpcy5zaW5rLmVuZCh0LCB0aGlzLnhmLmdldFJlc3VsdChuZXh0KSlcblx0XHQ6IG5leHQ7XG59O1xuXG5UcmFuc2R1Y2VTaW5rLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnhmLnJlc3VsdCh4KTtcbn07XG5cblRyYW5zZHVjZVNpbmsucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHRyZXR1cm4gdGhpcy5zaW5rLmVycm9yKHQsIGUpO1xufTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtZXIoc2luaykge1xuXHR0aGlzLnRpbWUgPSAtSW5maW5pdHk7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFRyYW5zZm9ybWVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7fTtcblxuVHJhbnNmb3JtZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gVHJhbnNmb3JtZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCFpc05hTih0KSkge1xuXHRcdHRoaXMudGltZSA9IE1hdGgubWF4KHQsIHRoaXMudGltZSk7XG5cdH1cblx0cmV0dXJuIHRoaXMuc2luay5ldmVudCh0aGlzLnRpbWUsIHgpO1xufTtcblxuVHJhbnNmb3JtZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBUcmFuc2Zvcm1lci5wcm90b3R5cGUucmVzdWx0ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdGhpcy5zaW5rLmVuZCh0aGlzLnRpbWUsIHgpO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3Qgc3VwcG9ydGluZyB0aGUgbmV3IG9yIGxlZ2FjeSB0cmFuc2R1Y2VyIHByb3RvY29sLFxuICogY3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGl0LlxuICogQHBhcmFtIHtvYmplY3R9IHR4IHRyYW5zZm9ybVxuICogQHJldHVybnMge1R4QWRhcHRlcnxMZWdhY3lUeEFkYXB0ZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFR4SGFuZGxlcih0eCkge1xuXHRyZXR1cm4gdHlwZW9mIHR4WydAQHRyYW5zZHVjZXIvc3RlcCddID09PSAnZnVuY3Rpb24nXG5cdFx0PyBuZXcgVHhBZGFwdGVyKHR4KVxuXHRcdDogbmV3IExlZ2FjeVR4QWRhcHRlcih0eCk7XG59XG5cbi8qKlxuICogQWRhcHRlciBmb3IgbmV3IG9mZmljaWFsIHRyYW5zZHVjZXIgcHJvdG9jb2xcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eCB0cmFuc2Zvcm1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUeEFkYXB0ZXIodHgpIHtcblx0dGhpcy50eCA9IHR4O1xufVxuXG5UeEFkYXB0ZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnR4WydAQHRyYW5zZHVjZXIvc3RlcCddKHQsIHgpO1xufTtcblR4QWRhcHRlci5wcm90b3R5cGUucmVzdWx0ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdGhpcy50eFsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHgpO1xufTtcblR4QWRhcHRlci5wcm90b3R5cGUuaXNSZWR1Y2VkID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4geCAhPSBudWxsICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ107XG59O1xuVHhBZGFwdGVyLnByb3RvdHlwZS5nZXRSZXN1bHQgPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiB4WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbn07XG5cbi8qKlxuICogQWRhcHRlciBmb3Igb2xkZXIgdHJhbnNkdWNlciBwcm90b2NvbFxuICogQHBhcmFtIHtvYmplY3R9IHR4IHRyYW5zZm9ybVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIExlZ2FjeVR4QWRhcHRlcih0eCkge1xuXHR0aGlzLnR4ID0gdHg7XG59XG5cbkxlZ2FjeVR4QWRhcHRlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0cmV0dXJuIHRoaXMudHguc3RlcCh0LCB4KTtcbn07XG5MZWdhY3lUeEFkYXB0ZXIucHJvdG90eXBlLnJlc3VsdCA9IGZ1bmN0aW9uKHgpIHtcblx0cmV0dXJuIHRoaXMudHgucmVzdWx0KHgpO1xufTtcbkxlZ2FjeVR4QWRhcHRlci5wcm90b3R5cGUuaXNSZWR1Y2VkID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4geCAhPSBudWxsICYmIHguX190cmFuc2R1Y2Vyc19yZWR1Y2VkX187XG59O1xuTGVnYWN5VHhBZGFwdGVyLnByb3RvdHlwZS5nZXRSZXN1bHQgPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiB4LnZhbHVlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTWFwID0gcmVxdWlyZSgnLi4vZnVzaW9uL01hcCcpO1xuXG5leHBvcnRzLm1hcCA9IG1hcDtcbmV4cG9ydHMuY29uc3RhbnQgPSBjb25zdGFudDtcbmV4cG9ydHMudGFwID0gdGFwO1xuXG4vKipcbiAqIFRyYW5zZm9ybSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gYnkgYXBwbHlpbmcgZiB0byBlYWNoXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCopOip9IGYgbWFwcGluZyBmdW5jdGlvblxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBzdHJlYW0gdG8gbWFwXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyB0cmFuc2Zvcm1lZCBieSBmXG4gKi9cbmZ1bmN0aW9uIG1hcChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0oTWFwLmNyZWF0ZShmLCBzdHJlYW0uc291cmNlKSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gd2l0aCB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW1cbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHJlcGxhY2VkIHdpdGggeFxuICovXG5mdW5jdGlvbiBjb25zdGFudCh4LCBzdHJlYW0pIHtcblx0cmV0dXJuIG1hcChmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4geDtcblx0fSwgc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtIGEgc2lkZSBlZmZlY3QgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RyZWFtXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6Kn0gZiBzaWRlIGVmZmVjdCB0byBleGVjdXRlIGZvciBlYWNoIGl0ZW0uIFRoZVxuICogIHJldHVybiB2YWx1ZSB3aWxsIGJlIGRpc2NhcmRlZC5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gc3RyZWFtIHRvIHRhcFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zIGFzIHRoaXMgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIHRhcChmLCBzdHJlYW0pIHtcblx0cmV0dXJuIG1hcChmdW5jdGlvbih4KSB7XG5cdFx0Zih4KTtcblx0XHRyZXR1cm4geDtcblx0fSwgc3RyZWFtKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgdHJhbnNmb3JtID0gcmVxdWlyZSgnLi90cmFuc2Zvcm0nKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi4vc291cmNlL2NvcmUnKTtcbnZhciBTaW5rID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG52YXIgSW5kZXhTaW5rID0gcmVxdWlyZSgnLi4vc2luay9JbmRleFNpbmsnKTtcbnZhciBkaXNwb3NlID0gcmVxdWlyZSgnLi4vZGlzcG9zYWJsZS9kaXNwb3NlJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuLi9pbnZva2UnKTtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL1F1ZXVlJyk7XG5cbnZhciBtYXAgPSBiYXNlLm1hcDtcbnZhciB0YWlsID0gYmFzZS50YWlsO1xuXG5leHBvcnRzLnppcCA9IHppcDtcbmV4cG9ydHMuemlwQXJyYXkgPSB6aXBBcnJheTtcblxuLyoqXG4gKiBDb21iaW5lIHN0cmVhbXMgcGFpcndpc2UgKG9yIHR1cGxlLXdpc2UpIGJ5IGluZGV4IGJ5IGFwcGx5aW5nIGYgdG8gdmFsdWVzXG4gKiBhdCBjb3JyZXNwb25kaW5nIGluZGljZXMuICBUaGUgcmV0dXJuZWQgc3RyZWFtIGVuZHMgd2hlbiBhbnkgb2YgdGhlIGlucHV0XG4gKiBzdHJlYW1zIGVuZHMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgdmFsdWVzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBuZXcgc3RyZWFtIHdpdGggaXRlbXMgYXQgY29ycmVzcG9uZGluZyBpbmRpY2VzIGNvbWJpbmVkXG4gKiAgdXNpbmcgZlxuICovXG5mdW5jdGlvbiB6aXAoZiAvKiwuLi5zdHJlYW1zICovKSB7XG5cdHJldHVybiB6aXBBcnJheShmLCB0YWlsKGFyZ3VtZW50cykpO1xufVxuXG4vKipcbiAqIENvbWJpbmUgc3RyZWFtcyBwYWlyd2lzZSAob3IgdHVwbGUtd2lzZSkgYnkgaW5kZXggYnkgYXBwbHlpbmcgZiB0byB2YWx1ZXNcbiAqIGF0IGNvcnJlc3BvbmRpbmcgaW5kaWNlcy4gIFRoZSByZXR1cm5lZCBzdHJlYW0gZW5kcyB3aGVuIGFueSBvZiB0aGUgaW5wdXRcbiAqIHN0cmVhbXMgZW5kcy5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGYgZnVuY3Rpb24gdG8gY29tYmluZSB2YWx1ZXNcbiAqIEBwYXJhbSB7W1N0cmVhbV19IHN0cmVhbXMgc3RyZWFtcyB0byB6aXAgdXNpbmcgZlxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aXRoIGl0ZW1zIGF0IGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBjb21iaW5lZFxuICogIHVzaW5nIGZcbiAqL1xuZnVuY3Rpb24gemlwQXJyYXkoZiwgc3RyZWFtcykge1xuXHRyZXR1cm4gc3RyZWFtcy5sZW5ndGggPT09IDAgPyBjb3JlLmVtcHR5KClcblx0XHQgOiBzdHJlYW1zLmxlbmd0aCA9PT0gMSA/IHRyYW5zZm9ybS5tYXAoZiwgc3RyZWFtc1swXSlcblx0XHQgOiBuZXcgU3RyZWFtKG5ldyBaaXAoZiwgbWFwKGdldFNvdXJjZSwgc3RyZWFtcykpKTtcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gWmlwKGYsIHNvdXJjZXMpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zb3VyY2VzID0gc291cmNlcztcbn1cblxuWmlwLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0dmFyIGwgPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuXHR2YXIgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXkobCk7XG5cdHZhciBzaW5rcyA9IG5ldyBBcnJheShsKTtcblx0dmFyIGJ1ZmZlcnMgPSBuZXcgQXJyYXkobCk7XG5cblx0dmFyIHppcFNpbmsgPSBuZXcgWmlwU2luayh0aGlzLmYsIGJ1ZmZlcnMsIHNpbmtzLCBzaW5rKTtcblxuXHRmb3IodmFyIGluZGV4U2luaywgaT0wOyBpPGw7ICsraSkge1xuXHRcdGJ1ZmZlcnNbaV0gPSBuZXcgUXVldWUoKTtcblx0XHRpbmRleFNpbmsgPSBzaW5rc1tpXSA9IG5ldyBJbmRleFNpbmsoaSwgemlwU2luayk7XG5cdFx0ZGlzcG9zYWJsZXNbaV0gPSB0aGlzLnNvdXJjZXNbaV0ucnVuKGluZGV4U2luaywgc2NoZWR1bGVyKTtcblx0fVxuXG5cdHJldHVybiBkaXNwb3NlLmFsbChkaXNwb3NhYmxlcyk7XG59O1xuXG5mdW5jdGlvbiBaaXBTaW5rKGYsIGJ1ZmZlcnMsIHNpbmtzLCBzaW5rKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2lua3MgPSBzaW5rcztcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5idWZmZXJzID0gYnVmZmVycztcbn1cblxuWmlwU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCBpbmRleGVkVmFsdWUpIHtcblx0dmFyIGJ1ZmZlcnMgPSB0aGlzLmJ1ZmZlcnM7XG5cdHZhciBidWZmZXIgPSBidWZmZXJzW2luZGV4ZWRWYWx1ZS5pbmRleF07XG5cblx0YnVmZmVyLnB1c2goaW5kZXhlZFZhbHVlLnZhbHVlKTtcblxuXHRpZihidWZmZXIubGVuZ3RoKCkgPT09IDEpIHtcblx0XHRpZighcmVhZHkodGhpcy5idWZmZXJzKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGVtaXRaaXBwZWQodGhpcy5mLCB0LCBidWZmZXJzLCB0aGlzLnNpbmspO1xuXG5cdFx0aWYgKGVuZGVkKHRoaXMuYnVmZmVycywgdGhpcy5zaW5rcykpIHtcblx0XHRcdHRoaXMuc2luay5lbmQodCwgdm9pZCAwKTtcblx0XHR9XG5cdH1cbn07XG5cblppcFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIGluZGV4ZWRWYWx1ZSkge1xuXHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzW2luZGV4ZWRWYWx1ZS5pbmRleF07XG5cdGlmKGJ1ZmZlci5pc0VtcHR5KCkpIHtcblx0XHR0aGlzLnNpbmsuZW5kKHQsIGluZGV4ZWRWYWx1ZS52YWx1ZSk7XG5cdH1cbn07XG5cblppcFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG5cbmZ1bmN0aW9uIGVtaXRaaXBwZWQgKGYsIHQsIGJ1ZmZlcnMsIHNpbmspIHtcblx0c2luay5ldmVudCh0LCBpbnZva2UoZiwgbWFwKGhlYWQsIGJ1ZmZlcnMpKSk7XG59XG5cbmZ1bmN0aW9uIGhlYWQoYnVmZmVyKSB7XG5cdHJldHVybiBidWZmZXIuc2hpZnQoKTtcbn1cblxuZnVuY3Rpb24gZW5kZWQoYnVmZmVycywgc2lua3MpIHtcblx0Zm9yKHZhciBpPTAsIGw9YnVmZmVycy5sZW5ndGg7IGk8bDsgKytpKSB7XG5cdFx0aWYoYnVmZmVyc1tpXS5pc0VtcHR5KCkgJiYgIXNpbmtzW2ldLmFjdGl2ZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZHkoYnVmZmVycykge1xuXHRmb3IodmFyIGk9MCwgbD1idWZmZXJzLmxlbmd0aDsgaTxsOyArK2kpIHtcblx0XHRpZihidWZmZXJzW2ldLmlzRW1wdHkoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmVyO1xuXG5mdW5jdGlvbiBkZWZlcih0YXNrKSB7XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUodGFzaykudGhlbihydW5UYXNrKTtcbn1cblxuZnVuY3Rpb24gcnVuVGFzayh0YXNrKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRhc2sucnVuKCk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHJldHVybiB0YXNrLmVycm9yKGUpO1xuXHR9XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwb3NhYmxlO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBEaXNwb3NhYmxlIHdoaWNoIHdpbGwgZGlzcG9zZSBpdHMgdW5kZXJseWluZyByZXNvdXJjZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRpc3Bvc2UgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kj99IGRhdGEgYW55IGRhdGEgdG8gYmUgcGFzc2VkIHRvIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gRGlzcG9zYWJsZShkaXNwb3NlLCBkYXRhKSB7XG5cdHRoaXMuX2Rpc3Bvc2UgPSBkaXNwb3NlO1xuXHR0aGlzLl9kYXRhID0gZGF0YTtcbn1cblxuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5fZGlzcG9zZSh0aGlzLl9kYXRhKTtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBTZXR0YWJsZURpc3Bvc2FibGU7XG5cbmZ1bmN0aW9uIFNldHRhYmxlRGlzcG9zYWJsZSgpIHtcblx0dGhpcy5kaXNwb3NhYmxlID0gdm9pZCAwO1xuXHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdHRoaXMuX3Jlc29sdmUgPSB2b2lkIDA7XG5cblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLnJlc3VsdCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcblx0XHRzZWxmLl9yZXNvbHZlID0gcmVzb2x2ZTtcblx0fSk7XG59XG5cblNldHRhYmxlRGlzcG9zYWJsZS5wcm90b3R5cGUuc2V0RGlzcG9zYWJsZSA9IGZ1bmN0aW9uKGRpc3Bvc2FibGUpIHtcblx0aWYodGhpcy5kaXNwb3NhYmxlICE9PSB2b2lkIDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3NldERpc3Bvc2FibGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlJyk7XG5cdH1cblxuXHR0aGlzLmRpc3Bvc2FibGUgPSBkaXNwb3NhYmxlO1xuXG5cdGlmKHRoaXMuZGlzcG9zZWQpIHtcblx0XHR0aGlzLl9yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKTtcblx0fVxufTtcblxuU2V0dGFibGVEaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdGlmKHRoaXMuZGlzcG9zZWQpIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN1bHQ7XG5cdH1cblxuXHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblxuXHRpZih0aGlzLmRpc3Bvc2FibGUgIT09IHZvaWQgMCkge1xuXHRcdHRoaXMucmVzdWx0ID0gdGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHJldHVybiB0aGlzLnJlc3VsdDtcbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIERpc3Bvc2FibGUgPSByZXF1aXJlKCcuL0Rpc3Bvc2FibGUnKTtcbnZhciBTZXR0YWJsZURpc3Bvc2FibGUgPSByZXF1aXJlKCcuL1NldHRhYmxlRGlzcG9zYWJsZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJy4uL1Byb21pc2UnKS5pc1Byb21pc2U7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcblxudmFyIG1hcCA9IGJhc2UubWFwO1xudmFyIGlkZW50aXR5ID0gYmFzZS5pZDtcblxuZXhwb3J0cy50cnlEaXNwb3NlID0gdHJ5RGlzcG9zZTtcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuZXhwb3J0cy5vbmNlID0gb25jZTtcbmV4cG9ydHMuZW1wdHkgPSBlbXB0eTtcbmV4cG9ydHMuYWxsID0gYWxsO1xuZXhwb3J0cy5zZXR0YWJsZSA9IHNldHRhYmxlO1xuZXhwb3J0cy5wcm9taXNlZCA9IHByb21pc2VkO1xuXG4vKipcbiAqIENhbGwgZGlzcG9zYWJsZS5kaXNwb3NlLiAgSWYgaXQgcmV0dXJucyBhIHByb21pc2UsIGNhdGNoIHByb21pc2VcbiAqIGVycm9yIGFuZCBmb3J3YXJkIGl0IHRocm91Z2ggdGhlIHByb3ZpZGVkIHNpbmsuXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0aW1lXG4gKiBAcGFyYW0ge3tkaXNwb3NlOiBmdW5jdGlvbn19IGRpc3Bvc2FibGVcbiAqIEBwYXJhbSB7e2Vycm9yOiBmdW5jdGlvbn19IHNpbmtcbiAqIEByZXR1cm4geyp9IHJlc3VsdCBvZiBkaXNwb3NhYmxlLmRpc3Bvc2VcbiAqL1xuZnVuY3Rpb24gdHJ5RGlzcG9zZSh0LCBkaXNwb3NhYmxlLCBzaW5rKSB7XG5cdHZhciByZXN1bHQgPSBkaXNwb3NlU2FmZWx5KGRpc3Bvc2FibGUpO1xuXHRyZXR1cm4gaXNQcm9taXNlKHJlc3VsdClcblx0XHQ/IHJlc3VsdC5jYXRjaChmdW5jdGlvbiAoZSkge1xuXHRcdFx0c2luay5lcnJvcih0LCBlKTtcblx0XHR9KVxuXHRcdDogcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBEaXNwb3NhYmxlIHdoaWNoIHdpbGwgZGlzcG9zZSBpdHMgdW5kZXJseWluZyByZXNvdXJjZVxuICogYXQgbW9zdCBvbmNlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGlzcG9zZSBmdW5jdGlvblxuICogQHBhcmFtIHsqP30gZGF0YSBhbnkgZGF0YSB0byBiZSBwYXNzZWQgdG8gZGlzcG9zZXIgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShkaXNwb3NlLCBkYXRhKSB7XG5cdHJldHVybiBvbmNlKG5ldyBEaXNwb3NhYmxlKGRpc3Bvc2UsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBub29wIGRpc3Bvc2FibGUuIENhbiBiZSB1c2VkIHRvIHNhdGlzZnkgYSBEaXNwb3NhYmxlXG4gKiByZXF1aXJlbWVudCB3aGVuIG5vIGFjdHVhbCByZXNvdXJjZSBuZWVkcyB0byBiZSBkaXNwb3NlZC5cbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV8ZXhwb3J0c3xtb2R1bGUuZXhwb3J0c31cbiAqL1xuZnVuY3Rpb24gZW1wdHkoKSB7XG5cdHJldHVybiBuZXcgRGlzcG9zYWJsZShpZGVudGl0eSwgdm9pZCAwKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwb3NhYmxlIHRoYXQgd2lsbCBkaXNwb3NlIGFsbCBpbnB1dCBkaXNwb3NhYmxlcyBpbiBwYXJhbGxlbC5cbiAqIEBwYXJhbSB7QXJyYXk8RGlzcG9zYWJsZT59IGRpc3Bvc2FibGVzXG4gKiBAcmV0dXJuIHtEaXNwb3NhYmxlfVxuICovXG5mdW5jdGlvbiBhbGwoZGlzcG9zYWJsZXMpIHtcblx0cmV0dXJuIGNyZWF0ZShkaXNwb3NlQWxsLCBkaXNwb3NhYmxlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VBbGwoZGlzcG9zYWJsZXMpIHtcblx0cmV0dXJuIFByb21pc2UuYWxsKG1hcChkaXNwb3NlU2FmZWx5LCBkaXNwb3NhYmxlcykpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlU2FmZWx5KGRpc3Bvc2FibGUpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdH0gY2F0Y2goZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRpc3Bvc2FibGUgZnJvbSBhIHByb21pc2UgZm9yIGFub3RoZXIgZGlzcG9zYWJsZVxuICogQHBhcmFtIHtQcm9taXNlPERpc3Bvc2FibGU+fSBkaXNwb3NhYmxlUHJvbWlzZVxuICogQHJldHVybiB7RGlzcG9zYWJsZX1cbiAqL1xuZnVuY3Rpb24gcHJvbWlzZWQoZGlzcG9zYWJsZVByb21pc2UpIHtcblx0cmV0dXJuIGNyZWF0ZShkaXNwb3NlUHJvbWlzZSwgZGlzcG9zYWJsZVByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlUHJvbWlzZShkaXNwb3NhYmxlUHJvbWlzZSkge1xuXHRyZXR1cm4gZGlzcG9zYWJsZVByb21pc2UudGhlbihkaXNwb3NlT25lKTtcbn1cblxuZnVuY3Rpb24gZGlzcG9zZU9uZShkaXNwb3NhYmxlKSB7XG5cdHJldHVybiBkaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwb3NhYmxlIHByb3h5IHRoYXQgYWxsb3dzIGl0cyB1bmRlcmx5aW5nIGRpc3Bvc2FibGUgdG9cbiAqIGJlIHNldCBsYXRlci5cbiAqIEByZXR1cm4ge1NldHRhYmxlRGlzcG9zYWJsZX1cbiAqL1xuZnVuY3Rpb24gc2V0dGFibGUoKSB7XG5cdHJldHVybiBuZXcgU2V0dGFibGVEaXNwb3NhYmxlKCk7XG59XG5cbi8qKlxuICogV3JhcCBhbiBleGlzdGluZyBkaXNwb3NhYmxlICh3aGljaCBtYXkgbm90IGFscmVhZHkgaGF2ZSBiZWVuIG9uY2UoKWQpXG4gKiBzbyB0aGF0IGl0IHdpbGwgb25seSBkaXNwb3NlIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlIGF0IG1vc3Qgb25jZS5cbiAqIEBwYXJhbSB7eyBkaXNwb3NlOiBmdW5jdGlvbigpIH19IGRpc3Bvc2FibGVcbiAqIEByZXR1cm4ge0Rpc3Bvc2FibGV9IHdyYXBwZWQgZGlzcG9zYWJsZVxuICovXG5mdW5jdGlvbiBvbmNlKGRpc3Bvc2FibGUpIHtcblx0cmV0dXJuIG5ldyBEaXNwb3NhYmxlKGRpc3Bvc2VNZW1vaXplZCwgbWVtb2l6ZWQoZGlzcG9zYWJsZSkpO1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlTWVtb2l6ZWQobWVtb2l6ZWQpIHtcblx0aWYoIW1lbW9pemVkLmRpc3Bvc2VkKSB7XG5cdFx0bWVtb2l6ZWQuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdG1lbW9pemVkLnZhbHVlID0gZGlzcG9zZVNhZmVseShtZW1vaXplZC5kaXNwb3NhYmxlKTtcblx0XHRtZW1vaXplZC5kaXNwb3NhYmxlID0gdm9pZCAwO1xuXHR9XG5cblx0cmV0dXJuIG1lbW9pemVkLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBtZW1vaXplZChkaXNwb3NhYmxlKSB7XG5cdHJldHVybiB7IGRpc3Bvc2VkOiBmYWxzZSwgZGlzcG9zYWJsZTogZGlzcG9zYWJsZSwgdmFsdWU6IHZvaWQgMCB9O1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gZmF0YWxFcnJvcjtcblxuZnVuY3Rpb24gZmF0YWxFcnJvciAoZSkge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdHRocm93IGU7XG5cdH0sIDApO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBQaXBlID0gcmVxdWlyZSgnLi4vc2luay9QaXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsdGVyO1xuXG5mdW5jdGlvbiBGaWx0ZXIocCwgc291cmNlKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZpbHRlcmVkIHNvdXJjZSwgZnVzaW5nIGFkamFjZW50IGZpbHRlci5maWx0ZXIgaWYgcG9zc2libGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oeDoqKTpib29sZWFufSBwIGZpbHRlcmluZyBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7e3J1bjpmdW5jdGlvbn19IHNvdXJjZSBzb3VyY2UgdG8gZmlsdGVyXG4gKiBAcmV0dXJucyB7RmlsdGVyfSBmaWx0ZXJlZCBzb3VyY2VcbiAqL1xuRmlsdGVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihwLCBzb3VyY2UpIHtcblx0aWYgKHNvdXJjZSBpbnN0YW5jZW9mIEZpbHRlcikge1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFuZChzb3VyY2UucCwgcCksIHNvdXJjZS5zb3VyY2UpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBGaWx0ZXIocCwgc291cmNlKTtcbn07XG5cbkZpbHRlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEZpbHRlclNpbmsodGhpcy5wLCBzaW5rKSwgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEZpbHRlclNpbmsocCwgc2luaykge1xuXHR0aGlzLnAgPSBwO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xufVxuXG5GaWx0ZXJTaW5rLnByb3RvdHlwZS5lbmQgICA9IFBpcGUucHJvdG90eXBlLmVuZDtcbkZpbHRlclNpbmsucHJvdG90eXBlLmVycm9yID0gUGlwZS5wcm90b3R5cGUuZXJyb3I7XG5cbkZpbHRlclNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgcCA9IHRoaXMucDtcblx0cCh4KSAmJiB0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5mdW5jdGlvbiBhbmQocCwgcSkge1xuXHRyZXR1cm4gZnVuY3Rpb24oeCkge1xuXHRcdHJldHVybiBwKHgpICYmIHEoeCk7XG5cdH07XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFBpcGUgPSByZXF1aXJlKCcuLi9zaW5rL1BpcGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWx0ZXJNYXA7XG5cbmZ1bmN0aW9uIEZpbHRlck1hcChwLCBmLCBzb3VyY2UpIHtcblx0dGhpcy5wID0gcDtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkZpbHRlck1hcC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZS5ydW4obmV3IEZpbHRlck1hcFNpbmsodGhpcy5wLCB0aGlzLmYsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gRmlsdGVyTWFwU2luayhwLCBmLCBzaW5rKSB7XG5cdHRoaXMucCA9IHA7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkZpbHRlck1hcFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHR2YXIgZiA9IHRoaXMuZjtcblx0dmFyIHAgPSB0aGlzLnA7XG5cdHAoeCkgJiYgdGhpcy5zaW5rLmV2ZW50KHQsIGYoeCkpO1xufTtcblxuRmlsdGVyTWFwU2luay5wcm90b3R5cGUuZW5kID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuRmlsdGVyTWFwU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgUGlwZSA9IHJlcXVpcmUoJy4uL3NpbmsvUGlwZScpO1xudmFyIEZpbHRlciA9IHJlcXVpcmUoJy4vRmlsdGVyJyk7XG52YXIgRmlsdGVyTWFwID0gcmVxdWlyZSgnLi9GaWx0ZXJNYXAnKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcblxuZnVuY3Rpb24gTWFwKGYsIHNvdXJjZSkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtYXBwZWQgc291cmNlLCBmdXNpbmcgYWRqYWNlbnQgbWFwLm1hcCwgZmlsdGVyLm1hcCxcbiAqIGFuZCBmaWx0ZXIubWFwLm1hcCBpZiBwb3NzaWJsZVxuICogQHBhcmFtIHtmdW5jdGlvbigqKToqfSBmIG1hcHBpbmcgZnVuY3Rpb25cbiAqIEBwYXJhbSB7e3J1bjpmdW5jdGlvbn19IHNvdXJjZSBzb3VyY2UgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWFwfEZpbHRlck1hcH0gbWFwcGVkIHNvdXJjZSwgcG9zc2libHkgZnVzZWRcbiAqL1xuTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZU1hcChmLCBzb3VyY2UpIHtcblx0aWYoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoYmFzZS5jb21wb3NlKGYsIHNvdXJjZS5mKSwgc291cmNlLnNvdXJjZSk7XG5cdH1cblxuXHRpZihzb3VyY2UgaW5zdGFuY2VvZiBGaWx0ZXIpIHtcblx0XHRyZXR1cm4gbmV3IEZpbHRlck1hcChzb3VyY2UucCwgZiwgc291cmNlLnNvdXJjZSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IE1hcChmLCBzb3VyY2UpO1xufTtcblxuTWFwLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIHRoaXMuc291cmNlLnJ1bihuZXcgTWFwU2luayh0aGlzLmYsIHNpbmspLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gTWFwU2luayhmLCBzaW5rKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbk1hcFNpbmsucHJvdG90eXBlLmVuZCAgID0gUGlwZS5wcm90b3R5cGUuZW5kO1xuTWFwU2luay5wcm90b3R5cGUuZXJyb3IgPSBQaXBlLnByb3RvdHlwZS5lcnJvcjtcblxuTWFwU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBmID0gdGhpcy5mO1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgZih4KSk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gaW52b2tlO1xuXG5mdW5jdGlvbiBpbnZva2UoZiwgYXJncykge1xuXHQvKmVzbGludCBjb21wbGV4aXR5OiBbMiw3XSovXG5cdHN3aXRjaChhcmdzLmxlbmd0aCkge1xuXHRcdGNhc2UgMDogcmV0dXJuIGYoKTtcblx0XHRjYXNlIDE6IHJldHVybiBmKGFyZ3NbMF0pO1xuXHRcdGNhc2UgMjogcmV0dXJuIGYoYXJnc1swXSwgYXJnc1sxXSk7XG5cdFx0Y2FzZSAzOiByZXR1cm4gZihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcblx0XHRjYXNlIDQ6IHJldHVybiBmKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuXHRcdGNhc2UgNTogcmV0dXJuIGYoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmLmFwcGx5KHZvaWQgMCwgYXJncyk7XG5cdH1cbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5leHBvcnRzLmlzSXRlcmFibGUgPSBpc0l0ZXJhYmxlO1xuZXhwb3J0cy5nZXRJdGVyYXRvciA9IGdldEl0ZXJhdG9yO1xuZXhwb3J0cy5tYWtlSXRlcmFibGUgPSBtYWtlSXRlcmFibGU7XG5cbi8qZ2xvYmFsIFNldCwgU3ltYm9sKi9cbnZhciBpdGVyYXRvclN5bWJvbDtcbi8vIEZpcmVmb3ggc2hpcHMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBuYW1lIEBAaXRlcmF0b3IuXG4vLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05MDcwNzcjYzE0XG5pZiAodHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV3IFNldCgpWydAQGl0ZXJhdG9yJ10gPT09ICdmdW5jdGlvbicpIHtcblx0aXRlcmF0b3JTeW1ib2wgPSAnQEBpdGVyYXRvcic7XG59IGVsc2Uge1xuXHRpdGVyYXRvclN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yIHx8XG5cdCdfZXM2c2hpbV9pdGVyYXRvcl8nO1xufVxuXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKG8pIHtcblx0cmV0dXJuIHR5cGVvZiBvW2l0ZXJhdG9yU3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3Iobykge1xuXHRyZXR1cm4gb1tpdGVyYXRvclN5bWJvbF0oKTtcbn1cblxuZnVuY3Rpb24gbWFrZUl0ZXJhYmxlKGYsIG8pIHtcblx0b1tpdGVyYXRvclN5bWJvbF0gPSBmO1xuXHRyZXR1cm4gbztcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xuXG5leHBvcnRzLmZyb21PYnNlcnZhYmxlID0gZnJvbU9ic2VydmFibGU7XG5leHBvcnRzLk9ic2VydmFibGVTb3VyY2UgPSBPYnNlcnZhYmxlU291cmNlO1xuZXhwb3J0cy5TdWJzY3JpYmVyU2luayA9IFN1YnNjcmliZXJTaW5rO1xuXG5mdW5jdGlvbiBmcm9tT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBPYnNlcnZhYmxlU291cmNlKG9ic2VydmFibGUpKTtcbn1cblxuZnVuY3Rpb24gT2JzZXJ2YWJsZVNvdXJjZShvYnNlcnZhYmxlKSB7XG5cdHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7XG59XG5cbk9ic2VydmFibGVTb3VyY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHR2YXIgc3ViID0gdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZShuZXcgU3Vic2NyaWJlclNpbmsoc2luaywgc2NoZWR1bGVyKSk7XG5cdGlmKHR5cGVvZiBzdWIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gZGlzcG9zZS5jcmVhdGUoc3ViKTtcblx0fSBlbHNlIGlmKHN1YiAmJiB0eXBlb2Ygc3ViLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGRpc3Bvc2UuY3JlYXRlKHVuc3Vic2NyaWJlLCBzdWIpO1xuXHR9XG5cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSByZXR1cm5lZCBpbnZhbGlkIHN1YnNjcmlwdGlvbiAnICsgU3RyaW5nKHN1YikpO1xufVxuXG5mdW5jdGlvbiBTdWJzY3JpYmVyU2luayhzaW5rLCBzY2hlZHVsZXIpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG59XG5cblN1YnNjcmliZXJTaW5rLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oeCkge1xuXHR0aGlzLnNpbmsuZXZlbnQodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufVxuXG5TdWJzY3JpYmVyU2luay5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbih4KSB7XG5cdHRoaXMuc2luay5lbmQodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufVxuXG5TdWJzY3JpYmVyU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7XG5cdHRoaXMuc2luay5lcnJvcih0aGlzLnNjaGVkdWxlci5ub3coKSwgZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuXHRyZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIHN5bWJvbE9ic2VydmFibGUgPSByZXF1aXJlKCdzeW1ib2wtb2JzZXJ2YWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE9ic2VydmFibGU7XG5cbmZ1bmN0aW9uIGdldE9ic2VydmFibGUobykge1xuXHR2YXIgb2JzID0gbnVsbDtcblx0aWYobyAhPSBudWxsICYmIHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuXHRcdHZhciBtZXRob2QgPSBvW3N5bWJvbE9ic2VydmFibGVdO1xuXHRcdGlmKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdG9icyA9IG1ldGhvZC5jYWxsKG8pO1xuXHRcdFx0aWYob2JzID09IG51bGwgfHwgdHlwZW9mIG9icyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBvYnNlcnZhYmxlICcgKyBvYnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYnM7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRlZmF1bHRTY2hlZHVsZXIgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvZGVmYXVsdFNjaGVkdWxlcicpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciBmYXRhbEVycm9yID0gcmVxdWlyZSgnLi4vZmF0YWxFcnJvcicpO1xuXG5leHBvcnRzLnN1YnNjcmliZSA9IHN1YnNjcmliZTtcbmV4cG9ydHMuU3Vic2NyaWJlT2JzZXJ2ZXIgPSBTdWJzY3JpYmVPYnNlcnZlcjtcbmV4cG9ydHMuU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uO1xuXG5mdW5jdGlvbiBzdWJzY3JpYmUoc3Vic2NyaWJlciwgc3RyZWFtKSB7XG5cdGlmKHN1YnNjcmliZXIgPT0gbnVsbCB8fCB0eXBlb2Ygc3Vic2NyaWJlciAhPT0gJ29iamVjdCcpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdWJzY3JpYmVyIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIgZGlzcG9zYWJsZSA9IGRpc3Bvc2Uuc2V0dGFibGUoKTtcblx0dmFyIG9ic2VydmVyID0gbmV3IFN1YnNjcmliZU9ic2VydmVyKGZhdGFsRXJyb3IsIHN1YnNjcmliZXIsIGRpc3Bvc2FibGUpO1xuXG5cdGRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZShzdHJlYW0uc291cmNlLnJ1bihvYnNlcnZlciwgZGVmYXVsdFNjaGVkdWxlcikpO1xuXG5cdHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGRpc3Bvc2FibGUpO1xufVxuXG5mdW5jdGlvbiBTdWJzY3JpYmVPYnNlcnZlcihmYXRhbEVycm9yLCBzdWJzY3JpYmVyLCBkaXNwb3NhYmxlKSB7XG5cdHRoaXMuZmF0YWxFcnJvciA9IGZhdGFsRXJyb3I7XG5cdHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG59XG5cblN1YnNjcmliZU9ic2VydmVyLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYodHlwZW9mIHRoaXMuc3Vic2NyaWJlci5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhpcy5zdWJzY3JpYmVyLm5leHQoeCk7XG5cdH1cbn07XG5cblN1YnNjcmliZU9ic2VydmVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHZhciBzID0gdGhpcy5zdWJzY3JpYmVyO1xuXHRkb0Rpc3Bvc2UodGhpcy5mYXRhbEVycm9yLCBzLCBzLmNvbXBsZXRlLCBzLmVycm9yLCB0aGlzLmRpc3Bvc2FibGUsIHgpO1xufTtcblxuU3Vic2NyaWJlT2JzZXJ2ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHR2YXIgcyA9IHRoaXMuc3Vic2NyaWJlcjtcblx0ZG9EaXNwb3NlKHRoaXMuZmF0YWxFcnJvciwgcywgcy5lcnJvciwgcy5lcnJvciwgdGhpcy5kaXNwb3NhYmxlLCBlKTtcbn07XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihkaXNwb3NhYmxlKSB7XG5cdHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG59XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbn1cblxuZnVuY3Rpb24gZG9EaXNwb3NlKGZhdGFsLCBzdWJzY3JpYmVyLCBjb21wbGV0ZSwgZXJyb3IsIGRpc3Bvc2FibGUsIHgpIHtcblx0UHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRpZih0eXBlb2YgY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbXBsZXRlLmNhbGwoc3Vic2NyaWJlciwgeCk7XG5cdFx0fVxuXHR9KS5jYXRjaChmdW5jdGlvbihlKSB7XG5cdFx0aWYodHlwZW9mIGVycm9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRlcnJvci5jYWxsKHN1YnNjcmliZXIsIGUpO1xuXHRcdH1cblx0fSkuY2F0Y2goZmF0YWwpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBPYnNlcnZlciA9IHJlcXVpcmUoJy4vc2luay9PYnNlcnZlcicpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIGRlZmF1bHRTY2hlZHVsZXIgPSByZXF1aXJlKCcuL3NjaGVkdWxlci9kZWZhdWx0U2NoZWR1bGVyJyk7XG5cbmV4cG9ydHMud2l0aERlZmF1bHRTY2hlZHVsZXIgPSB3aXRoRGVmYXVsdFNjaGVkdWxlcjtcbmV4cG9ydHMud2l0aFNjaGVkdWxlciA9IHdpdGhTY2hlZHVsZXI7XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0U2NoZWR1bGVyKGYsIHNvdXJjZSkge1xuXHRyZXR1cm4gd2l0aFNjaGVkdWxlcihmLCBzb3VyY2UsIGRlZmF1bHRTY2hlZHVsZXIpO1xufVxuXG5mdW5jdGlvbiB3aXRoU2NoZWR1bGVyKGYsIHNvdXJjZSwgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0cnVuU291cmNlKGYsIHNvdXJjZSwgc2NoZWR1bGVyLCByZXNvbHZlLCByZWplY3QpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gcnVuU291cmNlKGYsIHNvdXJjZSwgc2NoZWR1bGVyLCByZXNvbHZlLCByZWplY3QpIHtcblx0dmFyIGRpc3Bvc2FibGUgPSBkaXNwb3NlLnNldHRhYmxlKCk7XG5cdHZhciBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmLCByZXNvbHZlLCByZWplY3QsIGRpc3Bvc2FibGUpO1xuXG5cdGRpc3Bvc2FibGUuc2V0RGlzcG9zYWJsZShzb3VyY2UucnVuKG9ic2VydmVyLCBzY2hlZHVsZXIpKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgZmF0YWwgPSByZXF1aXJlKCcuLi9mYXRhbEVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvcGFnYXRlVGFzaztcblxuZnVuY3Rpb24gUHJvcGFnYXRlVGFzayhydW4sIHZhbHVlLCBzaW5rKSB7XG5cdHRoaXMuX3J1biA9IHJ1bjtcblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG59XG5cblByb3BhZ2F0ZVRhc2suZXZlbnQgPSBmdW5jdGlvbih2YWx1ZSwgc2luaykge1xuXHRyZXR1cm4gbmV3IFByb3BhZ2F0ZVRhc2soZW1pdCwgdmFsdWUsIHNpbmspO1xufTtcblxuUHJvcGFnYXRlVGFzay5lbmQgPSBmdW5jdGlvbih2YWx1ZSwgc2luaykge1xuXHRyZXR1cm4gbmV3IFByb3BhZ2F0ZVRhc2soZW5kLCB2YWx1ZSwgc2luayk7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLmVycm9yID0gZnVuY3Rpb24odmFsdWUsIHNpbmspIHtcblx0cmV0dXJuIG5ldyBQcm9wYWdhdGVUYXNrKGVycm9yLCB2YWx1ZSwgc2luayk7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5Qcm9wYWdhdGVUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbih0KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLl9ydW4odCwgdGhpcy52YWx1ZSwgdGhpcy5zaW5rKTtcbn07XG5cblByb3BhZ2F0ZVRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm4gZmF0YWwoZSk7XG5cdH1cblx0dGhpcy5zaW5rLmVycm9yKHQsIGUpO1xufTtcblxuZnVuY3Rpb24gZXJyb3IodCwgZSwgc2luaykge1xuXHRzaW5rLmVycm9yKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBlbWl0KHQsIHgsIHNpbmspIHtcblx0c2luay5ldmVudCh0LCB4KTtcbn1cblxuZnVuY3Rpb24gZW5kKHQsIHgsIHNpbmspIHtcblx0c2luay5lbmQodCwgeCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGJhc2UgPSByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZWR1bGVyO1xuXG5mdW5jdGlvbiBTY2hlZHVsZWRUYXNrKGRlbGF5LCBwZXJpb2QsIHRhc2ssIHNjaGVkdWxlcikge1xuXHR0aGlzLnRpbWUgPSBkZWxheTtcblx0dGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG5cdHRoaXMudGFzayA9IHRhc2s7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG59XG5cblNjaGVkdWxlZFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy50YXNrLnJ1bih0aGlzLnRpbWUpO1xufTtcblxuU2NoZWR1bGVkVGFzay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7XG5cdHJldHVybiB0aGlzLnRhc2suZXJyb3IodGhpcy50aW1lLCBlKTtcbn07XG5cblNjaGVkdWxlZFRhc2sucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5zY2hlZHVsZXIuY2FuY2VsKHRoaXMpO1xuXHRyZXR1cm4gdGhpcy50YXNrLmRpc3Bvc2UoKTtcbn07XG5cbmZ1bmN0aW9uIHJ1blRhc2sodGFzaykge1xuXHR0cnkge1xuXHRcdHJldHVybiB0YXNrLnJ1bigpO1xuXHR9IGNhdGNoKGUpIHtcblx0XHRyZXR1cm4gdGFzay5lcnJvcihlKTtcblx0fVxufVxuXG5mdW5jdGlvbiBTY2hlZHVsZXIodGltZXIpIHtcblx0dGhpcy50aW1lciA9IHRpbWVyO1xuXG5cdHRoaXMuX3RpbWVyID0gbnVsbDtcblx0dGhpcy5fbmV4dEFycml2YWwgPSAwO1xuXHR0aGlzLl90YXNrcyA9IFtdO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0dGhpcy5fcnVuUmVhZHlUYXNrc0JvdW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0c2VsZi5fcnVuUmVhZHlUYXNrcyhzZWxmLm5vdygpKTtcblx0fTtcbn1cblxuU2NoZWR1bGVyLnByb3RvdHlwZS5ub3cgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMudGltZXIubm93KCk7XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLmFzYXAgPSBmdW5jdGlvbih0YXNrKSB7XG5cdHJldHVybiB0aGlzLnNjaGVkdWxlKDAsIC0xLCB0YXNrKTtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbihkZWxheSwgdGFzaykge1xuXHRyZXR1cm4gdGhpcy5zY2hlZHVsZShkZWxheSwgLTEsIHRhc2spO1xufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5wZXJpb2RpYyA9IGZ1bmN0aW9uKHBlcmlvZCwgdGFzaykge1xuXHRyZXR1cm4gdGhpcy5zY2hlZHVsZSgwLCBwZXJpb2QsIHRhc2spO1xufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKGRlbGF5LCBwZXJpb2QsIHRhc2spIHtcblx0dmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdHZhciBzdCA9IG5ldyBTY2hlZHVsZWRUYXNrKG5vdyArIE1hdGgubWF4KDAsIGRlbGF5KSwgcGVyaW9kLCB0YXNrLCB0aGlzKTtcblxuXHRpbnNlcnRCeVRpbWUoc3QsIHRoaXMuX3Rhc2tzKTtcblx0dGhpcy5fc2NoZWR1bGVOZXh0UnVuKG5vdyk7XG5cdHJldHVybiBzdDtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24odGFzaykge1xuXHR0YXNrLmFjdGl2ZSA9IGZhbHNlO1xuXHR2YXIgaSA9IGJpbmFyeVNlYXJjaCh0YXNrLnRpbWUsIHRoaXMuX3Rhc2tzKTtcblxuXHRpZihpID49IDAgJiYgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuXHRcdHZhciBhdCA9IGJhc2UuZmluZEluZGV4KHRhc2ssIHRoaXMuX3Rhc2tzW2ldLmV2ZW50cyk7XG5cdFx0aWYoYXQgPj0gMCkge1xuXHRcdFx0dGhpcy5fdGFza3NbaV0uZXZlbnRzLnNwbGljZShhdCwgMSk7XG5cdFx0XHR0aGlzLl9yZXNjaGVkdWxlKCk7XG5cdFx0fVxuXHR9XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLmNhbmNlbEFsbCA9IGZ1bmN0aW9uKGYpIHtcblx0Zm9yKHZhciBpPTA7IGk8dGhpcy5fdGFza3MubGVuZ3RoOyArK2kpIHtcblx0XHRyZW1vdmVBbGxGcm9tKGYsIHRoaXMuX3Rhc2tzW2ldKTtcblx0fVxuXHR0aGlzLl9yZXNjaGVkdWxlKCk7XG59O1xuXG5mdW5jdGlvbiByZW1vdmVBbGxGcm9tKGYsIHRpbWVzbG90KSB7XG5cdHRpbWVzbG90LmV2ZW50cyA9IGJhc2UucmVtb3ZlQWxsKGYsIHRpbWVzbG90LmV2ZW50cyk7XG59XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX3Jlc2NoZWR1bGUgPSBmdW5jdGlvbigpIHtcblx0aWYodGhpcy5fdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhpcy5fdW5zY2hlZHVsZSgpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dFJ1bih0aGlzLm5vdygpKTtcblx0fVxufTtcblxuU2NoZWR1bGVyLnByb3RvdHlwZS5fdW5zY2hlZHVsZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLnRpbWVyLmNsZWFyVGltZXIodGhpcy5fdGltZXIpO1xuXHR0aGlzLl90aW1lciA9IG51bGw7XG59O1xuXG5TY2hlZHVsZXIucHJvdG90eXBlLl9zY2hlZHVsZU5leHRSdW4gPSBmdW5jdGlvbihub3cpIHtcblx0aWYodGhpcy5fdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIG5leHRBcnJpdmFsID0gdGhpcy5fdGFza3NbMF0udGltZTtcblxuXHRpZih0aGlzLl90aW1lciA9PT0gbnVsbCkge1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dEFycml2YWwobmV4dEFycml2YWwsIG5vdyk7XG5cdH0gZWxzZSBpZihuZXh0QXJyaXZhbCA8IHRoaXMuX25leHRBcnJpdmFsKSB7XG5cdFx0dGhpcy5fdW5zY2hlZHVsZSgpO1xuXHRcdHRoaXMuX3NjaGVkdWxlTmV4dEFycml2YWwobmV4dEFycml2YWwsIG5vdyk7XG5cdH1cbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX3NjaGVkdWxlTmV4dEFycml2YWwgPSBmdW5jdGlvbihuZXh0QXJyaXZhbCwgbm93KSB7XG5cdHRoaXMuX25leHRBcnJpdmFsID0gbmV4dEFycml2YWw7XG5cdHZhciBkZWxheSA9IE1hdGgubWF4KDAsIG5leHRBcnJpdmFsIC0gbm93KTtcblx0dGhpcy5fdGltZXIgPSB0aGlzLnRpbWVyLnNldFRpbWVyKHRoaXMuX3J1blJlYWR5VGFza3NCb3VuZCwgZGVsYXkpO1xufTtcblxuXG5TY2hlZHVsZXIucHJvdG90eXBlLl9ydW5SZWFkeVRhc2tzID0gZnVuY3Rpb24obm93KSB7XG5cdHRoaXMuX3RpbWVyID0gbnVsbDtcblxuXHR0aGlzLl90YXNrcyA9IHRoaXMuX2ZpbmRBbmRSdW5UYXNrcyhub3cpO1xuXG5cdHRoaXMuX3NjaGVkdWxlTmV4dFJ1bih0aGlzLm5vdygpKTtcbn07XG5cblNjaGVkdWxlci5wcm90b3R5cGUuX2ZpbmRBbmRSdW5UYXNrcyA9IGZ1bmN0aW9uKG5vdykge1xuXHR2YXIgdGFza3MgPSB0aGlzLl90YXNrcztcblx0dmFyIGwgPSB0YXNrcy5sZW5ndGg7XG5cdHZhciBpID0gMDtcblxuXHR3aGlsZShpIDwgbCAmJiB0YXNrc1tpXS50aW1lIDw9IG5vdykge1xuXHRcdCsraTtcblx0fVxuXG5cdHRoaXMuX3Rhc2tzID0gdGFza3Muc2xpY2UoaSk7XG5cblx0Ly8gUnVuIGFsbCByZWFkeSB0YXNrc1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGk7ICsraikge1xuXHRcdHRoaXMuX3Rhc2tzID0gcnVuVGFza3ModGFza3Nbal0sIHRoaXMuX3Rhc2tzKTtcblx0fVxuXHRyZXR1cm4gdGhpcy5fdGFza3M7XG59O1xuXG5mdW5jdGlvbiBydW5UYXNrcyh0aW1lc2xvdCwgdGFza3MpIHtcblx0dmFyIGV2ZW50cyA9IHRpbWVzbG90LmV2ZW50cztcblx0Zm9yKHZhciBpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHRhc2sgPSBldmVudHNbaV07XG5cblx0XHRpZih0YXNrLmFjdGl2ZSkge1xuXHRcdFx0cnVuVGFzayh0YXNrKTtcblxuXHRcdFx0Ly8gUmVzY2hlZHVsZSBwZXJpb2RpYyByZXBlYXRpbmcgdGFza3Ncblx0XHRcdC8vIENoZWNrIGFjdGl2ZSBhZ2Fpbiwgc2luY2UgYSB0YXNrIG1heSBoYXZlIGNhbmNlbGVkIGl0c2VsZlxuXHRcdFx0aWYodGFzay5wZXJpb2QgPj0gMCkge1xuXHRcdFx0XHR0YXNrLnRpbWUgPSB0YXNrLnRpbWUgKyB0YXNrLnBlcmlvZDtcblx0XHRcdFx0aW5zZXJ0QnlUaW1lKHRhc2ssIHRhc2tzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJ5VGltZSh0YXNrLCB0aW1lc2xvdHMpIHtcblx0dmFyIGwgPSB0aW1lc2xvdHMubGVuZ3RoO1xuXG5cdGlmKGwgPT09IDApIHtcblx0XHR0aW1lc2xvdHMucHVzaChuZXdUaW1lc2xvdCh0YXNrLnRpbWUsIFt0YXNrXSkpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBpID0gYmluYXJ5U2VhcmNoKHRhc2sudGltZSwgdGltZXNsb3RzKTtcblxuXHRpZihpID49IGwpIHtcblx0XHR0aW1lc2xvdHMucHVzaChuZXdUaW1lc2xvdCh0YXNrLnRpbWUsIFt0YXNrXSkpO1xuXHR9IGVsc2UgaWYodGFzay50aW1lID09PSB0aW1lc2xvdHNbaV0udGltZSkge1xuXHRcdHRpbWVzbG90c1tpXS5ldmVudHMucHVzaCh0YXNrKTtcblx0fSBlbHNlIHtcblx0XHR0aW1lc2xvdHMuc3BsaWNlKGksIDAsIG5ld1RpbWVzbG90KHRhc2sudGltZSwgW3Rhc2tdKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKHQsIHNvcnRlZEFycmF5KSB7XG5cdHZhciBsbyA9IDA7XG5cdHZhciBoaSA9IHNvcnRlZEFycmF5Lmxlbmd0aDtcblx0dmFyIG1pZCwgeTtcblxuXHR3aGlsZSAobG8gPCBoaSkge1xuXHRcdG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMik7XG5cdFx0eSA9IHNvcnRlZEFycmF5W21pZF07XG5cblx0XHRpZiAodCA9PT0geS50aW1lKSB7XG5cdFx0XHRyZXR1cm4gbWlkO1xuXHRcdH0gZWxzZSBpZiAodCA8IHkudGltZSkge1xuXHRcdFx0aGkgPSBtaWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvID0gbWlkICsgMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGhpO1xufVxuXG5mdW5jdGlvbiBuZXdUaW1lc2xvdCh0LCBldmVudHMpIHtcblx0cmV0dXJuIHsgdGltZTogdCwgZXZlbnRzOiBldmVudHMgfTtcbn1cbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJy4vU2NoZWR1bGVyJyk7XG52YXIgc2V0VGltZW91dFRpbWVyID0gcmVxdWlyZSgnLi90aW1lb3V0VGltZXInKTtcbnZhciBub2RlVGltZXIgPSByZXF1aXJlKCcuL25vZGVUaW1lcicpO1xuXG52YXIgaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnXG5cdFx0JiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVkdWxlcihpc05vZGUgPyBub2RlVGltZXIgOiBzZXRUaW1lb3V0VGltZXIpO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTl6WTJobFpIVnNaWEl2WkdWbVlYVnNkRk5qYUdWa2RXeGxjaTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2lCQWJHbGpaVzV6WlNCTlNWUWdUR2xqWlc1elpTQW9ZeWtnWTI5d2VYSnBaMmgwSURJd01UQXRNakF4TmlCdmNtbG5hVzVoYkNCaGRYUm9iM0lnYjNJZ1lYVjBhRzl5Y3lBcUwxeHVMeW9xSUVCaGRYUm9iM0lnUW5KcFlXNGdRMkYyWVd4cFpYSWdLaTljYmk4cUtpQkFZWFYwYUc5eUlFcHZhRzRnU0dGdWJpQXFMMXh1WEc1MllYSWdVMk5vWldSMWJHVnlJRDBnY21WeGRXbHlaU2duTGk5VFkyaGxaSFZzWlhJbktUdGNiblpoY2lCelpYUlVhVzFsYjNWMFZHbHRaWElnUFNCeVpYRjFhWEpsS0NjdUwzUnBiV1Z2ZFhSVWFXMWxjaWNwTzF4dWRtRnlJRzV2WkdWVWFXMWxjaUE5SUhKbGNYVnBjbVVvSnk0dmJtOWtaVlJwYldWeUp5azdYRzVjYm5aaGNpQnBjMDV2WkdVZ1BTQjBlWEJsYjJZZ2NISnZZMlZ6Y3lBOVBUMGdKMjlpYW1WamRDZGNibHgwWEhRbUppQjBlWEJsYjJZZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXlBOVBUMGdKMloxYm1OMGFXOXVKenRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCdVpYY2dVMk5vWldSMWJHVnlLR2x6VG05a1pTQS9JRzV2WkdWVWFXMWxjaUE2SUhObGRGUnBiV1Z2ZFhSVWFXMWxjaWs3WEc0aVhYMD0iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRlZmVyID0gcmVxdWlyZSgnLi4vZGVmZXInKTtcblxuLypnbG9iYWwgc2V0VGltZW91dCwgY2xlYXJUaW1lb3V0Ki9cblxuZnVuY3Rpb24gVGFzayhmKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgZiA9IHRoaXMuZjtcblx0cmV0dXJuIGYoKTtcbn07XG5cblRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aHJvdyBlO1xufTtcblxuVGFzay5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBydW5Bc1Rhc2soZikge1xuXHR2YXIgdGFzayA9IG5ldyBUYXNrKGYpO1xuXHRkZWZlcih0YXNrKTtcblx0cmV0dXJuIHRhc2s7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRub3c6IERhdGUubm93LFxuXHRzZXRUaW1lcjogZnVuY3Rpb24oZiwgZHQpIHtcblx0XHRyZXR1cm4gZHQgPD0gMCA/IHJ1bkFzVGFzayhmKSA6IHNldFRpbWVvdXQoZiwgZHQpO1xuXHR9LFxuXHRjbGVhclRpbWVyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQgaW5zdGFuY2VvZiBUYXNrID8gdC5jYW5jZWwoKSA6IGNsZWFyVGltZW91dCh0KTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG4vKmdsb2JhbCBzZXRUaW1lb3V0LCBjbGVhclRpbWVvdXQqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0bm93OiBEYXRlLm5vdyxcblx0c2V0VGltZXI6IGZ1bmN0aW9uKGYsIGR0KSB7XG5cdFx0cmV0dXJuIHNldFRpbWVvdXQoZiwgZHQpO1xuXHR9LFxuXHRjbGVhclRpbWVyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIGNsZWFyVGltZW91dCh0KTtcblx0fVxufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgZGVmZXIgPSByZXF1aXJlKCcuLi9kZWZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmVycmVkU2luaztcblxuZnVuY3Rpb24gRGVmZXJyZWRTaW5rKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5ldmVudHMgPSBbXTtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xufVxuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZih0aGlzLmV2ZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRkZWZlcihuZXcgUHJvcGFnYXRlQWxsVGFzayh0aGlzLnNpbmssIHRoaXMuZXZlbnRzKSk7XG5cdH1cblxuXHR0aGlzLmV2ZW50cy5wdXNoKHsgdGltZTogdCwgdmFsdWU6IHggfSk7XG59O1xuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24odCwgZSkge1xuXHR0aGlzLl9lbmQobmV3IEVycm9yVGFzayh0LCBlLCB0aGlzLnNpbmspKTtcbn07XG5cbkRlZmVycmVkU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHR0aGlzLl9lbmQobmV3IEVuZFRhc2sodCwgeCwgdGhpcy5zaW5rKSk7XG59O1xuXG5EZWZlcnJlZFNpbmsucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbih0YXNrKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuZXZlbnRzID0gdm9pZCAwO1xuXHRkZWZlcih0YXNrKTtcbn1cblxuZnVuY3Rpb24gUHJvcGFnYXRlQWxsVGFzayhzaW5rLCBldmVudHMpIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5ldmVudHMgPSBldmVudHM7XG59XG5cblByb3BhZ2F0ZUFsbFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgZXZlbnRzID0gdGhpcy5ldmVudHM7XG5cdHZhciBzaW5rID0gdGhpcy5zaW5rO1xuXHR2YXIgZXZlbnQ7XG5cblx0Zm9yKHZhciBpID0gMCwgbCA9IGV2ZW50cy5sZW5ndGg7IGk8bDsgKytpKSB7XG5cdFx0ZXZlbnQgPSBldmVudHNbaV07XG5cdFx0c2luay5ldmVudChldmVudC50aW1lLCBldmVudC52YWx1ZSk7XG5cdH1cblxuXHRldmVudHMubGVuZ3RoID0gMDtcbn07XG5cblByb3BhZ2F0ZUFsbFRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aGlzLnNpbmsuZXJyb3IoMCwgZSk7XG59O1xuXG5mdW5jdGlvbiBFbmRUYXNrKHQsIHgsIHNpbmspIHtcblx0dGhpcy50aW1lID0gdDtcblx0dGhpcy52YWx1ZSA9IHg7XG5cdHRoaXMuc2luayA9IHNpbms7XG59XG5cbkVuZFRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNpbmsuZW5kKHRoaXMudGltZSwgdGhpcy52YWx1ZSk7XG59O1xuXG5FbmRUYXNrLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGUpIHtcblx0dGhpcy5zaW5rLmVycm9yKHRoaXMudGltZSwgZSk7XG59O1xuXG5mdW5jdGlvbiBFcnJvclRhc2sodCwgZSwgc2luaykge1xuXHR0aGlzLnRpbWUgPSB0O1xuXHR0aGlzLnZhbHVlID0gZTtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuRXJyb3JUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbigpIHtcblx0dGhpcy5zaW5rLmVycm9yKHRoaXMudGltZSwgdGhpcy52YWx1ZSk7XG59O1xuXG5FcnJvclRhc2sucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZSkge1xuXHR0aHJvdyBlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU2luayA9IHJlcXVpcmUoJy4vUGlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEluZGV4U2luaztcblxuZnVuY3Rpb24gSW5kZXhTaW5rKGksIHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5pbmRleCA9IGk7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0dGhpcy52YWx1ZSA9IHZvaWQgMDtcbn1cblxuSW5kZXhTaW5rLnByb3RvdHlwZS5ldmVudCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMudmFsdWUgPSB4O1xuXHR0aGlzLnNpbmsuZXZlbnQodCwgdGhpcyk7XG59O1xuXG5JbmRleFNpbmsucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRoaXMuc2luay5lbmQodCwgeyBpbmRleDogdGhpcy5pbmRleCwgdmFsdWU6IHggfSk7XG59O1xuXG5JbmRleFNpbmsucHJvdG90eXBlLmVycm9yID0gU2luay5wcm90b3R5cGUuZXJyb3I7XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBPYnNlcnZlcjtcblxuLyoqXG4gKiBTaW5rIHRoYXQgYWNjZXB0cyBmdW5jdGlvbnMgdG8gYXBwbHkgdG8gZWFjaCBldmVudCwgYW5kIHRvIGVuZCwgYW5kIGVycm9yXG4gKiBzaWduYWxzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE9ic2VydmVyKGV2ZW50LCBlbmQsIGVycm9yLCBkaXNwb3NhYmxlKSB7XG5cdHRoaXMuX2V2ZW50ID0gZXZlbnQ7XG5cdHRoaXMuX2VuZCA9IGVuZDtcblx0dGhpcy5fZXJyb3IgPSBlcnJvcjtcblx0dGhpcy5fZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcbn1cblxuT2JzZXJ2ZXIucHJvdG90eXBlLmV2ZW50ID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZiAoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuX2V2ZW50KHgpO1xufTtcblxuT2JzZXJ2ZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIHgpIHtcblx0aWYgKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHRkaXNwb3NlVGhlbih0aGlzLl9lbmQsIHRoaXMuX2Vycm9yLCB0aGlzLl9kaXNwb3NhYmxlLCB4KTtcbn07XG5cbk9ic2VydmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKHQsIGUpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0ZGlzcG9zZVRoZW4odGhpcy5fZXJyb3IsIHRoaXMuX2Vycm9yLCB0aGlzLl9kaXNwb3NhYmxlLCBlKTtcbn07XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUaGVuKGVuZCwgZXJyb3IsIGRpc3Bvc2FibGUsIHgpIHtcblx0UHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FibGUuZGlzcG9zZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRlbmQoeCk7XG5cdH0sIGVycm9yKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBpcGU7XG5cbi8qKlxuICogQSBzaW5rIG1peGluIHRoYXQgc2ltcGx5IGZvcndhcmRzIGV2ZW50LCBlbmQsIGFuZCBlcnJvciB0b1xuICogYW5vdGhlciBzaW5rLlxuICogQHBhcmFtIHNpbmtcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQaXBlKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcbn1cblxuUGlwZS5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5QaXBlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZW5kKHQsIHgpO1xufTtcblxuUGlwZS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHJldHVybiB0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbm1vZHVsZS5leHBvcnRzID0gU2FmZVNpbms7XG5cbmZ1bmN0aW9uIFNhZmVTaW5rKHNpbmspIHtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xufVxuXG5TYWZlU2luay5wcm90b3R5cGUuZXZlbnQgPSBmdW5jdGlvbih0LCB4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0aGlzLnNpbmsuZXZlbnQodCwgeCk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgeCkge1xuXHRpZighdGhpcy5hY3RpdmUpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dGhpcy5kaXNhYmxlKCk7XG5cdHRoaXMuc2luay5lbmQodCwgeCk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0LCBlKSB7XG5cdHRoaXMuZGlzYWJsZSgpO1xuXHR0aGlzLnNpbmsuZXJyb3IodCwgZSk7XG59O1xuXG5TYWZlU2luay5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHRyZXR1cm4gdGhpcy5zaW5rO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBEZWZlcnJlZFNpbmsgPSByZXF1aXJlKCcuLi9zaW5rL0RlZmVycmVkU2luaycpO1xudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciB0cnlFdmVudCA9IHJlcXVpcmUoJy4vdHJ5RXZlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXJTb3VyY2U7XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlclNvdXJjZShldmVudCwgc291cmNlKSB7XG5cdHRoaXMuZXZlbnQgPSBldmVudDtcblx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG59XG5cbkV2ZW50RW1pdHRlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdC8vIE5PVEU6IEJlY2F1c2UgRXZlbnRFbWl0dGVyIGFsbG93cyBldmVudHMgaW4gdGhlIHNhbWUgY2FsbCBzdGFjayBhc1xuXHQvLyBhIGxpc3RlbmVyIGlzIGFkZGVkLCB1c2UgYSBEZWZlcnJlZFNpbmsgdG8gYnVmZmVyIGV2ZW50c1xuXHQvLyB1bnRpbCB0aGUgc3RhY2sgY2xlYXJzLCB0aGVuIHByb3BhZ2F0ZS4gIFRoaXMgbWFpbnRhaW5zIG1vc3QuanMnc1xuXHQvLyBpbnZhcmlhbnQgdGhhdCBubyBldmVudCB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgc2FtZSBjYWxsIHN0YWNrXG5cdC8vIGFzIGFuIG9ic2VydmVyIGJlZ2lucyBvYnNlcnZpbmcuXG5cdHZhciBkc2luayA9IG5ldyBEZWZlcnJlZFNpbmsoc2luayk7XG5cblx0ZnVuY3Rpb24gYWRkRXZlbnRWYXJpYWRpYyhhKSB7XG5cdFx0dmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdGlmKGwgPiAxKSB7XG5cdFx0XHR2YXIgYXJyID0gbmV3IEFycmF5KGwpO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bDsgKytpKSB7XG5cdFx0XHRcdGFycltpXSA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdH1cblx0XHRcdHRyeUV2ZW50LnRyeUV2ZW50KHNjaGVkdWxlci5ub3coKSwgYXJyLCBkc2luayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeUV2ZW50LnRyeUV2ZW50KHNjaGVkdWxlci5ub3coKSwgYSwgZHNpbmspO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuc291cmNlLmFkZExpc3RlbmVyKHRoaXMuZXZlbnQsIGFkZEV2ZW50VmFyaWFkaWMpO1xuXG5cdHJldHVybiBkaXNwb3NlLmNyZWF0ZShkaXNwb3NlRXZlbnRFbWl0dGVyLCB7IHRhcmdldDogdGhpcywgYWRkRXZlbnQ6IGFkZEV2ZW50VmFyaWFkaWMgfSk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRXZlbnRFbWl0dGVyKGluZm8pIHtcblx0dmFyIHRhcmdldCA9IGluZm8udGFyZ2V0O1xuXHR0YXJnZXQuc291cmNlLnJlbW92ZUxpc3RlbmVyKHRhcmdldC5ldmVudCwgaW5mby5hZGRFdmVudCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIGRpc3Bvc2UgPSByZXF1aXJlKCcuLi9kaXNwb3NhYmxlL2Rpc3Bvc2UnKTtcbnZhciB0cnlFdmVudCA9IHJlcXVpcmUoJy4vdHJ5RXZlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldFNvdXJjZTtcblxuZnVuY3Rpb24gRXZlbnRUYXJnZXRTb3VyY2UoZXZlbnQsIHNvdXJjZSwgY2FwdHVyZSkge1xuXHR0aGlzLmV2ZW50ID0gZXZlbnQ7XG5cdHRoaXMuc291cmNlID0gc291cmNlO1xuXHR0aGlzLmNhcHR1cmUgPSBjYXB0dXJlO1xufVxuXG5FdmVudFRhcmdldFNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdGZ1bmN0aW9uIGFkZEV2ZW50KGUpIHtcblx0XHR0cnlFdmVudC50cnlFdmVudChzY2hlZHVsZXIubm93KCksIGUsIHNpbmspO1xuXHR9XG5cblx0dGhpcy5zb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmV2ZW50LCBhZGRFdmVudCwgdGhpcy5jYXB0dXJlKTtcblxuXHRyZXR1cm4gZGlzcG9zZS5jcmVhdGUoZGlzcG9zZUV2ZW50VGFyZ2V0LFxuXHRcdHsgdGFyZ2V0OiB0aGlzLCBhZGRFdmVudDogYWRkRXZlbnQgfSk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRXZlbnRUYXJnZXQoaW5mbykge1xuXHR2YXIgdGFyZ2V0ID0gaW5mby50YXJnZXQ7XG5cdHRhcmdldC5zb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQuZXZlbnQsIGluZm8uYWRkRXZlbnQsIHRhcmdldC5jYXB0dXJlKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIFByb3BhZ2F0ZVRhc2sgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvUHJvcGFnYXRlVGFzaycpO1xuXG5leHBvcnRzLm9mID0gc3RyZWFtT2Y7XG5leHBvcnRzLmVtcHR5ID0gZW1wdHk7XG5leHBvcnRzLm5ldmVyID0gbmV2ZXI7XG5cbi8qKlxuICogU3RyZWFtIGNvbnRhaW5pbmcgb25seSB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbiBmdW5jdGlvbiBzdHJlYW1PZih4KSB7XG4gXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgSnVzdCh4KSk7XG4gfVxuXG4gZnVuY3Rpb24gSnVzdCh4KSB7XG4gXHR0aGlzLnZhbHVlID0geDtcbiB9XG5cbiBKdXN0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcbiBcdHJldHVybiBzY2hlZHVsZXIuYXNhcChuZXcgUHJvcGFnYXRlVGFzayhydW5KdXN0LCB0aGlzLnZhbHVlLCBzaW5rKSk7XG4gfTtcblxuIGZ1bmN0aW9uIHJ1bkp1c3QodCwgeCwgc2luaykge1xuIFx0c2luay5ldmVudCh0LCB4KTtcbiBcdHNpbmsuZW5kKHQsIHZvaWQgMCk7XG4gfVxuXG4vKipcbiAqIFN0cmVhbSBjb250YWluaW5nIG5vIGV2ZW50cyBhbmQgZW5kcyBpbW1lZGlhdGVseVxuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gZW1wdHkoKSB7XG5cdHJldHVybiBFTVBUWTtcbn1cblxuZnVuY3Rpb24gRW1wdHlTb3VyY2UoKSB7fVxuXG5FbXB0eVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHZhciB0YXNrID0gUHJvcGFnYXRlVGFzay5lbmQodm9pZCAwLCBzaW5rKTtcblx0c2NoZWR1bGVyLmFzYXAodGFzayk7XG5cblx0cmV0dXJuIGRpc3Bvc2UuY3JlYXRlKGRpc3Bvc2VFbXB0eSwgdGFzayk7XG59O1xuXG5mdW5jdGlvbiBkaXNwb3NlRW1wdHkodGFzaykge1xuXHRyZXR1cm4gdGFzay5kaXNwb3NlKCk7XG59XG5cbnZhciBFTVBUWSA9IG5ldyBTdHJlYW0obmV3IEVtcHR5U291cmNlKCkpO1xuXG4vKipcbiAqIFN0cmVhbSBjb250YWluaW5nIG5vIGV2ZW50cyBhbmQgbmV2ZXIgZW5kc1xuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gbmV2ZXIoKSB7XG5cdHJldHVybiBORVZFUjtcbn1cblxuZnVuY3Rpb24gTmV2ZXJTb3VyY2UoKSB7fVxuXG5OZXZlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBkaXNwb3NlLmVtcHR5KCk7XG59O1xuXG52YXIgTkVWRVIgPSBuZXcgU3RyZWFtKG5ldyBOZXZlclNvdXJjZSgpKTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTXVsdGljYXN0U291cmNlID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuTXVsdGljYXN0U291cmNlO1xudmFyIERlZmVycmVkU2luayA9IHJlcXVpcmUoJy4uL3NpbmsvRGVmZXJyZWRTaW5rJyk7XG52YXIgdHJ5RXZlbnQgPSByZXF1aXJlKCcuL3RyeUV2ZW50Jyk7XG5cbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShydW4pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IE11bHRpY2FzdFNvdXJjZShuZXcgU3Vic2NyaWJlclNvdXJjZShydW4pKSk7XG59XG5cbmZ1bmN0aW9uIFN1YnNjcmliZXJTb3VyY2Uoc3Vic2NyaWJlKSB7XG5cdHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTtcbn1cblxuU3Vic2NyaWJlclNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG5ldyBEZWZlcnJlZFNpbmsoc2luayksIHNjaGVkdWxlciwgdGhpcy5fc3Vic2NyaWJlKTtcbn07XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihzaW5rLCBzY2hlZHVsZXIsIHN1YnNjcmliZSkge1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXHR0aGlzLl91bnN1YnNjcmliZSA9IHRoaXMuX2luaXQoc3Vic2NyaWJlKTtcbn1cblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKHN1YnNjcmliZSkge1xuXHR2YXIgcyA9IHRoaXM7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gc3Vic2NyaWJlKGFkZCwgZW5kLCBlcnJvcik7XG5cdH0gY2F0Y2goZSkge1xuXHRcdGVycm9yKGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gYWRkKHgpIHtcblx0XHRzLl9hZGQoeCk7XG5cdH1cblx0ZnVuY3Rpb24gZW5kKHgpIHtcblx0XHRzLl9lbmQoeCk7XG5cdH1cblx0ZnVuY3Rpb24gZXJyb3IoZSkge1xuXHRcdHMuX2Vycm9yKGUpO1xuXHR9XG59O1xuXG5TdWJzY3JpcHRpb24ucHJvdG90eXBlLl9hZGQgPSBmdW5jdGlvbih4KSB7XG5cdGlmKCF0aGlzLmFjdGl2ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR0cnlFdmVudC50cnlFdmVudCh0aGlzLnNjaGVkdWxlci5ub3coKSwgeCwgdGhpcy5zaW5rKTtcbn07XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uKHgpIHtcblx0aWYoIXRoaXMuYWN0aXZlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdHRyeUV2ZW50LnRyeUVuZCh0aGlzLnNjaGVkdWxlci5ub3coKSwgeCwgdGhpcy5zaW5rKTtcbn07XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24oeCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHR0aGlzLnNpbmsuZXJyb3IodGhpcy5zY2hlZHVsZXIubm93KCksIHgpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdGlmKHR5cGVvZiB0aGlzLl91bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiB0aGlzLl91bnN1YnNjcmliZS5jYWxsKHZvaWQgMCk7XG5cdH1cbn07XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGZyb21BcnJheSA9IHJlcXVpcmUoJy4vZnJvbUFycmF5JykuZnJvbUFycmF5O1xudmFyIGlzSXRlcmFibGUgPSByZXF1aXJlKCcuLi9pdGVyYWJsZScpLmlzSXRlcmFibGU7XG52YXIgZnJvbUl0ZXJhYmxlID0gcmVxdWlyZSgnLi9mcm9tSXRlcmFibGUnKS5mcm9tSXRlcmFibGU7XG52YXIgZ2V0T2JzZXJ2YWJsZSA9IHJlcXVpcmUoJy4uL29ic2VydmFibGUvZ2V0T2JzZXJ2YWJsZScpO1xudmFyIGZyb21PYnNlcnZhYmxlID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9mcm9tT2JzZXJ2YWJsZScpLmZyb21PYnNlcnZhYmxlO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpLmlzQXJyYXlMaWtlO1xuXG5leHBvcnRzLmZyb20gPSBmcm9tO1xuXG5mdW5jdGlvbiBmcm9tKGEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG5cdGlmKGEgaW5zdGFuY2VvZiBTdHJlYW0pIHtcblx0XHRyZXR1cm4gYTtcblx0fVxuXG5cdHZhciBvYnNlcnZhYmxlID0gZ2V0T2JzZXJ2YWJsZShhKTtcblx0aWYob2JzZXJ2YWJsZSAhPSBudWxsKSB7XG5cdFx0cmV0dXJuIGZyb21PYnNlcnZhYmxlKG9ic2VydmFibGUpO1xuXHR9XG5cblx0aWYoQXJyYXkuaXNBcnJheShhKSB8fCBpc0FycmF5TGlrZShhKSkge1xuXHRcdHJldHVybiBmcm9tQXJyYXkoYSk7XG5cdH1cblxuXHRpZihpc0l0ZXJhYmxlKGEpKSB7XG5cdFx0cmV0dXJuIGZyb21JdGVyYWJsZShhKTtcblx0fVxuXG5cdHRocm93IG5ldyBUeXBlRXJyb3IoJ2Zyb20oeCkgbXVzdCBiZSBvYnNlcnZhYmxlLCBpdGVyYWJsZSwgb3IgYXJyYXktbGlrZTogJyArIGEpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5mcm9tQXJyYXkgPSBmcm9tQXJyYXk7XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAoYSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgQXJyYXlTb3VyY2UoYSkpO1xufVxuXG5mdW5jdGlvbiBBcnJheVNvdXJjZShhKSB7XG5cdHRoaXMuYXJyYXkgPSBhO1xufVxuXG5BcnJheVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBzY2hlZHVsZXIuYXNhcChuZXcgUHJvcGFnYXRlVGFzayhydW5Qcm9kdWNlciwgdGhpcy5hcnJheSwgc2luaykpO1xufTtcblxuZnVuY3Rpb24gcnVuUHJvZHVjZXIodCwgYXJyYXksIHNpbmspIHtcblx0Zm9yKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGwgJiYgdGhpcy5hY3RpdmU7ICsraSkge1xuXHRcdHNpbmsuZXZlbnQodCwgYXJyYXlbaV0pO1xuXHR9XG5cblx0dGhpcy5hY3RpdmUgJiYgZW5kKHQpO1xuXG5cdGZ1bmN0aW9uIGVuZCh0KSB7XG5cdFx0c2luay5lbmQodCk7XG5cdH1cbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgTXVsdGljYXN0U291cmNlID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuTXVsdGljYXN0U291cmNlO1xudmFyIEV2ZW50VGFyZ2V0U291cmNlID0gcmVxdWlyZSgnLi9FdmVudFRhcmdldFNvdXJjZScpO1xudmFyIEV2ZW50RW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4vRXZlbnRFbWl0dGVyU291cmNlJyk7XG5cbmV4cG9ydHMuZnJvbUV2ZW50ID0gZnJvbUV2ZW50O1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGFuIEV2ZW50VGFyZ2V0LCBzdWNoIGFzIGEgRE9NIE5vZGUsIG9yIEV2ZW50RW1pdHRlci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBldmVudCB0eXBlIG5hbWUsIGUuZy4gJ2NsaWNrJ1xuICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudEVtaXR0ZXJ9IHNvdXJjZSBFdmVudFRhcmdldCBvciBFdmVudEVtaXR0ZXJcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IHVzZUNhcHR1cmUgZm9yIERPTSBldmVudHMsIHdoZXRoZXIgdG8gdXNlXG4gKiAgY2FwdHVyaW5nLS1wYXNzZWQgYXMgM3JkIHBhcmFtZXRlciB0byBhZGRFdmVudExpc3RlbmVyLlxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgYWxsIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGVcbiAqIGZyb20gdGhlIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gZnJvbUV2ZW50KGV2ZW50LCBzb3VyY2UgLyosIHVzZUNhcHR1cmUgPSBmYWxzZSAqLykge1xuXHR2YXIgcztcblxuXHRpZih0eXBlb2Ygc291cmNlLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGNhcHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblx0XHRzID0gbmV3IE11bHRpY2FzdFNvdXJjZShuZXcgRXZlbnRUYXJnZXRTb3VyY2UoZXZlbnQsIHNvdXJjZSwgY2FwdHVyZSkpO1xuXHR9IGVsc2UgaWYodHlwZW9mIHNvdXJjZS5hZGRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cyA9IG5ldyBFdmVudEVtaXR0ZXJTb3VyY2UoZXZlbnQsIHNvdXJjZSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdzb3VyY2UgbXVzdCBzdXBwb3J0IGFkZEV2ZW50TGlzdGVuZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lciBvciBhZGRMaXN0ZW5lci9yZW1vdmVMaXN0ZW5lcicpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBTdHJlYW0ocyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaXRlcmFibGUnKS5nZXRJdGVyYXRvcjtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5mcm9tSXRlcmFibGUgPSBmcm9tSXRlcmFibGU7XG5cbmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkge1xuXHRyZXR1cm4gbmV3IFN0cmVhbShuZXcgSXRlcmFibGVTb3VyY2UoaXRlcmFibGUpKTtcbn1cblxuZnVuY3Rpb24gSXRlcmFibGVTb3VyY2UoaXRlcmFibGUpIHtcblx0dGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlO1xufVxuXG5JdGVyYWJsZVNvdXJjZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBuZXcgSXRlcmF0b3JQcm9kdWNlcihnZXRJdGVyYXRvcih0aGlzLml0ZXJhYmxlKSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEl0ZXJhdG9yUHJvZHVjZXIoaXRlcmF0b3IsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yO1xuXHR0aGlzLnRhc2sgPSBuZXcgUHJvcGFnYXRlVGFzayhydW5Qcm9kdWNlciwgdGhpcywgc2luayk7XG5cdHNjaGVkdWxlci5hc2FwKHRoaXMudGFzayk7XG59XG5cbkl0ZXJhdG9yUHJvZHVjZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMudGFzay5kaXNwb3NlKCk7XG59O1xuXG5mdW5jdGlvbiBydW5Qcm9kdWNlcih0LCBwcm9kdWNlciwgc2luaykge1xuXHR2YXIgeCA9IHByb2R1Y2VyLml0ZXJhdG9yLm5leHQoKTtcblx0aWYoeC5kb25lKSB7XG5cdFx0c2luay5lbmQodCwgeC52YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0c2luay5ldmVudCh0LCB4LnZhbHVlKTtcblx0fVxuXG5cdHByb2R1Y2VyLnNjaGVkdWxlci5hc2FwKHByb2R1Y2VyLnRhc2spO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE0IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuLi9TdHJlYW0nKTtcbnZhciBiYXNlID0gcmVxdWlyZSgnQG1vc3QvcHJlbHVkZScpO1xuXG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5cbi8qKlxuICogQ29tcHV0ZSBhIHN0cmVhbSB1c2luZyBhbiAqYXN5bmMqIGdlbmVyYXRvciwgd2hpY2ggeWllbGRzIHByb21pc2VzXG4gKiB0byBjb250cm9sIGV2ZW50IHRpbWVzLlxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtTdHJlYW19XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlKGYgLyosIC4uLmFyZ3MgKi8pIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IEdlbmVyYXRlU291cmNlKGYsIGJhc2UudGFpbChhcmd1bWVudHMpKSk7XG59XG5cbmZ1bmN0aW9uIEdlbmVyYXRlU291cmNlKGYsIGFyZ3MpIHtcblx0dGhpcy5mID0gZjtcblx0dGhpcy5hcmdzID0gYXJncztcbn1cblxuR2VuZXJhdGVTb3VyY2UucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHNpbmssIHNjaGVkdWxlcikge1xuXHRyZXR1cm4gbmV3IEdlbmVyYXRlKHRoaXMuZi5hcHBseSh2b2lkIDAsIHRoaXMuYXJncyksIHNpbmssIHNjaGVkdWxlcik7XG59O1xuXG5mdW5jdGlvbiBHZW5lcmF0ZShpdGVyYXRvciwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjtcblx0dGhpcy5zaW5rID0gc2luaztcblx0dGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG5cdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblxuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGZ1bmN0aW9uIGVycihlKSB7XG5cdFx0c2VsZi5zaW5rLmVycm9yKHNlbGYuc2NoZWR1bGVyLm5vdygpLCBlKTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKG5leHQpLmNhdGNoKGVycik7XG59XG5cbmZ1bmN0aW9uIG5leHQoZ2VuZXJhdGUsIHgpIHtcblx0cmV0dXJuIGdlbmVyYXRlLmFjdGl2ZSA/IGhhbmRsZShnZW5lcmF0ZSwgZ2VuZXJhdGUuaXRlcmF0b3IubmV4dCh4KSkgOiB4O1xufVxuXG5mdW5jdGlvbiBoYW5kbGUoZ2VuZXJhdGUsIHJlc3VsdCkge1xuXHRpZiAocmVzdWx0LmRvbmUpIHtcblx0XHRyZXR1cm4gZ2VuZXJhdGUuc2luay5lbmQoZ2VuZXJhdGUuc2NoZWR1bGVyLm5vdygpLCByZXN1bHQudmFsdWUpO1xuXHR9XG5cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQudmFsdWUpLnRoZW4oZnVuY3Rpb24gKHgpIHtcblx0XHRyZXR1cm4gZW1pdChnZW5lcmF0ZSwgeCk7XG5cdH0sIGZ1bmN0aW9uKGUpIHtcblx0XHRyZXR1cm4gZXJyb3IoZ2VuZXJhdGUsIGUpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZW1pdChnZW5lcmF0ZSwgeCkge1xuXHRnZW5lcmF0ZS5zaW5rLmV2ZW50KGdlbmVyYXRlLnNjaGVkdWxlci5ub3coKSwgeCk7XG5cdHJldHVybiBuZXh0KGdlbmVyYXRlLCB4KTtcbn1cblxuZnVuY3Rpb24gZXJyb3IoZ2VuZXJhdGUsIGUpIHtcblx0cmV0dXJuIGhhbmRsZShnZW5lcmF0ZSwgZ2VuZXJhdGUuaXRlcmF0b3IudGhyb3coZSkpO1xufVxuXG5HZW5lcmF0ZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG5cbmV4cG9ydHMuaXRlcmF0ZSA9IGl0ZXJhdGU7XG5cbi8qKlxuICogQ29tcHV0ZSBhIHN0cmVhbSBieSBpdGVyYXRpdmVseSBjYWxsaW5nIGYgdG8gcHJvZHVjZSB2YWx1ZXNcbiAqIEV2ZW50IHRpbWVzIG1heSBiZSBjb250cm9sbGVkIGJ5IHJldHVybmluZyBhIFByb21pc2UgZnJvbSBmXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6KnxQcm9taXNlPCo+fSBmXG4gKiBAcGFyYW0geyp9IHggaW5pdGlhbCB2YWx1ZVxuICogQHJldHVybnMge1N0cmVhbX1cbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZShmLCB4KSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBJdGVyYXRlU291cmNlKGYsIHgpKTtcbn1cblxuZnVuY3Rpb24gSXRlcmF0ZVNvdXJjZShmLCB4KSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMudmFsdWUgPSB4O1xufVxuXG5JdGVyYXRlU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBJdGVyYXRlKHRoaXMuZiwgdGhpcy52YWx1ZSwgc2luaywgc2NoZWR1bGVyKTtcbn07XG5cbmZ1bmN0aW9uIEl0ZXJhdGUoZiwgaW5pdGlhbCwgc2luaywgc2NoZWR1bGVyKSB7XG5cdHRoaXMuZiA9IGY7XG5cdHRoaXMuc2luayA9IHNpbms7XG5cdHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuXHR0aGlzLmFjdGl2ZSA9IHRydWU7XG5cblx0dmFyIHggPSBpbml0aWFsO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0ZnVuY3Rpb24gZXJyKGUpIHtcblx0XHRzZWxmLnNpbmsuZXJyb3Ioc2VsZi5zY2hlZHVsZXIubm93KCksIGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RhcnQoaXRlcmF0ZSkge1xuXHRcdHJldHVybiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKHN0YXJ0KS5jYXRjaChlcnIpO1xufVxuXG5JdGVyYXRlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuYWN0aXZlID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KSB7XG5cdGl0ZXJhdGUuc2luay5ldmVudChpdGVyYXRlLnNjaGVkdWxlci5ub3coKSwgeCk7XG5cblx0aWYoIWl0ZXJhdGUuYWN0aXZlKSB7XG5cdFx0cmV0dXJuIHg7XG5cdH1cblxuXHR2YXIgZiA9IGl0ZXJhdGUuZjtcblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmKHgpKS50aGVuKGZ1bmN0aW9uKHkpIHtcblx0XHRyZXR1cm4gY29udGludWVJdGVyYXRlKGl0ZXJhdGUsIHkpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gY29udGludWVJdGVyYXRlKGl0ZXJhdGUsIHgpIHtcblx0cmV0dXJuICFpdGVyYXRlLmFjdGl2ZSA/IGl0ZXJhdGUudmFsdWUgOiBzdGVwSXRlcmF0ZShpdGVyYXRlLCB4KTtcbn1cbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi4vU3RyZWFtJyk7XG52YXIgZGlzcG9zZSA9IHJlcXVpcmUoJy4uL2Rpc3Bvc2FibGUvZGlzcG9zZScpO1xudmFyIE11bHRpY2FzdFNvdXJjZSA9IHJlcXVpcmUoJ0Btb3N0L211bHRpY2FzdCcpLk11bHRpY2FzdFNvdXJjZTtcbnZhciBQcm9wYWdhdGVUYXNrID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL1Byb3BhZ2F0ZVRhc2snKTtcblxuZXhwb3J0cy5wZXJpb2RpYyA9IHBlcmlvZGljO1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IHRpbWUgcGVyaW9kaWNhbGx5XG4gKiBAcGFyYW0ge051bWJlcn0gcGVyaW9kIHBlcmlvZGljaXR5IG9mIGV2ZW50cyBpbiBtaWxsaXNcbiAqIEBwYXJhbSB7KikgdmFsdWUgdmFsdWUgdG8gZW1pdCBlYWNoIHBlcmlvZFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IHRpbWUgZXZlcnkgcGVyaW9kXG4gKi9cbmZ1bmN0aW9uIHBlcmlvZGljKHBlcmlvZCwgdmFsdWUpIHtcblx0cmV0dXJuIG5ldyBTdHJlYW0obmV3IE11bHRpY2FzdFNvdXJjZShuZXcgUGVyaW9kaWMocGVyaW9kLCB2YWx1ZSkpKTtcbn1cblxuZnVuY3Rpb24gUGVyaW9kaWMocGVyaW9kLCB2YWx1ZSkge1xuXHR0aGlzLnBlcmlvZCA9IHBlcmlvZDtcblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xufVxuXG5QZXJpb2RpYy5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oc2luaywgc2NoZWR1bGVyKSB7XG5cdHJldHVybiBzY2hlZHVsZXIucGVyaW9kaWModGhpcy5wZXJpb2QsIG5ldyBQcm9wYWdhdGVUYXNrKGVtaXQsIHRoaXMudmFsdWUsIHNpbmspKTtcbn07XG5cbmZ1bmN0aW9uIGVtaXQodCwgeCwgc2luaykge1xuXHRzaW5rLmV2ZW50KHQsIHgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChjKSBjb3B5cmlnaHQgMjAxMC0yMDE2IG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzICovXG4vKiogQGF1dGhvciBCcmlhbiBDYXZhbGllciAqL1xuLyoqIEBhdXRob3IgSm9obiBIYW5uICovXG5cbmV4cG9ydHMudHJ5RXZlbnQgPSB0cnlFdmVudDtcbmV4cG9ydHMudHJ5RW5kID0gdHJ5RW5kO1xuXG5mdW5jdGlvbiB0cnlFdmVudCh0LCB4LCBzaW5rKSB7XG5cdHRyeSB7XG5cdFx0c2luay5ldmVudCh0LCB4KTtcblx0fSBjYXRjaChlKSB7XG5cdFx0c2luay5lcnJvcih0LCBlKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cnlFbmQodCwgeCwgc2luaykge1xuXHR0cnkge1xuXHRcdHNpbmsuZW5kKHQsIHgpO1xuXHR9IGNhdGNoKGUpIHtcblx0XHRzaW5rLmVycm9yKHQsIGUpO1xuXHR9XG59XG4iLCIvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cbi8qKiBAYXV0aG9yIEJyaWFuIENhdmFsaWVyICovXG4vKiogQGF1dGhvciBKb2huIEhhbm4gKi9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4uL1N0cmVhbScpO1xuXG5leHBvcnRzLnVuZm9sZCA9IHVuZm9sZDtcblxuLyoqXG4gKiBDb21wdXRlIGEgc3RyZWFtIGJ5IHVuZm9sZGluZyB0dXBsZXMgb2YgZnV0dXJlIHZhbHVlcyBmcm9tIGEgc2VlZCB2YWx1ZVxuICogRXZlbnQgdGltZXMgbWF5IGJlIGNvbnRyb2xsZWQgYnkgcmV0dXJuaW5nIGEgUHJvbWlzZSBmcm9tIGZcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc2VlZDoqKTp7dmFsdWU6Kiwgc2VlZDoqLCBkb25lOmJvb2xlYW59fFByb21pc2U8e3ZhbHVlOiosIHNlZWQ6KiwgZG9uZTpib29sZWFufT59IGYgdW5mb2xkaW5nIGZ1bmN0aW9uIGFjY2VwdHNcbiAqICBhIHNlZWQgYW5kIHJldHVybnMgYSBuZXcgdHVwbGUgd2l0aCBhIHZhbHVlLCBuZXcgc2VlZCwgYW5kIGJvb2xlYW4gZG9uZSBmbGFnLlxuICogIElmIHR1cGxlLmRvbmUgaXMgdHJ1ZSwgdGhlIHN0cmVhbSB3aWxsIGVuZC5cbiAqIEBwYXJhbSB7Kn0gc2VlZCBzZWVkIHZhbHVlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBhbGwgdmFsdWUgb2YgYWxsIHR1cGxlcyBwcm9kdWNlZCBieSB0aGVcbiAqICB1bmZvbGRpbmcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHVuZm9sZChmLCBzZWVkKSB7XG5cdHJldHVybiBuZXcgU3RyZWFtKG5ldyBVbmZvbGRTb3VyY2UoZiwgc2VlZCkpO1xufVxuXG5mdW5jdGlvbiBVbmZvbGRTb3VyY2UoZiwgc2VlZCkge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnZhbHVlID0gc2VlZDtcbn1cblxuVW5mb2xkU291cmNlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihzaW5rLCBzY2hlZHVsZXIpIHtcblx0cmV0dXJuIG5ldyBVbmZvbGQodGhpcy5mLCB0aGlzLnZhbHVlLCBzaW5rLCBzY2hlZHVsZXIpO1xufTtcblxuZnVuY3Rpb24gVW5mb2xkKGYsIHgsIHNpbmssIHNjaGVkdWxlcikge1xuXHR0aGlzLmYgPSBmO1xuXHR0aGlzLnNpbmsgPSBzaW5rO1xuXHR0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcblx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXG5cdHZhciBzZWxmID0gdGhpcztcblx0ZnVuY3Rpb24gZXJyKGUpIHtcblx0XHRzZWxmLnNpbmsuZXJyb3Ioc2VsZi5zY2hlZHVsZXIubm93KCksIGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RhcnQodW5mb2xkKSB7XG5cdFx0cmV0dXJuIHN0ZXBVbmZvbGQodW5mb2xkLCB4KTtcblx0fVxuXG5cdFByb21pc2UucmVzb2x2ZSh0aGlzKS50aGVuKHN0YXJ0KS5jYXRjaChlcnIpO1xufVxuXG5VbmZvbGQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHN0ZXBVbmZvbGQodW5mb2xkLCB4KSB7XG5cdHZhciBmID0gdW5mb2xkLmY7XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoZih4KSkudGhlbihmdW5jdGlvbih0dXBsZSkge1xuXHRcdHJldHVybiBjb250aW51ZVVuZm9sZCh1bmZvbGQsIHR1cGxlKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRpbnVlVW5mb2xkKHVuZm9sZCwgdHVwbGUpIHtcblx0aWYodHVwbGUuZG9uZSkge1xuXHRcdHVuZm9sZC5zaW5rLmVuZCh1bmZvbGQuc2NoZWR1bGVyLm5vdygpLCB0dXBsZS52YWx1ZSk7XG5cdFx0cmV0dXJuIHR1cGxlLnZhbHVlO1xuXHR9XG5cblx0dW5mb2xkLnNpbmsuZXZlbnQodW5mb2xkLnNjaGVkdWxlci5ub3coKSwgdHVwbGUudmFsdWUpO1xuXG5cdGlmKCF1bmZvbGQuYWN0aXZlKSB7XG5cdFx0cmV0dXJuIHR1cGxlLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzdGVwVW5mb2xkKHVuZm9sZCwgdHVwbGUuc2VlZCk7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ0Btb3N0L211bHRpY2FzdCcsIFsnZXhwb3J0cycsICdAbW9zdC9wcmVsdWRlJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdAbW9zdC9wcmVsdWRlJykpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb2QgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgZmFjdG9yeShtb2QuZXhwb3J0cywgZ2xvYmFsLnByZWx1ZGUpO1xuICAgIGdsb2JhbC5tb3N0TXVsdGljYXN0ID0gbW9kLmV4cG9ydHM7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzLCBfcHJlbHVkZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGV4cG9ydHMuTXVsdGljYXN0U291cmNlID0gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBNdWx0aWNhc3REaXNwb3NhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpY2FzdERpc3Bvc2FibGUoc291cmNlLCBzaW5rKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTXVsdGljYXN0RGlzcG9zYWJsZSk7XG5cbiAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5zaW5rID0gc2luaztcbiAgICAgIHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoTXVsdGljYXN0RGlzcG9zYWJsZSwgW3tcbiAgICAgIGtleTogJ2Rpc3Bvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5zb3VyY2UucmVtb3ZlKHRoaXMuc2luayk7XG4gICAgICAgIHJldHVybiByZW1haW5pbmcgPT09IDAgJiYgdGhpcy5zb3VyY2UuX2Rpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gTXVsdGljYXN0RGlzcG9zYWJsZTtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIHRyeUV2ZW50KHQsIHgsIHNpbmspIHtcbiAgICB0cnkge1xuICAgICAgc2luay5ldmVudCh0LCB4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaW5rLmVycm9yKHQsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeUVuZCh0LCB4LCBzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNpbmsuZW5kKHQsIHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNpbmsuZXJyb3IodCwgZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKGRpc3Bvc2FibGUpIHtcbiAgICByZXR1cm4gZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gIH07XG5cbiAgdmFyIGVtcHR5RGlzcG9zYWJsZSA9IHtcbiAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge31cbiAgfTtcblxuICB2YXIgTXVsdGljYXN0U291cmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpY2FzdFNvdXJjZShzb3VyY2UpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNdWx0aWNhc3RTb3VyY2UpO1xuXG4gICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMuc2lua3MgPSBbXTtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSBlbXB0eURpc3Bvc2FibGU7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKE11bHRpY2FzdFNvdXJjZSwgW3tcbiAgICAgIGtleTogJ3J1bicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcnVuKHNpbmssIHNjaGVkdWxlcikge1xuICAgICAgICB2YXIgbiA9IHRoaXMuYWRkKHNpbmspO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSB0aGlzLnNvdXJjZS5ydW4odGhpcywgc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE11bHRpY2FzdERpc3Bvc2FibGUodGhpcywgc2luayk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnX2Rpc3Bvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kaXNwb3NlKCkge1xuICAgICAgICB2YXIgZGlzcG9zYWJsZSA9IHRoaXMuX2Rpc3Bvc2FibGU7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSBlbXB0eURpc3Bvc2FibGU7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGlzcG9zYWJsZSkudGhlbihkaXNwb3NlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdhZGQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChzaW5rKSB7XG4gICAgICAgIHRoaXMuc2lua3MgPSAoMCwgX3ByZWx1ZGUuYXBwZW5kKShzaW5rLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lua3MubGVuZ3RoO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3JlbW92ZScsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKHNpbmspIHtcbiAgICAgICAgdmFyIGkgPSAoMCwgX3ByZWx1ZGUuZmluZEluZGV4KShzaW5rLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgIHRoaXMuc2lua3MgPSAoMCwgX3ByZWx1ZGUucmVtb3ZlKShpLCB0aGlzLnNpbmtzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNpbmtzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdldmVudCcsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZXZlbnQodGltZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNpbmtzO1xuICAgICAgICBpZiAocy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gc1swXS5ldmVudCh0aW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdHJ5RXZlbnQodGltZSwgdmFsdWUsIHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZW5kJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmQodGltZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNpbmtzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB0cnlFbmQodGltZSwgdmFsdWUsIHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZXJyb3InLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVycm9yKHRpbWUsIGVycikge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc2lua3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHNbaV0uZXJyb3IodGltZSwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBNdWx0aWNhc3RTb3VyY2U7XG4gIH0oKTtcblxuICBmdW5jdGlvbiBtdWx0aWNhc3Qoc3RyZWFtKSB7XG4gICAgdmFyIHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE11bHRpY2FzdFNvdXJjZSA/IHN0cmVhbSA6IG5ldyBzdHJlYW0uY29uc3RydWN0b3IobmV3IE11bHRpY2FzdFNvdXJjZShzb3VyY2UpKTtcbiAgfVxuXG4gIGV4cG9ydHMuTXVsdGljYXN0U291cmNlID0gTXVsdGljYXN0U291cmNlO1xuICBleHBvcnRzLmRlZmF1bHQgPSBtdWx0aWNhc3Q7XG59KTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZSgnQG1vc3QvcHJlbHVkZScsIFsnZXhwb3J0cyddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1vZCA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBmYWN0b3J5KG1vZC5leHBvcnRzKTtcbiAgICBnbG9iYWwubW9zdFByZWx1ZGUgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICAvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cblxuICAvLyBOb24tbXV0YXRpbmcgYXJyYXkgb3BlcmF0aW9uc1xuXG4gIC8vIGNvbnMgOjogYSAtPiBbYV0gLT4gW2FdXG4gIC8vIGEgd2l0aCB4IHByZXBlbmRlZFxuICBmdW5jdGlvbiBjb25zKHgsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwgKyAxKTtcbiAgICBiWzBdID0geDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgYltpICsgMV0gPSBhW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIGFwcGVuZCA6OiBhIC0+IFthXSAtPiBbYV1cbiAgLy8gYSB3aXRoIHggYXBwZW5kZWRcbiAgZnVuY3Rpb24gYXBwZW5kKHgsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwgKyAxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgYltpXSA9IGFbaV07XG4gICAgfVxuXG4gICAgYltsXSA9IHg7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBkcm9wIDo6IEludCAtPiBbYV0gLT4gW2FdXG4gIC8vIGRyb3AgZmlyc3QgbiBlbGVtZW50c1xuICBmdW5jdGlvbiBkcm9wKG4sIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAobiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ24gbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMCB8fCBsID09PSAwKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBpZiAobiA+PSBsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuc2FmZURyb3AobiwgYSwgbCAtIG4pO1xuICB9XG5cbiAgLy8gdW5zYWZlRHJvcCA6OiBJbnQgLT4gW2FdIC0+IEludCAtPiBbYV1cbiAgLy8gSW50ZXJuYWwgaGVscGVyIGZvciBkcm9wXG4gIGZ1bmN0aW9uIHVuc2FmZURyb3AobiwgYSwgbCkge1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICBiW2ldID0gYVtuICsgaV07XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9XG5cbiAgLy8gdGFpbCA6OiBbYV0gLT4gW2FdXG4gIC8vIGRyb3AgaGVhZCBlbGVtZW50XG4gIGZ1bmN0aW9uIHRhaWwoYSkge1xuICAgIHJldHVybiBkcm9wKDEsIGEpO1xuICB9XG5cbiAgLy8gY29weSA6OiBbYV0gLT4gW2FdXG4gIC8vIGR1cGxpY2F0ZSBhIChzaGFsbG93IGR1cGxpY2F0aW9uKVxuICBmdW5jdGlvbiBjb3B5KGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICBiW2ldID0gYVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBtYXAgOjogKGEgLT4gYikgLT4gW2FdIC0+IFtiXVxuICAvLyB0cmFuc2Zvcm0gZWFjaCBlbGVtZW50IHdpdGggZlxuICBmdW5jdGlvbiBtYXAoZiwgYSkge1xuICAgIHZhciBsID0gYS5sZW5ndGg7XG4gICAgdmFyIGIgPSBuZXcgQXJyYXkobCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgIGJbaV0gPSBmKGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIHJlZHVjZSA6OiAoYSAtPiBiIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAgLy8gYWNjdW11bGF0ZSB2aWEgbGVmdC1mb2xkXG4gIGZ1bmN0aW9uIHJlZHVjZShmLCB6LCBhKSB7XG4gICAgdmFyIHIgPSB6O1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIHIgPSBmKHIsIGFbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIHJlcGxhY2UgOjogYSAtPiBJbnQgLT4gW2FdXG4gIC8vIHJlcGxhY2UgZWxlbWVudCBhdCBpbmRleFxuICBmdW5jdGlvbiByZXBsYWNlKHgsIGksIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2kgbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICB2YXIgYiA9IG5ldyBBcnJheShsKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGw7ICsraikge1xuICAgICAgYltqXSA9IGkgPT09IGogPyB4IDogYVtqXTtcbiAgICB9XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyByZW1vdmUgOjogSW50IC0+IFthXSAtPiBbYV1cbiAgLy8gcmVtb3ZlIGVsZW1lbnQgYXQgaW5kZXhcbiAgZnVuY3Rpb24gcmVtb3ZlKGksIGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbXBsZXhpdHlcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2kgbXVzdCBiZSA+PSAwJyk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICBpZiAobCA9PT0gMCB8fCBpID49IGwpIHtcbiAgICAgIC8vIGV4aXQgZWFybHkgaWYgaW5kZXggYmV5b25kIGVuZCBvZiBhcnJheVxuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgaWYgKGwgPT09IDEpIHtcbiAgICAgIC8vIGV4aXQgZWFybHkgaWYgaW5kZXggaW4gYm91bmRzIGFuZCBsZW5ndGggPT09IDFcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5zYWZlUmVtb3ZlKGksIGEsIGwgLSAxKTtcbiAgfVxuXG4gIC8vIHVuc2FmZVJlbW92ZSA6OiBJbnQgLT4gW2FdIC0+IEludCAtPiBbYV1cbiAgLy8gSW50ZXJuYWwgaGVscGVyIHRvIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4XG4gIGZ1bmN0aW9uIHVuc2FmZVJlbW92ZShpLCBhLCBsKSB7XG4gICAgdmFyIGIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGogPSB1bmRlZmluZWQ7XG4gICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikge1xuICAgICAgYltqXSA9IGFbal07XG4gICAgfVxuICAgIGZvciAoaiA9IGk7IGogPCBsOyArK2opIHtcbiAgICAgIGJbal0gPSBhW2ogKyAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIC8vIHJlbW92ZUFsbCA6OiAoYSAtPiBib29sZWFuKSAtPiBbYV0gLT4gW2FdXG4gIC8vIHJlbW92ZSBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKGYsIGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoO1xuICAgIHZhciBiID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBqID0gMDtcbiAgICBmb3IgKHZhciB4LCBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICBpZiAoIWYoeCkpIHtcbiAgICAgICAgYltqXSA9IHg7XG4gICAgICAgICsrajtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiLmxlbmd0aCA9IGo7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICAvLyBmaW5kSW5kZXggOjogYSAtPiBbYV0gLT4gSW50XG4gIC8vIGZpbmQgaW5kZXggb2YgeCBpbiBhLCBmcm9tIHRoZSBsZWZ0XG4gIGZ1bmN0aW9uIGZpbmRJbmRleCh4LCBhKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgaWYgKHggPT09IGFbaV0pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIGlzQXJyYXlMaWtlIDo6ICogLT4gYm9vbGVhblxuICAvLyBSZXR1cm4gdHJ1ZSBpZmYgeCBpcyBhcnJheS1saWtlXG4gIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgICByZXR1cm4geCAhPSBudWxsICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHggIT09ICdmdW5jdGlvbic7XG4gIH1cblxuICAvKiogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKGMpIGNvcHlyaWdodCAyMDEwLTIwMTYgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMgKi9cblxuICAvLyBpZCA6OiBhIC0+IGFcbiAgdmFyIGlkID0gZnVuY3Rpb24gaWQoeCkge1xuICAgIHJldHVybiB4O1xuICB9O1xuXG4gIC8vIGNvbXBvc2UgOjogKGIgLT4gYykgLT4gKGEgLT4gYikgLT4gKGEgLT4gYylcbiAgdmFyIGNvbXBvc2UgPSBmdW5jdGlvbiBjb21wb3NlKGYsIGcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmKGcoeCkpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gYXBwbHkgOjogKGEgLT4gYikgLT4gYSAtPiBiXG4gIHZhciBhcHBseSA9IGZ1bmN0aW9uIGFwcGx5KGYsIHgpIHtcbiAgICByZXR1cm4gZih4KTtcbiAgfTtcblxuICAvLyBjdXJyeTIgOjogKChhLCBiKSAtPiBjKSAtPiAoYSAtPiBiIC0+IGMpXG4gIGZ1bmN0aW9uIGN1cnJ5MihmKSB7XG4gICAgZnVuY3Rpb24gY3VycmllZChhLCBiKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBjdXJyaWVkO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICByZXR1cm4gZihhLCBiKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmKGEsIGIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmllZDtcbiAgfVxuXG4gIC8vIGN1cnJ5MyA6OiAoKGEsIGIsIGMpIC0+IGQpIC0+IChhIC0+IGIgLT4gYyAtPiBkKVxuICBmdW5jdGlvbiBjdXJyeTMoZikge1xuICAgIGZ1bmN0aW9uIGN1cnJpZWQoYSwgYiwgYykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBjdXJyaWVkO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGN1cnJ5MihmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgcmV0dXJuIGYoYSwgYiwgYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBmKGEsIGIsIGMpO1xuICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGYoYSwgYiwgYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyaWVkO1xuICB9XG5cbiAgZXhwb3J0cy5jb25zID0gY29ucztcbiAgZXhwb3J0cy5hcHBlbmQgPSBhcHBlbmQ7XG4gIGV4cG9ydHMuZHJvcCA9IGRyb3A7XG4gIGV4cG9ydHMudGFpbCA9IHRhaWw7XG4gIGV4cG9ydHMuY29weSA9IGNvcHk7XG4gIGV4cG9ydHMubWFwID0gbWFwO1xuICBleHBvcnRzLnJlZHVjZSA9IHJlZHVjZTtcbiAgZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcbiAgZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG4gIGV4cG9ydHMucmVtb3ZlQWxsID0gcmVtb3ZlQWxsO1xuICBleHBvcnRzLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuICBleHBvcnRzLmlkID0gaWQ7XG4gIGV4cG9ydHMuY29tcG9zZSA9IGNvbXBvc2U7XG4gIGV4cG9ydHMuYXBwbHkgPSBhcHBseTtcbiAgZXhwb3J0cy5jdXJyeTIgPSBjdXJyeTI7XG4gIGV4cG9ydHMuY3VycnkzID0gY3VycnkzO1xufSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiBnbG9iYWwgd2luZG93ICovXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9wb255ZmlsbCcpKGdsb2JhbCB8fCB3aW5kb3cgfHwgdGhpcyk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OXplVzFpYjJ3dGIySnpaWEoyWVdKc1pTOXBibVJsZUM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9nWjJ4dlltRnNJSGRwYm1SdmR5QXFMMXh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSEpsY1hWcGNtVW9KeTR2Y0c5dWVXWnBiR3duS1NobmJHOWlZV3dnZkh3Z2QybHVaRzkzSUh4OElIUm9hWE1wTzF4dUlsMTkiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoYykgY29weXJpZ2h0IDIwMTAtMjAxNiBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycyAqL1xuLyoqIEBhdXRob3IgQnJpYW4gQ2F2YWxpZXIgKi9cbi8qKiBAYXV0aG9yIEpvaG4gSGFubiAqL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9saWIvU3RyZWFtJyk7XG52YXIgYmFzZSA9IHJlcXVpcmUoJ0Btb3N0L3ByZWx1ZGUnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2NvcmUnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2Zyb20nKS5mcm9tO1xudmFyIHBlcmlvZGljID0gcmVxdWlyZSgnLi9saWIvc291cmNlL3BlcmlvZGljJykucGVyaW9kaWM7XG52YXIgc3ltYm9sT2JzZXJ2YWJsZSA9IHJlcXVpcmUoJ3N5bWJvbC1vYnNlcnZhYmxlJyk7XG5cbi8qKlxuICogQ29yZSBzdHJlYW0gdHlwZVxuICogQHR5cGUge1N0cmVhbX1cbiAqL1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW07XG5cbi8vIEFkZCBvZiBhbmQgZW1wdHkgdG8gY29uc3RydWN0b3IgZm9yIGZhbnRhc3ktbGFuZCBjb21wYXRcbmV4cG9ydHMub2YgICAgICAgPSBTdHJlYW0ub2YgICAgPSBjb3JlLm9mO1xuZXhwb3J0cy5qdXN0ICAgICA9IGNvcmUub2Y7IC8vIGVhc2llciBFUzYgaW1wb3J0IGFsaWFzXG5leHBvcnRzLmVtcHR5ICAgID0gU3RyZWFtLmVtcHR5ID0gY29yZS5lbXB0eTtcbmV4cG9ydHMubmV2ZXIgICAgPSBjb3JlLm5ldmVyO1xuZXhwb3J0cy5mcm9tICAgICA9IGZyb207XG5leHBvcnRzLnBlcmlvZGljID0gcGVyaW9kaWM7XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERyYWZ0IEVTIE9ic2VydmFibGUgcHJvcG9zYWwgaW50ZXJvcFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxuXG52YXIgc3Vic2NyaWJlID0gcmVxdWlyZSgnLi9saWIvb2JzZXJ2YWJsZS9zdWJzY3JpYmUnKS5zdWJzY3JpYmU7XG5cblN0cmVhbS5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuXHRyZXR1cm4gc3Vic2NyaWJlKHN1YnNjcmliZXIsIHRoaXMpO1xufTtcblxuU3RyZWFtLnByb3RvdHlwZVtzeW1ib2xPYnNlcnZhYmxlXSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmx1ZW50IGFkYXB0ZXJcblxudmFyIHRocnUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3RocnUnKS50aHJ1O1xuXG4vKipcbiAqIEFkYXB0IGEgZnVuY3Rpb25hbCBzdHJlYW0gdHJhbnNmb3JtIHRvIGZsdWVudCBzdHlsZS5cbiAqIEl0IGFwcGxpZXMgZiB0byB0aGUgdGhpcyBzdHJlYW0gb2JqZWN0XG4gKiBAcGFyYW0gIHtmdW5jdGlvbihzOiBTdHJlYW0pOiBTdHJlYW19IGYgZnVuY3Rpb24gdGhhdFxuICogcmVjZWl2ZXMgdGhlIHN0cmVhbSBpdHNlbGYgYW5kIG11c3QgcmV0dXJuIGEgbmV3IHN0cmVhbVxuICogQHJldHVybiB7U3RyZWFtfVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRocnUgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiB0aHJ1KGYsIHRoaXMpO1xufVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDcmVhdGluZ1xuXG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2NyZWF0ZScpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBDcmVhdGUgYSBzdHJlYW0gYnkgaW1wZXJhdGl2ZWx5IHB1c2hpbmcgZXZlbnRzLlxuICogQHBhcmFtIHtmdW5jdGlvbihhZGQ6ZnVuY3Rpb24oeCksIGVuZDpmdW5jdGlvbihlKSk6ZnVuY3Rpb259IHJ1biBmdW5jdGlvblxuICogIHRoYXQgd2lsbCByZWNlaXZlIDIgZnVuY3Rpb25zIGFzIGFyZ3VtZW50cywgdGhlIGZpcnN0IHRvIGFkZCBuZXcgdmFsdWVzIHRvIHRoZVxuICogIHN0cmVhbSBhbmQgdGhlIHNlY29uZCB0byBlbmQgdGhlIHN0cmVhbS4gSXQgbWF5ICpyZXR1cm4qIGEgZnVuY3Rpb24gdGhhdFxuICogIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWxsIGNvbnN1bWVycyBoYXZlIHN0b3BwZWQgb2JzZXJ2aW5nIHRoZSBzdHJlYW0uXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBhbGwgZXZlbnRzIGFkZGVkIGJ5IHJ1biBiZWZvcmUgZW5kXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlLmNyZWF0ZTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRhcHRpbmcgb3RoZXIgc291cmNlc1xuXG52YXIgZXZlbnRzID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2Zyb21FdmVudCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmVhbSBvZiBldmVudHMgZnJvbSB0aGUgc3VwcGxpZWQgRXZlbnRUYXJnZXQgb3IgRXZlbnRFbWl0dGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudEVtaXR0ZXJ9IHNvdXJjZSBFdmVudFRhcmdldCBvciBFdmVudEVtaXR0ZXIuIFRoZSBzb3VyY2VcbiAqICBtdXN0IHN1cHBvcnQgZWl0aGVyIGFkZEV2ZW50TGlzdGVuZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lciAodzNjIEV2ZW50VGFyZ2V0OlxuICogIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUV2ZW50cy9ldmVudHMuaHRtbCNFdmVudHMtRXZlbnRUYXJnZXQpLFxuICogIG9yIGFkZExpc3RlbmVyL3JlbW92ZUxpc3RlbmVyIChub2RlIEV2ZW50RW1pdHRlcjogaHR0cDovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sKVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIG9mIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgc291cmNlXG4gKi9cbmV4cG9ydHMuZnJvbUV2ZW50ID0gZXZlbnRzLmZyb21FdmVudDtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JzZXJ2aW5nXG5cbnZhciBvYnNlcnZlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9vYnNlcnZlJyk7XG5cbmV4cG9ydHMub2JzZXJ2ZSA9IG9ic2VydmUub2JzZXJ2ZTtcbmV4cG9ydHMuZm9yRWFjaCA9IG9ic2VydmUub2JzZXJ2ZTtcbmV4cG9ydHMuZHJhaW4gICA9IG9ic2VydmUuZHJhaW47XG5cbi8qKlxuICogUHJvY2VzcyBhbGwgdGhlIGV2ZW50cyBpbiB0aGUgc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdoZW4gdGhlIHN0cmVhbSBlbmRzLCBvciByZWplY3RzXG4gKiAgaWYgdGhlIHN0cmVhbSBmYWlscyB3aXRoIGFuIHVuaGFuZGxlZCBlcnJvci5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5vYnNlcnZlID0gU3RyZWFtLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZikge1xuXHRyZXR1cm4gb2JzZXJ2ZS5vYnNlcnZlKGYsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBDb25zdW1lIGFsbCBldmVudHMgaW4gdGhlIHN0cmVhbSwgd2l0aG91dCBwcm92aWRpbmcgYSBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2guXG4gKiBUaGlzIGNhdXNlcyBhIHN0cmVhbSB0byBiZWNvbWUgYWN0aXZlIGFuZCBiZWdpbiBlbWl0dGluZyBldmVudHMsIGFuZCBpcyB1c2VmdWxcbiAqIGluIGNhc2VzIHdoZXJlIGFsbCBwcm9jZXNzaW5nIGhhcyBiZWVuIHNldHVwIHVwc3RyZWFtIHZpYSBvdGhlciBjb21iaW5hdG9ycywgYW5kXG4gKiB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlIHRlcm1pbmFsIGV2ZW50cy5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiB0aGUgc3RyZWFtIGVuZHMsIG9yIHJlamVjdHNcbiAqICBpZiB0aGUgc3RyZWFtIGZhaWxzIHdpdGggYW4gdW5oYW5kbGVkIGVycm9yLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBvYnNlcnZlLmRyYWluKHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBsb29wID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9sb29wJykubG9vcDtcblxuZXhwb3J0cy5sb29wID0gbG9vcDtcblxuLyoqXG4gKiBHZW5lcmFsaXplZCBmZWVkYmFjayBsb29wLiBDYWxsIGEgc3RlcHBlciBmdW5jdGlvbiBmb3IgZWFjaCBldmVudC4gVGhlIHN0ZXBwZXJcbiAqIHdpbGwgYmUgY2FsbGVkIHdpdGggMiBwYXJhbXM6IHRoZSBjdXJyZW50IHNlZWQgYW5kIHRoZSBhbiBldmVudCB2YWx1ZS4gIEl0IG11c3RcbiAqIHJldHVybiBhIG5ldyB7IHNlZWQsIHZhbHVlIH0gcGFpci4gVGhlIGBzZWVkYCB3aWxsIGJlIGZlZCBiYWNrIGludG8gdGhlIG5leHRcbiAqIGludm9jYXRpb24gb2Ygc3RlcHBlciwgYW5kIHRoZSBgdmFsdWVgIHdpbGwgYmUgcHJvcGFnYXRlZCBhcyB0aGUgZXZlbnQgdmFsdWUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHNlZWQ6KiwgdmFsdWU6Kik6e3NlZWQ6KiwgdmFsdWU6Kn19IHN0ZXBwZXIgbG9vcCBzdGVwIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHNlZWQgaW5pdGlhbCBzZWVkIHZhbHVlIHBhc3NlZCB0byBmaXJzdCBzdGVwcGVyIGNhbGxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2hvc2UgdmFsdWVzIGFyZSB0aGUgYHZhbHVlYCBmaWVsZCBvZiB0aGUgb2JqZWN0c1xuICogcmV0dXJuZWQgYnkgdGhlIHN0ZXBwZXJcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5sb29wID0gZnVuY3Rpb24oc3RlcHBlciwgc2VlZCkge1xuXHRyZXR1cm4gbG9vcChzdGVwcGVyLCBzZWVkLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgYWNjdW11bGF0ZSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvYWNjdW11bGF0ZScpO1xuXG5leHBvcnRzLnNjYW4gICA9IGFjY3VtdWxhdGUuc2NhbjtcbmV4cG9ydHMucmVkdWNlID0gYWNjdW11bGF0ZS5yZWR1Y2U7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyZWFtIGNvbnRhaW5pbmcgc3VjY2Vzc2l2ZSByZWR1Y2UgcmVzdWx0cyBvZiBhcHBseWluZyBmIHRvXG4gKiB0aGUgcHJldmlvdXMgcmVkdWNlIHJlc3VsdCBhbmQgdGhlIGN1cnJlbnQgc3RyZWFtIGl0ZW0uXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHJlc3VsdDoqLCB4OiopOip9IGYgcmVkdWNlciBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBpbml0aWFsIGluaXRpYWwgdmFsdWVcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBzdWNjZXNzaXZlIHJlZHVjZSByZXN1bHRzXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2NhbiA9IGZ1bmN0aW9uKGYsIGluaXRpYWwpIHtcblx0cmV0dXJuIGFjY3VtdWxhdGUuc2NhbihmLCBpbml0aWFsLCB0aGlzKTtcbn07XG5cbi8qKlxuICogUmVkdWNlIHRoZSBzdHJlYW0gdG8gcHJvZHVjZSBhIHNpbmdsZSByZXN1bHQuICBOb3RlIHRoYXQgcmVkdWNpbmcgYW4gaW5maW5pdGVcbiAqIHN0cmVhbSB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCBuZXZlciBmdWxmaWxscywgYnV0IHRoYXQgbWF5IHJlamVjdCBpZiBhbiBlcnJvclxuICogb2NjdXJzLlxuICogQHBhcmFtIHtmdW5jdGlvbihyZXN1bHQ6KiwgeDoqKToqfSBmIHJlZHVjZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gaW5pdGlhbCBvcHRpb25hbCBpbml0aWFsIHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSBmb3IgdGhlIGZpbGUgcmVzdWx0IG9mIHRoZSByZWR1Y2VcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbihmLCBpbml0aWFsKSB7XG5cdHJldHVybiBhY2N1bXVsYXRlLnJlZHVjZShmLCBpbml0aWFsLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1aWxkaW5nIGFuZCBleHRlbmRpbmdcblxudmFyIHVuZm9sZCA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS91bmZvbGQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi9saWIvc291cmNlL2l0ZXJhdGUnKTtcbnZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS9nZW5lcmF0ZScpO1xudmFyIGJ1aWxkID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9idWlsZCcpO1xuXG5leHBvcnRzLnVuZm9sZCAgICA9IHVuZm9sZC51bmZvbGQ7XG5leHBvcnRzLml0ZXJhdGUgICA9IGl0ZXJhdGUuaXRlcmF0ZTtcbmV4cG9ydHMuZ2VuZXJhdGUgID0gZ2VuZXJhdGUuZ2VuZXJhdGU7XG5leHBvcnRzLmN5Y2xlICAgICA9IGJ1aWxkLmN5Y2xlO1xuZXhwb3J0cy5jb25jYXQgICAgPSBidWlsZC5jb25jYXQ7XG5leHBvcnRzLnN0YXJ0V2l0aCA9IGJ1aWxkLmNvbnM7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRpZSB0aGlzIHN0cmVhbSBpbnRvIGEgY2lyY2xlLCB0aHVzIGNyZWF0aW5nIGFuIGluZmluaXRlIHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGluZmluaXRlIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLmN5Y2xlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBidWlsZC5jeWNsZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJlYW19IHRhaWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBhbGwgaXRlbXMgaW4gdGhpcyBmb2xsb3dlZCBieVxuICogIGFsbCBpdGVtcyBpbiB0YWlsXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24odGFpbCkge1xuXHRyZXR1cm4gYnVpbGQuY29uY2F0KHRoaXMsIHRhaWwpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IHggdmFsdWUgdG8gcHJlcGVuZFxuICogQHJldHVybnMge1N0cmVhbX0gYSBuZXcgc3RyZWFtIHdpdGggeCBwcmVwZW5kZWRcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5zdGFydFdpdGggPSBmdW5jdGlvbih4KSB7XG5cdHJldHVybiBidWlsZC5jb25zKHgsIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHJhbnNmb3JtaW5nXG5cbnZhciB0cmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3RyYW5zZm9ybScpO1xudmFyIGFwcGxpY2F0aXZlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9hcHBsaWNhdGl2ZScpO1xuXG5leHBvcnRzLm1hcCAgICAgID0gdHJhbnNmb3JtLm1hcDtcbmV4cG9ydHMuY29uc3RhbnQgPSB0cmFuc2Zvcm0uY29uc3RhbnQ7XG5leHBvcnRzLnRhcCAgICAgID0gdHJhbnNmb3JtLnRhcDtcbmV4cG9ydHMuYXAgICAgICAgPSBhcHBsaWNhdGl2ZS5hcDtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gZWFjaCB2YWx1ZSBpbiB0aGUgc3RyZWFtIGJ5IGFwcGx5aW5nIGYgdG8gZWFjaFxuICogQHBhcmFtIHtmdW5jdGlvbigqKToqfSBmIG1hcHBpbmcgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHRyYW5zZm9ybWVkIGJ5IGZcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiB0cmFuc2Zvcm0ubWFwKGYsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBBc3N1bWUgdGhpcyBzdHJlYW0gY29udGFpbnMgZnVuY3Rpb25zLCBhbmQgYXBwbHkgZWFjaCBmdW5jdGlvbiB0byBlYWNoIGl0ZW1cbiAqIGluIHRoZSBwcm92aWRlZCBzdHJlYW0uICBUaGlzIGdlbmVyYXRlcywgaW4gZWZmZWN0LCBhIGNyb3NzIHByb2R1Y3QuXG4gKiBAcGFyYW0ge1N0cmVhbX0geHMgc3RyZWFtIG9mIGl0ZW1zIHRvIHdoaWNoXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBpdGVtc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oeHMpIHtcblx0cmV0dXJuIGFwcGxpY2F0aXZlLmFwKHRoaXMsIHhzKTtcbn07XG5cbi8qKlxuICogUmVwbGFjZSBlYWNoIHZhbHVlIGluIHRoZSBzdHJlYW0gd2l0aCB4XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHJlcGxhY2VkIHdpdGggeFxuICovXG5TdHJlYW0ucHJvdG90eXBlLmNvbnN0YW50ID0gZnVuY3Rpb24oeCkge1xuXHRyZXR1cm4gdHJhbnNmb3JtLmNvbnN0YW50KHgsIHRoaXMpO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgc2lkZSBlZmZlY3QgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RyZWFtXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6Kn0gZiBzaWRlIGVmZmVjdCB0byBleGVjdXRlIGZvciBlYWNoIGl0ZW0uIFRoZVxuICogIHJldHVybiB2YWx1ZSB3aWxsIGJlIGRpc2NhcmRlZC5cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyB0aGUgc2FtZSBpdGVtcyBhcyB0aGlzIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRhcCA9IGZ1bmN0aW9uKGYpIHtcblx0cmV0dXJuIHRyYW5zZm9ybS50YXAoZiwgdGhpcyk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmFuc2R1Y2VyIHN1cHBvcnRcblxudmFyIHRyYW5zZHVjZSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvdHJhbnNkdWNlJyk7XG5cbmV4cG9ydHMudHJhbnNkdWNlID0gdHJhbnNkdWNlLnRyYW5zZHVjZTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhpcyBzdHJlYW0gYnkgcGFzc2luZyBpdHMgZXZlbnRzIHRocm91Z2ggYSB0cmFuc2R1Y2VyLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IHRyYW5zZHVjZXIgdHJhbnNkdWNlciBmdW5jdGlvblxuICogQHJldHVybiB7U3RyZWFtfSBzdHJlYW0gb2YgZXZlbnRzIHRyYW5zZm9ybWVkIGJ5IHRoZSB0cmFuc2R1Y2VyXG4gKi9cblN0cmVhbS5wcm90b3R5cGUudHJhbnNkdWNlID0gZnVuY3Rpb24odHJhbnNkdWNlcikge1xuXHRyZXR1cm4gdHJhbnNkdWNlLnRyYW5zZHVjZSh0cmFuc2R1Y2VyLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZsYXRNYXBwaW5nXG5cbnZhciBmbGF0TWFwID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9mbGF0TWFwJyk7XG5cbmV4cG9ydHMuZmxhdE1hcCA9IGV4cG9ydHMuY2hhaW4gPSBmbGF0TWFwLmZsYXRNYXA7XG5leHBvcnRzLmpvaW4gICAgPSBmbGF0TWFwLmpvaW47XG5cbi8qKlxuICogTWFwIGVhY2ggdmFsdWUgaW4gdGhlIHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCBtZXJnZSBpdCBpbnRvIHRoZVxuICogcmV0dXJuZWQgb3V0ZXIgc3RyZWFtLiBFdmVudCBhcnJpdmFsIHRpbWVzIGFyZSBwcmVzZXJ2ZWQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGNoYWluaW5nIGZ1bmN0aW9uLCBtdXN0IHJldHVybiBhIFN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgZnJvbSBlYWNoIHN0cmVhbSByZXR1cm5lZCBieSBmXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZmxhdE1hcCA9IFN0cmVhbS5wcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiBmbGF0TWFwLmZsYXRNYXAoZiwgdGhpcyk7XG59O1xuXG4vKipcbiAqIE1vbmFkaWMgam9pbi4gRmxhdHRlbiBhIFN0cmVhbTxTdHJlYW08WD4+IHRvIFN0cmVhbTxYPiBieSBtZXJnaW5nIGlubmVyXG4gKiBzdHJlYW1zIHRvIHRoZSBvdXRlci4gRXZlbnQgYXJyaXZhbCB0aW1lcyBhcmUgcHJlc2VydmVkLlxuICogQHJldHVybnMge1N0cmVhbTxYPn0gbmV3IHN0cmVhbSBjb250YWluaW5nIGFsbCBldmVudHMgb2YgYWxsIGlubmVyIHN0cmVhbXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBmbGF0TWFwLmpvaW4odGhpcyk7XG59O1xuXG52YXIgY29udGludWVXaXRoID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9jb250aW51ZVdpdGgnKS5jb250aW51ZVdpdGg7XG5cbmV4cG9ydHMuY29udGludWVXaXRoID0gY29udGludWVXaXRoO1xuZXhwb3J0cy5mbGF0TWFwRW5kID0gY29udGludWVXaXRoO1xuXG4vKipcbiAqIE1hcCB0aGUgZW5kIGV2ZW50IHRvIGEgbmV3IHN0cmVhbSwgYW5kIGJlZ2luIGVtaXR0aW5nIGl0cyB2YWx1ZXMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHg6Kik6U3RyZWFtfSBmIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGVuZCBldmVudCB2YWx1ZSxcbiAqIGFuZCAqbXVzdCogcmV0dXJuIGEgbmV3IFN0cmVhbSB0byBjb250aW51ZSB3aXRoLlxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IGVtaXRzIGFsbCBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtLFxuICogZm9sbG93ZWQgYnkgYWxsIGV2ZW50cyBmcm9tIHRoZSBzdHJlYW0gcmV0dXJuZWQgYnkgZi5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5jb250aW51ZVdpdGggPSBTdHJlYW0ucHJvdG90eXBlLmZsYXRNYXBFbmQgPSBmdW5jdGlvbihmKSB7XG5cdHJldHVybiBjb250aW51ZVdpdGgoZiwgdGhpcyk7XG59O1xuXG52YXIgY29uY2F0TWFwID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9jb25jYXRNYXAnKS5jb25jYXRNYXA7XG5cbmV4cG9ydHMuY29uY2F0TWFwID0gY29uY2F0TWFwO1xuXG5TdHJlYW0ucHJvdG90eXBlLmNvbmNhdE1hcCA9IGZ1bmN0aW9uKGYpIHtcblx0cmV0dXJuIGNvbmNhdE1hcChmLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmN1cnJlbnQgbWVyZ2luZ1xuXG52YXIgbWVyZ2VDb25jdXJyZW50bHkgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL21lcmdlQ29uY3VycmVudGx5Jyk7XG5cbmV4cG9ydHMubWVyZ2VDb25jdXJyZW50bHkgPSBtZXJnZUNvbmN1cnJlbnRseS5tZXJnZUNvbmN1cnJlbnRseTtcblxuLyoqXG4gKiBGbGF0dGVuIGEgU3RyZWFtPFN0cmVhbTxYPj4gdG8gU3RyZWFtPFg+IGJ5IG1lcmdpbmcgaW5uZXJcbiAqIHN0cmVhbXMgdG8gdGhlIG91dGVyLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGlubmVyIHN0cmVhbXMgdGhhdCBtYXlcbiAqIGJlIGFjdGl2ZSBjb25jdXJyZW50bHkuXG4gKiBAcGFyYW0ge251bWJlcn0gY29uY3VycmVuY3kgYXQgbW9zdCB0aGlzIG1hbnkgaW5uZXIgc3RyZWFtcyB3aWxsIGJlXG4gKiAgYWxsb3dlZCB0byBiZSBhY3RpdmUgY29uY3VycmVudGx5LlxuICogQHJldHVybiB7U3RyZWFtPFg+fSBuZXcgc3RyZWFtIGNvbnRhaW5pbmcgYWxsIGV2ZW50cyBvZiBhbGwgaW5uZXJcbiAqICBzdHJlYW1zLCB3aXRoIGxpbWl0ZWQgY29uY3VycmVuY3kuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubWVyZ2VDb25jdXJyZW50bHkgPSBmdW5jdGlvbihjb25jdXJyZW5jeSkge1xuXHRyZXR1cm4gbWVyZ2VDb25jdXJyZW50bHkubWVyZ2VDb25jdXJyZW50bHkoY29uY3VycmVuY3ksIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVyZ2luZ1xuXG52YXIgbWVyZ2UgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL21lcmdlJyk7XG5cbmV4cG9ydHMubWVyZ2UgPSBtZXJnZS5tZXJnZTtcbmV4cG9ydHMubWVyZ2VBcnJheSA9IG1lcmdlLm1lcmdlQXJyYXk7XG5cbi8qKlxuICogTWVyZ2UgdGhpcyBzdHJlYW0gYW5kIGFsbCB0aGUgcHJvdmlkZWQgc3RyZWFtc1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgaXRlbXMgZnJvbSB0aGlzIHN0cmVhbSBhbmQgcyBpbiB0aW1lXG4gKiBvcmRlci4gIElmIHR3byBldmVudHMgYXJlIHNpbXVsdGFuZW91cyB0aGV5IHdpbGwgYmUgbWVyZ2VkIGluXG4gKiBhcmJpdHJhcnkgb3JkZXIuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbigvKi4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gbWVyZ2UubWVyZ2VBcnJheShiYXNlLmNvbnModGhpcywgYXJndW1lbnRzKSk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb21iaW5pbmdcblxudmFyIGNvbWJpbmUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL2NvbWJpbmUnKTtcblxuZXhwb3J0cy5jb21iaW5lID0gY29tYmluZS5jb21iaW5lO1xuZXhwb3J0cy5jb21iaW5lQXJyYXkgPSBjb21iaW5lLmNvbWJpbmVBcnJheTtcblxuLyoqXG4gKiBDb21iaW5lIGxhdGVzdCBldmVudHMgZnJvbSBhbGwgaW5wdXQgc3RyZWFtc1xuICogQHBhcmFtIHtmdW5jdGlvbiguLi5ldmVudHMpOip9IGYgZnVuY3Rpb24gdG8gY29tYmluZSBtb3N0IHJlY2VudCBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgZiB0byB0aGUgbW9zdCByZWNlbnRcbiAqICBldmVudCBvZiBlYWNoIGlucHV0IHN0cmVhbSwgd2hlbmV2ZXIgYSBuZXcgZXZlbnQgYXJyaXZlcyBvbiBhbnkgc3RyZWFtLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbihmIC8qLCAuLi5zdHJlYW1zKi8pIHtcblx0cmV0dXJuIGNvbWJpbmUuY29tYmluZUFycmF5KGYsIGJhc2UucmVwbGFjZSh0aGlzLCAwLCBhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNhbXBsaW5nXG5cbnZhciBzYW1wbGUgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL3NhbXBsZScpO1xuXG5leHBvcnRzLnNhbXBsZSA9IHNhbXBsZS5zYW1wbGU7XG5leHBvcnRzLnNhbXBsZVdpdGggPSBzYW1wbGUuc2FtcGxlV2l0aDtcblxuLyoqXG4gKiBXaGVuIGFuIGV2ZW50IGFycml2ZXMgb24gc2FtcGxlciwgZW1pdCB0aGUgbGF0ZXN0IGV2ZW50IHZhbHVlIGZyb20gc3RyZWFtLlxuICogQHBhcmFtIHtTdHJlYW19IHNhbXBsZXIgc3RyZWFtIG9mIGV2ZW50cyBhdCB3aG9zZSBhcnJpdmFsIHRpbWVcbiAqICBzaWduYWwncyBsYXRlc3QgdmFsdWUgd2lsbCBiZSBwcm9wYWdhdGVkXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzYW1wbGVkIHN0cmVhbSBvZiB2YWx1ZXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5zYW1wbGVXaXRoID0gZnVuY3Rpb24oc2FtcGxlcikge1xuXHRyZXR1cm4gc2FtcGxlLnNhbXBsZVdpdGgoc2FtcGxlciwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFdoZW4gYW4gZXZlbnQgYXJyaXZlcyBvbiB0aGlzIHN0cmVhbSwgZW1pdCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZiB3aXRoIHRoZSBsYXRlc3RcbiAqIHZhbHVlcyBvZiBhbGwgc3RyZWFtcyBiZWluZyBzYW1wbGVkXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLnZhbHVlcyk6Kn0gZiBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHNldCBvZiBzYW1wbGVkIHZhbHVlc1xuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIG9mIHNhbXBsZWQgYW5kIHRyYW5zZm9ybWVkIHZhbHVlc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uKGYgLyogLi4uc3RyZWFtcyAqLykge1xuXHRyZXR1cm4gc2FtcGxlLnNhbXBsZUFycmF5KGYsIHRoaXMsIGJhc2UudGFpbChhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFppcHBpbmdcblxudmFyIHppcCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvemlwJyk7XG5cbmV4cG9ydHMuemlwID0gemlwLnppcDtcblxuLyoqXG4gKiBQYWlyLXdpc2UgY29tYmluZSBpdGVtcyB3aXRoIHRob3NlIGluIHMuIEdpdmVuIDIgc3RyZWFtczpcbiAqIFsxLDIsM10gemlwV2l0aCBmIFs0LDUsNl0gLT4gW2YoMSw0KSxmKDIsNSksZigzLDYpXVxuICogTm90ZTogemlwIGNhdXNlcyBmYXN0IHN0cmVhbXMgdG8gYnVmZmVyIGFuZCB3YWl0IGZvciBzbG93IHN0cmVhbXMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGE6U3RyZWFtLCBiOlN0cmVhbSwgLi4uKToqfSBmIGZ1bmN0aW9uIHRvIGNvbWJpbmUgaXRlbXNcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBwYWlyc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLnppcCA9IGZ1bmN0aW9uKGYgLyosIC4uLnN0cmVhbXMqLykge1xuXHRyZXR1cm4gemlwLnppcEFycmF5KGYsIGJhc2UucmVwbGFjZSh0aGlzLCAwLCBhcmd1bWVudHMpKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN3aXRjaGluZ1xuXG52YXIgc3dpdGNoTGF0ZXN0ID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9zd2l0Y2gnKS5zd2l0Y2g7XG5cbmV4cG9ydHMuc3dpdGNoICAgICAgID0gc3dpdGNoTGF0ZXN0O1xuZXhwb3J0cy5zd2l0Y2hMYXRlc3QgPSBzd2l0Y2hMYXRlc3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBzdHJlYW0gb2Ygc3RyZWFtcywgcmV0dXJuIGEgbmV3IHN0cmVhbSB0aGF0IGFkb3B0cyB0aGUgYmVoYXZpb3JcbiAqIG9mIHRoZSBtb3N0IHJlY2VudCBpbm5lciBzdHJlYW0uXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzd2l0Y2hpbmcgc3RyZWFtXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc3dpdGNoID0gU3RyZWFtLnByb3RvdHlwZS5zd2l0Y2hMYXRlc3QgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHN3aXRjaExhdGVzdCh0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbHRlcmluZ1xuXG52YXIgZmlsdGVyID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9maWx0ZXInKTtcblxuZXhwb3J0cy5maWx0ZXIgICAgICAgICAgPSBmaWx0ZXIuZmlsdGVyO1xuZXhwb3J0cy5za2lwUmVwZWF0cyAgICAgPSBleHBvcnRzLmRpc3RpbmN0ICAgPSBmaWx0ZXIuc2tpcFJlcGVhdHM7XG5leHBvcnRzLnNraXBSZXBlYXRzV2l0aCA9IGV4cG9ydHMuZGlzdGluY3RCeSA9IGZpbHRlci5za2lwUmVwZWF0c1dpdGg7XG5cbi8qKlxuICogUmV0YWluIG9ubHkgaXRlbXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIHN0cmVhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNDU2NzgtXG4gKiBmaWx0ZXIoeCA9PiB4ICUgMiA9PT0gMCwgc3RyZWFtKTogLS0yLTQtNi04LVxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgZmlsdGVyaW5nIHByZWRpY2F0ZSBjYWxsZWQgZm9yIGVhY2ggaXRlbVxuICogQHJldHVybnMge1N0cmVhbX0gc3RyZWFtIGNvbnRhaW5pbmcgb25seSBpdGVtcyBmb3Igd2hpY2ggcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5XG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocCkge1xuXHRyZXR1cm4gZmlsdGVyLmZpbHRlcihwLCB0aGlzKTtcbn07XG5cbi8qKlxuICogU2tpcCByZXBlYXRlZCBldmVudHMsIHVzaW5nID09PSB0byBjb21wYXJlIGl0ZW1zXG4gKiBzdHJlYW06ICAgICAgICAgICAtYWJiY2QtXG4gKiBkaXN0aW5jdChzdHJlYW0pOiAtYWItY2QtXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gd2l0aCBubyByZXBlYXRlZCBldmVudHNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5za2lwUmVwZWF0cyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gZmlsdGVyLnNraXBSZXBlYXRzKHRoaXMpO1xufTtcblxuLyoqXG4gKiBTa2lwIHJlcGVhdGVkIGV2ZW50cywgdXNpbmcgc3VwcGxpZWQgZXF1YWxzIGZ1bmN0aW9uIHRvIGNvbXBhcmUgaXRlbXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oYToqLCBiOiopOmJvb2xlYW59IGVxdWFscyBmdW5jdGlvbiB0byBjb21wYXJlIGl0ZW1zXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gd2l0aCBubyByZXBlYXRlZCBldmVudHNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5za2lwUmVwZWF0c1dpdGggPSBmdW5jdGlvbihlcXVhbHMpIHtcblx0cmV0dXJuIGZpbHRlci5za2lwUmVwZWF0c1dpdGgoZXF1YWxzLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNsaWNpbmdcblxudmFyIHNsaWNlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci9zbGljZScpO1xuXG5leHBvcnRzLnRha2UgICAgICA9IHNsaWNlLnRha2U7XG5leHBvcnRzLnNraXAgICAgICA9IHNsaWNlLnNraXA7XG5leHBvcnRzLnNsaWNlICAgICA9IHNsaWNlLnNsaWNlO1xuZXhwb3J0cy50YWtlV2hpbGUgPSBzbGljZS50YWtlV2hpbGU7XG5leHBvcnRzLnNraXBXaGlsZSA9IHNsaWNlLnNraXBXaGlsZTtcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgIC1hYmNkLVxuICogdGFrZSgyLCBzdHJlYW0pOiAtYWJ8XG4gKiBAcGFyYW0ge051bWJlcn0gbiB0YWtlIHVwIHRvIHRoaXMgbWFueSBldmVudHNcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGF0IG1vc3QgdGhlIGZpcnN0IG4gaXRlbXMgZnJvbSB0aGlzIHN0cmVhbVxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRha2UgPSBmdW5jdGlvbihuKSB7XG5cdHJldHVybiBzbGljZS50YWtlKG4sIHRoaXMpO1xufTtcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgIC1hYmNkLT5cbiAqIHNraXAoMiwgc3RyZWFtKTogLS0tY2QtPlxuICogQHBhcmFtIHtOdW1iZXJ9IG4gc2tpcCB0aGlzIG1hbnkgZXZlbnRzXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gbm90IGNvbnRhaW5pbmcgdGhlIGZpcnN0IG4gZXZlbnRzXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKG4pIHtcblx0cmV0dXJuIHNsaWNlLnNraXAobiwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFNsaWNlIGEgc3RyZWFtIGJ5IGV2ZW50IGluZGV4LiBFcXVpdmFsZW50IHRvLCBidXQgbW9yZSBlZmZpY2llbnQgdGhhblxuICogc3RyZWFtLnRha2UoZW5kKS5za2lwKHN0YXJ0KTtcbiAqIE5PVEU6IE5lZ2F0aXZlIHN0YXJ0IGFuZCBlbmQgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBza2lwIGFsbCBldmVudHMgYmVmb3JlIHRoZSBzdGFydCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGVuZCBhbGxvdyBhbGwgZXZlbnRzIGZyb20gdGhlIHN0YXJ0IGluZGV4IHRvIHRoZSBlbmQgaW5kZXhcbiAqIEByZXR1cm5zIHtTdHJlYW19IHN0cmVhbSBjb250YWluaW5nIGl0ZW1zIHdoZXJlIHN0YXJ0IDw9IGluZGV4IDwgZW5kXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG5cdHJldHVybiBzbGljZS5zbGljZShzdGFydCwgZW5kLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgICAgIC0xMjM0NTEyMzQtPlxuICogdGFrZVdoaWxlKHggPT4geCA8IDUsIHN0cmVhbSk6IC0xMjM0fFxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgcHJlZGljYXRlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZVxuICogZmlyc3QgaXRlbSBmb3Igd2hpY2ggcCByZXR1cm5zIGZhbHN5LlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnRha2VXaGlsZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIHNsaWNlLnRha2VXaGlsZShwLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgICAgIC0xMjM0NTEyMzQtPlxuICogc2tpcFdoaWxlKHggPT4geCA8IDUsIHN0cmVhbSk6IC0tLS0tNTEyMzQtPlxuICogQHBhcmFtIHtmdW5jdGlvbih4OiopOmJvb2xlYW59IHAgcHJlZGljYXRlXG4gKiBAcmV0dXJucyB7U3RyZWFtfSBzdHJlYW0gY29udGFpbmluZyBpdGVtcyBmb2xsb3dpbmcgKmFuZCBpbmNsdWRpbmcqIHRoZVxuICogZmlyc3QgaXRlbSBmb3Igd2hpY2ggcCByZXR1cm5zIGZhbHN5LlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnNraXBXaGlsZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIHNsaWNlLnNraXBXaGlsZShwLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWUgc2xpY2luZ1xuXG52YXIgdGltZXNsaWNlID0gcmVxdWlyZSgnLi9saWIvY29tYmluYXRvci90aW1lc2xpY2UnKTtcblxuZXhwb3J0cy51bnRpbCAgPSBleHBvcnRzLnRha2VVbnRpbCA9IHRpbWVzbGljZS50YWtlVW50aWw7XG5leHBvcnRzLnNpbmNlICA9IGV4cG9ydHMuc2tpcFVudGlsID0gdGltZXNsaWNlLnNraXBVbnRpbDtcbmV4cG9ydHMuZHVyaW5nID0gdGltZXNsaWNlLmR1cmluZztcblxuLyoqXG4gKiBzdHJlYW06ICAgICAgICAgICAgICAgICAgICAtYS1iLWMtZC1lLWYtZy0+XG4gKiBzaWduYWw6ICAgICAgICAgICAgICAgICAgICAtLS0tLS0teFxuICogdGFrZVVudGlsKHNpZ25hbCwgc3RyZWFtKTogLWEtYi1jLXxcbiAqIEBwYXJhbSB7U3RyZWFtfSBzaWduYWwgcmV0YWluIG9ubHkgZXZlbnRzIGluIHN0cmVhbSBiZWZvcmUgdGhlIGZpcnN0XG4gKiBldmVudCBpbiBzaWduYWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB0aGF0IG9jY3VyIGJlZm9yZVxuICogdGhlIGZpcnN0IGV2ZW50IGluIHNpZ25hbC5cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS51bnRpbCA9IFN0cmVhbS5wcm90b3R5cGUudGFrZVVudGlsID0gZnVuY3Rpb24oc2lnbmFsKSB7XG5cdHJldHVybiB0aW1lc2xpY2UudGFrZVVudGlsKHNpZ25hbCwgdGhpcyk7XG59O1xuXG4vKipcbiAqIHN0cmVhbTogICAgICAgICAgICAgICAgICAgIC1hLWItYy1kLWUtZi1nLT5cbiAqIHNpZ25hbDogICAgICAgICAgICAgICAgICAgIC0tLS0tLS14XG4gKiB0YWtlVW50aWwoc2lnbmFsLCBzdHJlYW0pOiAtLS0tLS0tZC1lLWYtZy0+XG4gKiBAcGFyYW0ge1N0cmVhbX0gc2lnbmFsIHJldGFpbiBvbmx5IGV2ZW50cyBpbiBzdHJlYW0gYXQgb3IgYWZ0ZXIgdGhlIGZpcnN0XG4gKiBldmVudCBpbiBzaWduYWxcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB0aGF0IG9jY3VyIGFmdGVyXG4gKiB0aGUgZmlyc3QgZXZlbnQgaW4gc2lnbmFsLlxuICovXG5TdHJlYW0ucHJvdG90eXBlLnNpbmNlID0gU3RyZWFtLnByb3RvdHlwZS5za2lwVW50aWwgPSBmdW5jdGlvbihzaWduYWwpIHtcblx0cmV0dXJuIHRpbWVzbGljZS5za2lwVW50aWwoc2lnbmFsLCB0aGlzKTtcbn07XG5cbi8qKlxuICogc3RyZWFtOiAgICAgICAgICAgICAgICAgICAgLWEtYi1jLWQtZS1mLWctPlxuICogdGltZVdpbmRvdzogICAgICAgICAgICAgICAgLS0tLS1zXG4gKiBzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLXRcbiAqIHN0cmVhbS5kdXJpbmcodGltZVdpbmRvdyk6IC0tLS0tYy1kLWUtfFxuICogQHBhcmFtIHtTdHJlYW08U3RyZWFtPn0gdGltZVdpbmRvdyBhIHN0cmVhbSB3aG9zZSBmaXJzdCBldmVudCAocykgcmVwcmVzZW50c1xuICogIHRoZSB3aW5kb3cgc3RhcnQgdGltZS4gIFRoYXQgZXZlbnQgKHMpIGlzIGl0c2VsZiBhIHN0cmVhbSB3aG9zZSBmaXJzdCBldmVudCAodClcbiAqICByZXByZXNlbnRzIHRoZSB3aW5kb3cgZW5kIHRpbWVcbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gY29udGFpbmluZyBvbmx5IGV2ZW50cyB3aXRoaW4gdGhlIHByb3ZpZGVkIHRpbWVzcGFuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUuZHVyaW5nID0gZnVuY3Rpb24odGltZVdpbmRvdykge1xuXHRyZXR1cm4gdGltZXNsaWNlLmR1cmluZyh0aW1lV2luZG93LCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbGF5aW5nXG5cbnZhciBkZWxheSA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvZGVsYXknKS5kZWxheTtcblxuZXhwb3J0cy5kZWxheSA9IGRlbGF5O1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheVRpbWUgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGVhY2ggaXRlbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zLCBidXQgZGVsYXllZCBieSBtc1xuICovXG5TdHJlYW0ucHJvdG90eXBlLmRlbGF5ID0gZnVuY3Rpb24oZGVsYXlUaW1lKSB7XG5cdHJldHVybiBkZWxheShkZWxheVRpbWUsIHRoaXMpO1xufTtcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2V0dGluZyBldmVudCB0aW1lc3RhbXBcblxudmFyIHRpbWVzdGFtcCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvdGltZXN0YW1wJykudGltZXN0YW1wO1xuXG5leHBvcnRzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcblxuLyoqXG4gKiBFeHBvc2UgZXZlbnQgdGltZXN0YW1wcyBpbnRvIHRoZSBzdHJlYW0uIFR1cm5zIGEgU3RyZWFtPFg+IGludG9cbiAqIFN0cmVhbTx7dGltZTp0LCB2YWx1ZTpYfT5cbiAqIEByZXR1cm5zIHtTdHJlYW08e3RpbWU6bnVtYmVyLCB2YWx1ZToqfT59XG4gKi9cblN0cmVhbS5wcm90b3R5cGUudGltZXN0YW1wID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aW1lc3RhbXAodGhpcyk7XG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSYXRlIGxpbWl0aW5nXG5cbnZhciBsaW1pdCA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvbGltaXQnKTtcblxuZXhwb3J0cy50aHJvdHRsZSA9IGxpbWl0LnRocm90dGxlO1xuZXhwb3J0cy5kZWJvdW5jZSA9IGxpbWl0LmRlYm91bmNlO1xuXG4vKipcbiAqIExpbWl0IHRoZSByYXRlIG9mIGV2ZW50c1xuICogc3RyZWFtOiAgICAgICAgICAgICAgYWJjZC0tLS1hYmNkLS0tLVxuICogdGhyb3R0bGUoMiwgc3RyZWFtKTogYS1jLS0tLS1hLWMtLS0tLVxuICogQHBhcmFtIHtOdW1iZXJ9IHBlcmlvZCB0aW1lIHRvIHN1cHByZXNzIGV2ZW50c1xuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB0aGF0IHNraXBzIGV2ZW50cyBmb3IgdGhyb3R0bGUgcGVyaW9kXG4gKi9cblN0cmVhbS5wcm90b3R5cGUudGhyb3R0bGUgPSBmdW5jdGlvbihwZXJpb2QpIHtcblx0cmV0dXJuIGxpbWl0LnRocm90dGxlKHBlcmlvZCwgdGhpcyk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIGEgYnVyc3Qgb2YgZXZlbnRzIHRvIHN1YnNpZGUgYW5kIGVtaXQgb25seSB0aGUgbGFzdCBldmVudCBpbiB0aGUgYnVyc3RcbiAqIHN0cmVhbTogICAgICAgICAgICAgIGFiY2QtLS0tYWJjZC0tLS1cbiAqIGRlYm91bmNlKDIsIHN0cmVhbSk6IC0tLS0tZC0tLS0tLS1kLS1cbiAqIEBwYXJhbSB7TnVtYmVyfSBwZXJpb2QgZXZlbnRzIG9jY3VyaW5nIG1vcmUgZnJlcXVlbnRseSB0aGFuIHRoaXNcbiAqICBvbiB0aGUgcHJvdmlkZWQgc2NoZWR1bGVyIHdpbGwgYmUgc3VwcHJlc3NlZFxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IGRlYm91bmNlZCBzdHJlYW1cbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5kZWJvdW5jZSA9IGZ1bmN0aW9uKHBlcmlvZCkge1xuXHRyZXR1cm4gbGltaXQuZGVib3VuY2UocGVyaW9kLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEF3YWl0aW5nIFByb21pc2VzXG5cbnZhciBwcm9taXNlcyA9IHJlcXVpcmUoJy4vbGliL2NvbWJpbmF0b3IvcHJvbWlzZXMnKTtcblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IHByb21pc2VzLmZyb21Qcm9taXNlO1xuZXhwb3J0cy5hd2FpdCAgICAgICA9IHByb21pc2VzLmF3YWl0UHJvbWlzZXM7XG5cbi8qKlxuICogQXdhaXQgcHJvbWlzZXMsIHR1cm5pbmcgYSBTdHJlYW08UHJvbWlzZTxYPj4gaW50byBTdHJlYW08WD4uICBQcmVzZXJ2ZXNcbiAqIGV2ZW50IG9yZGVyLCBidXQgdGltZXNoaWZ0cyBldmVudHMgYmFzZWQgb24gcHJvbWlzZSByZXNvbHV0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7U3RyZWFtPFg+fSBzdHJlYW0gY29udGFpbmluZyBub24tcHJvbWlzZSB2YWx1ZXNcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5hd2FpdCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gcHJvbWlzZXMuYXdhaXRQcm9taXNlcyh0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVycm9yIGhhbmRsaW5nXG5cbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuL2xpYi9jb21iaW5hdG9yL2Vycm9ycycpO1xuXG5leHBvcnRzLnJlY292ZXJXaXRoICA9IGVycm9ycy5mbGF0TWFwRXJyb3I7XG5leHBvcnRzLmZsYXRNYXBFcnJvciA9IGVycm9ycy5mbGF0TWFwRXJyb3I7XG5leHBvcnRzLnRocm93RXJyb3IgICA9IGVycm9ycy50aHJvd0Vycm9yO1xuXG4vKipcbiAqIElmIHRoaXMgc3RyZWFtIGVuY291bnRlcnMgYW4gZXJyb3IsIHJlY292ZXIgYW5kIGNvbnRpbnVlIHdpdGggaXRlbXMgZnJvbSBzdHJlYW1cbiAqIHJldHVybmVkIGJ5IGYuXG4gKiBzdHJlYW06ICAgICAgICAgICAgICAgICAgLWEtYi1jLVgtXG4gKiBmKFgpOiAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtZS1mLWctXG4gKiBmbGF0TWFwRXJyb3IoZiwgc3RyZWFtKTogLWEtYi1jLWQtZS1mLWctXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGVycm9yOiopOlN0cmVhbX0gZiBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgbmV3IHN0cmVhbVxuICogQHJldHVybnMge1N0cmVhbX0gbmV3IHN0cmVhbSB3aGljaCB3aWxsIHJlY292ZXIgZnJvbSBhbiBlcnJvciBieSBjYWxsaW5nIGZcbiAqL1xuU3RyZWFtLnByb3RvdHlwZS5yZWNvdmVyV2l0aCA9IFN0cmVhbS5wcm90b3R5cGUuZmxhdE1hcEVycm9yID0gZnVuY3Rpb24oZikge1xuXHRyZXR1cm4gZXJyb3JzLmZsYXRNYXBFcnJvcihmLCB0aGlzKTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE11bHRpY2FzdGluZ1xuXG52YXIgbXVsdGljYXN0ID0gcmVxdWlyZSgnQG1vc3QvbXVsdGljYXN0JykuZGVmYXVsdDtcblxuZXhwb3J0cy5tdWx0aWNhc3QgPSBtdWx0aWNhc3Q7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBzdHJlYW0gaW50byBtdWx0aWNhc3Qgc3RyZWFtLiAgVGhhdCBtZWFucyB0aGF0IG1hbnkgc3Vic2NyaWJlcnNcbiAqIHRvIHRoZSBzdHJlYW0gd2lsbCBub3QgY2F1c2UgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhlIGludGVybmFsIG1hY2hpbmVyeS5cbiAqIEByZXR1cm5zIHtTdHJlYW19IG5ldyBzdHJlYW0gd2hpY2ggd2lsbCBtdWx0aWNhc3QgZXZlbnRzIHRvIGFsbCBvYnNlcnZlcnMuXG4gKi9cblN0cmVhbS5wcm90b3R5cGUubXVsdGljYXN0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBtdWx0aWNhc3QodGhpcyk7XG59O1xuIl19
const most = require('most');
const stream = most.just(Array(170000));
const dest = [];
stream.forEach(bigArray =>
dest.push.apply(dest, bigArray)
);
console.log(dest);
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"most": "0.19.6"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment