react-background-animation
Version:
React effect components
446 lines (377 loc) • 53.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.sketchFactory = exports.getSketch = void 0;
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
/* Copyright (C) 2013 Justin Windle, http://soulwire.co.uk */
/* eslint-disable */
var getSketch = function getSketch(root, factory) {
if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object') {
// CommonJS like
module.exports = factory(root, root.document);
} else if (typeof define === 'function' && define.amd) {
// AMD
define(function () {
return factory(root, root.document);
});
} else {
// Browser global
root.Sketch = factory(root, root.document);
}
};
exports.getSketch = getSketch;
var sketchFactory = function sketchFactory(window, document) {
"use strict";
/*
----------------------------------------------------------------------
Config
----------------------------------------------------------------------
*/
var MATH_PROPS = 'E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min'.split(' ');
var HAS_SKETCH = '__hasSketch';
var M = Math;
var CANVAS = 'canvas';
var WEBGL = 'webgl';
var DOM = 'dom';
var doc = document;
var win = window;
var instances = [];
var defaults = {
fullscreen: true,
autostart: true,
autoclear: true,
autopause: true,
container: doc.body,
interval: 1,
globals: true,
retina: false,
type: CANVAS
};
var keyMap = {
8: 'BACKSPACE',
9: 'TAB',
13: 'ENTER',
16: 'SHIFT',
27: 'ESCAPE',
32: 'SPACE',
37: 'LEFT',
38: 'UP',
39: 'RIGHT',
40: 'DOWN'
};
/*
----------------------------------------------------------------------
Utilities
----------------------------------------------------------------------
*/
function isArray(object) {
return Object.prototype.toString.call(object) == '[object Array]';
}
function isFunction(object) {
return typeof object == 'function';
}
function isNumber(object) {
return typeof object == 'number';
}
function isString(object) {
return typeof object == 'string';
}
function keyName(code) {
return keyMap[code] || String.fromCharCode(code);
}
function extend(target, source, overwrite) {
for (var key in source) {
if (overwrite || !(key in target)) target[key] = source[key];
}
return target;
}
function proxy(method, context) {
return function () {
method.apply(context, arguments);
};
}
function clone(target) {
var object = {};
for (var key in target) {
if (key === 'webkitMovementX' || key === 'webkitMovementY') continue;
if (isFunction(target[key])) object[key] = proxy(target[key], target);else object[key] = target[key];
}
return object;
}
/*
----------------------------------------------------------------------
Constructor
----------------------------------------------------------------------
*/
function constructor(context) {
var request, handler, target, parent, bounds, index, suffix, clock, node, copy, type, key, val, min, max, w, h;
var counter = 0;
var touches = [];
var resized = false;
var setup = false;
var ratio = win.devicePixelRatio || 1;
var isDiv = context.type == DOM;
var is2D = context.type == CANVAS;
var mouse = {
x: 0.0,
y: 0.0,
ox: 0.0,
oy: 0.0,
dx: 0.0,
dy: 0.0
};
var eventMap = [context.eventTarget || context.element, pointer, 'mousedown', 'touchstart', pointer, 'mousemove', 'touchmove', pointer, 'mouseup', 'touchend', pointer, 'click', pointer, 'mouseout', pointer, 'mouseover', doc, keypress, 'keydown', 'keyup', win, active, 'focus', 'blur', resize, 'resize'];
var keys = {};
for (key in keyMap) {
keys[keyMap[key]] = false;
}
function trigger(method) {
if (isFunction(method)) method.apply(context, [].splice.call(arguments, 1));
}
function bind(on) {
for (index = 0; index < eventMap.length; index++) {
node = eventMap[index];
if (isString(node)) target[(on ? 'add' : 'remove') + 'EventListener'].call(target, node, handler, false);else if (isFunction(node)) handler = node;else target = node;
}
}
function update() {
cAF(request);
request = rAF(update);
if (!setup) {
trigger(context.setup);
setup = isFunction(context.setup);
}
if (!resized) {
trigger(context.resize);
resized = isFunction(context.resize);
}
if (context.running && !counter) {
context.dt = (clock = +new Date()) - context.now;
context.millis += context.dt;
context.now = clock;
trigger(context.update); // Pre draw
if (is2D) {
if (context.retina) {
context.save();
if (context.autoclear) {
context.scale(ratio, ratio);
}
}
if (context.autoclear) context.clear();
} // Draw
trigger(context.draw); // Post draw
if (is2D && context.retina) context.restore();
}
counter = ++counter % context.interval;
}
function resize() {
target = isDiv ? context.style : context.canvas;
suffix = isDiv ? 'px' : '';
w = context.width;
h = context.height;
if (context.fullscreen) {
h = context.height = win.innerHeight;
w = context.width = win.innerWidth;
}
if (context.retina && is2D && ratio) {
target.style.height = h + 'px';
target.style.width = w + 'px';
w *= ratio;
h *= ratio;
}
if (target.height !== h) target.height = h + suffix;
if (target.width !== w) target.width = w + suffix;
if (is2D && !context.autoclear && context.retina) context.scale(ratio, ratio);
if (setup) trigger(context.resize);
}
function align(touch, target) {
bounds = target.getBoundingClientRect();
touch.x = touch.pageX - bounds.left - (win.scrollX || win.pageXOffset);
touch.y = touch.pageY - bounds.top - (win.scrollY || win.pageYOffset);
return touch;
}
function augment(touch, target) {
align(touch, context.element);
target = target || {};
target.ox = target.x || touch.x;
target.oy = target.y || touch.y;
target.x = touch.x;
target.y = touch.y;
target.dx = target.x - target.ox;
target.dy = target.y - target.oy;
return target;
}
function process(event) {
event.preventDefault();
copy = clone(event);
copy.originalEvent = event;
if (copy.touches) {
touches.length = copy.touches.length;
for (index = 0; index < copy.touches.length; index++) {
touches[index] = augment(copy.touches[index], touches[index]);
}
} else {
touches.length = 0;
touches[0] = augment(copy, mouse);
}
extend(mouse, touches[0], true);
return copy;
}
function pointer(event) {
event = process(event);
min = (max = eventMap.indexOf(type = event.type)) - 1;
context.dragging = /down|start/.test(type) ? true : /up|end/.test(type) ? false : context.dragging;
while (min) {
isString(eventMap[min]) ? trigger(context[eventMap[min--]], event) : isString(eventMap[max]) ? trigger(context[eventMap[max++]], event) : min = 0;
}
}
function keypress(event) {
key = event.keyCode;
val = event.type == 'keyup';
keys[key] = keys[keyName(key)] = !val;
trigger(context[event.type], event);
}
function active(event) {
if (context.autopause) (event.type == 'blur' ? stop : start)();
trigger(context[event.type], event);
} // Public API
function start() {
context.now = +new Date();
context.running = true;
}
function stop() {
context.running = false;
}
function toggle() {
(context.running ? stop : start)();
}
function clear() {
if (is2D) context.clearRect(0, 0, context.width * ratio, context.height * ratio);
}
function destroy() {
parent = context.element.parentNode;
index = instances.indexOf(context);
if (parent) parent.removeChild(context.element);
if (~index) instances.splice(index, 1);
bind(false);
stop();
}
extend(context, {
touches: touches,
mouse: mouse,
keys: keys,
dragging: false,
running: false,
millis: 0,
now: NaN,
dt: NaN,
destroy: destroy,
toggle: toggle,
clear: clear,
start: start,
stop: stop
});
instances.push(context);
return context.autostart && start(), bind(true), resize(), update(), context;
}
/*
----------------------------------------------------------------------
Global API
----------------------------------------------------------------------
*/
var element,
context,
Sketch = {
CANVAS: CANVAS,
WEB_GL: WEBGL,
WEBGL: WEBGL,
DOM: DOM,
instances: instances,
install: function install(context) {
if (!context[HAS_SKETCH]) {
for (var i = 0; i < MATH_PROPS.length; i++) {
context[MATH_PROPS[i]] = M[MATH_PROPS[i]];
}
extend(context, {
TWO_PI: M.PI * 2,
HALF_PI: M.PI / 2,
QUARTER_PI: M.PI / 4,
random: function random(min, max) {
if (isArray(min)) return min[~~(M.random() * min.length)];
if (!isNumber(max)) max = min || 1, min = 0;
return min + M.random() * (max - min);
},
lerp: function lerp(min, max, amount) {
return min + amount * (max - min);
},
map: function map(num, minA, maxA, minB, maxB) {
return (num - minA) / (maxA - minA) * (maxB - minB) + minB;
}
});
context[HAS_SKETCH] = true;
}
},
create: function create(options) {
options = extend(options || {}, defaults);
if (options.globals) Sketch.install(self);
element = options.element = options.element || doc.createElement(options.type === DOM ? 'div' : 'canvas');
context = options.context = options.context || function () {
switch (options.type) {
case CANVAS:
return element.getContext('2d', options);
case WEBGL:
return element.getContext('webgl', options) || element.getContext('experimental-webgl', options);
case DOM:
return element.canvas = element;
}
}();
(options.container || doc.body).appendChild(element);
return Sketch.augment(context, options);
},
augment: function augment(context, options) {
options = extend(options || {}, defaults);
options.element = context.canvas || context;
options.element.className += ' sketch';
extend(context, options, true);
return constructor(context);
}
};
/*
----------------------------------------------------------------------
Shims
----------------------------------------------------------------------
*/
var vendors = ['ms', 'moz', 'webkit', 'o'];
var scope = self;
var then = 0;
var a = 'AnimationFrame';
var b = 'request' + a;
var c = 'cancel' + a;
var rAF = scope[b];
var cAF = scope[c];
for (var i = 0; i < vendors.length && !rAF; i++) {
rAF = scope[vendors[i] + 'Request' + a];
cAF = scope[vendors[i] + 'Cancel' + a];
}
scope[b] = rAF = rAF || function (callback) {
var now = +new Date();
var dt = M.max(0, 16 - (now - then));
var id = setTimeout(function () {
callback(now + dt);
}, dt);
then = now + dt;
return id;
};
scope[c] = cAF = cAF || function (id) {
clearTimeout(id);
};
/*
----------------------------------------------------------------------
Output
----------------------------------------------------------------------
*/
return Sketch;
};
exports.sketchFactory = sketchFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jc3NFZmZlY3RzL2Nyb3NzQnVpbGRpbmcvc2tldGNoLmpzIl0sIm5hbWVzIjpbImdldFNrZXRjaCIsInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRvY3VtZW50IiwiZGVmaW5lIiwiYW1kIiwiU2tldGNoIiwic2tldGNoRmFjdG9yeSIsIndpbmRvdyIsIk1BVEhfUFJPUFMiLCJzcGxpdCIsIkhBU19TS0VUQ0giLCJNIiwiTWF0aCIsIkNBTlZBUyIsIldFQkdMIiwiRE9NIiwiZG9jIiwid2luIiwiaW5zdGFuY2VzIiwiZGVmYXVsdHMiLCJmdWxsc2NyZWVuIiwiYXV0b3N0YXJ0IiwiYXV0b2NsZWFyIiwiYXV0b3BhdXNlIiwiY29udGFpbmVyIiwiYm9keSIsImludGVydmFsIiwiZ2xvYmFscyIsInJldGluYSIsInR5cGUiLCJrZXlNYXAiLCJpc0FycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiaXNGdW5jdGlvbiIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJrZXlOYW1lIiwiY29kZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImV4dGVuZCIsInRhcmdldCIsInNvdXJjZSIsIm92ZXJ3cml0ZSIsImtleSIsInByb3h5IiwibWV0aG9kIiwiY29udGV4dCIsImFwcGx5IiwiYXJndW1lbnRzIiwiY2xvbmUiLCJjb25zdHJ1Y3RvciIsInJlcXVlc3QiLCJoYW5kbGVyIiwicGFyZW50IiwiYm91bmRzIiwiaW5kZXgiLCJzdWZmaXgiLCJjbG9jayIsIm5vZGUiLCJjb3B5IiwidmFsIiwibWluIiwibWF4IiwidyIsImgiLCJjb3VudGVyIiwidG91Y2hlcyIsInJlc2l6ZWQiLCJzZXR1cCIsInJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImlzRGl2IiwiaXMyRCIsIm1vdXNlIiwieCIsInkiLCJveCIsIm95IiwiZHgiLCJkeSIsImV2ZW50TWFwIiwiZXZlbnRUYXJnZXQiLCJlbGVtZW50IiwicG9pbnRlciIsImtleXByZXNzIiwiYWN0aXZlIiwicmVzaXplIiwia2V5cyIsInRyaWdnZXIiLCJzcGxpY2UiLCJiaW5kIiwib24iLCJsZW5ndGgiLCJ1cGRhdGUiLCJjQUYiLCJyQUYiLCJydW5uaW5nIiwiZHQiLCJEYXRlIiwibm93IiwibWlsbGlzIiwic2F2ZSIsInNjYWxlIiwiY2xlYXIiLCJkcmF3IiwicmVzdG9yZSIsInN0eWxlIiwiY2FudmFzIiwid2lkdGgiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJhbGlnbiIsInRvdWNoIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGFnZVgiLCJsZWZ0Iiwic2Nyb2xsWCIsInBhZ2VYT2Zmc2V0IiwicGFnZVkiLCJ0b3AiLCJzY3JvbGxZIiwicGFnZVlPZmZzZXQiLCJhdWdtZW50IiwicHJvY2VzcyIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiaW5kZXhPZiIsImRyYWdnaW5nIiwidGVzdCIsImtleUNvZGUiLCJzdG9wIiwic3RhcnQiLCJ0b2dnbGUiLCJjbGVhclJlY3QiLCJkZXN0cm95IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiTmFOIiwicHVzaCIsIldFQl9HTCIsImluc3RhbGwiLCJpIiwiVFdPX1BJIiwiUEkiLCJIQUxGX1BJIiwiUVVBUlRFUl9QSSIsInJhbmRvbSIsImxlcnAiLCJhbW91bnQiLCJtYXAiLCJudW0iLCJtaW5BIiwibWF4QSIsIm1pbkIiLCJtYXhCIiwiY3JlYXRlIiwib3B0aW9ucyIsInNlbGYiLCJjcmVhdGVFbGVtZW50IiwiZ2V0Q29udGV4dCIsImFwcGVuZENoaWxkIiwiY2xhc3NOYW1lIiwidmVuZG9ycyIsInNjb3BlIiwidGhlbiIsImEiLCJiIiwiYyIsImNhbGxiYWNrIiwiaWQiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTtBQUNPLElBQU1BLFNBQVMsR0FBRyxT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QUVoQkEsRUFGZ0IsQ0FBbkI7QUFJQXFFLElBQUFBLElBQUksR0FBR25FLEdBQUcsR0FBR0YsRUFBYjtBQUNBLFdBQU8wRSxFQUFQO0FBQ0QsR0FWRDs7QUFZQU4sRUFBQUEsS0FBSyxDQUFFSSxDQUFGLENBQUwsR0FBYTNFLEdBQUcsR0FBR0EsR0FBRyxJQUFJLFVBQVU2RSxFQUFWLEVBQWU7QUFDdkNFLElBQUFBLFlBQVksQ0FBRUYsRUFBRixDQUFaO0FBQ0QsR0FGRDtBQUlBOzs7Ozs7O0FBT0EsU0FBTzNLLE1BQVA7QUFFRCxDQWhtQk0iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyogQ29weXJpZ2h0IChDKSAyMDEzIEp1c3RpbiBXaW5kbGUsIGh0dHA6Ly9zb3Vsd2lyZS5jby51ayAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5leHBvcnQgY29uc3QgZ2V0U2tldGNoID0gKCByb290LCBmYWN0b3J5ICkgPT4ge1xyXG5cclxuICBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyApIHtcclxuXHJcbiAgICAvLyBDb21tb25KUyBsaWtlXHJcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnkocm9vdCwgcm9vdC5kb2N1bWVudCk7XHJcblxyXG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcclxuXHJcbiAgICAvLyBBTURcclxuICAgIGRlZmluZSggZnVuY3Rpb24oKSB7IHJldHVybiBmYWN0b3J5KCByb290LCByb290LmRvY3VtZW50ICk7IH0pO1xyXG5cclxuICB9IGVsc2Uge1xyXG5cclxuICAgIC8vIEJyb3dzZXIgZ2xvYmFsXHJcbiAgICByb290LlNrZXRjaCA9IGZhY3RvcnkoIHJvb3QsIHJvb3QuZG9jdW1lbnQgKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2tldGNoRmFjdG9yeSA9IGZ1bmN0aW9uICggd2luZG93LCBkb2N1bWVudCApIHtcclxuXHJcblxyXG4gIFwidXNlIHN0cmljdFwiO1xyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBDb25maWdcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIHZhciBNQVRIX1BST1BTID0gJ0UgTE4xMCBMTjIgTE9HMkUgTE9HMTBFIFBJIFNRUlQxXzIgU1FSVDIgYWJzIGFjb3MgYXNpbiBhdGFuIGNlaWwgY29zIGV4cCBmbG9vciBsb2cgcm91bmQgc2luIHNxcnQgdGFuIGF0YW4yIHBvdyBtYXggbWluJy5zcGxpdCggJyAnICk7XHJcbiAgdmFyIEhBU19TS0VUQ0ggPSAnX19oYXNTa2V0Y2gnO1xyXG4gIHZhciBNID0gTWF0aDtcclxuXHJcbiAgdmFyIENBTlZBUyA9ICdjYW52YXMnO1xyXG4gIHZhciBXRUJHTCA9ICd3ZWJnbCc7XHJcbiAgdmFyIERPTSA9ICdkb20nO1xyXG5cclxuICB2YXIgZG9jID0gZG9jdW1lbnQ7XHJcbiAgdmFyIHdpbiA9IHdpbmRvdztcclxuXHJcbiAgdmFyIGluc3RhbmNlcyA9IFtdO1xyXG5cclxuICB2YXIgZGVmYXVsdHMgPSB7XHJcblxyXG4gICAgZnVsbHNjcmVlbjogdHJ1ZSxcclxuICAgIGF1dG9zdGFydDogdHJ1ZSxcclxuICAgIGF1dG9jbGVhcjogdHJ1ZSxcclxuICAgIGF1dG9wYXVzZTogdHJ1ZSxcclxuICAgIGNvbnRhaW5lcjogZG9jLmJvZHksXHJcbiAgICBpbnRlcnZhbDogMSxcclxuICAgIGdsb2JhbHM6IHRydWUsXHJcbiAgICByZXRpbmE6IGZhbHNlLFxyXG4gICAgdHlwZTogQ0FOVkFTXHJcbiAgfTtcclxuXHJcbiAgdmFyIGtleU1hcCA9IHtcclxuXHJcbiAgICAgODogJ0JBQ0tTUEFDRScsXHJcbiAgICAgOTogJ1RBQicsXHJcbiAgICAxMzogJ0VOVEVSJyxcclxuICAgIDE2OiAnU0hJRlQnLFxyXG4gICAgMjc6ICdFU0NBUEUnLFxyXG4gICAgMzI6ICdTUEFDRScsXHJcbiAgICAzNzogJ0xFRlQnLFxyXG4gICAgMzg6ICdVUCcsXHJcbiAgICAzOTogJ1JJR0hUJyxcclxuICAgIDQwOiAnRE9XTidcclxuICB9O1xyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBVdGlsaXRpZXNcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIGZ1bmN0aW9uIGlzQXJyYXkoIG9iamVjdCApIHtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKCBvYmplY3QgKSA9PSAnW29iamVjdCBBcnJheV0nO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqZWN0ICkge1xyXG5cclxuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICdmdW5jdGlvbic7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBpc051bWJlciggb2JqZWN0ICkge1xyXG5cclxuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICdudW1iZXInO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaXNTdHJpbmcoIG9iamVjdCApIHtcclxuXHJcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAnc3RyaW5nJztcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGtleU5hbWUoIGNvZGUgKSB7XHJcblxyXG4gICAgcmV0dXJuIGtleU1hcFsgY29kZSBdIHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoIGNvZGUgKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGV4dGVuZCggdGFyZ2V0LCBzb3VyY2UsIG92ZXJ3cml0ZSApIHtcclxuXHJcbiAgICBmb3IgKCB2YXIga2V5IGluIHNvdXJjZSApXHJcblxyXG4gICAgICBpZiAoIG92ZXJ3cml0ZSB8fCAhKCBrZXkgaW4gdGFyZ2V0ICkgKVxyXG5cclxuICAgICAgICB0YXJnZXRbIGtleSBdID0gc291cmNlWyBrZXkgXTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHJveHkoIG1ldGhvZCwgY29udGV4dCApIHtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICBtZXRob2QuYXBwbHkoIGNvbnRleHQsIGFyZ3VtZW50cyApO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGNsb25lKCB0YXJnZXQgKSB7XHJcblxyXG4gICAgdmFyIG9iamVjdCA9IHt9O1xyXG5cclxuICAgIGZvciAoIHZhciBrZXkgaW4gdGFyZ2V0ICkge1xyXG4gICAgICBcclxuICAgICAgaWYgKCBrZXkgPT09ICd3ZWJraXRNb3ZlbWVudFgnIHx8IGtleSA9PT0gJ3dlYmtpdE1vdmVtZW50WScgKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCBpc0Z1bmN0aW9uKCB0YXJnZXRbIGtleSBdICkgKVxyXG5cclxuICAgICAgICBvYmplY3RbIGtleSBdID0gcHJveHkoIHRhcmdldFsga2V5IF0sIHRhcmdldCApO1xyXG5cclxuICAgICAgZWxzZVxyXG5cclxuICAgICAgICBvYmplY3RbIGtleSBdID0gdGFyZ2V0WyBrZXkgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgQ29uc3RydWN0b3JcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIGZ1bmN0aW9uIGNvbnN0cnVjdG9yKCBjb250ZXh0ICkge1xyXG5cclxuICAgIHZhciByZXF1ZXN0LCBoYW5kbGVyLCB0YXJnZXQsIHBhcmVudCwgYm91bmRzLCBpbmRleCwgc3VmZml4LCBjbG9jaywgbm9kZSwgY29weSwgdHlwZSwga2V5LCB2YWwsIG1pbiwgbWF4LCB3LCBoO1xyXG5cclxuICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgIHZhciB0b3VjaGVzID0gW107XHJcbiAgICB2YXIgcmVzaXplZCA9IGZhbHNlO1xyXG4gICAgdmFyIHNldHVwID0gZmFsc2U7XHJcbiAgICB2YXIgcmF0aW8gPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xyXG4gICAgdmFyIGlzRGl2ID0gY29udGV4dC50eXBlID09IERPTTtcclxuICAgIHZhciBpczJEID0gY29udGV4dC50eXBlID09IENBTlZBUztcclxuXHJcbiAgICB2YXIgbW91c2UgPSB7XHJcbiAgICAgIHg6ICAwLjAsIHk6ICAwLjAsXHJcbiAgICAgIG94OiAwLjAsIG95OiAwLjAsXHJcbiAgICAgIGR4OiAwLjAsIGR5OiAwLjBcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGV2ZW50TWFwID0gW1xyXG5cclxuICAgICAgY29udGV4dC5ldmVudFRhcmdldCB8fCBjb250ZXh0LmVsZW1lbnQsXHJcblxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZWRvd24nLCAndG91Y2hzdGFydCcsXHJcbiAgICAgICAgcG9pbnRlciwgJ21vdXNlbW92ZScsICd0b3VjaG1vdmUnLFxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZXVwJywgJ3RvdWNoZW5kJyxcclxuICAgICAgICBwb2ludGVyLCAnY2xpY2snLFxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZW91dCcsXHJcbiAgICAgICAgcG9pbnRlciwgJ21vdXNlb3ZlcicsXHJcblxyXG4gICAgICBkb2MsXHJcblxyXG4gICAgICAgIGtleXByZXNzLCAna2V5ZG93bicsICdrZXl1cCcsXHJcblxyXG4gICAgICB3aW4sXHJcblxyXG4gICAgICAgIGFjdGl2ZSwgJ2ZvY3VzJywgJ2JsdXInLFxyXG4gICAgICAgIHJlc2l6ZSwgJ3Jlc2l6ZSdcclxuICAgIF07XHJcblxyXG4gICAgdmFyIGtleXMgPSB7fTsgZm9yICgga2V5IGluIGtleU1hcCApIGtleXNbIGtleU1hcFsga2V5IF0gXSA9IGZhbHNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHRyaWdnZXIoIG1ldGhvZCApIHtcclxuXHJcbiAgICAgIGlmICggaXNGdW5jdGlvbiggbWV0aG9kICkgKVxyXG5cclxuICAgICAgICBtZXRob2QuYXBwbHkoIGNvbnRleHQsIFtdLnNwbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGJpbmQoIG9uICkge1xyXG5cclxuICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50TWFwLmxlbmd0aDsgaW5kZXgrKyApIHtcclxuXHJcbiAgICAgICAgbm9kZSA9IGV2ZW50TWFwWyBpbmRleCBdO1xyXG5cclxuICAgICAgICBpZiAoIGlzU3RyaW5nKCBub2RlICkgKVxyXG5cclxuICAgICAgICAgIHRhcmdldFsgKCBvbiA/ICdhZGQnIDogJ3JlbW92ZScgKSArICdFdmVudExpc3RlbmVyJyBdLmNhbGwoIHRhcmdldCwgbm9kZSwgaGFuZGxlciwgZmFsc2UgKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAoIGlzRnVuY3Rpb24oIG5vZGUgKSApXHJcblxyXG4gICAgICAgICAgaGFuZGxlciA9IG5vZGU7XHJcblxyXG4gICAgICAgIGVsc2UgdGFyZ2V0ID0gbm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuXHJcbiAgICAgIGNBRiggcmVxdWVzdCApO1xyXG4gICAgICByZXF1ZXN0ID0gckFGKCB1cGRhdGUgKTtcclxuXHJcbiAgICAgIGlmICggIXNldHVwICkge1xyXG5cclxuICAgICAgICB0cmlnZ2VyKCBjb250ZXh0LnNldHVwICk7XHJcbiAgICAgICAgc2V0dXAgPSBpc0Z1bmN0aW9uKCBjb250ZXh0LnNldHVwICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICggIXJlc2l6ZWQgKSB7XHJcbiAgICAgICAgdHJpZ2dlciggY29udGV4dC5yZXNpemUgKTtcclxuICAgICAgICByZXNpemVkID0gaXNGdW5jdGlvbiggY29udGV4dC5yZXNpemUgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCBjb250ZXh0LnJ1bm5pbmcgJiYgIWNvdW50ZXIgKSB7XHJcblxyXG4gICAgICAgIGNvbnRleHQuZHQgPSAoIGNsb2NrID0gK25ldyBEYXRlKCkgKSAtIGNvbnRleHQubm93O1xyXG4gICAgICAgIGNvbnRleHQubWlsbGlzICs9IGNvbnRleHQuZHQ7XHJcbiAgICAgICAgY29udGV4dC5ub3cgPSBjbG9jaztcclxuXHJcbiAgICAgICAgdHJpZ2dlciggY29udGV4dC51cGRhdGUgKTtcclxuXHJcbiAgICAgICAgLy8gUHJlIGRyYXdcclxuXHJcbiAgICAgICAgaWYgKCBpczJEICkge1xyXG5cclxuICAgICAgICAgIGlmICggY29udGV4dC5yZXRpbmEgKSB7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LnNhdmUoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmF1dG9jbGVhcikge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoIHJhdGlvLCByYXRpbyApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCBjb250ZXh0LmF1dG9jbGVhciApXHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEcmF3XHJcblxyXG4gICAgICAgIHRyaWdnZXIoIGNvbnRleHQuZHJhdyApO1xyXG5cclxuICAgICAgICAvLyBQb3N0IGRyYXdcclxuXHJcbiAgICAgICAgaWYgKCBpczJEICYmIGNvbnRleHQucmV0aW5hIClcclxuXHJcbiAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY291bnRlciA9ICsrY291bnRlciAlIGNvbnRleHQuaW50ZXJ2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzaXplKCkge1xyXG5cclxuICAgICAgdGFyZ2V0ID0gaXNEaXYgPyBjb250ZXh0LnN0eWxlIDogY29udGV4dC5jYW52YXM7XHJcbiAgICAgIHN1ZmZpeCA9IGlzRGl2ID8gJ3B4JyA6ICcnO1xyXG5cclxuICAgICAgdyA9IGNvbnRleHQud2lkdGg7XHJcbiAgICAgIGggPSBjb250ZXh0LmhlaWdodDtcclxuXHJcbiAgICAgIGlmICggY29udGV4dC5mdWxsc2NyZWVuICkge1xyXG5cclxuICAgICAgICBoID0gY29udGV4dC5oZWlnaHQgPSB3aW4uaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgdyA9IGNvbnRleHQud2lkdGggPSB3aW4uaW5uZXJXaWR0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCBjb250ZXh0LnJldGluYSAmJiBpczJEICYmIHJhdGlvICkge1xyXG5cclxuICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XHJcbiAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gdyArICdweCc7XHJcblxyXG4gICAgICAgIHcgKj0gcmF0aW87XHJcbiAgICAgICAgaCAqPSByYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCB0YXJnZXQuaGVpZ2h0ICE9PSBoIClcclxuXHJcbiAgICAgICAgdGFyZ2V0LmhlaWdodCA9IGggKyBzdWZmaXg7XHJcblxyXG4gICAgICBpZiAoIHRhcmdldC53aWR0aCAhPT0gdyApXHJcblxyXG4gICAgICAgIHRhcmdldC53aWR0aCA9IHcgKyBzdWZmaXg7XHJcblxyXG4gICAgICBpZiAoIGlzMkQgJiYgIWNvbnRleHQuYXV0b2NsZWFyICYmIGNvbnRleHQucmV0aW5hIClcclxuXHJcbiAgICAgICAgY29udGV4dC5zY2FsZSggcmF0aW8sIHJhdGlvICk7XHJcblxyXG4gICAgICBpZiAoIHNldHVwICkgdHJpZ2dlciggY29udGV4dC5yZXNpemUgKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhbGlnbiggdG91Y2gsIHRhcmdldCApIHtcclxuXHJcbiAgICAgIGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgIHRvdWNoLnggPSB0b3VjaC5wYWdlWCAtIGJvdW5kcy5sZWZ0IC0gKHdpbi5zY3JvbGxYIHx8IHdpbi5wYWdlWE9mZnNldCk7XHJcbiAgICAgIHRvdWNoLnkgPSB0b3VjaC5wYWdlWSAtIGJvdW5kcy50b3AgLSAod2luLnNjcm9sbFkgfHwgd2luLnBhZ2VZT2Zmc2V0KTtcclxuXHJcbiAgICAgIHJldHVybiB0b3VjaDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhdWdtZW50KCB0b3VjaCwgdGFyZ2V0ICkge1xyXG5cclxuICAgICAgYWxpZ24oIHRvdWNoLCBjb250ZXh0LmVsZW1lbnQgKTtcclxuXHJcbiAgICAgIHRhcmdldCA9IHRhcmdldCB8fCB7fTtcclxuXHJcbiAgICAgIHRhcmdldC5veCA9IHRhcmdldC54IHx8IHRvdWNoLng7XHJcbiAgICAgIHRhcmdldC5veSA9IHRhcmdldC55IHx8IHRvdWNoLnk7XHJcblxyXG4gICAgICB0YXJnZXQueCA9IHRvdWNoLng7XHJcbiAgICAgIHRhcmdldC55ID0gdG91Y2gueTtcclxuXHJcbiAgICAgIHRhcmdldC5keCA9IHRhcmdldC54IC0gdGFyZ2V0Lm94O1xyXG4gICAgICB0YXJnZXQuZHkgPSB0YXJnZXQueSAtIHRhcmdldC5veTtcclxuXHJcbiAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJvY2VzcyggZXZlbnQgKSB7XHJcblxyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgY29weSA9IGNsb25lKCBldmVudCApO1xyXG4gICAgICBjb3B5Lm9yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGlmICggY29weS50b3VjaGVzICkge1xyXG5cclxuICAgICAgICB0b3VjaGVzLmxlbmd0aCA9IGNvcHkudG91Y2hlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBjb3B5LnRvdWNoZXMubGVuZ3RoOyBpbmRleCsrIClcclxuXHJcbiAgICAgICAgICB0b3VjaGVzWyBpbmRleCBdID0gYXVnbWVudCggY29weS50b3VjaGVzWyBpbmRleCBdLCB0b3VjaGVzWyBpbmRleCBdICk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICB0b3VjaGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdG91Y2hlc1swXSA9IGF1Z21lbnQoIGNvcHksIG1vdXNlICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGV4dGVuZCggbW91c2UsIHRvdWNoZXNbMF0sIHRydWUgKTtcclxuXHJcbiAgICAgIHJldHVybiBjb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBvaW50ZXIoIGV2ZW50ICkge1xyXG5cclxuICAgICAgZXZlbnQgPSBwcm9jZXNzKCBldmVudCApO1xyXG5cclxuICAgICAgbWluID0gKCBtYXggPSBldmVudE1hcC5pbmRleE9mKCB0eXBlID0gZXZlbnQudHlwZSApICkgLSAxO1xyXG5cclxuICAgICAgY29udGV4dC5kcmFnZ2luZyA9XHJcblxyXG4gICAgICAgIC9kb3dufHN0YXJ0Ly50ZXN0KCB0eXBlICkgPyB0cnVlIDpcclxuXHJcbiAgICAgICAgL3VwfGVuZC8udGVzdCggdHlwZSApID8gZmFsc2UgOlxyXG5cclxuICAgICAgICBjb250ZXh0LmRyYWdnaW5nO1xyXG5cclxuICAgICAgd2hpbGUoIG1pbiApXHJcblxyXG4gICAgICAgIGlzU3RyaW5nKCBldmVudE1hcFsgbWluIF0gKSA/XHJcblxyXG4gICAgICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnRNYXBbIG1pbi0tIF0gXSwgZXZlbnQgKSA6XHJcblxyXG4gICAgICAgIGlzU3RyaW5nKCBldmVudE1hcFsgbWF4IF0gKSA/XHJcblxyXG4gICAgICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnRNYXBbIG1heCsrIF0gXSwgZXZlbnQgKSA6XHJcblxyXG4gICAgICAgIG1pbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24ga2V5cHJlc3MoIGV2ZW50ICkge1xyXG5cclxuICAgICAga2V5ID0gZXZlbnQua2V5Q29kZTtcclxuICAgICAgdmFsID0gZXZlbnQudHlwZSA9PSAna2V5dXAnO1xyXG4gICAgICBrZXlzWyBrZXkgXSA9IGtleXNbIGtleU5hbWUoIGtleSApIF0gPSAhdmFsO1xyXG5cclxuICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnQudHlwZSBdLCBldmVudCApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFjdGl2ZSggZXZlbnQgKSB7XHJcblxyXG4gICAgICBpZiAoIGNvbnRleHQuYXV0b3BhdXNlIClcclxuXHJcbiAgICAgICAgKCBldmVudC50eXBlID09ICdibHVyJyA/IHN0b3AgOiBzdGFydCApKCk7XHJcblxyXG4gICAgICB0cmlnZ2VyKCBjb250ZXh0WyBldmVudC50eXBlIF0sIGV2ZW50ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHVibGljIEFQSVxyXG5cclxuICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xyXG5cclxuICAgICAgY29udGV4dC5ub3cgPSArbmV3IERhdGUoKTtcclxuICAgICAgY29udGV4dC5ydW5uaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzdG9wKCkge1xyXG5cclxuICAgICAgY29udGV4dC5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlKCkge1xyXG5cclxuICAgICAgKCBjb250ZXh0LnJ1bm5pbmcgPyBzdG9wIDogc3RhcnQgKSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xyXG5cclxuICAgICAgaWYgKCBpczJEIClcclxuXHJcbiAgICAgICAgY29udGV4dC5jbGVhclJlY3QoIDAsIDAsIGNvbnRleHQud2lkdGggKiByYXRpbywgY29udGV4dC5oZWlnaHQgKiByYXRpbyApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XHJcblxyXG4gICAgICBwYXJlbnQgPSBjb250ZXh0LmVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgaW5kZXggPSBpbnN0YW5jZXMuaW5kZXhPZiggY29udGV4dCApO1xyXG5cclxuICAgICAgaWYgKCBwYXJlbnQgKSBwYXJlbnQucmVtb3ZlQ2hpbGQoIGNvbnRleHQuZWxlbWVudCApO1xyXG4gICAgICBpZiAoIH5pbmRleCApIGluc3RhbmNlcy5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG4gICAgICBiaW5kKCBmYWxzZSApO1xyXG4gICAgICBzdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXh0ZW5kKCBjb250ZXh0LCB7XHJcblxyXG4gICAgICB0b3VjaGVzOiB0b3VjaGVzLFxyXG4gICAgICBtb3VzZTogbW91c2UsXHJcbiAgICAgIGtleXM6IGtleXMsXHJcblxyXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgIHJ1bm5pbmc6IGZhbHNlLFxyXG4gICAgICBtaWxsaXM6IDAsXHJcbiAgICAgIG5vdzogTmFOLFxyXG4gICAgICBkdDogTmFOLFxyXG5cclxuICAgICAgZGVzdHJveTogZGVzdHJveSxcclxuICAgICAgdG9nZ2xlOiB0b2dnbGUsXHJcbiAgICAgIGNsZWFyOiBjbGVhcixcclxuICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICBzdG9wOiBzdG9wXHJcbiAgICB9KTtcclxuXHJcbiAgICBpbnN0YW5jZXMucHVzaCggY29udGV4dCApO1xyXG5cclxuICAgIHJldHVybiAoIGNvbnRleHQuYXV0b3N0YXJ0ICYmIHN0YXJ0KCksIGJpbmQoIHRydWUgKSwgcmVzaXplKCksIHVwZGF0ZSgpLCBjb250ZXh0ICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBHbG9iYWwgQVBJXHJcblxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqL1xyXG5cclxuICB2YXIgZWxlbWVudCwgY29udGV4dCwgU2tldGNoID0ge1xyXG5cclxuICAgIENBTlZBUzogQ0FOVkFTLFxyXG4gICAgV0VCX0dMOiBXRUJHTCxcclxuICAgIFdFQkdMOiBXRUJHTCxcclxuICAgIERPTTogRE9NLFxyXG5cclxuICAgIGluc3RhbmNlczogaW5zdGFuY2VzLFxyXG5cclxuICAgIGluc3RhbGw6IGZ1bmN0aW9uKCBjb250ZXh0ICkge1xyXG5cclxuICAgICAgaWYgKCAhY29udGV4dFsgSEFTX1NLRVRDSCBdICkge1xyXG5cclxuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBNQVRIX1BST1BTLmxlbmd0aDsgaSsrIClcclxuXHJcbiAgICAgICAgICBjb250ZXh0WyBNQVRIX1BST1BTW2ldIF0gPSBNWyBNQVRIX1BST1BTW2ldIF07XHJcblxyXG4gICAgICAgIGV4dGVuZCggY29udGV4dCwge1xyXG5cclxuICAgICAgICAgIFRXT19QSTogTS5QSSAqIDIsXHJcbiAgICAgICAgICBIQUxGX1BJOiBNLlBJIC8gMixcclxuICAgICAgICAgIFFVQVJURVJfUEk6IE0uUEkgLyA0LFxyXG5cclxuICAgICAgICAgIHJhbmRvbTogZnVuY3Rpb24oIG1pbiwgbWF4ICkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCBpc0FycmF5KCBtaW4gKSApXHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBtaW5bIH5+KCBNLnJhbmRvbSgpICogbWluLmxlbmd0aCApIF07XHJcblxyXG4gICAgICAgICAgICBpZiAoICFpc051bWJlciggbWF4ICkgKVxyXG5cclxuICAgICAgICAgICAgICBtYXggP