UNPKG

19.9 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var index_1 = require("../index");
4var concat_1 = require("./concat");
5function interpolate(y, from, to) {
6 return (from * (1 - y) + to * y);
7}
8function flip(fn) {
9 return function (x) { return 1 - fn(1 - x); };
10}
11function createEasing(fn) {
12 var fnFlipped = flip(fn);
13 return {
14 easeIn: function (x, from, to) {
15 return interpolate(fn(x), from, to);
16 },
17 easeOut: function (x, from, to) {
18 return interpolate(fnFlipped(x), from, to);
19 },
20 easeInOut: function (x, from, to) {
21 var y = (x < 0.5) ?
22 (fn(2 * x) * 0.5) :
23 (0.5 + fnFlipped(2 * (x - 0.5)) * 0.5);
24 return interpolate(y, from, to);
25 }
26 };
27}
28var easingPower2 = createEasing(function (x) { return x * x; });
29var easingPower3 = createEasing(function (x) { return x * x * x; });
30var easingPower4 = createEasing(function (x) {
31 var xx = x * x;
32 return xx * xx;
33});
34var EXP_WEIGHT = 6;
35var EXP_MAX = Math.exp(EXP_WEIGHT) - 1;
36function expFn(x) {
37 return (Math.exp(x * EXP_WEIGHT) - 1) / EXP_MAX;
38}
39var easingExponential = createEasing(expFn);
40var OVERSHOOT = 1.70158;
41var easingBack = createEasing(function (x) { return x * x * ((OVERSHOOT + 1) * x - OVERSHOOT); });
42var PARAM1 = 7.5625;
43var PARAM2 = 2.75;
44function easeOutFn(x) {
45 var z = x;
46 if (z < 1 / PARAM2) {
47 return (PARAM1 * z * z);
48 }
49 else if (z < 2 / PARAM2) {
50 return (PARAM1 * (z -= 1.5 / PARAM2) * z + 0.75);
51 }
52 else if (z < 2.5 / PARAM2) {
53 return (PARAM1 * (z -= 2.25 / PARAM2) * z + 0.9375);
54 }
55 else {
56 return (PARAM1 * (z -= 2.625 / PARAM2) * z + 0.984375);
57 }
58}
59var easingBounce = createEasing(function (x) { return 1 - easeOutFn(1 - x); });
60var easingCirc = createEasing(function (x) { return -(Math.sqrt(1 - x * x) - 1); });
61var PERIOD = 0.3;
62var OVERSHOOT_ELASTIC = PERIOD / 4;
63var AMPLITUDE = 1;
64function elasticIn(x) {
65 var z = x;
66 if (z <= 0) {
67 return 0;
68 }
69 else if (z >= 1) {
70 return 1;
71 }
72 else {
73 z -= 1;
74 return -(AMPLITUDE * Math.pow(2, 10 * z))
75 * Math.sin((z - OVERSHOOT_ELASTIC) * (2 * Math.PI) / PERIOD);
76 }
77}
78var easingElastic = createEasing(elasticIn);
79var HALF_PI = Math.PI * 0.5;
80var easingSine = createEasing(function (x) { return 1 - Math.cos(x * HALF_PI); });
81var DEFAULT_INTERVAL = 15;
82/**
83 * Creates a stream of numbers emitted in a quick burst, following a numeric
84 * function like sine or elastic or quadratic. tween() is meant for creating
85 * streams for animations.
86 *
87 * Example:
88 *
89 * ```js
90 * import tween from 'xstream/extra/tween'
91 *
92 * const stream = tween({
93 * from: 20,
94 * to: 100,
95 * ease: tween.exponential.easeIn,
96 * duration: 1000, // milliseconds
97 * })
98 *
99 * stream.addListener({
100 * next: (x) => console.log(x),
101 * error: (err) => console.error(err),
102 * complete: () => console.log('concat completed'),
103 * })
104 * ```
105 *
106 * The stream would behave like the plot below:
107 *
108 * ```text
109 * 100 #
110 * |
111 * |
112 * |
113 * |
114 * 80 #
115 * |
116 * |
117 * |
118 * | #
119 * 60
120 * |
121 * | #
122 * |
123 * | #
124 * 40
125 * | #
126 * | #
127 * | ##
128 * | ###
129 * 20########
130 * +---------------------> time
131 * ```
132 *
133 * Provide a configuration object with **from**, **to**, **duration**, **ease**,
134 * **interval** (optional), and this factory function will return a stream of
135 * numbers following that pattern. The first number emitted will be `from`, and
136 * the last number will be `to`. The numbers in between follow the easing
137 * function you specify in `ease`, and the stream emission will last in total
138 * `duration` milliseconds.
139 *
140 * The easing functions are attached to `tween` too, such as
141 * `tween.linear.ease`, `tween.power2.easeIn`, `tween.exponential.easeOut`, etc.
142 * Here is a list of all the available easing options:
143 *
144 * - `tween.linear` with ease
145 * - `tween.power2` with easeIn, easeOut, easeInOut
146 * - `tween.power3` with easeIn, easeOut, easeInOut
147 * - `tween.power4` with easeIn, easeOut, easeInOut
148 * - `tween.exponential` with easeIn, easeOut, easeInOut
149 * - `tween.back` with easeIn, easeOut, easeInOut
150 * - `tween.bounce` with easeIn, easeOut, easeInOut
151 * - `tween.circular` with easeIn, easeOut, easeInOut
152 * - `tween.elastic` with easeIn, easeOut, easeInOut
153 * - `tween.sine` with easeIn, easeOut, easeInOut
154 *
155 * @factory true
156 * @param {TweenConfig} config An object with properties `from: number`,
157 * `to: number`, `duration: number`, `ease: function` (optional, defaults to
158 * linear), `interval: number` (optional, defaults to 15).
159 * @return {Stream}
160 */
161function tween(_a) {
162 var from = _a.from, to = _a.to, duration = _a.duration, _b = _a.ease, ease = _b === void 0 ? tweenFactory.linear.ease : _b, _c = _a.interval, interval = _c === void 0 ? DEFAULT_INTERVAL : _c;
163 var totalTicks = Math.round(duration / interval);
164 return index_1.Stream.periodic(interval)
165 .take(totalTicks)
166 .map(function (tick) { return ease(tick / totalTicks, from, to); })
167 .compose(function (s) { return concat_1.default(s, index_1.Stream.of(to)); });
168}
169var tweenFactory = tween;
170tweenFactory.linear = { ease: interpolate };
171tweenFactory.power2 = easingPower2;
172tweenFactory.power3 = easingPower3;
173tweenFactory.power4 = easingPower4;
174tweenFactory.exponential = easingExponential;
175tweenFactory.back = easingBack;
176tweenFactory.bounce = easingBounce;
177tweenFactory.circular = easingCirc;
178tweenFactory.elastic = easingElastic;
179tweenFactory.sine = easingSine;
180exports.default = tweenFactory;
181//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdlZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXh0cmEvdHdlZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBZ0M7QUFDaEMsbUNBQThCO0FBbUI5QixxQkFBcUIsQ0FBUyxFQUFFLElBQVksRUFBRSxFQUFVO0lBQ3RELE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxjQUFjLEVBQW1CO0lBQy9CLE9BQU8sVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBYixDQUFhLENBQUM7QUFDNUIsQ0FBQztBQUVELHNCQUFzQixFQUFtQjtJQUN2QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsT0FBTztRQUNMLE1BQU0sWUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDaEIsT0FBTyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxZQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNqQixPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxTQUFTLFlBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ25CLElBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFH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QUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDbkQsT0FBTyxjQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2hCLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBakMsQ0FBaUMsQ0FBQztTQUM5QyxPQUFPLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxnQkFBTSxDQUFTLENBQUMsRUFBRSxjQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQWhDLENBQWdDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsSUFBTSxZQUFZLEdBQWdDLEtBQUssQ0FBQztBQUV4RCxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQzVDLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO0FBQ25DLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO0FBQ25DLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO0FBQ25DLFlBQVksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDN0MsWUFBWSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7QUFDL0IsWUFBWSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7QUFDbkMsWUFBWSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDbkMsWUFBWSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7QUFDckMsWUFBWSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7QUFFL0Isa0JBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTdHJlYW19IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnO1xuXG5leHBvcnQgdHlwZSBFYXNlID0gKHg6IG51bWJlciwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiBudW1iZXI7XG5leHBvcnQgdHlwZSBFYXNpbmdzID0ge1xuICBlYXNlSW46IEVhc2U7XG4gIGVhc2VPdXQ6IEVhc2U7XG4gIGVhc2VJbk91dDogRWFzZTtcbn07XG5cbmV4cG9ydCB0eXBlIE51bWVyaWNGdW5jdGlvbiA9IChpbnB1dDogbnVtYmVyKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHdlZW5Db25maWcge1xuICBmcm9tOiBudW1iZXI7XG4gIHRvOiBudW1iZXI7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIGVhc2U/OiBFYXNlO1xuICBpbnRlcnZhbD86IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoeTogbnVtYmVyLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKGZyb20gKiAoMSAtIHkpICsgdG8gKiB5KTtcbn1cblxuZnVuY3Rpb24gZmxpcChmbjogTnVtZXJpY0Z1bmN0aW9uKTogTnVtZXJpY0Z1bmN0aW9uIHtcbiAgcmV0dXJuIHggPT4gMSAtIGZuKDEgLSB4KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWFzaW5nKGZuOiBOdW1lcmljRnVuY3Rpb24pOiBFYXNpbmdzIHtcbiAgbGV0IGZuRmxpcHBlZCA9IGZsaXAoZm4pO1xuICByZXR1cm4ge1xuICAgIGVhc2VJbih4LCBmcm9tLCB0bykge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGZuKHgpLCBmcm9tLCB0byk7XG4gICAgfSxcbiAgICBlYXNlT3V0KHgsIGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZm5GbGlwcGVkKHgpLCBmcm9tLCB0byk7XG4gICAgfSxcbiAgICBlYXNlSW5PdXQoeCwgZnJvbSwgdG8pIHtcbiAgICAgIGNvbnN0IHkgPSAoeCA8IDAuNSkgP1xuICAgICAgICAoZm4oMiAqIHgpICogMC41KSA6XG4gICAgICAgICgwLjUgKyBmbkZsaXBwZWQoMiAqICh4IC0gMC41KSkgKiAwLjUpO1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKHksIGZyb20sIHRvKTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBlYXNpbmdQb3dlcjIgPSBjcmVhdGVFYXNpbmcoeCA9PiB4ICogeCk7XG5sZXQgZWFzaW5nUG93ZXIzID0gY3JlYXRlRWFzaW5nKHggPT4geCAqIHggKiB4KTtcbmxldCBlYXNpbmdQb3dlcjQgPSBjcmVhdGVFYXNpbmcoeCA9PiB7XG4gIGNvbnN0IHh4ID0geCAqIHg7XG4gIHJldHVybiB4eCAqIHh4O1xufSk7XG5cbmNvbnN0IEVYUF9XRUlHSFQgPSA2O1xuY29uc3QgRVhQX01BWCA9IE1hdGguZXhwKEVYUF9XRUlHSFQpIC0gMTtcbmZ1bmN0aW9uIGV4cEZuKHg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoTWF0aC5leHAoeCAqIEVYUF9XRUlHSFQpIC0gMSkgLyBFWFBfTUFYO1xufVxubGV0IGVhc2luZ0V4cG9uZW50aWFsID0gY3JlYXRlRWFzaW5nKGV4cEZuKTtcblxuY29uc3QgT1ZFUlNIT09UID0gMS43MDE1ODtcbmxldCBlYXNpbmdCYWNrID0gY3JlYXRlRWFzaW5nKHggPT4geCAqIHggKiAoKE9WRVJTSE9PVCArIDEpICogeCAtIE9WRVJTSE9PVCkpO1xuXG5jb25zdCBQQVJBTTEgPSA3LjU2MjU7XG5jb25zdCBQQVJBTTIgPSAyLjc1O1xuZnVuY3Rpb24gZWFzZU91dEZuKHg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCB6ID0geDtcbiAgaWYgKHogPCAxIC8gUEFSQU0yKSB7XG4gICAgcmV0dXJuIChQQVJBTTEgKiB6ICogeik7XG4gIH0gZWxzZSBpZiAoeiA8IDIgLyBQQVJBTTIpIHtcbiAgICByZXR1cm4gKFBBUkFNMSAqICh6IC09IDEuNSAvIFBBUkFNMikgKiB6ICsgMC43NSk7XG4gIH0gZWxzZSBpZiAoeiA8IDIuNSAvIFBBUkFNMikge1xuICAgIHJldHVybiAoUEFSQU0xICogKHogLT0gMi4yNSAvIFBBUkFNMikgKiB6ICsgMC45Mzc1KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFBBUkFNMSAqICh6IC09IDIuNjI1IC8gUEFSQU0yKSAqIHogKyAwLjk4NDM3NSk7XG4gIH1cbn1cbmxldCBlYXNpbmdCb3VuY2UgPSBjcmVhdGVFYXNpbmcoeCA9PiAxIC0gZWFzZU91dEZuKDEgLSB4KSk7XG5cbmxldCBlYXNpbmdDaXJjID0gY3JlYXRlRWFzaW5nKHggPT4gLShNYXRoLnNxcnQoMSAtIHggKiB4KSAtIDEpKTtcblxuY29uc3QgUEVSSU9EID0gMC4zO1xuY29uc3QgT1ZFUlNIT09UX0VMQVNUSUMgPSBQRVJJT0QgLyA0O1xuY29uc3QgQU1QTElUVURFID0gMTtcbmZ1bmN0aW9uIGVsYXN0aWNJbih4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgeiA9IHg7XG4gIGlmICh6IDw9IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmICh6ID49IDEpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICB6IC09IDE7XG4gICAgcmV0dXJuIC0oQU1QTElUVURFICogTWF0aC5wb3coMiwgMTAgKiB6KSlcbiAgICAgICogTWF0aC5zaW4oKHogLSBPVkVSU0hPT1RfRUxBU1RJQykgKiAoMiAqIE1hdGguUEkpIC8gUEVSSU9EKTtcbiAgfVxufVxubGV0IGVhc2luZ0VsYXN0aWMgPSBjcmVhdGVFYXNpbmcoZWxhc3RpY0luKTtcblxuY29uc3QgSEFMRl9QSSA9IE1hdGguUEkgKiAwLjU7XG5sZXQgZWFzaW5nU2luZSA9IGNyZWF0ZUVhc2luZyh4ID0+IDEgLSBNYXRoLmNvcyh4ICogSEFMRl9QSSkpO1xuXG5jb25zdCBERUZBVUxUX0lOVEVSVkFMOiBudW1iZXIgPSAxNTtcblxuZXhwb3J0IGludGVyZmFjZSBUd2VlbkZhY3Rvcnkge1xuICAoY29uZmlnOiBUd2VlbkNvbmZpZyk6IFN0cmVhbTxudW1iZXI+O1xuICBsaW5lYXI6IHsgZWFzZTogRWFzZSB9O1xuICBwb3dlcjI6IEVhc2luZ3M7XG4gIHBvd2VyMzogRWFzaW5ncztcbiAgcG93ZXI0OiBFYXNpbmdzO1xuICBleHBvbmVudGlhbDogRWFzaW5ncztcbiAgYmFjazogRWFzaW5ncztcbiAgYm91bmNlOiBFYXNpbmdzO1xuICBjaXJjdWxhcjogRWFzaW5ncztcbiAgZWxhc3RpYzogRWFzaW5ncztcbiAgc2luZTogRWFzaW5ncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyZWFtIG9mIG51bWJlcnMgZW1pdHRlZCBpbiBhIHF1aWNrIGJ1cnN0LCBmb2xsb3dpbmcgYSBudW1lcmljXG4gKiBmdW5jdGlvbiBsaWtlIHNpbmUgb3IgZWxhc3RpYyBvciBxdWFkcmF0aWMuIHR3ZWVuKCkgaXMgbWVhbnQgZm9yIGNyZWF0aW5nXG4gKiBzdHJlYW1zIGZvciBhbmltYXRpb25zLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGltcG9ydCB0d2VlbiBmcm9tICd4c3RyZWFtL2V4dHJhL3R3ZWVuJ1xuICpcbiAqIGNvbnN0IHN0cmVhbSA9IHR3ZWVuKHtcbiAqICAgZnJvbTogMjAsXG4gKiAgIHRvOiAxMDAsXG4gKiAgIGVhc2U6IHR3ZWVuLmV4cG9uZW50aWFsLmVhc2VJbixcbiAqICAgZHVyYXRpb246IDEwMDAsIC8vIG1pbGxpc2Vjb25kc1xuICogfSlcbiAqXG4gKiBzdHJlYW0uYWRkTGlzdGVuZXIoe1xuICogICBuZXh0OiAoeCkgPT4gY29uc29sZS5sb2coeCksXG4gKiAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVyciksXG4gKiAgIGNvbXBsZXRlOiAoKSA9PiBjb25zb2xlLmxvZygnY29uY2F0IGNvbXBsZXRlZCcpLFxuICogfSlcbiAqIGBgYFxuICpcbiAqIFRoZSBzdHJlYW0gd291bGQgYmVoYXZlIGxpa2UgdGhlIHBsb3QgYmVsb3c6XG4gKlxuICogYGBgdGV4dFxuICogMTAwICAgICAgICAgICAgICAgICAgI1xuICogfFxuICogfFxuICogfFxuICogfFxuICogODAgICAgICAgICAgICAgICAgICAjXG4gKiB8XG4gKiB8XG4gKiB8XG4gKiB8ICAgICAgICAgICAgICAgICAgI1xuICogNjBcbiAqIHxcbiAqIHwgICAgICAgICAgICAgICAgICNcbiAqIHxcbiAqIHwgICAgICAgICAgICAgICAgI1xuICogNDBcbiAqIHwgICAgICAgICAgICAgICAjXG4gKiB8ICAgICAgICAgICAgICAjXG4gKiB8ICAgICAgICAgICAgIyNcbiAqIHwgICAgICAgICAjIyNcbiAqIDIwIyMjIyMjIyNcbiAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0+IHRpbWVcbiAqIGBgYFxuICpcbiAqIFByb3ZpZGUgYSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoICoqZnJvbSoqLCAqKnRvKiosICoqZHVyYXRpb24qKiwgKiplYXNlKiosXG4gKiAqKmludGVydmFsKiogKG9wdGlvbmFsKSwgYW5kIHRoaXMgZmFjdG9yeSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0cmVhbSBvZlxuICogbnVtYmVycyBmb2xsb3dpbmcgdGhhdCBwYXR0ZXJuLiBUaGUgZmlyc3QgbnVtYmVyIGVtaXR0ZWQgd2lsbCBiZSBgZnJvbWAsIGFuZFxuICogdGhlIGxhc3QgbnVtYmVyIHdpbGwgYmUgYHRvYC4gVGhlIG51bWJlcnMgaW4gYmV0d2VlbiBmb2xsb3cgdGhlIGVhc2luZ1xuICogZnVuY3Rpb24geW91IHNwZWNpZnkgaW4gYGVhc2VgLCBhbmQgdGhlIHN0cmVhbSBlbWlzc2lvbiB3aWxsIGxhc3QgaW4gdG90YWxcbiAqIGBkdXJhdGlvbmAgbWlsbGlzZWNvbmRzLlxuICpcbiAqIFRoZSBlYXNpbmcgZnVuY3Rpb25zIGFyZSBhdHRhY2hlZCB0byBgdHdlZW5gIHRvbywgc3VjaCBhc1xuICogYHR3ZWVuLmxpbmVhci5lYXNlYCwgYHR3ZWVuLnBvd2VyMi5lYXNlSW5gLCBgdHdlZW4uZXhwb25lbnRpYWwuZWFzZU91dGAsIGV0Yy5cbiAqIEhlcmUgaXMgYSBsaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIGVhc2luZyBvcHRpb25zOlxuICpcbiAqIC0gYHR3ZWVuLmxpbmVhcmAgd2l0aCBlYXNlXG4gKiAtIGB0d2Vlbi5wb3dlcjJgIHdpdGggZWFzZUluLCBlYXNlT3V0LCBlYXNlSW5PdXRcbiAqIC0gYHR3ZWVuLnBvd2VyM2Agd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4ucG93ZXI0YCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5leHBvbmVudGlhbGAgd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4uYmFja2Agd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4uYm91bmNlYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5jaXJjdWxhcmAgd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4uZWxhc3RpY2Agd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4uc2luZWAgd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICpcbiAqIEBmYWN0b3J5IHRydWVcbiAqIEBwYXJhbSB7VHdlZW5Db25maWd9IGNvbmZpZyBBbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBmcm9tOiBudW1iZXJgLFxuICogYHRvOiBudW1iZXJgLCBgZHVyYXRpb246IG51bWJlcmAsIGBlYXNlOiBmdW5jdGlvbmAgKG9wdGlvbmFsLCBkZWZhdWx0cyB0b1xuICogbGluZWFyKSwgYGludGVydmFsOiBudW1iZXJgIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gMTUpLlxuICogQHJldHVybiB7U3RyZWFtfVxuICovXG5mdW5jdGlvbiB0d2Vlbih7XG4gIGZyb20sXG4gIHRvLFxuICBkdXJhdGlvbixcbiAgZWFzZSA9IHR3ZWVuRmFjdG9yeS5saW5lYXIuZWFzZSxcbiAgaW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMXG59OiBUd2VlbkNvbmZpZyk6IFN0cmVhbTxudW1iZXI+IHtcbiAgY29uc3QgdG90YWxUaWNrcyA9IE1hdGgucm91bmQoZHVyYXRpb24gLyBpbnRlcnZhbCk7XG4gIHJldHVybiBTdHJlYW0ucGVyaW9kaWMoaW50ZXJ2YWwpXG4gICAgLnRha2UodG90YWxUaWNrcylcbiAgICAubWFwKHRpY2sgPT4gZWFzZSh0aWNrIC8gdG90YWxUaWNrcywgZnJvbSwgdG8pKVxuICAgIC5jb21wb3NlKHMgPT4gY29uY2F0PG51bWJlcj4ocywgU3RyZWFtLm9mKHRvKSkpO1xufVxuXG5jb25zdCB0d2VlbkZhY3Rvcnk6IFR3ZWVuRmFjdG9yeSA9IDxUd2VlbkZhY3Rvcnk+IHR3ZWVuO1xuXG50d2VlbkZhY3RvcnkubGluZWFyID0geyBlYXNlOiBpbnRlcnBvbGF0ZSB9O1xudHdlZW5GYWN0b3J5LnBvd2VyMiA9IGVhc2luZ1Bvd2VyMjtcbnR3ZWVuRmFjdG9yeS5wb3dlcjMgPSBlYXNpbmdQb3dlcjM7XG50d2VlbkZhY3RvcnkucG93ZXI0ID0gZWFzaW5nUG93ZXI0O1xudHdlZW5GYWN0b3J5LmV4cG9uZW50aWFsID0gZWFzaW5nRXhwb25lbnRpYWw7XG50d2VlbkZhY3RvcnkuYmFjayA9IGVhc2luZ0JhY2s7XG50d2VlbkZhY3RvcnkuYm91bmNlID0gZWFzaW5nQm91bmNlO1xudHdlZW5GYWN0b3J5LmNpcmN1bGFyID0gZWFzaW5nQ2lyYztcbnR3ZWVuRmFjdG9yeS5lbGFzdGljID0gZWFzaW5nRWxhc3RpYztcbnR3ZWVuRmFjdG9yeS5zaW5lID0gZWFzaW5nU2luZTtcblxuZXhwb3J0IGRlZmF1bHQgdHdlZW5GYWN0b3J5O1xuIl19
\No newline at end of file