made with requirebin
Last active
August 8, 2017 18:53
-
-
Save leebyron/85115c44c89bf2c202ae8e6450978654 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Observable = require("zen-observable"); | |
let sink; | |
const list = []; | |
const error = new Error(); | |
new Observable(_sink => { | |
sink = _sink; | |
return () => list.push('cleanup'); | |
}).subscribe({ | |
next: val => { | |
list.push('next:' + val); | |
throw error; | |
}, | |
error: err => { | |
list.push('error-handler:'); | |
list.push(err); | |
}, | |
complete: () => list.push('complete'), | |
}); | |
try { | |
sink.next(1); | |
} catch (e) { | |
list.push('try-catch:'); | |
list.push(e); | |
} | |
try { | |
sink.next(2); | |
} catch (e) { | |
list.push('try-catch:'); | |
list.push(e); | |
} | |
console.log(list); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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){ | |
'use strict'; (function(fn, name) { if (typeof exports !== 'undefined') fn(exports, module); else if (typeof self !== 'undefined') fn(name === '*' ? self : (name ? self[name] = {} : {})); })(function(exports, module) { // === Symbol Support === | |
function hasSymbol(name) { | |
return typeof Symbol === "function" && Boolean(Symbol[name]); | |
} | |
function getSymbol(name) { | |
return hasSymbol(name) ? Symbol[name] : "@@" + name; | |
} | |
// Ponyfill Symbol.observable for interoperability with other libraries | |
if (typeof Symbol === "function" && !Symbol.observable) { | |
Symbol.observable = Symbol("observable"); | |
} | |
// === Abstract Operations === | |
function getMethod(obj, key) { | |
var value = obj[key]; | |
if (value == null) | |
return undefined; | |
if (typeof value !== "function") | |
throw new TypeError(value + " is not a function"); | |
return value; | |
} | |
function getSpecies(obj) { | |
var ctor = obj.constructor; | |
if (ctor !== undefined) { | |
ctor = ctor[getSymbol("species")]; | |
if (ctor === null) { | |
ctor = undefined; | |
} | |
} | |
return ctor !== undefined ? ctor : Observable; | |
} | |
function addMethods(target, methods) { | |
Object.keys(methods).forEach(function(k) { | |
var desc = Object.getOwnPropertyDescriptor(methods, k); | |
desc.enumerable = false; | |
Object.defineProperty(target, k, desc); | |
}); | |
} | |
function cleanupSubscription(subscription) { | |
// Assert: observer._observer is undefined | |
var cleanup = subscription._cleanup; | |
if (!cleanup) | |
return; | |
// Drop the reference to the cleanup function so that we won't call it | |
// more than once | |
subscription._cleanup = undefined; | |
// Call the cleanup function | |
cleanup(); | |
} | |
function subscriptionClosed(subscription) { | |
return subscription._observer === undefined; | |
} | |
function closeSubscription(subscription) { | |
if (subscriptionClosed(subscription)) | |
return; | |
subscription._observer = undefined; | |
cleanupSubscription(subscription); | |
} | |
function cleanupFromSubscription(subscription) { | |
return function() { subscription.unsubscribe() }; | |
} | |
function Subscription(observer, subscriber) { | |
// Assert: subscriber is callable | |
// The observer must be an object | |
if (Object(observer) !== observer) | |
throw new TypeError("Observer must be an object"); | |
this._cleanup = undefined; | |
this._observer = observer; | |
var start = getMethod(observer, "start"); | |
if (start) | |
start.call(observer, this); | |
if (subscriptionClosed(this)) | |
return; | |
observer = new SubscriptionObserver(this); | |
try { | |
// Call the subscriber function | |
var cleanup$0 = subscriber.call(undefined, observer); | |
// The return value must be undefined, null, a subscription object, or a function | |
if (cleanup$0 != null) { | |
if (typeof cleanup$0.unsubscribe === "function") | |
cleanup$0 = cleanupFromSubscription(cleanup$0); | |
else if (typeof cleanup$0 !== "function") | |
throw new TypeError(cleanup$0 + " is not a function"); | |
this._cleanup = cleanup$0; | |
} | |
} catch (e) { | |
// If an error occurs during startup, then attempt to send the error | |
// to the observer | |
observer.error(e); | |
return; | |
} | |
// If the stream is already finished, then perform cleanup | |
if (subscriptionClosed(this)) | |
cleanupSubscription(this); | |
} | |
addMethods(Subscription.prototype = {}, { | |
get closed() { return subscriptionClosed(this) }, | |
unsubscribe: function() { closeSubscription(this) }, | |
}); | |
function SubscriptionObserver(subscription) { | |
this._subscription = subscription; | |
} | |
addMethods(SubscriptionObserver.prototype = {}, { | |
get closed() { return subscriptionClosed(this._subscription) }, | |
next: function(value) { | |
var subscription = this._subscription; | |
// If the stream is closed, then return undefined | |
if (subscriptionClosed(subscription)) | |
return undefined; | |
var observer = subscription._observer; | |
var m = getMethod(observer, "next"); | |
// If the observer doesn't support "next", then return undefined | |
if (!m) | |
return undefined; | |
// Send the next value to the sink | |
return m.call(observer, value); | |
}, | |
error: function(value) { | |
var subscription = this._subscription; | |
// If the stream is closed, throw the error to the caller | |
if (subscriptionClosed(subscription)) | |
throw value; | |
var observer = subscription._observer; | |
subscription._observer = undefined; | |
try { | |
var m$0 = getMethod(observer, "error"); | |
// If the sink does not support "error", then throw the error to the caller | |
if (!m$0) | |
throw value; | |
value = m$0.call(observer, value); | |
} catch (e) { | |
try { cleanupSubscription(subscription) } | |
finally { throw e } | |
} | |
cleanupSubscription(subscription); | |
return value; | |
}, | |
complete: function(value) { | |
var subscription = this._subscription; | |
// If the stream is closed, then return undefined | |
if (subscriptionClosed(subscription)) | |
return undefined; | |
var observer = subscription._observer; | |
subscription._observer = undefined; | |
try { | |
var m$1 = getMethod(observer, "complete"); | |
// If the sink does not support "complete", then return undefined | |
value = m$1 ? m$1.call(observer, value) : undefined; | |
} catch (e) { | |
try { cleanupSubscription(subscription) } | |
finally { throw e } | |
} | |
cleanupSubscription(subscription); | |
return value; | |
}, | |
}); | |
function Observable(subscriber) { | |
// The stream subscriber must be a function | |
if (typeof subscriber !== "function") | |
throw new TypeError("Observable initializer must be a function"); | |
this._subscriber = subscriber; | |
} | |
addMethods(Observable.prototype, { | |
subscribe: function(observer) { for (var args = [], __$0 = 1; __$0 < arguments.length; ++__$0) args.push(arguments[__$0]); | |
if (typeof observer === 'function') { | |
observer = { | |
next: observer, | |
error: args[0], | |
complete: args[1], | |
}; | |
} | |
return new Subscription(observer, this._subscriber); | |
}, | |
forEach: function(fn) { var __this = this; | |
return new Promise(function(resolve, reject) { | |
if (typeof fn !== "function") | |
return Promise.reject(new TypeError(fn + " is not a function")); | |
__this.subscribe({ | |
_subscription: null, | |
start: function(subscription) { | |
if (Object(subscription) !== subscription) | |
throw new TypeError(subscription + " is not an object"); | |
this._subscription = subscription; | |
}, | |
next: function(value) { | |
var subscription = this._subscription; | |
if (subscription.closed) | |
return; | |
try { | |
return fn(value); | |
} catch (err) { | |
reject(err); | |
subscription.unsubscribe(); | |
} | |
}, | |
error: reject, | |
complete: resolve, | |
}); | |
}); | |
}, | |
map: function(fn) { var __this = this; | |
if (typeof fn !== "function") | |
throw new TypeError(fn + " is not a function"); | |
var C = getSpecies(this); | |
return new C(function(observer) { return __this.subscribe({ | |
next: function(value) { | |
if (observer.closed) | |
return; | |
try { value = fn(value) } | |
catch (e) { return observer.error(e) } | |
return observer.next(value); | |
}, | |
error: function(e) { return observer.error(e) }, | |
complete: function(x) { return observer.complete(x) }, | |
}); }); | |
}, | |
filter: function(fn) { var __this = this; | |
if (typeof fn !== "function") | |
throw new TypeError(fn + " is not a function"); | |
var C = getSpecies(this); | |
return new C(function(observer) { return __this.subscribe({ | |
next: function(value) { | |
if (observer.closed) | |
return; | |
try { if (!fn(value)) return undefined } | |
catch (e) { return observer.error(e) } | |
return observer.next(value); | |
}, | |
error: function(e) { return observer.error(e) }, | |
complete: function() { return observer.complete() }, | |
}); }); | |
}, | |
reduce: function(fn) { var __this = this; | |
if (typeof fn !== "function") | |
throw new TypeError(fn + " is not a function"); | |
var C = getSpecies(this); | |
var hasSeed = arguments.length > 1; | |
var hasValue = false; | |
var seed = arguments[1]; | |
var acc = seed; | |
return new C(function(observer) { return __this.subscribe({ | |
next: function(value) { | |
if (observer.closed) | |
return; | |
var first = !hasValue; | |
hasValue = true; | |
if (!first || hasSeed) { | |
try { acc = fn(acc, value) } | |
catch (e) { return observer.error(e) } | |
} else { | |
acc = value; | |
} | |
}, | |
error: function(e) { observer.error(e) }, | |
complete: function() { | |
if (!hasValue && !hasSeed) { | |
observer.error(new TypeError("Cannot reduce an empty sequence")); | |
return; | |
} | |
observer.next(acc); | |
observer.complete(); | |
}, | |
}); }); | |
}, | |
flatMap: function(fn) { var __this = this; | |
if (typeof fn !== "function") | |
throw new TypeError(fn + " is not a function"); | |
var C = getSpecies(this); | |
return new C(function(observer) { | |
var completed = false; | |
var subscriptions = []; | |
// Subscribe to the outer Observable | |
var outer = __this.subscribe({ | |
next: function(value) { | |
if (fn) { | |
try { | |
value = fn(value); | |
} catch (x) { | |
observer.error(x); | |
return; | |
} | |
} | |
// Subscribe to the inner Observable | |
Observable.from(value).subscribe({ | |
_subscription: null, | |
start: function(s) { subscriptions.push(this._subscription = s) }, | |
next: function(value) { observer.next(value) }, | |
error: function(e) { observer.error(e) }, | |
complete: function() { | |
var i = subscriptions.indexOf(this._subscription); | |
if (i >= 0) | |
subscriptions.splice(i, 1); | |
closeIfDone(); | |
} | |
}); | |
}, | |
error: function(e) { | |
return observer.error(e); | |
}, | |
complete: function() { | |
completed = true; | |
closeIfDone(); | |
} | |
}); | |
function closeIfDone() { | |
if (completed && subscriptions.length === 0) | |
observer.complete(); | |
} | |
return function() { | |
subscriptions.forEach(function(s) { return s.unsubscribe(); }); | |
outer.unsubscribe(); | |
}; | |
}); | |
}, | |
}); | |
Object.defineProperty(Observable.prototype, getSymbol("observable"), { | |
value: function() { return this }, | |
writable: true, | |
configurable: true, | |
}); | |
addMethods(Observable, { | |
from: function(x) { | |
var C = typeof this === "function" ? this : Observable; | |
if (x == null) | |
throw new TypeError(x + " is not an object"); | |
var method = getMethod(x, getSymbol("observable")); | |
if (method) { | |
var observable$0 = method.call(x); | |
if (Object(observable$0) !== observable$0) | |
throw new TypeError(observable$0 + " is not an object"); | |
if (observable$0.constructor === C) | |
return observable$0; | |
return new C(function(observer) { return observable$0.subscribe(observer); }); | |
} | |
if (hasSymbol("iterator") && (method = getMethod(x, getSymbol("iterator")))) { | |
return new C(function(observer) { | |
for (var __$0 = (method.call(x))[Symbol.iterator](), __$1; __$1 = __$0.next(), !__$1.done;) { var item$0 = __$1.value; | |
observer.next(item$0); | |
if (observer.closed) | |
return; | |
} | |
observer.complete(); | |
}); | |
} | |
if (Array.isArray(x)) { | |
return new C(function(observer) { | |
for (var i$0 = 0; i$0 < x.length; ++i$0) { | |
observer.next(x[i$0]); | |
if (observer.closed) | |
return; | |
} | |
observer.complete(); | |
}); | |
} | |
throw new TypeError(x + " is not observable"); | |
}, | |
of: function() { for (var items = [], __$0 = 0; __$0 < arguments.length; ++__$0) items.push(arguments[__$0]); | |
var C = typeof this === "function" ? this : Observable; | |
return new C(function(observer) { | |
for (var i$1 = 0; i$1 < items.length; ++i$1) { | |
observer.next(items[i$1]); | |
if (observer.closed) | |
return; | |
} | |
observer.complete(); | |
}); | |
}, | |
}); | |
Object.defineProperty(Observable, getSymbol("species"), { | |
get: function() { return this }, | |
configurable: true, | |
}); | |
exports.Observable = Observable; | |
}, "*"); | |
},{}],"zen-observable":[function(require,module,exports){ | |
module.exports = require("./zen-observable.js").Observable; | |
},{"./zen-observable.js":1}]},{},[]) | |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInplbi1vYnNlcnZhYmxlLmpzIiwiemVuLW9ic2VydmFibGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamZBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnOyAoZnVuY3Rpb24oZm4sIG5hbWUpIHsgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykgZm4oZXhwb3J0cywgbW9kdWxlKTsgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSBmbihuYW1lID09PSAnKicgPyBzZWxmIDogKG5hbWUgPyBzZWxmW25hbWVdID0ge30gOiB7fSkpOyB9KShmdW5jdGlvbihleHBvcnRzLCBtb2R1bGUpIHsgLy8gPT09IFN5bWJvbCBTdXBwb3J0ID09PVxuXG5mdW5jdGlvbiBoYXNTeW1ib2wobmFtZSkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIEJvb2xlYW4oU3ltYm9sW25hbWVdKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3ltYm9sKG5hbWUpIHtcbiAgcmV0dXJuIGhhc1N5bWJvbChuYW1lKSA/IFN5bWJvbFtuYW1lXSA6IFwiQEBcIiArIG5hbWU7XG59XG5cbi8vIFBvbnlmaWxsIFN5bWJvbC5vYnNlcnZhYmxlIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmICFTeW1ib2wub2JzZXJ2YWJsZSkge1xuICBTeW1ib2wub2JzZXJ2YWJsZSA9IFN5bWJvbChcIm9ic2VydmFibGVcIik7XG59XG5cbi8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG5mdW5jdGlvbiBnZXRNZXRob2Qob2JqLCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gb2JqW2tleV07XG5cbiAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgdmFyIGN0b3IgPSBvYmouY29uc3RydWN0b3I7XG4gIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjdG9yID0gY3RvcltnZXRTeW1ib2woXCJzcGVjaWVzXCIpXTtcbiAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgY3RvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGN0b3IgIT09IHVuZGVmaW5lZCA/IGN0b3IgOiBPYnNlcnZhYmxlO1xufVxuXG5mdW5jdGlvbiBhZGRNZXRob2RzKHRhcmdldCwgbWV0aG9kcykge1xuICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobWV0aG9kcywgayk7XG4gICAgZGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgaywgZGVzYyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICAvLyBBc3NlcnQ6ICBvYnNlcnZlci5fb2JzZXJ2ZXIgaXMgdW5kZWZpbmVkXG5cbiAgdmFyIGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2NsZWFudXA7XG5cbiAgaWYgKCFjbGVhbnVwKVxuICAgIHJldHVybjtcblxuICAvLyBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNsZWFudXAgZnVuY3Rpb24gc28gdGhhdCB3ZSB3b24ndCBjYWxsIGl0XG4gIC8vIG1vcmUgdGhhbiBvbmNlXG4gIHN1YnNjcmlwdGlvbi5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblxuICAvLyBDYWxsIHRoZSBjbGVhbnVwIGZ1bmN0aW9uXG4gIGNsZWFudXAoKTtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vYnNlcnZlciA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKVxuICAgIHJldHVybjtcblxuICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBGcm9tU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpIH07XG59XG5cbmZ1bmN0aW9uIFN1YnNjcmlwdGlvbihvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICAvLyBBc3NlcnQ6IHN1YnNjcmliZXIgaXMgY2FsbGFibGVcblxuICAvLyBUaGUgb2JzZXJ2ZXIgbXVzdCBiZSBhbiBvYmplY3RcbiAgaWYgKE9iamVjdChvYnNlcnZlcikgIT09IG9ic2VydmVyKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYnNlcnZlciBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblxuICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICB0aGlzLl9vYnNlcnZlciA9IG9ic2VydmVyO1xuXG4gIHZhciBzdGFydCA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJzdGFydFwiKTtcblxuICBpZiAoc3RhcnQpXG4gICAgc3RhcnQuY2FsbChvYnNlcnZlciwgdGhpcyk7XG5cbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzKSlcbiAgICByZXR1cm47XG5cbiAgb2JzZXJ2ZXIgPSBuZXcgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIodGhpcyk7XG5cbiAgdHJ5IHtcbiAgICAvLyBDYWxsIHRoZSBzdWJzY3JpYmVyIGZ1bmN0aW9uXG4gICAgdmFyIGNsZWFudXAkMCA9IHN1YnNjcmliZXIuY2FsbCh1bmRlZmluZWQsIG9ic2VydmVyKTtcblxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSB1bmRlZmluZWQsIG51bGwsIGEgc3Vic2NyaXB0aW9uIG9iamVjdCwgb3IgYSBmdW5jdGlvblxuICAgIGlmIChjbGVhbnVwJDAgIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwJDAudW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY2xlYW51cCQwID0gY2xlYW51cEZyb21TdWJzY3JpcHRpb24oY2xlYW51cCQwKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBjbGVhbnVwJDAgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjbGVhbnVwJDAgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgICAgdGhpcy5fY2xlYW51cCA9IGNsZWFudXAkMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHN0YXJ0dXAsIHRoZW4gYXR0ZW1wdCB0byBzZW5kIHRoZSBlcnJvclxuICAgIC8vIHRvIHRoZSBvYnNlcnZlclxuICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBmaW5pc2hlZCwgdGhlbiBwZXJmb3JtIGNsZWFudXBcbiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzKSlcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xufVxuXG5hZGRNZXRob2RzKFN1YnNjcmlwdGlvbi5wcm90b3R5cGUgPSB7fSwge1xuICBnZXQgY2xvc2VkKCkgeyByZXR1cm4gc3Vic2NyaXB0aW9uQ2xvc2VkKHRoaXMpIH0sXG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbigpIHsgY2xvc2VTdWJzY3JpcHRpb24odGhpcykgfSxcbn0pO1xuXG5mdW5jdGlvbiBTdWJzY3JpcHRpb25PYnNlcnZlcihzdWJzY3JpcHRpb24pIHtcbiAgdGhpcy5fc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xufVxuXG5hZGRNZXRob2RzKFN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHt9LCB7XG5cbiAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzLl9zdWJzY3JpcHRpb24pIH0sXG5cbiAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSlcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLCBcIm5leHRcIik7XG5cbiAgICAvLyBJZiB0aGUgb2JzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IFwibmV4dFwiLCB0aGVuIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIW0pXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gU2VuZCB0aGUgbmV4dCB2YWx1ZSB0byB0aGUgc2lua1xuICAgIHJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRocm93IHRoZSBlcnJvciB0byB0aGUgY2FsbGVyXG4gICAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKVxuICAgICAgdGhyb3cgdmFsdWU7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG0kMCA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJlcnJvclwiKTtcblxuICAgICAgLy8gSWYgdGhlIHNpbmsgZG9lcyBub3Qgc3VwcG9ydCBcImVycm9yXCIsIHRoZW4gdGhyb3cgdGhlIGVycm9yIHRvIHRoZSBjYWxsZXJcbiAgICAgIGlmICghbSQwKVxuICAgICAgICB0aHJvdyB2YWx1ZTtcblxuICAgICAgdmFsdWUgPSBtJDAuY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB9XG4gICAgICBmaW5hbGx5IHsgdGhyb3cgZSB9XG4gICAgfVxuXG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBjb21wbGV0ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSlcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuICAgIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG0kMSA9IGdldE1ldGhvZChvYnNlcnZlciwgXCJjb21wbGV0ZVwiKTtcblxuICAgICAgLy8gSWYgdGhlIHNpbmsgZG9lcyBub3Qgc3VwcG9ydCBcImNvbXBsZXRlXCIsIHRoZW4gcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgdmFsdWUgPSBtJDEgPyBtJDEuY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB9XG4gICAgICBmaW5hbGx5IHsgdGhyb3cgZSB9XG4gICAgfVxuXG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxufSk7XG5cbmZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICAvLyBUaGUgc3RyZWFtIHN1YnNjcmliZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXG4gIGlmICh0eXBlb2Ygc3Vic2NyaWJlciAhPT0gXCJmdW5jdGlvblwiKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYnNlcnZhYmxlIGluaXRpYWxpemVyIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbn1cblxuYWRkTWV0aG9kcyhPYnNlcnZhYmxlLnByb3RvdHlwZSwge1xuXG4gIHN1YnNjcmliZTogZnVuY3Rpb24ob2JzZXJ2ZXIpIHsgZm9yICh2YXIgYXJncyA9IFtdLCBfXyQwID0gMTsgX18kMCA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrX18kMCkgYXJncy5wdXNoKGFyZ3VtZW50c1tfXyQwXSk7IFxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBvYnNlcnZlcixcbiAgICAgICAgZXJyb3I6IGFyZ3NbMF0sXG4gICAgICAgIGNvbXBsZXRlOiBhcmdzWzFdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gIH0sXG5cbiAgZm9yRWFjaDogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKSk7XG5cbiAgICAgIF9fdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBfc3Vic2NyaXB0aW9uOiBudWxsLFxuXG4gICAgICAgIHN0YXJ0OiBmdW5jdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBpZiAoT2JqZWN0KHN1YnNjcmlwdGlvbikgIT09IHN1YnNjcmlwdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3Vic2NyaXB0aW9uICsgXCIgaXMgbm90IGFuIG9iamVjdFwiKTtcblxuICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgfSxcblxuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJzY3JpcHRpb247XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLmNsb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICBtYXA6IGZ1bmN0aW9uKGZuKSB7IHZhciBfX3RoaXMgPSB0aGlzOyBcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG5cbiAgICB2YXIgQyA9IGdldFNwZWNpZXModGhpcyk7XG5cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHsgcmV0dXJuIF9fdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdHJ5IHsgdmFsdWUgPSBmbih2YWx1ZSkgfVxuICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSkgfVxuXG4gICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9LFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlKHgpIH0sXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIGZpbHRlcjogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgIHZhciBDID0gZ2V0U3BlY2llcyh0aGlzKTtcblxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikgeyByZXR1cm4gX190aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0cnkgeyBpZiAoIWZuKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZCB9XG4gICAgICAgIGNhdGNoIChlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3I6IGZ1bmN0aW9uKGUpIHsgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpIH0sXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7IHJldHVybiBvYnNlcnZlci5jb21wbGV0ZSgpIH0sXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIHJlZHVjZTogZnVuY3Rpb24oZm4pIHsgdmFyIF9fdGhpcyA9IHRoaXM7IFxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblxuICAgIHZhciBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICB2YXIgaGFzU2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxO1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHZhciBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBhY2MgPSBzZWVkO1xuXG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uKG9ic2VydmVyKSB7IHJldHVybiBfX3RoaXMuc3Vic2NyaWJlKHtcblxuICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdmFyIGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmaXJzdCB8fCBoYXNTZWVkKSB7XG4gICAgICAgICAgdHJ5IHsgYWNjID0gZm4oYWNjLCB2YWx1ZSkgfVxuICAgICAgICAgIGNhdGNoIChlKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlKSB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IG9ic2VydmVyLmVycm9yKGUpIH0sXG5cbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSAmJiAhaGFzU2VlZCkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVkdWNlIGFuIGVtcHR5IHNlcXVlbmNlXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LFxuXG4gICAgfSk7IH0pO1xuICB9LFxuXG4gIGZsYXRNYXA6IGZ1bmN0aW9uKGZuKSB7IHZhciBfX3RoaXMgPSB0aGlzOyBcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG5cbiAgICB2YXIgQyA9IGdldFNwZWNpZXModGhpcyk7XG5cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgb3V0ZXIgT2JzZXJ2YWJsZVxuICAgICAgdmFyIG91dGVyID0gX190aGlzLnN1YnNjcmliZSh7XG5cbiAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih4KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgaW5uZXIgT2JzZXJ2YWJsZVxuICAgICAgICAgIE9ic2VydmFibGUuZnJvbSh2YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIF9zdWJzY3JpcHRpb246IG51bGwsXG5cbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbihzKSB7IHN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLl9zdWJzY3JpcHRpb24gPSBzKSB9LFxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUpIHsgb2JzZXJ2ZXIubmV4dCh2YWx1ZSkgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihlKSB7IG9ic2VydmVyLmVycm9yKGUpIH0sXG5cbiAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YodGhpcy5fc3Vic2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuXG4gICAgICAgICAgICAgIGNsb3NlSWZEb25lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgY2xvc2VJZkRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsb3NlSWZEb25lKCkge1xuICAgICAgICBpZiAoY29tcGxldGVkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMudW5zdWJzY3JpYmUoKTsgfSk7XG4gICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9LFxuXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUucHJvdG90eXBlLCBnZXRTeW1ib2woXCJvYnNlcnZhYmxlXCIpLCB7XG4gIHZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbn0pO1xuXG5hZGRNZXRob2RzKE9ic2VydmFibGUsIHtcblxuICBmcm9tOiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PT0gXCJmdW5jdGlvblwiID8gdGhpcyA6IE9ic2VydmFibGU7XG5cbiAgICBpZiAoeCA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgXCIgaXMgbm90IGFuIG9iamVjdFwiKTtcblxuICAgIHZhciBtZXRob2QgPSBnZXRNZXRob2QoeCwgZ2V0U3ltYm9sKFwib2JzZXJ2YWJsZVwiKSk7XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB2YXIgb2JzZXJ2YWJsZSQwID0gbWV0aG9kLmNhbGwoeCk7XG5cbiAgICAgIGlmIChPYmplY3Qob2JzZXJ2YWJsZSQwKSAhPT0gb2JzZXJ2YWJsZSQwKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG9ic2VydmFibGUkMCArIFwiIGlzIG5vdCBhbiBvYmplY3RcIik7XG5cbiAgICAgIGlmIChvYnNlcnZhYmxlJDAuY29uc3RydWN0b3IgPT09IEMpXG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlJDA7XG5cbiAgICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikgeyByZXR1cm4gb2JzZXJ2YWJsZSQwLnN1YnNjcmliZShvYnNlcnZlcik7IH0pO1xuICAgIH1cblxuICAgIGlmIChoYXNTeW1ib2woXCJpdGVyYXRvclwiKSAmJiAobWV0aG9kID0gZ2V0TWV0aG9kKHgsIGdldFN5bWJvbChcIml0ZXJhdG9yXCIpKSkpIHtcbiAgICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikge1xuICAgICAgICBmb3IgKHZhciBfXyQwID0gKG1ldGhvZC5jYWxsKHgpKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9fJDE7IF9fJDEgPSBfXyQwLm5leHQoKSwgIV9fJDEuZG9uZTspIHsgdmFyIGl0ZW0kMCA9IF9fJDEudmFsdWU7IFxuICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbSQwKTtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgICAgZm9yICh2YXIgaSQwID0gMDsgaSQwIDwgeC5sZW5ndGg7ICsraSQwKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2kkMF0pO1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgXCIgaXMgbm90IG9ic2VydmFibGVcIik7XG4gIH0sXG5cbiAgb2Y6IGZ1bmN0aW9uKCkgeyBmb3IgKHZhciBpdGVtcyA9IFtdLCBfXyQwID0gMDsgX18kMCA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrX18kMCkgaXRlbXMucHVzaChhcmd1bWVudHNbX18kMF0pOyBcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzIDogT2JzZXJ2YWJsZTtcblxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcikge1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaXRlbXMubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2kkMV0pO1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfSxcblxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlLCBnZXRTeW1ib2woXCJzcGVjaWVzXCIpLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0sXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbn0pO1xuXG5leHBvcnRzLk9ic2VydmFibGUgPSBPYnNlcnZhYmxlO1xuXG5cbn0sIFwiKlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3plbi1vYnNlcnZhYmxlLmpzXCIpLk9ic2VydmFibGU7XG4iXX0= | |
const Observable = require("zen-observable"); | |
let sink; | |
const list = []; | |
const error = new Error(); | |
new Observable(_sink => { | |
sink = _sink; | |
return () => list.push('cleanup'); | |
}).subscribe({ | |
next: val => { | |
list.push('next:' + val); | |
throw error; | |
}, | |
error: err => { | |
list.push('error-handler:'); | |
list.push(err); | |
}, | |
complete: () => list.push('complete'), | |
}); | |
try { | |
sink.next(1); | |
} catch (e) { | |
list.push('try-catch:'); | |
list.push(e); | |
} | |
try { | |
sink.next(2); | |
} catch (e) { | |
list.push('try-catch:'); | |
list.push(e); | |
} | |
console.log(list); | |
;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"zen-observable": "0.5.2" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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
xstream: