blob: 0ae167ed793dae77fa3284ab99679188d878221f [file] [log] [blame]
(this.nativeLog || function(s) {console.log(s)})('START JS FRAMEWORK 0.23.6, Build 2017-12-29 15:36.');
;(this.getJSFMVersion = function(){return "0.23.6"});
var global = this, process = { env: {} };var setTimeout = global.setTimeout;
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, (function () { 'use strict';
var subversion = {"framework":"0.23.6","transformer":">=0.1.5 <0.5"};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// Production steps of ECMA-262, Edition 6, 22.1.2.1
// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
/* istanbul ignore if */
if (!Array.from) {
Array.from = (function() {
var toStr = Object.prototype.toString;
var isCallable = function(fn) {
return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
};
var toInteger = function(value) {
var number = Number(value);
if (isNaN(number)) {
return 0;
}
if (number === 0 || !isFinite(number)) {
return number;
}
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
};
var maxSafeInteger = Math.pow(2, 53) - 1;
var toLength = function(value) {
var len = toInteger(value);
return Math.min(Math.max(len, 0), maxSafeInteger);
};
// The length property of the from method is 1.
return function from(arrayLike/*, mapFn, thisArg */) {
// 1. Let C be the this value.
var C = this;
// 2. Let items be ToObject(arrayLike).
var items = Object(arrayLike);
// 3. ReturnIfAbrupt(items).
if (arrayLike == null) {
throw new TypeError('Array.from requires an array-like object - not null or undefined');
}
// 4. If mapfn is undefined, then let mapping be false.
var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
var T;
if (typeof mapFn !== 'undefined') {
// 5. else
// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
if (!isCallable(mapFn)) {
throw new TypeError('Array.from: when provided, the second argument must be a function');
}
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
if (arguments.length > 2) {
T = arguments[2];
}
}
// 10. Let lenValue be Get(items, "length").
// 11. Let len be ToLength(lenValue).
var len = toLength(items.length);
// 13. If IsConstructor(C) is true, then
// 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
// 14. a. Else, Let A be ArrayCreate(len).
var A = isCallable(C) ? Object(new C(len)) : new Array(len);
// 16. Let k be 0.
var k = 0;
// 17. Repeat, while k < len… (also steps a - h)
var kValue;
while (k < len) {
kValue = items[k];
if (mapFn) {
A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
} else {
A[k] = kValue;
}
k += 1;
}
// 18. Let putStatus be Put(A, "length", len, true).
A.length = len;
// 20. Return A.
return A;
};
}());
}
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function unwrapExports (x) {
return x && x.__esModule ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var _global = createCommonjsModule(function (module) {
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
? window : typeof self != 'undefined' && self.Math == Math ? self
// eslint-disable-next-line no-new-func
: Function('return this')();
if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
});
var _core = createCommonjsModule(function (module) {
var core = module.exports = { version: '2.5.3' };
if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
});
var _isObject = function (it) {
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
var isObject = _isObject;
var _anObject = function (it) {
if (!isObject(it)) { throw TypeError(it + ' is not an object!'); }
return it;
};
var _fails = function (exec) {
try {
return !!exec();
} catch (e) {
return true;
}
};
// Thank's IE8 for his funny defineProperty
var _descriptors = !_fails(function () {
return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
});
var isObject$1 = _isObject;
var document$1 = _global.document;
// typeof document.createElement is 'object' in old IE
var is = isObject$1(document$1) && isObject$1(document$1.createElement);
var _domCreate = function (it) {
return is ? document$1.createElement(it) : {};
};
var _ie8DomDefine = !_descriptors && !_fails(function () {
return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
});
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject$2 = _isObject;
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
var _toPrimitive = function (it, S) {
if (!isObject$2(it)) { return it; }
var fn, val;
if (S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
if (typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
if (!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
throw TypeError("Can't convert object to primitive value");
};
var anObject = _anObject;
var IE8_DOM_DEFINE = _ie8DomDefine;
var toPrimitive = _toPrimitive;
var dP$1 = Object.defineProperty;
var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if (IE8_DOM_DEFINE) { try {
return dP$1(O, P, Attributes);
} catch (e) { /* empty */ } }
if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
if ('value' in Attributes) { O[P] = Attributes.value; }
return O;
};
var _objectDp = {
f: f
};
var _propertyDesc = function (bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value: value
};
};
var dP = _objectDp;
var createDesc = _propertyDesc;
var _hide = _descriptors ? function (object, key, value) {
return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
object[key] = value;
return object;
};
var hasOwnProperty = {}.hasOwnProperty;
var _has = function (it, key) {
return hasOwnProperty.call(it, key);
};
var id = 0;
var px = Math.random();
var _uid = function (key) {
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};
var _redefine = createCommonjsModule(function (module) {
var global = _global;
var hide = _hide;
var has = _has;
var SRC = _uid('src');
var TO_STRING = 'toString';
var $toString = Function[TO_STRING];
var TPL = ('' + $toString).split(TO_STRING);
_core.inspectSource = function (it) {
return $toString.call(it);
};
(module.exports = function (O, key, val, safe) {
var isFunction = typeof val == 'function';
if (isFunction) { has(val, 'name') || hide(val, 'name', key); }
if (O[key] === val) { return; }
if (isFunction) { has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
if (O === global) {
O[key] = val;
} else if (!safe) {
delete O[key];
hide(O, key, val);
} else if (O[key]) {
O[key] = val;
} else {
hide(O, key, val);
}
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
})(Function.prototype, TO_STRING, function toString() {
return typeof this == 'function' && this[SRC] || $toString.call(this);
});
});
var _aFunction = function (it) {
if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
return it;
};
// optional / simple context binding
var aFunction = _aFunction;
var _ctx = function (fn, that, length) {
aFunction(fn);
if (that === undefined) { return fn; }
switch (length) {
case 1: return function (a) {
return fn.call(that, a);
};
case 2: return function (a, b) {
return fn.call(that, a, b);
};
case 3: return function (a, b, c) {
return fn.call(that, a, b, c);
};
}
return function (/* ...args */) {
return fn.apply(that, arguments);
};
};
var global$1 = _global;
var core = _core;
var hide = _hide;
var redefine = _redefine;
var ctx = _ctx;
var PROTOTYPE = 'prototype';
var $export$1 = function (type, name, source) {
var IS_FORCED = type & $export$1.F;
var IS_GLOBAL = type & $export$1.G;
var IS_STATIC = type & $export$1.S;
var IS_PROTO = type & $export$1.P;
var IS_BIND = type & $export$1.B;
var target = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE];
var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
var key, own, out, exp;
if (IS_GLOBAL) { source = name; }
for (key in source) {
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
// export native or passed
out = (own ? target : source)[key];
// bind timers to global for call from export context
exp = IS_BIND && own ? ctx(out, global$1) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
// extend global
if (target) { redefine(target, key, out, type & $export$1.U); }
// export
if (exports[key] != out) { hide(exports, key, exp); }
if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
}
};
global$1.core = core;
// type bitmap
$export$1.F = 1; // forced
$export$1.G = 2; // global
$export$1.S = 4; // static
$export$1.P = 8; // proto
$export$1.B = 16; // bind
$export$1.W = 32; // wrap
$export$1.U = 64; // safe
$export$1.R = 128; // real proto method for `library`
var _export = $export$1;
var toString$1 = {}.toString;
var _cof = function (it) {
return toString$1.call(it).slice(8, -1);
};
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = _cof;
// eslint-disable-next-line no-prototype-builtins
var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
return cof(it) == 'String' ? it.split('') : Object(it);
};
// 7.2.1 RequireObjectCoercible(argument)
var _defined = function (it) {
if (it == undefined) { throw TypeError("Can't call method on " + it); }
return it;
};
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject$1 = _iobject;
var defined = _defined;
var _toIobject = function (it) {
return IObject$1(defined(it));
};
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function (it) {
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
// 7.1.15 ToLength
var toInteger = _toInteger;
var min = Math.min;
var _toLength = function (it) {
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
var toInteger$1 = _toInteger;
var max = Math.max;
var min$1 = Math.min;
var _toAbsoluteIndex = function (index, length) {
index = toInteger$1(index);
return index < 0 ? max(index + length, 0) : min$1(index, length);
};
// false -> Array#indexOf
// true -> Array#includes
var toIObject$1 = _toIobject;
var toLength = _toLength;
var toAbsoluteIndex = _toAbsoluteIndex;
var _arrayIncludes = function (IS_INCLUDES) {
return function ($this, el, fromIndex) {
var O = toIObject$1($this);
var length = toLength(O.length);
var index = toAbsoluteIndex(fromIndex, length);
var value;
// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare
if (IS_INCLUDES && el != el) { while (length > index) {
value = O[index++];
// eslint-disable-next-line no-self-compare
if (value != value) { return true; }
// Array#indexOf ignores holes, Array#includes - not
} } else { for (;length > index; index++) { if (IS_INCLUDES || index in O) {
if (O[index] === el) { return IS_INCLUDES || index || 0; }
} } } return !IS_INCLUDES && -1;
};
};
var global$2 = _global;
var SHARED = '__core-js_shared__';
var store = global$2[SHARED] || (global$2[SHARED] = {});
var _shared = function (key) {
return store[key] || (store[key] = {});
};
var shared = _shared('keys');
var uid = _uid;
var _sharedKey = function (key) {
return shared[key] || (shared[key] = uid(key));
};
var has$1 = _has;
var toIObject = _toIobject;
var arrayIndexOf = _arrayIncludes(false);
var IE_PROTO = _sharedKey('IE_PROTO');
var _objectKeysInternal = function (object, names) {
var O = toIObject(object);
var i = 0;
var result = [];
var key;
for (key in O) { if (key != IE_PROTO) { has$1(O, key) && result.push(key); } }
// Don't enum bug & hidden keys
while (names.length > i) { if (has$1(O, key = names[i++])) {
~arrayIndexOf(result, key) || result.push(key);
} }
return result;
};
// IE 8- don't enum bug keys
var _enumBugKeys = (
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = _objectKeysInternal;
var enumBugKeys = _enumBugKeys;
var _objectKeys = Object.keys || function keys(O) {
return $keys(O, enumBugKeys);
};
var f$1 = Object.getOwnPropertySymbols;
var _objectGops = {
f: f$1
};
var f$2 = {}.propertyIsEnumerable;
var _objectPie = {
f: f$2
};
// 7.1.13 ToObject(argument)
var defined$1 = _defined;
var _toObject = function (it) {
return Object(defined$1(it));
};
// 19.1.2.1 Object.assign(target, source, ...)
var getKeys = _objectKeys;
var gOPS = _objectGops;
var pIE = _objectPie;
var toObject = _toObject;
var IObject = _iobject;
var $assign = Object.assign;
// should work with symbols and should have deterministic property order (V8 bug)
var _objectAssign = !$assign || _fails(function () {
var A = {};
var B = {};
// eslint-disable-next-line no-undef
var S = Symbol();
var K = 'abcdefghijklmnopqrst';
A[S] = 7;
K.split('').forEach(function (k) { B[k] = k; });
return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source) {
var arguments$1 = arguments;
// eslint-disable-line no-unused-vars
var T = toObject(target);
var aLen = arguments.length;
var index = 1;
var getSymbols = gOPS.f;
var isEnum = pIE.f;
while (aLen > index) {
var S = IObject(arguments$1[index++]);
var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
var length = keys.length;
var j = 0;
var key;
while (length > j) { if (isEnum.call(S, key = keys[j++])) { T[key] = S[key]; } }
} return T;
} : $assign;
// 19.1.3.1 Object.assign(target, source)
var $export = _export;
$export($export.S + $export.F, 'Object', { assign: _objectAssign });
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// https://gist.github.com/WebReflection/5593554
/* istanbul ignore if */
if (!Object.setPrototypeOf) {
Object.setPrototypeOf = (function(Object, magic) {
var set;
function setPrototypeOf(O, proto) {
set.call(O, proto);
return O;
}
try {
// this works already in Firefox and Safari
set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;
set.call({}, null);
} catch (e) {
if (
// IE < 11 cannot be shimmed
Object.prototype !== {}[magic] ||
// neither can any browser that actually
// implemented __proto__ correctly
// (all but old V8 will return here)
{__proto__: null}.__proto__ === void 0
// this case means null objects cannot be passed
// through setPrototypeOf in a reliable way
// which means here a **Sham** is needed instead
) {
return;
}
// nodejs 0.8 and 0.10 are (buggy and..) fine here
// probably Chrome or some old Mobile stock browser
set = function(proto) {
this[magic] = proto;
};
// please note that this will **not** work
// in those browsers that do not inherit
// __proto__ by mistake from Object.prototype
// in these cases we should probably throw an error
// or at least be informed about the issue
setPrototypeOf.polyfill = setPrototypeOf(
setPrototypeOf({}, null),
Object.prototype
) instanceof Object;
// setPrototypeOf.polyfill === true means it works as meant
// setPrototypeOf.polyfill === false means it's not 100% reliable
// setPrototypeOf.polyfill === undefined
// or
// setPrototypeOf.polyfill == null means it's not a polyfill
// which means it works as expected
// we can even delete Object.prototype.__proto__;
}
return setPrototypeOf;
}(Object, '__proto__'));
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// fix Promise Problem on JSContext of iOS7~8
// @see https://bugs.webkit.org/show_bug.cgi?id=135866
var ref = commonjsGlobal;
var WXEnvironment$1 = ref.WXEnvironment;
/* istanbul ignore next */
if (WXEnvironment$1 && WXEnvironment$1.platform === 'iOS') {
commonjsGlobal.Promise = undefined;
}
var _wks = createCommonjsModule(function (module) {
var store = _shared('wks');
var uid = _uid;
var Symbol = _global.Symbol;
var USE_SYMBOL = typeof Symbol == 'function';
var $exports = module.exports = function (name) {
return store[name] || (store[name] =
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};
$exports.store = store;
});
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof$1 = _cof;
var TAG = _wks('toStringTag');
// ES3 wrong here
var ARG = cof$1(function () { return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
try {
return it[key];
} catch (e) { /* empty */ }
};
var _classof = function (it) {
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
// builtinTag case
: ARG ? cof$1(O)
// ES3 arguments fallback
: (B = cof$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
// 19.1.3.6 Object.prototype.toString()
var classof = _classof;
var test = {};
test[_wks('toStringTag')] = 'z';
if (test + '' != '[object z]') {
_redefine(Object.prototype, 'toString', function toString() {
return '[object ' + classof(this) + ']';
}, true);
}
var toInteger$2 = _toInteger;
var defined$2 = _defined;
// true -> String#at
// false -> String#codePointAt
var _stringAt = function (TO_STRING) {
return function (that, pos) {
var s = String(defined$2(that));
var i = toInteger$2(pos);
var l = s.length;
var a, b;
if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
var _library = false;
var _iterators = {};
var dP$2 = _objectDp;
var anObject$2 = _anObject;
var getKeys$1 = _objectKeys;
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
anObject$2(O);
var keys = getKeys$1(Properties);
var length = keys.length;
var i = 0;
var P;
while (length > i) { dP$2.f(O, P = keys[i++], Properties[P]); }
return O;
};
var document$2 = _global.document;
var _html = document$2 && document$2.documentElement;
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject$1 = _anObject;
var dPs = _objectDps;
var enumBugKeys$1 = _enumBugKeys;
var IE_PROTO$1 = _sharedKey('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE$1 = 'prototype';
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function () {
// Thrash, waste and sodomy: IE GC bug
var iframe = _domCreate('iframe');
var i = enumBugKeys$1.length;
var lt = '<';
var gt = '>';
var iframeDocument;
iframe.style.display = 'none';
_html.appendChild(iframe);
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (i--) { delete createDict[PROTOTYPE$1][enumBugKeys$1[i]]; }
return createDict();
};
var _objectCreate = Object.create || function create(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = anObject$1(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1] = O;
} else { result = createDict(); }
return Properties === undefined ? result : dPs(result, Properties);
};
var def = _objectDp.f;
var has$3 = _has;
var TAG$1 = _wks('toStringTag');
var _setToStringTag = function (it, tag, stat) {
if (it && !has$3(it = stat ? it : it.prototype, TAG$1)) { def(it, TAG$1, { configurable: true, value: tag }); }
};
var create$1 = _objectCreate;
var descriptor = _propertyDesc;
var setToStringTag$1 = _setToStringTag;
var IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
var _iterCreate = function (Constructor, NAME, next) {
Constructor.prototype = create$1(IteratorPrototype, { next: descriptor(1, next) });
setToStringTag$1(Constructor, NAME + ' Iterator');
};
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has$4 = _has;
var toObject$1 = _toObject;
var IE_PROTO$2 = _sharedKey('IE_PROTO');
var ObjectProto = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function (O) {
O = toObject$1(O);
if (has$4(O, IE_PROTO$2)) { return O[IE_PROTO$2]; }
if (typeof O.constructor == 'function' && O instanceof O.constructor) {
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
};
var LIBRARY = _library;
var $export$2 = _export;
var redefine$1 = _redefine;
var hide$1 = _hide;
var has$2 = _has;
var Iterators = _iterators;
var $iterCreate = _iterCreate;
var setToStringTag = _setToStringTag;
var getPrototypeOf = _objectGpo;
var ITERATOR = _wks('iterator');
var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';
var returnThis = function () { return this; };
var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
$iterCreate(Constructor, NAME, next);
var getMethod = function (kind) {
if (!BUGGY && kind in proto) { return proto[kind]; }
switch (kind) {
case KEYS: return function keys() { return new Constructor(this, kind); };
case VALUES: return function values() { return new Constructor(this, kind); };
} return function entries() { return new Constructor(this, kind); };
};
var TAG = NAME + ' Iterator';
var DEF_VALUES = DEFAULT == VALUES;
var VALUES_BUG = false;
var proto = Base.prototype;
var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
var $default = (!BUGGY && $native) || getMethod(DEFAULT);
var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
var methods, key, IteratorPrototype;
// Fix native
if ($anyNative) {
IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
// Set @@toStringTag to native iterators
setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if (!LIBRARY && !has$2(IteratorPrototype, ITERATOR)) { hide$1(IteratorPrototype, ITERATOR, returnThis); }
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() { return $native.call(this); };
}
// Define iterator
if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
hide$1(proto, ITERATOR, $default);
}
// Plug for library
Iterators[NAME] = $default;
Iterators[TAG] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED) { for (key in methods) {
if (!(key in proto)) { redefine$1(proto, key, methods[key]); }
} } else { $export$2($export$2.P + $export$2.F * (BUGGY || VALUES_BUG), NAME, methods); }
}
return methods;
};
var $at = _stringAt(true);
// 21.1.3.27 String.prototype[@@iterator]()
_iterDefine(String, 'String', function (iterated) {
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
var O = this._t;
var index = this._i;
var point;
if (index >= O.length) { return { value: undefined, done: true }; }
point = $at(O, index);
this._i += point.length;
return { value: point, done: false };
});
// 22.1.3.31 Array.prototype[@@unscopables]
var UNSCOPABLES = _wks('unscopables');
var ArrayProto = Array.prototype;
if (ArrayProto[UNSCOPABLES] == undefined) { _hide(ArrayProto, UNSCOPABLES, {}); }
var _addToUnscopables = function (key) {
ArrayProto[UNSCOPABLES][key] = true;
};
var _iterStep = function (done, value) {
return { value: value, done: !!done };
};
var addToUnscopables = _addToUnscopables;
var step = _iterStep;
var Iterators$2 = _iterators;
var toIObject$2 = _toIobject;
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
this._t = toIObject$2(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
var O = this._t;
var kind = this._k;
var index = this._i++;
if (!O || index >= O.length) {
this._t = undefined;
return step(1);
}
if (kind == 'keys') { return step(0, index); }
if (kind == 'values') { return step(0, O[index]); }
return step(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators$2.Arguments = Iterators$2.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');
var $iterators = es6_array_iterator;
var getKeys$2 = _objectKeys;
var redefine$2 = _redefine;
var global$3 = _global;
var hide$2 = _hide;
var Iterators$1 = _iterators;
var wks = _wks;
var ITERATOR$1 = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators$1.Array;
var DOMIterables = {
CSSRuleList: true, // TODO: Not spec compliant, should be false.
CSSStyleDeclaration: false,
CSSValueList: false,
ClientRectList: false,
DOMRectList: false,
DOMStringList: false,
DOMTokenList: true,
DataTransferItemList: false,
FileList: false,
HTMLAllCollection: false,
HTMLCollection: false,
HTMLFormElement: false,
HTMLSelectElement: false,
MediaList: true, // TODO: Not spec compliant, should be false.
MimeTypeArray: false,
NamedNodeMap: false,
NodeList: true,
PaintRequestList: false,
Plugin: false,
PluginArray: false,
SVGLengthList: false,
SVGNumberList: false,
SVGPathSegList: false,
SVGPointList: false,
SVGStringList: false,
SVGTransformList: false,
SourceBufferList: false,
StyleSheetList: true, // TODO: Not spec compliant, should be false.
TextTrackCueList: false,
TextTrackList: false,
TouchList: false
};
for (var collections = getKeys$2(DOMIterables), i = 0; i < collections.length; i++) {
var NAME = collections[i];
var explicit = DOMIterables[NAME];
var Collection = global$3[NAME];
var proto = Collection && Collection.prototype;
var key;
if (proto) {
if (!proto[ITERATOR$1]) { hide$2(proto, ITERATOR$1, ArrayValues); }
if (!proto[TO_STRING_TAG]) { hide$2(proto, TO_STRING_TAG, NAME); }
Iterators$1[NAME] = ArrayValues;
if (explicit) { for (key in $iterators) { if (!proto[key]) { redefine$2(proto, key, $iterators[key], true); } } }
}
}
var _anInstance = function (it, Constructor, name, forbiddenField) {
if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
throw TypeError(name + ': incorrect invocation!');
} return it;
};
// call something on iterator step with safe closing on error
var anObject$3 = _anObject;
var _iterCall = function (iterator, fn, value, entries) {
try {
return entries ? fn(anObject$3(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch (e) {
var ret = iterator['return'];
if (ret !== undefined) { anObject$3(ret.call(iterator)); }
throw e;
}
};
// check on default Array iterator
var Iterators$3 = _iterators;
var ITERATOR$2 = _wks('iterator');
var ArrayProto$1 = Array.prototype;
var _isArrayIter = function (it) {
return it !== undefined && (Iterators$3.Array === it || ArrayProto$1[ITERATOR$2] === it);
};
var classof$2 = _classof;
var ITERATOR$3 = _wks('iterator');
var Iterators$4 = _iterators;
var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
if (it != undefined) { return it[ITERATOR$3]
|| it['@@iterator']
|| Iterators$4[classof$2(it)]; }
};
var _forOf = createCommonjsModule(function (module) {
var ctx = _ctx;
var call = _iterCall;
var isArrayIter = _isArrayIter;
var anObject = _anObject;
var toLength = _toLength;
var getIterFn = core_getIteratorMethod;
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
var f = ctx(fn, that, entries ? 2 : 1);
var index = 0;
var length, step, iterator, result;
if (typeof iterFn != 'function') { throw TypeError(iterable + ' is not iterable!'); }
// fast case for arrays with default iterator
if (isArrayIter(iterFn)) { for (length = toLength(iterable.length); length > index; index++) {
result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
if (result === BREAK || result === RETURN) { return result; }
} } else { for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
result = call(iterator, f, step.value, entries);
if (result === BREAK || result === RETURN) { return result; }
} }
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;
});
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject$4 = _anObject;
var aFunction$2 = _aFunction;
var SPECIES = _wks('species');
var _speciesConstructor = function (O, D) {
var C = anObject$4(O).constructor;
var S;
return C === undefined || (S = anObject$4(C)[SPECIES]) == undefined ? D : aFunction$2(S);
};
// fast apply, http://jsperf.lnkit.com/fast-apply/5
var _invoke = function (fn, args, that) {
var un = that === undefined;
switch (args.length) {
case 0: return un ? fn()
: fn.call(that);
case 1: return un ? fn(args[0])
: fn.call(that, args[0]);
case 2: return un ? fn(args[0], args[1])
: fn.call(that, args[0], args[1]);
case 3: return un ? fn(args[0], args[1], args[2])
: fn.call(that, args[0], args[1], args[2]);
case 4: return un ? fn(args[0], args[1], args[2], args[3])
: fn.call(that, args[0], args[1], args[2], args[3]);
} return fn.apply(that, args);
};
var ctx$2 = _ctx;
var invoke = _invoke;
var html = _html;
var cel = _domCreate;
var global$5 = _global;
var process$2 = global$5.process;
var setTask = global$5.setImmediate;
var clearTask = global$5.clearImmediate;
var MessageChannel$1 = global$5.MessageChannel;
var Dispatch = global$5.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer;
var channel;
var port;
var run$1 = function () {
var id = +this;
// eslint-disable-next-line no-prototype-builtins
if (queue.hasOwnProperty(id)) {
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function (event) {
run$1.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!setTask || !clearTask) {
setTask = function setImmediate(fn) {
var arguments$1 = arguments;
var args = [];
var i = 1;
while (arguments.length > i) { args.push(arguments$1[i++]); }
queue[++counter] = function () {
// eslint-disable-next-line no-new-func
invoke(typeof fn == 'function' ? fn : Function(fn), args);
};
defer(counter);
return counter;
};
clearTask = function clearImmediate(id) {
delete queue[id];
};
// Node.js 0.8-
if (_cof(process$2) == 'process') {
defer = function (id) {
process$2.nextTick(ctx$2(run$1, id, 1));
};
// Sphere (JS game engine) Dispatch API
} else if (Dispatch && Dispatch.now) {
defer = function (id) {
Dispatch.now(ctx$2(run$1, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if (MessageChannel$1) {
channel = new MessageChannel$1();
port = channel.port2;
channel.port1.onmessage = listener;
defer = ctx$2(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts) {
defer = function (id) {
global$5.postMessage(id + '', '*');
};
global$5.addEventListener('message', listener, false);
// IE8-
} else if (ONREADYSTATECHANGE in cel('script')) {
defer = function (id) {
html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
html.removeChild(this);
run$1.call(id);
};
};
// Rest old browsers
} else {
defer = function (id) {
setTimeout(ctx$2(run$1, id, 1), 0);
};
}
}
var _task = {
set: setTask,
clear: clearTask
};
var global$6 = _global;
var macrotask = _task.set;
var Observer = global$6.MutationObserver || global$6.WebKitMutationObserver;
var process$3 = global$6.process;
var Promise$1 = global$6.Promise;
var isNode$1 = _cof(process$3) == 'process';
var _microtask = function () {
var head, last, notify;
var flush = function () {
var parent, fn;
if (isNode$1 && (parent = process$3.domain)) { parent.exit(); }
while (head) {
fn = head.fn;
head = head.next;
try {
fn();
} catch (e) {
if (head) { notify(); }
else { last = undefined; }
throw e;
}
} last = undefined;
if (parent) { parent.enter(); }
};
// Node.js
if (isNode$1) {
notify = function () {
process$3.nextTick(flush);
};
// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
} else if (Observer && !(global$6.navigator && global$6.navigator.standalone)) {
var toggle = true;
var node = document.createTextNode('');
new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
notify = function () {
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if (Promise$1 && Promise$1.resolve) {
var promise = Promise$1.resolve();
notify = function () {
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function () {
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global$6, flush);
};
}
return function (fn) {
var task = { fn: fn, next: undefined };
if (last) { last.next = task; }
if (!head) {
head = task;
notify();
} last = task;
};
};
// 25.4.1.5 NewPromiseCapability(C)
var aFunction$3 = _aFunction;
function PromiseCapability(C) {
var resolve, reject;
this.promise = new C(function ($$resolve, $$reject) {
if (resolve !== undefined || reject !== undefined) { throw TypeError('Bad Promise constructor'); }
resolve = $$resolve;
reject = $$reject;
});
this.resolve = aFunction$3(resolve);
this.reject = aFunction$3(reject);
}
var f$3 = function (C) {
return new PromiseCapability(C);
};
var _newPromiseCapability = {
f: f$3
};
var _perform = function (exec) {
try {
return { e: false, v: exec() };
} catch (e) {
return { e: true, v: e };
}
};
var anObject$5 = _anObject;
var isObject$4 = _isObject;
var newPromiseCapability$1 = _newPromiseCapability;
var _promiseResolve = function (C, x) {
anObject$5(C);
if (isObject$4(x) && x.constructor === C) { return x; }
var promiseCapability = newPromiseCapability$1.f(C);
var resolve = promiseCapability.resolve;
resolve(x);
return promiseCapability.promise;
};
var redefine$3 = _redefine;
var _redefineAll = function (target, src, safe) {
for (var key in src) { redefine$3(target, key, src[key], safe); }
return target;
};
var global$7 = _global;
var dP$3 = _objectDp;
var DESCRIPTORS = _descriptors;
var SPECIES$1 = _wks('species');
var _setSpecies = function (KEY) {
var C = global$7[KEY];
if (DESCRIPTORS && C && !C[SPECIES$1]) { dP$3.f(C, SPECIES$1, {
configurable: true,
get: function () { return this; }
}); }
};
var ITERATOR$4 = _wks('iterator');
var SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR$4]();
riter['return'] = function () { SAFE_CLOSING = true; };
// eslint-disable-next-line no-throw-literal
Array.from(riter, function () { throw 2; });
} catch (e) { /* empty */ }
var _iterDetect = function (exec, skipClosing) {
if (!skipClosing && !SAFE_CLOSING) { return false; }
var safe = false;
try {
var arr = [7];
var iter = arr[ITERATOR$4]();
iter.next = function () { return { done: safe = true }; };
arr[ITERATOR$4] = function () { return iter; };
exec(arr);
} catch (e) { /* empty */ }
return safe;
};
var LIBRARY$1 = _library;
var global$4 = _global;
var ctx$1 = _ctx;
var classof$1 = _classof;
var $export$3 = _export;
var isObject$3 = _isObject;
var aFunction$1 = _aFunction;
var anInstance = _anInstance;
var forOf = _forOf;
var speciesConstructor = _speciesConstructor;
var task = _task.set;
var microtask = _microtask();
var newPromiseCapabilityModule = _newPromiseCapability;
var perform = _perform;
var promiseResolve = _promiseResolve;
var PROMISE = 'Promise';
var TypeError$1 = global$4.TypeError;
var process$1 = global$4.process;
var $Promise = global$4[PROMISE];
var isNode = classof$1(process$1) == 'process';
var empty = function () { /* empty */ };
var Internal;
var newGenericPromiseCapability;
var OwnPromiseCapability;
var Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
var USE_NATIVE = !!function () {
try {
// correct subclassing with @@species support
var promise = $Promise.resolve(1);
var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
exec(empty, empty);
};
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
} catch (e) { /* empty */ }
}();
// helpers
var isThenable = function (it) {
var then;
return isObject$3(it) && typeof (then = it.then) == 'function' ? then : false;
};
var notify$1 = function (promise, isReject) {
if (promise._n) { return; }
promise._n = true;
var chain = promise._c;
microtask(function () {
var value = promise._v;
var ok = promise._s == 1;
var i = 0;
var run = function (reaction) {
var handler = ok ? reaction.ok : reaction.fail;
var resolve = reaction.resolve;
var reject = reaction.reject;
var domain = reaction.domain;
var result, then;
try {
if (handler) {
if (!ok) {
if (promise._h == 2) { onHandleUnhandled(promise); }
promise._h = 1;
}
if (handler === true) { result = value; }
else {
if (domain) { domain.enter(); }
result = handler(value);
if (domain) { domain.exit(); }
}
if (result === reaction.promise) {
reject(TypeError$1('Promise-chain cycle'));
} else if (then = isThenable(result)) {
then.call(result, resolve, reject);
} else { resolve(result); }
} else { reject(value); }
} catch (e) {
reject(e);
}
};
while (chain.length > i) { run(chain[i++]); } // variable length - can't use forEach
promise._c = [];
promise._n = false;
if (isReject && !promise._h) { onUnhandled(promise); }
});
};
var onUnhandled = function (promise) {
task.call(global$4, function () {
var value = promise._v;
var unhandled = isUnhandled(promise);
var result, handler, console;
if (unhandled) {
result = perform(function () {
if (isNode) {
process$1.emit('unhandledRejection', value, promise);
} else if (handler = global$4.onunhandledrejection) {
handler({ promise: promise, reason: value });
} else if ((console = global$4.console) && console.error) {
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if (unhandled && result.e) { throw result.v; }
});
};
var isUnhandled = function (promise) {
return promise._h !== 1 && (promise._a || promise._c).length === 0;
};
var onHandleUnhandled = function (promise) {
task.call(global$4, function () {
var handler;
if (isNode) {
process$1.emit('rejectionHandled', promise);
} else if (handler = global$4.onrejectionhandled) {
handler({ promise: promise, reason: promise._v });
}
});
};
var $reject = function (value) {
var promise = this;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if (!promise._a) { promise._a = promise._c.slice(); }
notify$1(promise, true);
};
var $resolve = function (value) {
var promise = this;
var then;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if (promise === value) { throw TypeError$1("Promise can't be resolved itself"); }
if (then = isThenable(value)) {
microtask(function () {
var wrapper = { _w: promise, _d: false }; // wrap
try {
then.call(value, ctx$1($resolve, wrapper, 1), ctx$1($reject, wrapper, 1));
} catch (e) {
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify$1(promise, false);
}
} catch (e) {
$reject.call({ _w: promise, _d: false }, e); // wrap
}
};
// constructor polyfill
if (!USE_NATIVE) {
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor) {
anInstance(this, $Promise, PROMISE, '_h');
aFunction$1(executor);
Internal.call(this);
try {
executor(ctx$1($resolve, this, 1), ctx$1($reject, this, 1));
} catch (err) {
$reject.call(this, err);
}
};
// eslint-disable-next-line no-unused-vars
Internal = function Promise(executor) {
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = _redefineAll($Promise.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected) {
var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
reaction.domain = isNode ? process$1.domain : undefined;
this._c.push(reaction);
if (this._a) { this._a.push(reaction); }
if (this._s) { notify$1(this, false); }
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function (onRejected) {
return this.then(undefined, onRejected);
}
});
OwnPromiseCapability = function () {
var promise = new Internal();
this.promise = promise;
this.resolve = ctx$1($resolve, promise, 1);
this.reject = ctx$1($reject, promise, 1);
};
newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
return C === $Promise || C === Wrapper
? new OwnPromiseCapability(C)
: newGenericPromiseCapability(C);
};
}
$export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, { Promise: $Promise });
_setToStringTag($Promise, PROMISE);
_setSpecies(PROMISE);
Wrapper = _core[PROMISE];
// statics
$export$3($export$3.S + $export$3.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r) {
var capability = newPromiseCapability(this);
var $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
$export$3($export$3.S + $export$3.F * (LIBRARY$1 || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x) {
return promiseResolve(LIBRARY$1 && this === Wrapper ? $Promise : this, x);
}
});
$export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(function (iter) {
$Promise.all(iter)['catch'](empty);
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var resolve = capability.resolve;
var reject = capability.reject;
var result = perform(function () {
var values = [];
var index = 0;
var remaining = 1;
forOf(iterable, false, function (promise) {
var $index = index++;
var alreadyCalled = false;
values.push(undefined);
remaining++;
C.resolve(promise).then(function (value) {
if (alreadyCalled) { return; }
alreadyCalled = true;
values[$index] = value;
--remaining || resolve(values);
}, reject);
});
--remaining || resolve(values);
});
if (result.e) { reject(result.v); }
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var reject = capability.reject;
var result = perform(function () {
forOf(iterable, false, function (promise) {
C.resolve(promise).then(capability.resolve, reject);
});
});
if (result.e) { reject(result.v); }
return capability.promise;
}
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* This file will hack `console` methods by `WXEnvironment.logLevel`.
* So we can control how many and which messages will be sent by change the log level.
* Additionally in native platform the message content must be primitive values and
* using `nativeLog(...args, logLevelMark)` so we create a new `console` object in
* global add a format process for its methods.
*/
var LEVELS = ['off', 'error', 'warn', 'info', 'log', 'debug'];
var levelMap = {};
var originalConsole = global.console;
/**
* Hack console for native environment.
*/
function setNativeConsole () {
generateLevelMap();
/* istanbul ignore next */
// mock console in native environment
if (global.WXEnvironment && global.WXEnvironment.platform !== 'Web') {
global.console = {
debug: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('debug')) { global.nativeLog.apply(global, format(args).concat( ['__DEBUG'] )); }
},
log: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('log')) { global.nativeLog.apply(global, format(args).concat( ['__LOG'] )); }
},
info: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('info')) { global.nativeLog.apply(global, format(args).concat( ['__INFO'] )); }
},
warn: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('warn')) { global.nativeLog.apply(global, format(args).concat( ['__WARN'] )); }
},
error: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('error')) { global.nativeLog.apply(global, format(args).concat( ['__ERROR'] )); }
}
};
}
// Web or Node
else {
var debug = console.debug;
var log = console.log;
var info = console.info;
var warn = console.warn;
var error = console.error;
console.__ori__ = { debug: debug, log: log, info: info, warn: warn, error: error };
console.debug = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('debug')) { console.__ori__.debug.apply(console, args); }
};
console.log = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('log')) { console.__ori__.log.apply(console, args); }
};
console.info = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('info')) { console.__ori__.info.apply(console, args); }
};
console.warn = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('warn')) { console.__ori__.warn.apply(console, args); }
};
console.error = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('error')) { console.__ori__.error.apply(console, args); }
};
}
}
/**
* Reset hacked console to original.
*/
/* istanbul ignore next */
function resetNativeConsole () {
levelMap = {};
global.console = originalConsole;
}
/**
* Generate map for which types of message will be sent in a certain message level
* as the order of LEVELS.
*/
function generateLevelMap () {
LEVELS.forEach(function (level) {
var levelIndex = LEVELS.indexOf(level);
levelMap[level] = {};
LEVELS.forEach(function (type) {
var typeIndex = LEVELS.indexOf(type);
if (typeIndex <= levelIndex) {
levelMap[level][type] = true;
}
});
});
}
/**
* Check if a certain type of message will be sent in current log level of env.
* @param {string} type
* @return {boolean}
*/
function checkLevel (type) {
var logLevel = (global.WXEnvironment && global.WXEnvironment.logLevel) || 'log';
return levelMap[logLevel] && levelMap[logLevel][type]
}
/**
* Convert all log arguments into primitive values.
* @param {array} args
* @return {array}
*/
/* istanbul ignore next */
function format (args) {
return args.map(function (v) {
var type = Object.prototype.toString.call(v);
if (type.toLowerCase() === '[object object]') {
v = JSON.stringify(v);
}
else {
v = String(v);
}
return v
})
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Polyfill `setTimeout` on Android V8 using native method
* `setTimeoutNative(callbackId, time)` and JS method
* `setTimeoutCallback(callbackId)`.
* This polyfill is only used in virtual-DOM diff & flush agorithm. Not
* accessed by JS Bundle code (The timer APIs polyfill for JS Bundle is in
* `html5/default/app/ctrl.js`).
*/
var originalSetTimeout = global.setTimeout;
var setTimeoutNative = global.setTimeoutNative;
/**
* Set up native timer
*/
/* istanbul ignore next */
function setNativeTimer () {
if (typeof setTimeout === 'undefined' &&
typeof setTimeoutNative === 'function') {
var timeoutMap = {};
var timeoutId = 0;
global.setTimeout = function (cb, time) {
timeoutMap[++timeoutId] = cb;
setTimeoutNative(timeoutId.toString(), time);
};
global.setTimeoutCallback = function (id) {
if (typeof timeoutMap[id] === 'function') {
timeoutMap[id]();
delete timeoutMap[id];
}
};
}
}
/* istanbul ignore next */
function resetNativeTimer () {
global.setTimeout = originalSetTimeout;
global.setTimeoutCallback = null;
}
setNativeTimer();
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Freeze the prototype of javascript build-in objects.
*/
/* istanbul ignore next */
function freezePrototype$1 () {
Object.freeze(Object);
Object.freeze(Array);
// Object.freeze(Object.prototype)
freezeObjectProto();
Object.freeze(Array.prototype);
Object.freeze(String.prototype);
Object.freeze(Number.prototype);
Object.freeze(Boolean.prototype);
// Object.freeze(Error.prototype)
freezeErrorProto();
Object.freeze(Date.prototype);
Object.freeze(RegExp.prototype);
}
function freezeObjectProto () {
var proto = Object.prototype;
var protoName = 'Object.prototype';
freezeProtoProperty(proto, '__defineGetter__', protoName);
freezeProtoProperty(proto, '__defineSetter__', protoName);
freezeProtoProperty(proto, '__lookupGetter__', protoName);
freezeProtoProperty(proto, '__lookupSetter__', protoName);
freezeProtoProperty(proto, 'constructor', protoName);
freezeProtoProperty(proto, 'hasOwnProperty', protoName);
freezeProtoProperty(proto, 'isPrototypeOf', protoName);
freezeProtoProperty(proto, 'propertyIsEnumerable', protoName);
freezeProtoProperty(proto, 'toLocaleString', protoName);
freezeProtoProperty(proto, 'toString', protoName);
freezeProtoProperty(proto, 'valueOf', protoName);
Object.seal(proto);
}
function freezeErrorProto () {
var proto = Error.prototype;
var protoName = 'Error.prototype';
freezeProtoProperty(proto, 'name', protoName);
freezeProtoProperty(proto, 'message', protoName);
freezeProtoProperty(proto, 'toString', protoName);
freezeProtoProperty(proto, 'constructor', protoName);
Object.seal(proto);
}
function freezeProtoProperty (proto, propertyName, protoName) {
if (!proto.hasOwnProperty(propertyName)) {
return
}
var origin = proto[propertyName];
Object.defineProperty(proto, propertyName, {
get: function () {
return origin
},
set: function (value) {
if (this === proto) {
throw Error(("Cannot assign to read only property " + propertyName + " of " + protoName))
}
Object.defineProperty(this, propertyName, {
value: value,
writable: true
});
return value
}
});
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// import promise hack and polyfills
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Get a unique id.
*/
var nextNodeRef = 1;
function uniqueId () {
return (nextNodeRef++).toString()
}
function typof (v) {
var s = Object.prototype.toString.call(v);
return s.substring(8, s.length - 1)
}
function bufferToBase64 (buffer) {
if (typeof btoa !== 'function') {
return ''
}
var string = Array.prototype.map.call(
new Uint8Array(buffer),
function (code) { return String.fromCharCode(code); }
).join('');
return btoa(string) // eslint-disable-line no-undef
}
function base64ToBuffer (base64) {
if (typeof atob !== 'function') {
return new ArrayBuffer(0)
}
var string = atob(base64); // eslint-disable-line no-undef
var array = new Uint8Array(string.length);
Array.prototype.forEach.call(string, function (ch, i) {
array[i] = ch.charCodeAt(0);
});
return array.buffer
}
/**
* Detect if the param is falsy or empty
* @param {any} any
*/
function isEmpty$1 (any) {
if (!any || typeof any !== 'object') {
return true
}
for (var key in any) {
if (Object.prototype.hasOwnProperty.call(any, key)) {
return false
}
}
return true
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Normalize a primitive value.
* @param {any} v
* @return {primitive}
*/
function normalizePrimitive (v) {
var type = typof(v);
switch (type) {
case 'Undefined':
case 'Null':
return ''
case 'RegExp':
return v.toString()
case 'Date':
return v.toISOString()
case 'Number':
case 'String':
case 'Boolean':
case 'Array':
case 'Object':
return v
case 'ArrayBuffer':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v)
}
case 'Int8Array':
case 'Uint8Array':
case 'Uint8ClampedArray':
case 'Int16Array':
case 'Uint16Array':
case 'Int32Array':
case 'Uint32Array':
case 'Float32Array':
case 'Float64Array':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v.buffer)
}
default:
return JSON.stringify(v)
}
}
function decodePrimitive (data) {
if (typof(data) === 'Object') {
// decode base64 into binary
if (data['@type'] && data['@type'] === 'binary') {
return base64ToBuffer(data.base64 || '')
}
var realData = {};
for (var key in data) {
realData[key] = decodePrimitive(data[key]);
}
return realData
}
if (typof(data) === 'Array') {
return data.map(decodePrimitive)
}
return data
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getHookKey (componentId, type, hookName) {
return (type + "@" + hookName + "#" + componentId)
}
/**
* For general callback management of a certain Weex instance.
* Because function can not passed into native, so we create callback
* callback id for each function and pass the callback id into native
* in fact. And when a callback called from native, we can find the real
* callback through the callback id we have passed before.
*/
var CallbackManager = function CallbackManager (instanceId) {
this.instanceId = String(instanceId);
this.lastCallbackId = 0;
this.callbacks = {};
this.hooks = {};
};
CallbackManager.prototype.add = function add (callback) {
this.lastCallbackId++;
this.callbacks[this.lastCallbackId] = callback;
return this.lastCallbackId
};
CallbackManager.prototype.remove = function remove (callbackId) {
var callback = this.callbacks[callbackId];
delete this.callbacks[callbackId];
return callback
};
CallbackManager.prototype.registerHook = function registerHook (componentId, type, hookName, hookFunction) {
// TODO: validate arguments
var key = getHookKey(componentId, type, hookName);
if (this.hooks[key]) {
console.warn(("[JS Framework] Override an existing component hook \"" + key + "\"."));
}
this.hooks[key] = hookFunction;
};
CallbackManager.prototype.triggerHook = function triggerHook (componentId, type, hookName, options) {
if ( options === void 0 ) options = {};
// TODO: validate arguments
var key = getHookKey(componentId, type, hookName);
var hookFunction = this.hooks[key];
if (typeof hookFunction !== 'function') {
console.error(("[JS Framework] Invalid hook function type (" + (typeof hookFunction) + ") on \"" + key + "\"."));
return null
}
var result = null;
try {
result = hookFunction.apply(null, options.args || []);
}
catch (e) {
console.error(("[JS Framework] Failed to execute the hook function on \"" + key + "\"."));
}
return result
};
CallbackManager.prototype.consume = function consume (callbackId, data, ifKeepAlive) {
var callback = this.callbacks[callbackId];
if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) {
delete this.callbacks[callbackId];
}
if (typeof callback === 'function') {
return callback(decodePrimitive(data))
}
return new Error(("invalid callback id \"" + callbackId + "\""))
};
CallbackManager.prototype.close = function close () {
this.callbacks = {};
this.hooks = {};
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var docMap = {};
/**
* Add a document object into docMap.
* @param {string} id
* @param {object} document
*/
function addDoc (id, doc) {
if (id) {
docMap[id] = doc;
}
}
/**
* Get the document object by id.
* @param {string} id
*/
function getDoc (id) {
return docMap[id]
}
/**
* Remove the document from docMap by id.
* @param {string} id
*/
function removeDoc (id) {
delete docMap[id];
}
/**
* @deprecated
* Get listener by document id.
* @param {string} id
* @return {object} listener
*/
/**
* Get TaskCenter instance by id.
* @param {string} id
* @return {object} TaskCenter
*/
function getTaskCenter (id) {
var doc = docMap[id];
if (doc && doc.taskCenter) {
return doc.taskCenter
}
return null
}
/**
* Append body node to documentElement.
* @param {object} document
* @param {object} node
* @param {object} before
*/
function appendBody (doc, node, before) {
var documentElement = doc.documentElement;
if (documentElement.pureChildren.length > 0 || node.parentNode) {
return
}
var children = documentElement.children;
var beforeIndex = children.indexOf(before);
if (beforeIndex < 0) {
children.push(node);
}
else {
children.splice(beforeIndex, 0, node);
}
if (node.nodeType === 1) {
if (node.role === 'body') {
node.docId = doc.id;
node.ownerDocument = doc;
node.parentNode = documentElement;
linkParent(node, documentElement);
}
else {
node.children.forEach(function (child) {
child.parentNode = node;
});
setBody(doc, node);
node.docId = doc.id;
node.ownerDocument = doc;
linkParent(node, documentElement);
delete doc.nodeMap[node.nodeId];
}
documentElement.pureChildren.push(node);
sendBody(doc, node);
}
else {
node.parentNode = documentElement;
doc.nodeMap[node.ref] = node;
}
}
function sendBody (doc, node) {
var body = node.toJSON();
if (doc && doc.taskCenter && typeof doc.taskCenter.send === 'function') {
doc.taskCenter.send('dom', { action: 'createBody' }, [body]);
}
}
/**
* Set up body node.
* @param {object} document
* @param {object} element
*/
function setBody (doc, el) {
el.role = 'body';
el.depth = 1;
delete doc.nodeMap[el.nodeId];
el.ref = '_root';
doc.nodeMap._root = el;
doc.body = el;
}
/**
* Establish the connection between parent and child node.
* @param {object} child node
* @param {object} parent node
*/
function linkParent (node, parent) {
node.parentNode = parent;
if (parent.docId) {
node.docId = parent.docId;
node.ownerDocument = parent.ownerDocument;
node.ownerDocument.nodeMap[node.nodeId] = node;
node.depth = parent.depth + 1;
}
node.children.forEach(function (child) {
linkParent(child, node);
});
}
/**
* Get the next sibling element.
* @param {object} node
*/
function nextElement (node) {
while (node) {
if (node.nodeType === 1) {
return node
}
node = node.nextSibling;
}
}
/**
* Get the previous sibling element.
* @param {object} node
*/
function previousElement (node) {
while (node) {
if (node.nodeType === 1) {
return node
}
node = node.previousSibling;
}
}
/**
* Insert a node into list at the specified index.
* @param {object} target node
* @param {array} list
* @param {number} newIndex
* @param {boolean} changeSibling
* @return {number} newIndex
*/
function insertIndex (target, list, newIndex, changeSibling) {
/* istanbul ignore next */
if (newIndex < 0) {
newIndex = 0;
}
var before = list[newIndex - 1];
var after = list[newIndex];
list.splice(newIndex, 0, target);
if (changeSibling) {
before && (before.nextSibling = target);
target.previousSibling = before;
target.nextSibling = after;
after && (after.previousSibling = target);
}
return newIndex
}
/**
* Move the node to a new index in list.
* @param {object} target node
* @param {array} list
* @param {number} newIndex
* @param {boolean} changeSibling
* @return {number} newIndex
*/
function moveIndex (target, list, newIndex, changeSibling) {
var index = list.indexOf(target);
/* istanbul ignore next */
if (index < 0) {
return -1
}
if (changeSibling) {
var before = list[index - 1];
var after = list[index + 1];
before && (before.nextSibling = after);
after && (after.previousSibling = before);
}
list.splice(index, 1);
var newIndexAfter = newIndex;
if (index <= newIndex) {
newIndexAfter = newIndex - 1;
}
var beforeNew = list[newIndexAfter - 1];
var afterNew = list[newIndexAfter];
list.splice(newIndexAfter, 0, target);
if (changeSibling) {
beforeNew && (beforeNew.nextSibling = target);
target.previousSibling = beforeNew;
target.nextSibling = afterNew;
afterNew && (afterNew.previousSibling = target);
}
if (index === newIndexAfter) {
return -1
}
return newIndex
}
/**
* Remove the node from list.
* @param {object} target node
* @param {array} list
* @param {boolean} changeSibling
*/
function removeIndex (target, list, changeSibling) {
var index = list.indexOf(target);
/* istanbul ignore next */
if (index < 0) {
return
}
if (changeSibling) {
var before = list[index - 1];
var after = list[index + 1];
before && (before.nextSibling = after);
after && (after.previousSibling = before);
}
list.splice(index, 1);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Node = function Node () {
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.children = [];
this.pureChildren = [];
this.parentNode = null;
this.nextSibling = null;
this.previousSibling = null;
};
/**
* Destroy current node, and remove itself form nodeMap.
*/
Node.prototype.destroy = function destroy () {
var doc = getDoc(this.docId);
if (doc) {
delete this.docId;
delete doc.nodeMap[this.nodeId];
}
this.children.forEach(function (child) {
child.destroy();
});
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Element$2;
function setElement (El) {
Element$2 = El;
}
/**
* A map which stores all type of elements.
* @type {Object}
*/
var registeredElements = {};
/**
* Register an extended element type with component methods.
* @param {string} type component type
* @param {array} methods a list of method names
*/
function registerElement (type, methods) {
// Skip when no special component methods.
if (!methods || !methods.length) {
return
}
// Init constructor.
var WeexElement = (function (Element) {
function WeexElement () {
Element.apply(this, arguments);
}if ( Element ) WeexElement.__proto__ = Element;
WeexElement.prototype = Object.create( Element && Element.prototype );
WeexElement.prototype.constructor = WeexElement;
return WeexElement;
}(Element$2));
// Add methods to prototype.
methods.forEach(function (methodName) {
WeexElement.prototype[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send('component', {
ref: this.ref,
component: type,
method: methodName
}, args)
}
};
});
// Add to element type map.
registeredElements[type] = WeexElement;
}
function getWeexElement (type) {
return registeredElements[type]
}
/**
* Clear all element types. Only for testing.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_TAG_NAME = 'div';
var BUBBLE_EVENTS = [
'click', 'longpress', 'touchstart', 'touchmove', 'touchend',
'panstart', 'panmove', 'panend', 'horizontalpan', 'verticalpan', 'swipe'
];
function registerNode (docId, node) {
var doc = getDoc(docId);
doc.nodeMap[node.nodeId] = node;
}
var Element = (function (Node$$1) {
function Element (type, props, isExtended) {
if ( type === void 0 ) type = DEFAULT_TAG_NAME;
Node$$1.call(this);
var WeexElement = getWeexElement(type);
if (WeexElement && !isExtended) {
return new WeexElement(type, props, true)
}
props = props || {};
this.nodeType = 1;
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.type = type;
this.attr = props.attr || {};
this.style = props.style || {};
this.classStyle = props.classStyle || {};
this.event = {};
this.children = [];
this.pureChildren = [];
}
if ( Node$$1 ) Element.__proto__ = Node$$1;
Element.prototype = Object.create( Node$$1 && Node$$1.prototype );
Element.prototype.constructor = Element;
/**
* Append a child node.
* @param {object} node
* @return {undefined | number} the signal sent by native
*/
Element.prototype.appendChild = function appendChild (node) {
if (node.parentNode && node.parentNode !== this) {
return
}
/* istanbul ignore else */
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.length, true);
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
insertIndex(node, this.pureChildren, this.pureChildren.length);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), -1]
)
}
}
}
else {
moveIndex(node, this.children, this.children.length, true);
if (node.nodeType === 1) {
var index = moveIndex(node, this.pureChildren, this.pureChildren.length);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index]
)
}
}
}
};
/**
* Insert a node before specified node.
* @param {object} node
* @param {object} before
* @return {undefined | number} the signal sent by native
*/
Element.prototype.insertBefore = function insertBefore (node, before) {
if (node.parentNode && node.parentNode !== this) {
return
}
if (node === before || (node.nextSibling && node.nextSibling === before)) {
return
}
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.indexOf(before), true);
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
var pureBefore = nextElement(before);
var index = insertIndex(
node,
this.pureChildren,
pureBefore
? this.pureChildren.indexOf(pureBefore)
: this.pureChildren.length
);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), index]
)
}
}
}
else {
moveIndex(node, this.children, this.children.indexOf(before), true);
if (node.nodeType === 1) {
var pureBefore$1 = nextElement(before);
/* istanbul ignore next */
var index$1 = moveIndex(
node,
this.pureChildren,
pureBefore$1
? this.pureChildren.indexOf(pureBefore$1)
: this.pureChildren.length
);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index$1 >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index$1]
)
}
}
}
};
/**
* Insert a node after specified node.
* @param {object} node
* @param {object} after
* @return {undefined | number} the signal sent by native
*/
Element.prototype.insertAfter = function insertAfter (node, after) {
if (node.parentNode && node.parentNode !== this) {
return
}
if (node === after || (node.previousSibling && node.previousSibling === after)) {
return
}
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.indexOf(after) + 1, true);
/* istanbul ignore else */
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
var index = insertIndex(
node,
this.pureChildren,
this.pureChildren.indexOf(previousElement(after)) + 1
);
var taskCenter = getTaskCenter(this.docId);
/* istanbul ignore else */
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), index]
)
}
}
}
else {
moveIndex(node, this.children, this.children.indexOf(after) + 1, true);
if (node.nodeType === 1) {
var index$1 = moveIndex(
node,
this.pureChildren,
this.pureChildren.indexOf(previousElement(after)) + 1
);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index$1 >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index$1]
)
}
}
}
};
/**
* Remove a child node, and decide whether it should be destroyed.
* @param {object} node
* @param {boolean} preserved
*/
Element.prototype.removeChild = function removeChild (node, preserved) {
if (node.parentNode) {
removeIndex(node, this.children, true);
if (node.nodeType === 1) {
removeIndex(node, this.pureChildren);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'removeElement' },
[node.ref]
);
}
}
}
if (!preserved) {
node.destroy();
}
};
/**
* Clear all child nodes.
*/
Element.prototype.clear = function clear () {
var taskCenter = getTaskCenter(this.docId);
/* istanbul ignore else */
if (taskCenter) {
this.pureChildren.forEach(function (node) {
taskCenter.send(
'dom',
{ action: 'removeElement' },
[node.ref]
);
});
}
this.children.forEach(function (node) {
node.destroy();
});
this.children.length = 0;
this.pureChildren.length = 0;
};
/**
* Set an attribute, and decide whether the task should be send to native.
* @param {string} key
* @param {string | number} value
* @param {boolean} silent
*/
Element.prototype.setAttr = function setAttr (key, value, silent) {
if (this.attr[key] === value && silent !== false) {
return
}
this.attr[key] = value;
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
var result = {};
result[key] = value;
taskCenter.send(
'dom',
{ action: 'updateAttrs' },
[this.ref, result]
);
}
};
/**
* Set batched attributes.
* @param {object} batchedAttrs
* @param {boolean} silent
*/
Element.prototype.setAttrs = function setAttrs (batchedAttrs, silent) {
var this$1 = this;
if (isEmpty$1(batchedAttrs)) { return }
var mutations = {};
for (var key in batchedAttrs) {
if (this$1.attr[key] !== batchedAttrs[key]) {
this$1.attr[key] = batchedAttrs[key];
mutations[key] = batchedAttrs[key];
}
}
if (!isEmpty$1(mutations)) {
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
taskCenter.send(
'dom',
{ action: 'updateAttrs' },
[this.ref, mutations]
);
}
}
};
/**
* Set a style property, and decide whether the task should be send to native.
* @param {string} key
* @param {string | number} value
* @param {boolean} silent
*/
Element.prototype.setStyle = function setStyle (key, value, silent) {
if (this.style[key] === value && silent !== false) {
return
}
this.style[key] = value;
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
var result = {};
result[key] = value;
taskCenter.send(
'dom',
{ action: 'updateStyle' },
[this.ref, result]
);
}
};
/**
* Set batched style properties.
* @param {object} batchedStyles
* @param {boolean} silent
*/
Element.prototype.setStyles = function setStyles (batchedStyles, silent) {
var this$1 = this;
if (isEmpty$1(batchedStyles)) { return }
var mutations = {};
for (var key in batchedStyles) {
if (this$1.style[key] !== batchedStyles[key]) {
this$1.style[key] = batchedStyles[key];
mutations[key] = batchedStyles[key];
}
}
if (!isEmpty$1(mutations)) {
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
taskCenter.send(
'dom',
{ action: 'updateStyle' },
[this.ref, mutations]
);
}
}
};
/**
* Set style properties from class.
* @param {object} classStyle
*/
Element.prototype.setClassStyle = function setClassStyle (classStyle) {
var this$1 = this;
// reset previous class style to empty string
for (var key in this.classStyle) {
this$1.classStyle[key] = '';
}
Object.assign(this.classStyle, classStyle);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'updateStyle' },
[this.ref, this.toStyle()]
);
}
};
/**
* Add an event handler.
* @param {string} event type
* @param {function} event handler
*/
Element.prototype.addEvent = function addEvent (type, handler, params) {
if (!this.event) {
this.event = {};
}
if (!this.event[type]) {
this.event[type] = { handler: handler, params: params };
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'addEvent' },
[this.ref, type]
);
}
}
};
/**
* Remove an event handler.
* @param {string} event type
*/
Element.prototype.removeEvent = function removeEvent (type) {
if (this.event && this.event[type]) {
delete this.event[type];
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'removeEvent' },
[this.ref, type]
);
}
}
};
/**
* Fire an event manually.
* @param {string} type type
* @param {function} event handler
* @param {boolean} isBubble whether or not event bubble
* @param {boolean} options
* @return {} anything returned by handler function
*/
Element.prototype.fireEvent = function fireEvent (type, event, isBubble, options) {
var result = null;
var isStopPropagation = false;
var eventDesc = this.event[type];
if (eventDesc && event) {
var handler = eventDesc.handler;
event.stopPropagation = function () {
isStopPropagation = true;
};
if (options && options.params) {
result = handler.call.apply(handler, [ this ].concat( options.params, [event] ));
}
else {
result = handler.call(this, event);
}
}
if (!isStopPropagation
&& isBubble
&& (BUBBLE_EVENTS.indexOf(type) !== -1)
&& this.parentNode
&& this.parentNode.fireEvent) {
event.currentTarget = this.parentNode;
this.parentNode.fireEvent(type, event, isBubble); // no options
}
return result
};
/**
* Get all styles of current element.
* @return {object} style
*/
Element.prototype.toStyle = function toStyle () {
return Object.assign({}, this.classStyle, this.style)
};
/**
* Convert current element to JSON like object.
* @return {object} element
*/
Element.prototype.toJSON = function toJSON () {
var this$1 = this;
var result = {
ref: this.ref.toString(),
type: this.type,
attr: this.attr,
style: this.toStyle()
};
var event = [];
for (var type in this.event) {
var ref = this$1.event[type];
var params = ref.params;
if (!params) {
event.push(type);
}
else {
event.push({ type: type, params: params });
}
}
if (event.length) {
result.event = event;
}
if (this.pureChildren.length) {
result.children = this.pureChildren.map(function (child) { return child.toJSON(); });
}
return result
};
/**
* Convert to HTML element tag string.
* @return {stirng} html
*/
Element.prototype.toString = function toString () {
return '<' + this.type +
' attr=' + JSON.stringify(this.attr) +
' style=' + JSON.stringify(this.toStyle()) + '>' +
this.pureChildren.map(function (child) { return child.toString(); }).join('') +
'</' + this.type + '>'
};
return Element;
}(Node));
setElement(Element);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var fallback = function () {};
// The API of TaskCenter would be re-design.
var TaskCenter = function TaskCenter (id, sendTasks) {
Object.defineProperty(this, 'instanceId', {
enumerable: true,
value: String(id)
});
Object.defineProperty(this, 'callbackManager', {
enumerable: true,
value: new CallbackManager(id)
});
fallback = sendTasks || function () {};
};
TaskCenter.prototype.callback = function callback (callbackId, data, ifKeepAlive) {
return this.callbackManager.consume(callbackId, data, ifKeepAlive)
};
TaskCenter.prototype.registerHook = function registerHook () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return (ref = this.callbackManager).registerHook.apply(ref, args)
var ref;
};
TaskCenter.prototype.triggerHook = function triggerHook () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return (ref = this.callbackManager).triggerHook.apply(ref, args)
var ref;
};
TaskCenter.prototype.updateData = function updateData (componentId, newData, callback) {
this.send('module', {
module: 'dom',
method: 'updateComponentData'
}, [componentId, newData, callback]);
};
TaskCenter.prototype.destroyCallback = function destroyCallback () {
return this.callbackManager.close()
};
/**
* Normalize a value. Specially, if the value is a function, then generate a function id
* and save it to `CallbackManager`, at last return the function id.
* @param{any} v
* @return {primitive}
*/
TaskCenter.prototype.normalize = function normalize (v) {
var type = typof(v);
if (v && v instanceof Element) {
return v.ref
}
if (v && v._isVue && v.$el instanceof Element) {
return v.$el.ref
}
if (type === 'Function') {
return this.callbackManager.add(v).toString()
}
return normalizePrimitive(v)
};
TaskCenter.prototype.send = function send (type, params, args, options) {
var this$1 = this;
var action = params.action;
var component = params.component;
var ref = params.ref;
var module = params.module;
var method = params.method;
args = args.map(function (arg) { return this$1.normalize(arg); });
switch (type) {
case 'dom':
return this[action](this.instanceId, args)
case 'component':
return this.componentHandler(this.instanceId, ref, method, args, Object.assign({ component: component }, options))
default:
return this.moduleHandler(this.instanceId, module, method, args, options)
}
};
TaskCenter.prototype.callDOM = function callDOM (action, args) {
return this[action](this.instanceId, args)
};
TaskCenter.prototype.callComponent = function callComponent (ref, method, args, options) {
return this.componentHandler(this.instanceId, ref, method, args, options)
};
TaskCenter.prototype.callModule = function callModule (module, method, args, options) {
return this.moduleHandler(this.instanceId, module, method, args, options)
};
function init$2 () {
var DOM_METHODS = {
createFinish: global.callCreateFinish,
updateFinish: global.callUpdateFinish,
refreshFinish: global.callRefreshFinish,
createBody: global.callCreateBody,
addElement: global.callAddElement,
removeElement: global.callRemoveElement,
moveElement: global.callMoveElement,
updateAttrs: global.callUpdateAttrs,
updateStyle: global.callUpdateStyle,
addEvent: global.callAddEvent,
removeEvent: global.callRemoveEvent
};
var proto = TaskCenter.prototype;
var loop = function ( name ) {
var method = DOM_METHODS[name];
proto[name] = method ?
function (id, args) { return method.apply(void 0, [ id ].concat( args )); } :
function (id, args) { return fallback(id, [{ module: 'dom', method: name, args: args }], '-1'); };
};
for (var name in DOM_METHODS) loop( name );
proto.componentHandler = global.callNativeComponent ||
(function (id, ref, method, args, options) { return fallback(id, [{ component: options.component, ref: ref, method: method, args: args }]); });
proto.moduleHandler = global.callNativeModule ||
(function (id, module, method, args) { return fallback(id, [{ module: module, method: method, args: args }]); });
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function fireEvent$1 (document, nodeId, type, event, domChanges, params) {
var el = document.getRef(nodeId);
if (el) {
return document.fireEvent(el, type, event, domChanges, params)
}
return new Error(("invalid element reference \"" + nodeId + "\""))
}
function callback$1 (document, callbackId, data, ifKeepAlive) {
return document.taskCenter.callback(callbackId, data, ifKeepAlive)
}
function componentHook (document, componentId, type, hook, options) {
if (!document || !document.taskCenter) {
console.error("[JS Framework] Can't find \"document\" or \"taskCenter\".");
return null
}
var result = null;
try {
result = document.taskCenter.triggerHook(componentId, type, hook, options);
}
catch (e) {
console.error(("[JS Framework] Failed to trigger the \"" + type + "@" + hook + "\" hook on " + componentId + "."));
}
return result
}
/**
* Accept calls from native (event or callback).
*
* @param {string} id
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks (id, tasks) {
var document = getDoc(id);
if (!document) {
return new Error("[JS Framework] Failed to receiveTasks, "
+ "instance (" + id + ") is not available.")
}
if (Array.isArray(tasks)) {
return tasks.map(function (task) {
switch (task.method) {
case 'callback': return callback$1.apply(void 0, [ document ].concat( task.args ))
case 'fireEventSync':
case 'fireEvent': return fireEvent$1.apply(void 0, [ document ].concat( task.args ))
case 'componentHook': return componentHook.apply(void 0, [ document ].concat( task.args ))
}
})
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var weexModules = {};
/**
* Register native modules information.
* @param {object} newModules
*/
function registerModules (newModules) {
var loop = function ( name ) {
if (!weexModules[name]) {
weexModules[name] = {};
}
newModules[name].forEach(function (method) {
if (typeof method === 'string') {
weexModules[name][method] = true;
}
else {
weexModules[name][method.name] = method.args;
}
});
};
for (var name in newModules) loop( name );
}
/**
* Check whether the module or the method has been registered.
* @param {String} module name
* @param {String} method name (optional)
*/
function isRegisteredModule (name, method) {
if (typeof method === 'string') {
return !!(weexModules[name] && weexModules[name][method])
}
return !!weexModules[name]
}
function getModuleDescription (name) {
return weexModules[name]
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var weexComponents = {};
/**
* Register native components information.
* @param {array} newComponents
*/
function registerComponents (newComponents) {
if (Array.isArray(newComponents)) {
newComponents.forEach(function (component) {
if (!component) {
return
}
if (typeof component === 'string') {
weexComponents[component] = true;
}
else if (typeof component === 'object' && typeof component.type === 'string') {
weexComponents[component.type] = component;
registerElement(component.type, component.methods);
}
});
}
}
/**
* Check whether the component has been registered.
* @param {String} component name
*/
function isRegisteredComponent (name) {
return !!weexComponents[name]
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// JS Services
var services = [];
/**
* Register a JavaScript service.
* A JavaScript service options could have a set of lifecycle methods
* for each Weex instance. For example: create, refresh, destroy.
* For the JS framework maintainer if you want to supply some features
* which need to work well in different Weex instances, even in different
* frameworks separately. You can make a JavaScript service to init
* its variables or classes for each Weex instance when it's created
* and recycle them when it's destroyed.
* @param {object} options Could have { create, refresh, destroy }
* lifecycle methods. In create method it should
* return an object of what variables or classes
* would be injected into the Weex instance.
*/
function register$1 (name, options) {
if (has$5(name)) {
console.warn(("Service \"" + name + "\" has been registered already!"));
}
else {
options = Object.assign({}, options);
services.push({ name: name, options: options });
}
}
/**
* Unregister a JavaScript service by name
* @param {string} name
*/
function unregister (name) {
services.some(function (service, index) {
if (service.name === name) {
services.splice(index, 1);
return true
}
});
}
/**
* Check if a JavaScript service with a certain name existed.
* @param {string} name
* @return {Boolean}
*/
function has$5 (name) {
return indexOf(name) >= 0
}
/**
* Find the index of a JavaScript service by name
* @param {string} name
* @return {number}
*/
function indexOf (name) {
return services.map(function (service) { return service.name; }).indexOf(name)
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function track (id, type, value) {
var taskCenter = getTaskCenter(id);
if (!taskCenter || typeof taskCenter.send !== 'function') {
console.error("[JS Framework] Failed to create tracker!");
return
}
if (!type || !value) {
console.warn(("[JS Framework] Invalid track type (" + type + ") or value (" + value + ")"));
return
}
var label = "jsfm." + type + "." + value;
try {
if (isRegisteredModule('userTrack', 'addPerfPoint')) {
var message = Object.create(null);
message[label] = '4';
taskCenter.send('module', {
module: 'userTrack',
method: 'addPerfPoint'
}, [message]);
}
}
catch (err) {
console.error(("[JS Framework] Failed to trace \"" + label + "\"!"));
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Comment = (function (Node$$1) {
function Comment (value) {
Node$$1.call(this);
this.nodeType = 8;
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.type = 'comment';
this.value = value;
this.children = [];
this.pureChildren = [];
}
if ( Node$$1 ) Comment.__proto__ = Node$$1;
Comment.prototype = Object.create( Node$$1 && Node$$1.prototype );
Comment.prototype.constructor = Comment;
/**
* Convert to HTML comment string.
* @return {stirng} html
*/
Comment.prototype.toString = function toString () {
return '<!-- ' + this.value + ' -->'
};
return Comment;
}(Node));
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Create the action object.
* @param {string} name
* @param {array} arguments
* @return {object} action
*/
function createAction (name, args) {
if ( args === void 0 ) args = [];
return { module: 'dom', method: name, args: args }
}
var Listener = function Listener (id, handler) {
this.id = id;
this.batched = false;
this.updates = [];
if (typeof handler === 'function') {
Object.defineProperty(this, 'handler', {
configurable: true,
enumerable: true,
writable: true,
value: handler
});
}
else {
console.error('[JS Runtime] invalid parameter, handler must be a function');
}
};
/**
* Send the "createFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.createFinish = function createFinish (callback) {
var handler = this.handler;
return handler([createAction('createFinish')], callback)
};
/**
* Send the "updateFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.updateFinish = function updateFinish (callback) {
var handler = this.handler;
return handler([createAction('updateFinish')], callback)
};
/**
* Send the "refreshFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.refreshFinish = function refreshFinish (callback) {
var handler = this.handler;
return handler([createAction('refreshFinish')], callback)
};
/**
* Send the "createBody" signal.
* @param {object} element
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.createBody = function createBody (element) {
var body = element.toJSON();
var children = body.children;
delete body.children;
var actions = [createAction('createBody', [body])];
if (children) {
actions.push.apply(actions, children.map(function (child) {
return createAction('addElement', [body.ref, child, -1])
}));
}
return this.addActions(actions)
};
/**
* Send the "addElement" signal.
* @param {object} element
* @param {stirng} reference id
* @param {number} index
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addElement = function addElement (element, ref, index) {
if (!(index >= 0)) {
index = -1;
}
return this.addActions(createAction('addElement', [ref, element.toJSON(), index]))
};
/**
* Send the "removeElement" signal.
* @param {stirng} reference id
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.removeElement = function removeElement (ref) {
if (Array.isArray(ref)) {
var actions = ref.map(function (r) { return createAction('removeElement', [r]); });
return this.addActions(actions)
}
return this.addActions(createAction('removeElement', [ref]))
};
/**
* Send the "moveElement" signal.
* @param {stirng} target reference id
* @param {stirng} parent reference id
* @param {number} index
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.moveElement = function moveElement (targetRef, parentRef, index) {
return this.addActions(createAction('moveElement', [targetRef, parentRef, index]))
};
/**
* Send the "updateAttrs" signal.
* @param {stirng} reference id
* @param {stirng} key
* @param {stirng} value
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setAttr = function setAttr (ref, key, value) {
var result = {};
result[key] = value;
return this.addActions(createAction('updateAttrs', [ref, result]))
};
/**
* Send the "updateStyle" signal, update a sole style.
* @param {stirng} reference id
* @param {stirng} key
* @param {stirng} value
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setStyle = function setStyle (ref, key, value) {
var result = {};
result[key] = value;
return this.addActions(createAction('updateStyle', [ref, result]))
};
/**
* Send the "updateStyle" signal.
* @param {stirng} reference id
* @param {object} style
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setStyles = function setStyles (ref, style) {
return this.addActions(createAction('updateStyle', [ref, style]))
};
/**
* Send the "addEvent" signal.
* @param {stirng} reference id
* @param {string} event type
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addEvent = function addEvent (ref, type) {
return this.addActions(createAction('addEvent', [ref, type]))
};
/**
* Send the "removeEvent" signal.
* @param {stirng} reference id
* @param {string} event type
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.removeEvent = function removeEvent (ref, type) {
return this.addActions(createAction('removeEvent', [ref, type]))
};
/**
* Default handler.
* @param {object | array} actions
* @param {function} callback
* @return {} anything returned by callback function
*/
Listener.prototype.handler = function handler (actions, cb) {
return cb && cb()
};
/**
* Add actions into updates.
* @param {object | array} actions
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addActions = function addActions (actions) {
var updates = this.updates;
var handler = this.handler;
if (!Array.isArray(actions)) {
actions = [actions];
}
if (this.batched) {
updates.push.apply(updates, actions);
}
else {
return handler(actions)
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Task handler for communication between javascript and native.
*/
var handlerMap = {
createBody: 'callCreateBody',
addElement: 'callAddElement',
removeElement: 'callRemoveElement',
moveElement: 'callMoveElement',
updateAttrs: 'callUpdateAttrs',
updateStyle: 'callUpdateStyle',
addEvent: 'callAddEvent',
removeEvent: 'callRemoveEvent'
};
/**
* Create a task handler.
* @param {string} id
* @param {function} handler
* @return {function} taskHandler
*/
function createHandler (id, handler) {
var defaultHandler = handler || global.callNative;
/* istanbul ignore if */
if (typeof defaultHandler !== 'function') {
console.error('[JS Runtime] no default handler');
}
return function taskHandler (tasks) {
/* istanbul ignore if */
if (!Array.isArray(tasks)) {
tasks = [tasks];
}
for (var i = 0; i < tasks.length; i++) {
var returnValue = dispatchTask(id, tasks[i], defaultHandler);
if (returnValue === -1) {
return returnValue
}
}
}
}
/**
* Check if there is a corresponding available handler in the environment.
* @param {string} module
* @param {string} method
* @return {boolean}
*/
function hasAvailableHandler (module, method) {
return module === 'dom'
&& handlerMap[method]
&& typeof global[handlerMap[method]] === 'function'
}
/**
* Dispatch the task to the specified handler.
* @param {string} id
* @param {object} task
* @param {function} defaultHandler
* @return {number} signal returned from native
*/
function dispatchTask (id, task, defaultHandler) {
var module = task.module;
var method = task.method;
var args = task.args;
if (hasAvailableHandler(module, method)) {
return global[handlerMap[method]].apply(global, [ id ].concat( args, ['-1'] ))
}
return defaultHandler(id, [task], '-1')
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Update all changes for an element.
* @param {object} element
* @param {object} changes
*/
function updateElement (el, changes) {
var attrs = changes.attrs || {};
for (var name in attrs) {
el.setAttr(name, attrs[name], true);
}
var style = changes.style || {};
for (var name$1 in style) {
el.setStyle(name$1, style[name$1], true);
}
}
var Document = function Document (id, url, handler) {
id = id ? id.toString() : '';
this.id = id;
this.URL = url;
addDoc(id, this);
this.nodeMap = {};
var L = Document.Listener || Listener;
this.listener = new L(id, handler || createHandler(id, Document.handler)); // deprecated
this.taskCenter = new TaskCenter(id, handler ? function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return handler.apply(void 0, args);
} : Document.handler);
this.createDocumentElement();
};
/**
* Get the node from nodeMap.
* @param {string} reference id
* @return {object} node
*/
Document.prototype.getRef = function getRef (ref) {
return this.nodeMap[ref]
};
/**
* Turn on batched updates.
*/
Document.prototype.open = function open () {
this.listener.batched = false;
};
/**
* Turn off batched updates.
*/
Document.prototype.close = function close () {
this.listener.batched = true;
};
/**
* Create the document element.
* @return {object} documentElement
*/
Document.prototype.createDocumentElement = function createDocumentElement () {
var this$1 = this;
if (!this.documentElement) {
var el = new Element('document');
el.docId = this.id;
el.ownerDocument = this;
el.role = 'documentElement';
el.depth = 0;
el.ref = '_documentElement';
this.nodeMap._documentElement = el;
this.documentElement = el;
Object.defineProperty(el, 'appendChild', {
configurable: true,
enumerable: true,
writable: true,
value: function (node) {
appendBody(this$1, node);
}
});
Object.defineProperty(el, 'insertBefore', {
configurable: true,
enumerable: true,
writable: true,
value: function (node, before) {
appendBody(this$1, node, before);
}
});
}
return this.documentElement
};
/**
* Create the body element.
* @param {string} type
* @param {objct} props
* @return {object} body element
*/
Document.prototype.createBody = function createBody (type, props) {
if (!this.body) {
var el = new Element(type, props);
setBody(this, el);
}
return this.body
};
/**
* Create an element.
* @param {string} tagName
* @param {objct} props
* @return {object} element
*/
Document.prototype.createElement = function createElement (tagName, props) {
return new Element(tagName, props)
};
/**
* Create an comment.
* @param {string} text
* @return {object} comment
*/
Document.prototype.createComment = function createComment (text) {
return new Comment(text)
};
/**
* Fire an event on specified element manually.
* @param {object} element
* @param {string} event type
* @param {object} event object
* @param {object} dom changes
* @param {object} options
* @return {} anything returned by handler function
*/
Document.prototype.fireEvent = function fireEvent (el, type, event, domChanges, options) {
if (!el) {
return
}
event = event || {};
event.type = event.type || type;
event.target = el;
event.currentTarget = el;
event.timestamp = Date.now();
if (domChanges) {
updateElement(el, domChanges);
}
var isBubble = this.getRef('_root').attr['bubble'] === 'true';
return el.fireEvent(type, event, isBubble, options)
};
/**
* Destroy current document, and remove itself form docMap.
*/
Document.prototype.destroy = function destroy () {
this.taskCenter.destroyCallback();
delete this.listener;
delete this.nodeMap;
delete this.taskCenter;
removeDoc(this.id);
};
// default task handler
Document.handler = null;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var moduleProxies = {};
function setId (weex, id) {
Object.defineProperty(weex, '[[CurrentInstanceId]]', { value: id });
}
function getId (weex) {
return weex['[[CurrentInstanceId]]']
}
function moduleGetter$1 (id, module, method) {
var taskCenter = getTaskCenter(id);
if (!taskCenter || typeof taskCenter.send !== 'function') {
console.error(("[JS Framework] Failed to find taskCenter (" + id + ")."));
return null
}
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return taskCenter.send('module', { module: module, method: method }, args);
}
}
function moduleSetter$1 (id, module, method, fn) {
var taskCenter = getTaskCenter(id);
if (!taskCenter || typeof taskCenter.send !== 'function') {
console.error(("[JS Framework] Failed to find taskCenter (" + id + ")."));
return null
}
if (typeof fn !== 'function') {
console.error(("[JS Framework] " + module + "." + method + " must be assigned as a function."));
return null
}
return function (fn) { return taskCenter.send('module', { module: module, method: method }, [fn]); }
}
var WeexInstance = function WeexInstance (id, config) {
setId(this, String(id));
this.config = config || {};
this.document = new Document(id, this.config.bundleUrl);
this.requireModule = this.requireModule.bind(this);
this.isRegisteredModule = isRegisteredModule;
this.isRegisteredComponent = isRegisteredComponent;
};
WeexInstance.prototype.requireModule = function requireModule (moduleName) {
var id = getId(this);
if (!(id && this.document && this.document.taskCenter)) {
console.error("[JS Framework] Failed to requireModule(\"" + moduleName + "\"), "
+ "instance (" + id + ") doesn't exist anymore.");
return
}
// warn for unknown module
if (!isRegisteredModule(moduleName)) {
console.warn(("[JS Framework] using unregistered weex module \"" + moduleName + "\""));
return
}
// create new module proxy
var proxyName = moduleName + "#" + id;
if (!moduleProxies[proxyName]) {
// create registered module apis
var moduleDefine = getModuleDescription(moduleName);
var moduleApis = {};
var loop = function ( methodName ) {
Object.defineProperty(moduleApis, methodName, {
enumerable: true,
configurable: true,
get: function () { return moduleGetter$1(id, moduleName, methodName); },
set: function (fn) { return moduleSetter$1(id, moduleName, methodName, fn); }
});
};
for (var methodName in moduleDefine) loop( methodName );
// create module Proxy
if (typeof Proxy === 'function') {
moduleProxies[proxyName] = new Proxy(moduleApis, {
get: function get (target, methodName) {
if (methodName in target) {
return target[methodName]
}
console.warn(("[JS Framework] using unregistered method \"" + moduleName + "." + methodName + "\""));
return moduleGetter$1(id, moduleName, methodName)
}
});
}
else {
moduleProxies[proxyName] = moduleApis;
}
}
return moduleProxies[proxyName]
};
WeexInstance.prototype.supports = function supports (condition) {
if (typeof condition !== 'string') { return null }
var res = condition.match(/^@(\w+)\/(\w+)(\.(\w+))?$/i);
if (res) {
var type = res[1];
var name = res[2];
var method = res[4];
switch (type) {
case 'module': return isRegisteredModule(name, method)
case 'component': return isRegisteredComponent(name)
}
}
return null
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var frameworks;
var runtimeConfig;
var versionRegExp = /^\s*\/\/ *(\{[^}]*\}) *\r?\n/;
/**
* Detect a JS Bundle code and make sure which framework it's based to. Each JS
* Bundle should make sure that it starts with a line of JSON comment and is
* more that one line.
* @param {string} code
* @return {object}
*/
function getBundleType (code) {
var result = versionRegExp.exec(code);
if (result) {
try {
var info = JSON.parse(result[1]);
return info.framework
}
catch (e) {}
}
// default bundle type
return 'Weex'
}
function createServices (id, env, config) {
// Init JavaScript services for this instance.
var serviceMap = Object.create(null);
serviceMap.service = Object.create(null);
services.forEach(function (ref) {
var name = ref.name;
var options = ref.options;
{
console.debug(("[JS Runtime] create service " + name + "."));
}
var create = options.create;
if (create) {
var result = create(id, env, config);
Object.assign(serviceMap.service, result);
Object.assign(serviceMap, result.instance);
}
});
delete serviceMap.service.instance;
Object.freeze(serviceMap.service);
return serviceMap
}
var instanceTypeMap = {};
function getFrameworkType (id) {
return instanceTypeMap[id]
}
function createInstanceContext (id, options, data) {
if ( options === void 0 ) options = {};
var weex = new WeexInstance(id, options);
Object.freeze(weex);
var bundleType = options.bundleType || 'Vue';
instanceTypeMap[id] = bundleType;
var framework = runtimeConfig.frameworks[bundleType];
if (!framework) {
return new Error(("[JS Framework] Invalid bundle type \"" + bundleType + "\"."))
}
track(id, 'bundleType', bundleType);
// prepare js service
var services$$1 = createServices(id, { weex: weex, bundleType: bundleType }, runtimeConfig);
Object.freeze(services$$1);
// prepare runtime context
var runtimeContext = Object.create(null);
Object.assign(runtimeContext, services$$1, {
weex: weex,
services: services$$1 // Temporary compatible with some legacy APIs in Rax
});
Object.freeze(runtimeContext);
// prepare instance context
var instanceContext = Object.create(runtimeContext);
if (typeof framework.createInstanceContext === 'function') {
Object.assign(instanceContext, framework.createInstanceContext(id, runtimeContext, data));
}
Object.freeze(instanceContext);
return instanceContext
}
/**
* Check which framework a certain JS Bundle code based to. And create instance
* by this framework.
* @param {string} id
* @param {string} code
* @param {object} config
* @param {object} data
*/
function createInstance (id, code, config, data) {
if (instanceTypeMap[id]) {
return new Error(("The instance id \"" + id + "\" has already been used!"))
}
// Init instance info.
var bundleType = getBundleType(code);
instanceTypeMap[id] = bundleType;
// Init instance config.
config = JSON.parse(JSON.stringify(config || {}));
config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {}));
config.bundleType = bundleType;
var framework = runtimeConfig.frameworks[bundleType];
if (!framework) {
return new Error(("[JS Framework] Invalid bundle type \"" + bundleType + "\"."))
}
if (bundleType === 'Weex') {
console.error("[JS Framework] COMPATIBILITY WARNING: "
+ "Weex DSL 1.0 (.we) framework is no longer supported! "
+ "It will be removed in the next version of WeexSDK, "
+ "your page would be crash if you still using the \".we\" framework. "
+ "Please upgrade it to Vue.js or Rax.");
}
var instanceContext = createInstanceContext(id, config, data);
if (typeof framework.createInstance === 'function') {
// Temporary compatible with some legacy APIs in Rax,
// some Rax page is using the legacy ".we" framework.
if (bundleType === 'Rax' || bundleType === 'Weex') {
var raxInstanceContext = Object.assign({
config: config,
created: Date.now(),
framework: bundleType
}, instanceContext);
return framework.createInstance(id, code, config, data, raxInstanceContext)
}
return framework.createInstance(id, code, config, data, instanceContext)
}
// console.error(`[JS Framework] Can't find available "createInstance" method in ${bundleType}!`)
runInContext(code, instanceContext);
}
/**
* Run js code in a specific context.
* @param {string} code
* @param {object} context
*/
function runInContext (code, context) {
var keys = [];
var args = [];
for (var key in context) {
keys.push(key);
args.push(context[key]);
}
var bundle = "\n (function (global) {\n " + code + "\n })(Object.create(this))\n ";
return (new (Function.prototype.bind.apply( Function, [ null ].concat( keys, [bundle]) ))).apply(void 0, args)
}
/**
* Get the JSON object of the root element.
* @param {string} instanceId
*/
function getRoot (instanceId) {
var document = getDoc(instanceId);
try {
if (document && document.body) {
return document.body.toJSON()
}
}
catch (e) {
console.error("[JS Framework] Failed to get the virtual dom tree.");
return
}
}
var methods = {
createInstance: createInstance,
createInstanceContext: createInstanceContext,
getRoot: getRoot,
getDocument: getDoc,
registerService: register$1,
unregisterService: unregister,
callJS: function callJS (id, tasks) {
var framework = frameworks[getFrameworkType(id)];
if (framework && typeof framework.receiveTasks === 'function') {
return framework.receiveTasks(id, tasks)
}
return receiveTasks(id, tasks)
}
};
/**
* Register methods which will be called for each instance.
* @param {string} methodName
*/
function genInstance (methodName) {
methods[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var id = args[0];
var type = getFrameworkType(id);
if (type && frameworks[type]) {
var result = (ref = frameworks[type])[methodName].apply(ref, args);
var info = { framework: type };
// Lifecycle methods
if (methodName === 'refreshInstance') {
services.forEach(function (service) {
var refresh = service.options.refresh;
if (refresh) {
refresh(id, { info: info, runtime: runtimeConfig });
}
});
}
else if (methodName === 'destroyInstance') {
services.forEach(function (service) {
var destroy = service.options.destroy;
if (destroy) {
destroy(id, { info: info, runtime: runtimeConfig });
}
});
delete instanceTypeMap[id];
}
return result
}
return new Error("[JS Framework] Using invalid instance id "
+ "\"" + id + "\" when calling " + methodName + ".")
var ref;
};
}
/**
* Register methods which init each frameworks.
* @param {string} methodName
* @param {function} sharedMethod
*/
function adaptMethod (methodName, sharedMethod) {
methods[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (typeof sharedMethod === 'function') {
sharedMethod.apply(void 0, args);
}
// TODO: deprecated
for (var name in runtimeConfig.frameworks) {
var framework = runtimeConfig.frameworks[name];
if (framework && framework[methodName]) {
framework[methodName].apply(framework, args);
}
}
};
}
function init$1 (config) {
runtimeConfig = config || {};
frameworks = runtimeConfig.frameworks || {};
init$2();
// Init each framework by `init` method and `config` which contains three
// virtual-DOM Class: `Document`, `Element` & `Comment`, and a JS bridge method:
// `sendTasks(...args)`.
for (var name in frameworks) {
var framework = frameworks[name];
if (typeof framework.init === 'function') {
try {
framework.init(config);
}
catch (e) {}
}
}
adaptMethod('registerComponents', registerComponents);
adaptMethod('registerModules', registerModules);
adaptMethod('registerMethods')
; ['destroyInstance', 'refreshInstance'].forEach(genInstance);
return methods
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config = {
Document: Document, Element: Element, Comment: Comment, Listener: Listener,
TaskCenter: TaskCenter,
sendTasks: function sendTasks () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (typeof callNative === 'function') {
return callNative.apply(void 0, args)
}
return (global.callNative || (function () {})).apply(void 0, args)
}
};
Document.handler = config.sendTasks;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Register framework(s) in JS runtime. Weex supply two layers for 3rd-party
* framework(s): one is the instance management layer, another is the
* virtual-DOM layer.
*/
/* istanbul ignore next */
function freezePrototype$$1 () {
freezePrototype$1();
// Object.freeze(config.Element)
Object.freeze(config.Comment);
Object.freeze(config.Listener);
Object.freeze(config.Document.prototype);
// Object.freeze(config.Element.prototype)
Object.freeze(config.Comment.prototype);
Object.freeze(config.Listener.prototype);
}
var runtime = {
setNativeConsole: setNativeConsole,
resetNativeConsole: resetNativeConsole,
setNativeTimer: setNativeTimer,
resetNativeTimer: resetNativeTimer,
service: { register: register$1, unregister: unregister, has: has$5 },
freezePrototype: freezePrototype$$1,
init: init$1,
config: config
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Mock MessageEvent type
* @param {string} type
* @param {object} dict { data, origin, source, ports }
*
* This type has been simplified.
* https://html.spec.whatwg.org/multipage/comms.html#messageevent
* https://dom.spec.whatwg.org/#interface-event
*/
function MessageEvent (type, dict) {
if ( dict === void 0 ) dict = {};
this.type = type || 'message';
this.data = dict.data || null;
this.origin = dict.origin || '';
this.source = dict.source || null;
this.ports = dict.ports || [];
// inherit properties
this.target = null;
this.timeStamp = Date.now();
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* The polyfill of BroadcastChannel API.
* This api can be used to achieve inter-instance communications.
*
* https://html.spec.whatwg.org/multipage/comms.html#broadcasting-to-other-browsing-contexts
*/
var channels = {};
var instances = {};
/**
* An empty constructor for BroadcastChannel polyfill.
* The real constructor will be defined when a Weex instance created because
* we need to track the channel by Weex instance id.
*/
function BroadcastChannel () {}
/**
* Sends the given message to other BroadcastChannel objects set up for this channel.
* @param {any} message
*/
BroadcastChannel.prototype.postMessage = function (message) {
var this$1 = this;
if (this._closed) {
throw new Error(("BroadcastChannel \"" + (this.name) + "\" is closed."))
}
var subscribers = channels[this.name];
if (subscribers && subscribers.length) {
for (var i = 0; i < subscribers.length; ++i) {
var member = subscribers[i];
if (member._closed || member === this$1) { continue }
if (typeof member.onmessage === 'function') {
member.onmessage(new MessageEvent('message', { data: message }));
}
}
}
};
/**
* Closes the BroadcastChannel object, opening it up to garbage collection.
*/
BroadcastChannel.prototype.close = function () {
var this$1 = this;
if (this._closed) {
return
}
this._closed = true;
// remove itself from channels.
if (channels[this.name]) {
var subscribers = channels[this.name].filter(function (x) { return x !== this$1; });
if (subscribers.length) {
channels[this.name] = subscribers;
}
else {
delete channels[this.name];
}
}
};
var BroadcastChannel$1 = {
create: function (id, env, config) {
instances[id] = [];
if (typeof global.BroadcastChannel === 'function') {
return {}
}
var serviceObject = {
/**
* Returns a new BroadcastChannel object via which messages for the given
* channel name can be sent and received.
* @param {string} name
*/
BroadcastChannel: function (name) {
// the name property is readonly
Object.defineProperty(this, 'name', {
configurable: false,
enumerable: true,
writable: false,
value: String(name)
});
this._closed = false;
this.onmessage = null;
if (!channels[this.name]) {
channels[this.name] = [];
}
channels[this.name].push(this);
instances[id].push(this);
}
};
serviceObject.BroadcastChannel.prototype = BroadcastChannel.prototype;
return {
instance: serviceObject
}
},
destroy: function (id, env) {
instances[id].forEach(function (channel) { return channel.close(); });
delete instances[id];
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var services$1 = {
BroadcastChannel: BroadcastChannel$1
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Setup frameworks with runtime.
* You can package more frameworks by
* passing them as arguments.
*/
var setup = function (frameworks) {
var init = runtime.init;
var config = runtime.config;
config.frameworks = frameworks;
var native = subversion.native;
var transformer = subversion.transformer;
for (var serviceName in services$1) {
runtime.service.register(serviceName, services$1[serviceName]);
}
runtime.freezePrototype();
runtime.setNativeConsole();
// register framework meta info
global.frameworkVersion = native;
global.transformerVersion = transformer;
// init frameworks
var globalMethods = init(config);
// set global methods
var loop = function ( methodName ) {
global[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var ret = globalMethods[methodName].apply(globalMethods, args);
if (ret instanceof Error) {
console.error(ret.toString());
}
return ret
};
};
for (var methodName in globalMethods) loop( methodName );
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config$2 = {};
var instanceMap = {};
function init$3 (cfg) {
config$2.Document = cfg.Document;
config$2.Element = cfg.Element;
config$2.Comment = cfg.Comment;
config$2.sendTasks = cfg.sendTasks;
}
function createInstance$1 (id, code, options, data, serviceObjects) {
if ( options === void 0 ) options = {};
if ( data === void 0 ) data = {};
if ( serviceObjects === void 0 ) serviceObjects = {};
var document = new config$2.Document(id, options.bundleUrl);
var callbacks = {};
var instance = { id: id, data: data, document: document, callbacks: callbacks };
var lastCallbackId = 0;
document.addCallback = function (func) {
lastCallbackId++;
callbacks[lastCallbackId] = func;
return lastCallbackId
};
document.handleCallback = function (funcId, data, ifLast) {
var callback = callbacks[funcId];
if (ifLast) {
delete callbacks[funcId];
}
return callback(data)
};
instanceMap[id] = instance;
var globalObjects = Object.assign({
Document: config$2.Document,
Element: config$2.Element,
Comment: config$2.Comment,
sendTasks: function (tasks) { return config$2.sendTasks(id, tasks, -1); },
options: options,
document: document
}, serviceObjects);
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
globalKeys.push(code);
var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) ));
result.apply(void 0, globalValues);
config$2.sendTasks(id, [{ module: 'dom', method: 'createFinish', args: [] }], -1);
return instance
}
function destroyInstance (id) {
delete instanceMap[id];
}
function getRoot$1 (id) {
return instanceMap[id].document.body.toJSON()
}
function receiveTasks$1 (id, tasks) {
var jsHandlers = {
fireEvent: function (id, ref, type, data, domChanges) {
var ref$1 = instanceMap[id];
var document = ref$1.document;
var el = document.getRef(ref);
return document.fireEvent(el, type, data, domChanges)
},
callback: function (id, funcId, data, ifLast) {
var ref = instanceMap[id];
var document = ref.document;
return document.handleCallback(funcId, data, ifLast)
}
};
var ref = instanceMap[id] || {};
var document = ref.document;
if (document && Array.isArray(tasks)) {
var results = [];
tasks.forEach(function (task) {
var handler = jsHandlers[task.method];
var args = [].concat( task.args );
if (typeof handler === 'function') {
args.unshift(id);
results.push(handler.apply(void 0, args));
}
});
return results
}
}
var Vanilla = Object.freeze({
init: init$3,
createInstance: createInstance$1,
destroyInstance: destroyInstance,
getRoot: getRoot$1,
receiveTasks: receiveTasks$1
});
var factory = createCommonjsModule(function (module) {
'use strict';
module.exports = function weexFactory (exports, document) {
/* */
var emptyObject = Object.freeze({});
// these helpers produces better vm code in JS engines due to their
// explicitness and function inlining
function isUndef (v) {
return v === undefined || v === null
}
function isDef (v) {
return v !== undefined && v !== null
}
function isTrue (v) {
return v === true
}
function isFalse (v) {
return v === false
}
/**
* Check if value is primitive
*/
function isPrimitive (value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
typeof value === 'boolean'
)
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*/
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Get the raw type string of a value e.g. [object Object]
*/
var _toString = Object.prototype.toString;
function toRawType (value) {
return _toString.call(value).slice(8, -1)
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*/
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function isRegExp (v) {
return _toString.call(v) === '[object RegExp]'
}
/**
* Check if val is a valid array index.
*/
function isValidArrayIndex (val) {
var n = parseFloat(String(val));
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString (val) {
return val == null
? ''
: typeof val === 'object'
? JSON.stringify(val, null, 2)
: String(val)
}
/**
* Convert a input value to a number for persistence.
* If the conversion fails, return original string.
*/
function toNumber (val) {
var n = parseFloat(val);
return isNaN(n) ? val : n
}
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
/**
* Check if a tag is a built-in tag.
*/
var isBuiltInTag = makeMap('slot,component', true);
/**
* Check if a attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
/**
* Remove an item from an array
*/
function remove (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether the object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty.call(obj, key)
}
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
});
/**
* Capitalize a string.
*/
var capitalize = cached(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
});
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cached(function (str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
});
/**
* Simple bind, faster than native
*/
function bind (fn, ctx) {
function boundFn (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
// record original fn length
boundFn._length = fn.length;
return boundFn
}
/**
* Convert an Array-like object to a real Array.
*/
function toArray (list, start) {
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret
}
/**
* Mix properties into target object.
*/
function extend (to, _from) {
for (var key in _from) {
to[key] = _from[key];
}
return to
}
/**
* Merge an Array of Objects into a single Object.
*/
function toObject (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
/**
* Perform no operation.
* Stubbing args to make Flow happy without leaving useless transpiled code
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
*/
function noop (a, b, c) {}
/**
* Always return false.
*/
var no = function (a, b, c) { return false; };
/**
* Return same value
*/
var identity = function (_) { return _; };
/**
* Generate a static keys string from compiler modules.
*/
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
*/
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
function looseIndexOf (arr, val) {
for (var i = 0; i < arr.length; i++) {
if (looseEqual(arr[i], val)) { return i }
}
return -1
}
/**
* Ensure a function is called only once.
*/
function once (fn) {
var called = false;
return function () {
if (!called) {
called = true;
fn.apply(this, arguments);
}
}
}
var SSR_ATTR = 'data-server-rendered';
var ASSET_TYPES = [
'component',
'directive',
'filter'
];
var LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated',
'errorCaptured'
];
/* */
var config = ({
/**
* Option merge strategies (used in core/util/options)
*/
// $flow-disable-line
optionMergeStrategies: Object.create(null),
/**
* Whether to suppress warnings.
*/
silent: false,
/**
* Show production mode tip message on boot?
*/
productionTip: "development" !== 'production',
/**
* Whether to enable devtools
*/
devtools: "development" !== 'production',
/**
* Whether to record perf
*/
performance: false,
/**
* Error handler for watcher errors
*/
errorHandler: null,
/**
* Warn handler for watcher warns
*/
warnHandler: null,
/**
* Ignore certain custom elements
*/
ignoredElements: [],
/**
* Custom user key aliases for v-on
*/
// $flow-disable-line
keyCodes: Object.create(null),
/**
* Check if a tag is reserved so that it cannot be registered as a
* component. This is platform-dependent and may be overwritten.
*/
isReservedTag: no,
/**
* Check if an attribute is reserved so that it cannot be used as a component
* prop. This is platform-dependent and may be overwritten.
*/
isReservedAttr: no,
/**
* Check if a tag is an unknown element.
* Platform-dependent.
*/
isUnknownElement: no,
/**
* Get the namespace of an element
*/
getTagNamespace: noop,
/**
* Parse the real tag name for the specific platform.
*/
parsePlatformTagName: identity,
/**
* Check if an attribute must be bound using property, e.g. value
* Platform-dependent.
*/
mustUseProp: no,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
});
/* */
/**
* Check if a string starts with $ or _
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
/**
* Define a property.
*/
function def (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Parse simple path.
*/
var bailRE = /[^\w.$]/;
function parsePath (path) {
if (bailRE.test(path)) {
return
}
var segments = path.split('.');
return function (obj) {
for (var i = 0; i < segments.length; i++) {
if (!obj) { return }
obj = obj[segments[i]];
}
return obj
}
}
/* */
// can we use __proto__?
var hasProto = '__proto__' in {};
// Browser environment sniffing
var inBrowser = typeof window !== 'undefined';
var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
var isIE = UA && /msie|trident/.test(UA);
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
var isEdge = UA && UA.indexOf('edge/') > 0;
var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
// Firefox has a "watch" function on Object.prototype...
var nativeWatch = ({}).watch;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, 'passive', ({
get: function get () {
/* istanbul ignore next */
}
})); // https://github.com/facebook/flow/issues/285
window.addEventListener('test-passive', null, opts);
} catch (e) {}
}
// this needs to be lazy-evaled because vue may be required before
// vue-server-renderer can set VUE_ENV
var _isServer;
var isServerRendering = function () {
if (_isServer === undefined) {
/* istanbul ignore if */
if (!inBrowser && typeof commonjsGlobal !== 'undefined') {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = commonjsGlobal['process'].env.VUE_ENV === 'server';
} else {
_isServer = false;
}
}
return _isServer
};
// detect devtools
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
/* istanbul ignore next */
function isNative (Ctor) {
return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}
var hasSymbol =
typeof Symbol !== 'undefined' && isNative(Symbol) &&
typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
var _Set;
/* istanbul ignore if */ // $flow-disable-line
if (typeof Set !== 'undefined' && isNative(Set)) {
// use native Set when available.
_Set = Set;
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = (function () {
function Set () {
this.set = Object.create(null);
}
Set.prototype.has = function has (key) {
return this.set[key] === true
};
Set.prototype.add = function add (key) {
this.set[key] = true;
};
Set.prototype.clear = function clear () {
this.set = Object.create(null);
};
return Set;
}());
}
/* */
var warn = noop;
var tip = noop;
var generateComponentTrace = (noop); // work around flow check
var formatComponentName = (noop);
{
var hasConsole = typeof console !== 'undefined';
var classifyRE = /(?:^|[-_])(\w)/g;
var classify = function (str) { return str
.replace(classifyRE, function (c) { return c.toUpperCase(); })
.replace(/[-_]/g, ''); };
warn = function (msg, vm) {
var trace = vm ? generateComponentTrace(vm) : '';
if (config.warnHandler) {
config.warnHandler.call(null, msg, vm, trace);
} else if (hasConsole && (!config.silent)) {
console.error(("[Vue warn]: " + msg + trace));
}
};
tip = function (msg, vm) {
if (hasConsole && (!config.silent)) {
console.warn("[Vue tip]: " + msg + (
vm ? generateComponentTrace(vm) : ''
));
}
};
formatComponentName = function (vm, includeFile) {
if (vm.$root === vm) {
return '<Root>'
}
var options = typeof vm === 'function' && vm.cid != null
? vm.options
: vm._isVue
? vm.$options || vm.constructor.options
: vm || {};
var name = options.name || options._componentTag;
var file = options.__file;
if (!name && file) {
var match = file.match(/([^/\\]+)\.vue$/);
name = match && match[1];
}
return (
(name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
(file && includeFile !== false ? (" at " + file) : '')
)
};
var repeat = function (str, n) {
var res = '';
while (n) {
if (n % 2 === 1) { res += str; }
if (n > 1) { str += str; }
n >>= 1;
}
return res
};
generateComponentTrace = function (vm) {
if (vm._isVue && vm.$parent) {
var tree = [];
var currentRecursiveSequence = 0;
while (vm) {
if (tree.length > 0) {
var last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
tree.push(vm);
vm = vm.$parent;
}
return '\n\nfound in\n\n' + tree
.map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
: formatComponentName(vm))); })
.join('\n')
} else {
return ("\n\n(found in " + (formatComponentName(vm)) + ")")
}
};
}
/* */
var uid$1 = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep () {
this.id = uid$1++;
this.subs = [];
};
Dep.prototype.addSub = function addSub (sub) {
this.subs.push(sub);
};
Dep.prototype.removeSub = function removeSub (sub) {
remove(this.subs, sub);
};
Dep.prototype.depend = function depend () {
if (Dep.target) {
Dep.target.addDep(this);
}
};
Dep.prototype.notify = function notify () {
// stabilize the subscriber list first
var subs = this.subs.slice();
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
// the current target watcher being evaluated.
// this is globally unique because there could be only one
// watcher being evaluated at any time.
Dep.target = null;
var targetStack = [];
function pushTarget (_target) {
if (Dep.target) { targetStack.push(Dep.target); }
Dep.target = _target;
}
function popTarget () {
Dep.target = targetStack.pop();
}
/* */
var VNode = function VNode (
tag,
data,
children,
text,
elm,
context,
componentOptions,
asyncFactory
) {
this.tag = tag;
this.data = data;
this.children = children;
this.text = text;
this.elm = elm;
this.ns = undefined;
this.context = context;
this.fnContext = undefined;
this.fnOptions = undefined;
this.fnScopeId = undefined;
this.key = data && data.key;
this.componentOptions = componentOptions;
this.componentInstance = undefined;
this.parent = undefined;
this.raw = false;
this.isStatic = false;
this.isRootInsert = true;
this.isComment = false;
this.isCloned = false;
this.isOnce = false;
this.asyncFactory = asyncFactory;
this.asyncMeta = undefined;
this.isAsyncPlaceholder = false;
};
var prototypeAccessors = { child: { configurable: true } };
// DEPRECATED: alias for componentInstance for backwards compat.
/* istanbul ignore next */
prototypeAccessors.child.get = function () {
return this.componentInstance
};
Object.defineProperties( VNode.prototype, prototypeAccessors );
var createEmptyVNode = function (text) {
if ( text === void 0 ) { text = ''; }
var node = new VNode();
node.text = text;
node.isComment = true;
return node
};
function createTextVNode (val) {
return new VNode(undefined, undefined, undefined, String(val))
}
// optimized shallow clone
// used for static nodes and slot nodes because they may be reused across
// multiple renders, cloning them avoids errors when DOM manipulations rely
// on their elm reference.
function cloneVNode (vnode, deep) {
var componentOptions = vnode.componentOptions;
var cloned = new VNode(
vnode.tag,
vnode.data,
vnode.children,
vnode.text,
vnode.elm,
vnode.context,
componentOptions,
vnode.asyncFactory
);
cloned.ns = vnode.ns;
cloned.isStatic = vnode.isStatic;
cloned.key = vnode.key;
cloned.isComment = vnode.isComment;
cloned.fnContext = vnode.fnContext;
cloned.fnOptions = vnode.fnOptions;
cloned.fnScopeId = vnode.fnScopeId;
cloned.isCloned = true;
if (deep) {
if (vnode.children) {
cloned.children = cloneVNodes(vnode.children, true);
}
if (componentOptions && componentOptions.children) {
componentOptions.children = cloneVNodes(componentOptions.children, true);
}
}
return cloned
}
function cloneVNodes (vnodes, deep) {
var len = vnodes.length;
var res = new Array(len);
for (var i = 0; i < len; i++) {
res[i] = cloneVNode(vnodes[i], deep);
}
return res
}
/*
* not type checking this file because flow doesn't play well with
* dynamically accessing methods on Array prototype
*/
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
].forEach(function (method) {
// cache original method
var original = arrayProto[method];
def(arrayMethods, method, function mutator () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/* */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* By default, when a reactive property is set, the new value is
* also converted to become reactive. However when passing down props,
* we don't want to force conversion because the value may be a nested value
* under a frozen data structure. Converting it would defeat the optimization.
*/
var observerState = {
shouldConvert: true
};
/**
* Observer class that are attached to each observed
* object. Once attached, the observer converts target
* object's property keys into getter/setters that
* collect dependencies and dispatches updates.
*/
var Observer = function Observer (value) {
this.value = value;
this.dep = new Dep();
this.vmCount = 0;
def(value, '__ob__', this);
if (Array.isArray(value)) {
var augment = hasProto
? protoAugment
: copyAugment;
augment(value, arrayMethods, arrayKeys);
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through each property and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*/
Observer.prototype.walk = function walk (obj) {
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
defineReactive(obj, keys[i], obj[keys[i]]);
}
};
/**
* Observe a list of Array items.
*/
Observer.prototype.observeArray = function observeArray (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
// helpers
/**
* Augment an target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment (target, src, keys) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment an target Object or Array by defining
* hidden properties.
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def(target, key, src[key]);
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*/
function observe (value, asRootData) {
if (!isObject(value) || value instanceof VNode) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__;
} else if (
observerState.shouldConvert &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value);
}
if (asRootData && ob) {
ob.vmCount++;
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive (
obj,
key,
val,
customSetter,
shallow
) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
var childOb = !shallow && observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
dep.depend();
if (childOb) {
childOb.dep.depend();
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
/* eslint-enable no-self-compare */
if ("development" !== 'production' && customSetter) {
customSetter();
}
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = !shallow && observe(newVal);
dep.notify();
}
});
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
function set (target, key, val) {
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
if (key in target && !(key in Object.prototype)) {
target[key] = val;
return val
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== 'production' && warn(
'Avoid adding reactive properties to a Vue instance or its root $data ' +
'at runtime - declare it upfront in the data option.'
);
return val
}
if (!ob) {
target[key] = val;
return val
}
defineReactive(ob.value, key, val);
ob.dep.notify();
return val
}
/**
* Delete a property and trigger change if necessary.
*/
function del (target, key) {
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== 'production' && warn(
'Avoid deleting properties on a Vue instance or its root $data ' +
'- just set it to null.'
);
return
}
if (!hasOwn(target, key)) {
return
}
delete target[key];
if (!ob) {
return
}
ob.dep.notify();
}
/**
* Collect dependencies on array elements when the array is touched, since
* we cannot intercept array element access like property getters.
*/
function dependArray (value) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
if (Array.isArray(e)) {
dependArray(e);
}
}
}
/* */
/**
* Option overwriting strategies are functions that handle
* how to merge a parent option value and a child option
* value into the final value.
*/
var strats = config.optionMergeStrategies;
/**
* Options with restrictions
*/
{
strats.el = strats.propsData = function (parent, child, vm, key) {
if (!vm) {
warn(
"option \"" + key + "\" can only be used during instance " +
'creation with the `new` keyword.'
);
}
return defaultStrat(parent, child)
};
}
/**
* Helper that recursively merges two data objects together.
*/
function mergeData (to, from) {
if (!from) { return to }
var key, toVal, fromVal;
var keys = Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
mergeData(toVal, fromVal);
}
}
return to
}
/**
* Data
*/
function mergeDataOrFn (
parentVal,
childVal,
vm
) {
if (!vm) {
// in a Vue.extend merge, both should be functions
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// when parentVal & childVal are both present,
// we need to return a function that returns the
// merged result of both functions... no need to
// check if parentVal is a function here because
// it has to be a function to pass previous merges.
return function mergedDataFn () {
return mergeData(
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
)
}
} else {
return function mergedInstanceDataFn () {
// instance merge
var instanceData = typeof childVal === 'function'
? childVal.call(vm, vm)
: childVal;
var defaultData = typeof parentVal === 'function'
? parentVal.call(vm, vm)
: parentVal;
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function (
parentVal,
childVal,
vm
) {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
"development" !== 'production' && warn(
'The "data" option should be a function ' +
'that returns a per-instance value in component ' +
'definitions.',
vm
);
return parentVal
}
return mergeDataOrFn(parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook (
parentVal,
childVal
) {
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal
}
LIFECYCLE_HOOKS.forEach(function (hook) {
strats[hook] = mergeHook;
});
/**
* Assets
*
* When a vm is present (instance creation), we need to do
* a three-way merge between constructor options, instance
* options and parent options.
*/
function mergeAssets (
parentVal,
childVal,
vm,
key
) {
var res = Object.create(parentVal || null);
if (childVal) {
"development" !== 'production' && assertObjectType(key, childVal, vm);
return extend(res, childVal)
} else {
return res
}
}
ASSET_TYPES.forEach(function (type) {
strats[type + 's'] = mergeAssets;
});
/**
* Watchers.
*
* Watchers hashes should not overwrite one
* another, so we merge them as arrays.
*/
strats.watch = function (
parentVal,
childVal,
vm,
key
) {
// work around Firefox's Object.prototype.watch...
if (parentVal === nativeWatch) { parentVal = undefined; }
if (childVal === nativeWatch) { childVal = undefined; }
/* istanbul ignore if */
if (!childVal) { return Object.create(parentVal || null) }
{
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = {};
extend(ret, parentVal);
for (var key$1 in childVal) {
var parent = ret[key$1];
var child = childVal[key$1];
if (parent && !Array.isArray(parent)) {
parent = [parent];
}
ret[key$1] = parent
? parent.concat(child)
: Array.isArray(child) ? child : [child];
}
return ret
};
/**
* Other object hashes.
*/
strats.props =
strats.methods =
strats.inject =
strats.computed = function (
parentVal,
childVal,
vm,
key
) {
if (childVal && "development" !== 'production') {
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = Object.create(null);
extend(ret, parentVal);
if (childVal) { extend(ret, childVal); }
return ret
};
strats.provide = mergeDataOrFn;
/**
* Default strategy.
*/
var defaultStrat = function (parentVal, childVal) {
return childVal === undefined
? parentVal
: childVal
};
/**
* Validate component names
*/
function checkComponents (options) {
for (var key in options.components) {
validateComponentName(key);
}
}
function validateComponentName (name) {
if (!/^[a-zA-Z][\w-]*$/.test(name)) {
warn(
'Invalid component name: "' + name + '". Component names ' +
'can only contain alphanumeric characters and the hyphen, ' +
'and must start with a letter.'
);
}
if (isBuiltInTag(name) || config.isReservedTag(name)) {
warn(
'Do not use built-in or reserved HTML elements as component ' +
'id: ' + name
);
}
}
/**
* Ensure all props option syntax are normalized into the
* Object-based format.
*/
function normalizeProps (options, vm) {
var props = options.props;
if (!props) { return }
var res = {};
var i, val, name;
if (Array.isArray(props)) {
i = props.length;
while (i--) {
val = props[i];
if (typeof val === 'string') {
name = camelize(val);
res[name] = { type: null };
} else {
warn('props must be strings when using array syntax.');
}
}
} else if (isPlainObject(props)) {
for (var key in props) {
val = props[key];
name = camelize(key);
if ("development" !== 'production' && isPlainObject(val)) {
validatePropObject(name, val, vm);
}
res[name] = isPlainObject(val)
? val
: { type: val };
}
} else {
warn(
"Invalid value for option \"props\": expected an Array or an Object, " +
"but got " + (toRawType(props)) + ".",
vm
);
}
options.props = res;
}
/**
* Validate whether a prop object keys are valid.
*/
var propOptionsRE = /^(type|default|required|validator)$/;
function validatePropObject (
propName,
prop,
vm
) {
for (var key in prop) {
if (!propOptionsRE.test(key)) {
warn(
("Invalid key \"" + key + "\" in validation rules object for prop \"" + propName + "\"."),
vm
);
}
}
}
/**
* Normalize all injections into Object-based format
*/
function normalizeInject (options, vm) {
var inject = options.inject;
if (!inject) { return }
var normalized = options.inject = {};
if (Array.isArray(inject)) {
for (var i = 0; i < inject.length; i++) {
normalized[inject[i]] = { from: inject[i] };
}
} else if (isPlainObject(inject)) {
for (var key in inject) {
var val = inject[key];
normalized[key] = isPlainObject(val)
? extend({ from: key }, val)
: { from: val };
}
} else {
warn(
"Invalid value for option \"inject\": expected an Array or an Object, " +
"but got " + (toRawType(inject)) + ".",
vm
);
}
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives (options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def = dirs[key];
if (typeof def === 'function') {
dirs[key] = { bind: def, update: def };
}
}
}
}
function assertObjectType (name, value, vm) {
if (!isPlainObject(value)) {
warn(
"Invalid value for option \"" + name + "\": expected an Object, " +
"but got " + (toRawType(value)) + ".",
vm
);
}
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
function mergeOptions (
parent,
child,
vm
) {
{
checkComponents(child);
}
if (typeof child === 'function') {
child = child.options;
}
normalizeProps(child, vm);
normalizeInject(child, vm);
normalizeDirectives(child);
var extendsFrom = child.extends;
if (extendsFrom) {
parent = mergeOptions(parent, extendsFrom, vm);
}
if (child.mixins) {
for (var i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm);
}
}
var options = {};
var key;
for (key in parent) {
mergeField(key);
}
for (key in child) {
if (!hasOwn(parent, key)) {
mergeField(key);
}
}
function mergeField (key) {
var strat = strats[key] || defaultStrat;
options[key] = strat(parent[key], child[key], vm, key);
}
return options
}
/**
* Resolve an asset.
* This function is used because child instances need access
* to assets defined in its ancestor chain.
*/
function resolveAsset (
options,
type,
id,
warnMissing
) {
/* istanbul ignore if */
if (typeof id !== 'string') {
return
}
var assets = options[type];
// check local registration variations first
if (hasOwn(assets, id)) { return assets[id] }
var camelizedId = camelize(id);
if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
var PascalCaseId = capitalize(camelizedId);
if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
// fallback to prototype chain
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
if ("development" !== 'production' && warnMissing && !res) {
warn(
'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
options
);
}
return res
}
/* */
function validateProp (
key,
propOptions,
propsData,
vm
) {
var prop = propOptions[key];
var absent = !hasOwn(propsData, key);
var value = propsData[key];
// handle boolean props
if (isType(Boolean, prop.type)) {
if (absent && !hasOwn(prop, 'default')) {
value = false;
} else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) {
value = true;
}
}
// check default value
if (value === undefined) {
value = getPropDefaultValue(vm, prop, key);
// since the default value is a fresh copy,
// make sure to observe it.
var prevShouldConvert = observerState.shouldConvert;
observerState.shouldConvert = true;
observe(value);
observerState.shouldConvert = prevShouldConvert;
}
if (
"development" !== 'production' &&
// skip validation for weex recycle-list child component props
!(true && isObject(value) && ('@binding' in value))
) {
assertProp(prop, key, value, vm, absent);
}
return value
}
/**
* Get the default value of a prop.
*/
function getPropDefaultValue (vm, prop, key) {
// no default, return undefined
if (!hasOwn(prop, 'default')) {
return undefined
}
var def = prop.default;
// warn against non-factory defaults for Object & Array
if ("development" !== 'production' && isObject(def)) {
warn(
'Invalid default value for prop "' + key + '": ' +
'Props with type Object/Array must use a factory function ' +
'to return the default value.',
vm
);
}
// the raw prop value was also undefined from previous render,
// return previous default value to avoid unnecessary watcher trigger
if (vm && vm.$options.propsData &&
vm.$options.propsData[key] === undefined &&
vm._props[key] !== undefined
) {
return vm._props[key]
}
// call factory function for non-Function types
// a value is Function if its prototype is function even across different execution context
return typeof def === 'function' && getType(prop.type) !== 'Function'
? def.call(vm)
: def
}
/**
* Assert whether a prop is valid.
*/
function assertProp (
prop,
name,
value,
vm,
absent
) {
if (prop.required && absent) {
warn(
'Missing required prop: "' + name + '"',
vm
);
return
}
if (value == null && !prop.required) {
return
}
var type = prop.type;
var valid = !type || type === true;
var expectedTypes = [];
if (type) {
if (!Array.isArray(type)) {
type = [type];
}
for (var i = 0; i < type.length && !valid; i++) {
var assertedType = assertType(value, type[i]);
expectedTypes.push(assertedType.expectedType || '');
valid = assertedType.valid;
}
}
if (!valid) {
warn(
"Invalid prop: type check failed for prop \"" + name + "\"." +
" Expected " + (expectedTypes.map(capitalize).join(', ')) +
", got " + (toRawType(value)) + ".",
vm
);
return
}
var validator = prop.validator;
if (validator) {
if (!validator(value)) {
warn(
'Invalid prop: custom validator check failed for prop "' + name + '".',
vm
);
}
}
}
var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
function assertType (value, type) {
var valid;
var expectedType = getType(type);
if (simpleCheckRE.test(expectedType)) {
var t = typeof value;
valid = t === expectedType.toLowerCase();
// for primitive wrapper objects
if (!valid && t === 'object') {
valid = value instanceof type;
}
} else if (expectedType === 'Object') {
valid = isPlainObject(value);
} else if (expectedType === 'Array') {
valid = Array.isArray(value);
} else {
valid = value instanceof type;
}
return {
valid: valid,
expectedType: expectedType
}
}
/**
* Use function string name to check built-in types,
* because a simple equality check will fail when running
* across different vms / iframes.
*/
function getType (fn) {
var match = fn && fn.toString().match(/^\s*function (\w+)/);
return match ? match[1] : ''
}
function isType (type, fn) {
if (!Array.isArray(fn)) {
return getType(fn) === getType(type)
}
for (var i = 0, len = fn.length; i < len; i++) {
if (getType(fn[i]) === getType(type)) {
return true
}
}
/* istanbul ignore next */
return false
}
/* */
function handleError (err, vm, info) {
if (vm) {
var cur = vm;
while ((cur = cur.$parent)) {
var hooks = cur.$options.errorCaptured;
if (hooks) {
for (var i = 0; i < hooks.length; i++) {
try {
var capture = hooks[i].call(cur, err, vm, info) === false;
if (capture) { return }
} catch (e) {
globalHandleError(e, cur, 'errorCaptured hook');
}
}
}
}
}
globalHandleError(err, vm, info);
}
function globalHandleError (err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info)
} catch (e) {
logError(e, null, 'config.errorHandler');
}
}
logError(err, vm, info);
}
function logError (err, vm, info) {
{
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
console.error(err);
} else {
throw err
}
}
/* */
/* globals MessageChannel */
var callbacks = [];
var pending = false;
function flushCallbacks () {
pending = false;
var copies = callbacks.slice(0);
callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
// Here we have async deferring wrappers using both micro and macro tasks.
// In < 2.4 we used micro tasks everywhere, but there are some scenarios where
// micro tasks have too high a priority and fires in between supposedly
// sequential events (e.g. #4521, #6690) or even between bubbling of the same
// event (#6566). However, using macro tasks everywhere also has subtle problems
// when state is changed right before repaint (e.g. #6813, out-in transitions).
// Here we use micro task by default, but expose a way to force macro task when
// needed (e.g. in event handlers attached by v-on).
var microTimerFunc;
var macroTimerFunc;
var useMacroTask = false;
// Determine (macro) Task defer implementation.
// Technically setImmediate should be the ideal choice, but it's only available
// in IE. The only polyfill that consistently queues the callback after all DOM
// events triggered in the same loop is by using MessageChannel.
/* istanbul ignore if */
if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
macroTimerFunc = function () {
setImmediate(flushCallbacks);
};
} else if (typeof MessageChannel !== 'undefined' && (
isNative(MessageChannel) ||
// PhantomJS
MessageChannel.toString() === '[object MessageChannelConstructor]'
)) {
var channel = new MessageChannel();
var port = channel.port2;
channel.port1.onmessage = flushCallbacks;
macroTimerFunc = function () {
port.postMessage(1);
};
} else {
/* istanbul ignore next */
macroTimerFunc = function () {
setTimeout(flushCallbacks, 0);
};
}
// Determine MicroTask defer implementation.
/* istanbul ignore next, $flow-disable-line */
if (typeof Promise !== 'undefined' && isNative(Promise)) {
var p = Promise.resolve();
microTimerFunc = function () {
p.then(flushCallbacks);
// in problematic UIWebViews, Promise.then doesn't completely break, but
// it can get stuck in a weird state where callbacks are pushed into the
// microtask queue but the queue isn't being flushed, until the browser
// needs to do some other work, e.g. handle a timer. Therefore we can
// "force" the microtask queue to be flushed by adding an empty timer.
if (isIOS) { setTimeout(noop); }
};
} else {
// fallback to macro
microTimerFunc = macroTimerFunc;
}
/**
* Wrap a function so that if any code inside triggers state change,
* the changes are queued using a Task instead of a MicroTask.
*/
function nextTick (cb, ctx) {
var _resolve;
callbacks.push(function () {
if (cb) {
try {
cb.call(ctx);
} catch (e) {
handleError(e, ctx, 'nextTick');
}
} else if (_resolve) {
_resolve(ctx);
}
});
if (!pending) {
pending = true;
if (useMacroTask) {
macroTimerFunc();
} else {
microTimerFunc();
}
}
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
/* not type checking this file because flow doesn't play well with Proxy */
var initProxy;
{
var allowedGlobals = makeMap(
'Infinity,undefined,NaN,isFinite,isNaN,' +
'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
'require' // for Webpack/Browserify
);
var warnNonPresent = function (target, key) {
warn(
"Property or method \"" + key + "\" is not defined on the instance but " +
'referenced during render. Make sure that this property is reactive, ' +
'either in the data option, or for class-based components, by ' +
'initializing the property. ' +
'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
target
);
};
var hasProxy =
typeof Proxy !== 'undefined' &&
Proxy.toString().match(/native code/);
if (hasProxy) {
var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
config.keyCodes = new Proxy(config.keyCodes, {
set: function set (target, key, value) {
if (isBuiltInModifier(key)) {
warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
return false
} else {
target[key] = value;
return true
}
}
});
}
var hasHandler = {
has: function has (target, key) {
var has = key in target;
var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';
if (!has && !isAllowed) {
warnNonPresent(target, key);
}
return has || !isAllowed
}
};
var getHandler = {
get: function get (target, key) {
if (typeof key === 'string' && !(key in target)) {
warnNonPresent(target, key);
}
return target[key]
}
};
initProxy = function initProxy (vm) {
if (hasProxy) {
// determine which proxy handler to use
var options = vm.$options;
var handlers = options.render && options.render._withStripped
? getHandler
: hasHandler;
vm._renderProxy = new Proxy(vm, handlers);
} else {
vm._renderProxy = vm;
}
};
}
/* */
var seenObjects = new _Set();
/**
* Recursively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*/
function traverse (val) {
_traverse(val, seenObjects);
seenObjects.clear();
}
function _traverse (val, seen) {
var i, keys;
var isA = Array.isArray(val);
if ((!isA && !isObject(val)) || Object.isFrozen(val)) {
return
}
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
}
seen.add(depId);
}
if (isA) {
i = val.length;
while (i--) { _traverse(val[i], seen); }
} else {
keys = Object.keys(val);
i = keys.length;
while (i--) { _traverse(val[keys[i]], seen); }
}
}
var mark;
var measure;
{
var perf = inBrowser && window.performance;
/* istanbul ignore if */
if (
perf &&
perf.mark &&
perf.measure &&
perf.clearMarks &&
perf.clearMeasures
) {
mark = function (tag) { return perf.mark(tag); };
measure = function (name, startTag, endTag) {
perf.measure(name, startTag, endTag);
perf.clearMarks(startTag);
perf.clearMarks(endTag);
perf.clearMeasures(name);
};
}
}
/* */
var normalizeEvent = cached(function (name) {
var passive = name.charAt(0) === '&';
name = passive ? name.slice(1) : name;
var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
name = once$$1 ? name.slice(1) : name;
var capture = name.charAt(0) === '!';
name = capture ? name.slice(1) : name;
return {
name: name,
once: once$$1,
capture: capture,
passive: passive
}
});
function createFnInvoker (fns) {
function invoker () {
var arguments$1 = arguments;
var fns = invoker.fns;
if (Array.isArray(fns)) {
var cloned = fns.slice();
for (var i = 0; i < cloned.length; i++) {
cloned[i].apply(null, arguments$1);
}
} else {
// return handler return value for single handlers
return fns.apply(null, arguments)
}
}
invoker.fns = fns;
return invoker
}
function updateListeners (
on,
oldOn,
add,
remove$$1,
vm
) {
var name, def, cur, old, event;
for (name in on) {
def = cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
/* istanbul ignore if */
if (true && isPlainObject(def)) {
cur = def.handler;
event.params = def.params;
}
if (isUndef(cur)) {
"development" !== 'production' && warn(
"Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
vm
);
} else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur);
}
add(event.name, cur, event.once, event.capture, event.passive, event.params);
} else if (cur !== old) {
old.fns = cur;
on[name] = old;
}
}
for (name in oldOn) {
if (isUndef(on[name])) {
event = normalizeEvent(name);
remove$$1(event.name, oldOn[name], event.capture);
}
}
}
/* */
function mergeVNodeHook (def, hookKey, hook) {
if (def instanceof VNode) {
def = def.data.hook || (def.data.hook = {});
}
var invoker;
var oldHook = def[hookKey];
function wrappedHook () {
hook.apply(this, arguments);
// important: remove merged hook to ensure it's called only once
// and prevent memory leak
remove(invoker.fns, wrappedHook);
}
if (isUndef(oldHook)) {
// no existing hook
invoker = createFnInvoker([wrappedHook]);
} else {
/* istanbul ignore if */
if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
// already a merged invoker
invoker = oldHook;
invoker.fns.push(wrappedHook);
} else {
// existing plain hook
invoker = createFnInvoker([oldHook, wrappedHook]);
}
}
invoker.merged = true;
def[hookKey] = invoker;
}
/* */
function extractPropsFromVNodeData (
data,
Ctor,
tag
) {
// we are only extracting raw values here.
// validation and default values are handled in the child
// component itself.
var propOptions = Ctor.options.props;
if (isUndef(propOptions)) {
return
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
{
var keyInLowerCase = key.toLowerCase();
if (
key !== keyInLowerCase &&
attrs && hasOwn(attrs, keyInLowerCase)
) {
tip(
"Prop \"" + keyInLowerCase + "\" is passed to component " +
(formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
" \"" + key + "\". " +
"Note that HTML attributes are case-insensitive and camelCased " +
"props need to use their kebab-case equivalents when using in-DOM " +
"templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
);
}
}
checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
}
}
return res
}
function checkProp (
res,
hash,
key,
altKey,
preserve
) {
if (isDef(hash)) {
if (hasOwn(hash, key)) {
res[key] = hash[key];
if (!preserve) {
delete hash[key];
}
return true
} else if (hasOwn(hash, altKey)) {
res[key] = hash[altKey];
if (!preserve) {
delete hash[altKey];
}
return true
}
}
return false
}
/* */
// The template compiler attempts to minimize the need for normalization by
// statically analyzing the template at compile time.
//
// For plain HTML markup, normalization can be completely skipped because the
// generated render function is guaranteed to return Array<VNode>. There are
// two cases where extra normalization is needed:
// 1. When the children contains components - because a functional component
// may return an Array instead of a single root. In this case, just a simple
// normalization is needed - if any child is an Array, we flatten the whole
// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
// because functional components already normalize their own children.
function simpleNormalizeChildren (children) {
for (var i = 0; i < children.length; i++) {
if (Array.isArray(children[i])) {
return Array.prototype.concat.apply([], children)
}
}
return children
}
// 2. When the children contains constructs that always generated nested Arrays,
// e.g. <template>, <slot>, v-for, or when the children is provided by user
// with hand-written render functions / JSX. In such cases a full normalization
// is needed to cater to all possible types of children values.
function normalizeChildren (children) {
return isPrimitive(children)
? [createTextVNode(children)]
: Array.isArray(children)
? normalizeArrayChildren(children)
: undefined
}
function isTextNode (node) {
return isDef(node) && isDef(node.text) && isFalse(node.isComment)
}
function normalizeArrayChildren (children, nestedIndex) {
var res = [];
var i, c, lastIndex, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === 'boolean') { continue }
lastIndex = res.length - 1;
last = res[lastIndex];
// nested
if (Array.isArray(c)) {
if (c.length > 0) {
c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
// merge adjacent text nodes
if (isTextNode(c[0]) && isTextNode(last)) {
res[lastIndex] = createTextVNode(last.text + (c[0]).text);
c.shift();
}
res.push.apply(res, c);
}
} else if (isPrimitive(c)) {
if (isTextNode(last)) {
// merge adjacent text nodes
// this is necessary for SSR hydration because text nodes are
// essentially merged when rendered to HTML strings
res[lastIndex] = createTextVNode(last.text + c);
} else if (c !== '') {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[lastIndex] = createTextVNode(last.text + c.text);
} else {
// default key for nested array children (likely generated by v-for)
if (isTrue(children._isVList) &&
isDef(c.tag) &&
isUndef(c.key) &&
isDef(nestedIndex)) {
c.key = "__vlist" + nestedIndex + "_" + i + "__";
}
res.push(c);
}
}
}
return res
}
/* */
function ensureCtor (comp, base) {
if (
comp.__esModule ||
(hasSymbol && comp[Symbol.toStringTag] === 'Module')
) {
comp = comp.default;
}
return isObject(comp)
? base.extend(comp)
: comp
}
function createAsyncPlaceholder (
factory,
data,
context,
children,
tag
) {
var node = createEmptyVNode();
node.asyncFactory = factory;
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
return node
}
function resolveAsyncComponent (
factory,
baseCtor,
context
) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp
}
if (isDef(factory.resolved)) {
return factory.resolved
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp
}
if (isDef(factory.contexts)) {
// already pending
factory.contexts.push(context);
} else {
var contexts = factory.contexts = [context];
var sync = true;
var forceRender = function () {
for (var i = 0, l = contexts.length; i < l; i++) {
contexts[i].$forceUpdate();
}
};
var resolve = once(function (res) {
// cache resolved
factory.resolved = ensureCtor(res, baseCtor);
// invoke callbacks only if this is not a synchronous resolve
// (async resolves are shimmed as synchronous during SSR)
if (!sync) {
forceRender();
}
});
var reject = once(function (reason) {
"development" !== 'production' && warn(
"Failed to resolve async component: " + (String(factory)) +
(reason ? ("\nReason: " + reason) : '')
);
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender();
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (typeof res.then === 'function') {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isDef(res.component) && typeof res.component.then === 'function') {
res.component.then(resolve, reject);
if (isDef(res.error)) {
factory.errorComp = ensureCtor(res.error, baseCtor);
}
if (isDef(res.loading)) {
factory.loadingComp = ensureCtor(res.loading, baseCtor);
if (res.delay === 0) {
factory.loading = true;
} else {
setTimeout(function () {
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender();
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
setTimeout(function () {
if (isUndef(factory.resolved)) {
reject(
("timeout (" + (res.timeout) + "ms)")
);
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading
? factory.loadingComp
: factory.resolved
}
}
/* */
function isAsyncPlaceholder (node) {
return node.isComment && node.asyncFactory
}
/* */
function getFirstComponentChild (children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i];
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c
}
}
}
}
/* */
/* */
function initEvents (vm) {
vm._events = Object.create(null);
vm._hasHookEvent = false;
// init parent attached events
var listeners = vm.$options._parentListeners;
if (listeners) {
updateComponentListeners(vm, listeners);
}
}
var target;
function add (event, fn, once) {
if (once) {
target.$once(event, fn);
} else {
target.$on(event, fn);
}
}
function remove$1 (event, fn) {
target.$off(event, fn);
}
function updateComponentListeners (
vm,
listeners,
oldListeners
) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
target = undefined;
}
function eventsMixin (Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function (event, fn) {
var this$1 = this;
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
this$1.$on(event[i], fn);
}
} else {
(vm._events[event] || (vm._events[event] = [])).push(fn);
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
if (hookRE.test(event)) {
vm._hasHookEvent = true;
}
}
return vm
};
Vue.prototype.$once = function (event, fn) {
var vm = this;
function on () {
vm.$off(event, on);
fn.apply(vm, arguments);
}
on.fn = fn;
vm.$on(event, on);
return vm
};
Vue.prototype.$off = function (event, fn) {
var this$1 = this;
var vm = this;
// all
if (!arguments.length) {
vm._events = Object.create(null);
return vm
}
// array of events
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
this$1.$off(event[i], fn);
}
return vm
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm
}
if (!fn) {
vm._events[event] = null;
return vm
}
if (fn) {
// specific handler
var cb;
var i$1 = cbs.length;
while (i$1--) {
cb = cbs[i$1];
if (cb === fn || cb.fn === fn) {
cbs.splice(i$1, 1);
break
}
}
}
return vm
};
Vue.prototype.$emit = function (event) {
var vm = this;
{
var lowerCaseEvent = event.toLowerCase();
if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
tip(
"Event \"" + lowerCaseEvent + "\" is emitted in component " +
(formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
"Note that HTML attributes are case-insensitive and you cannot use " +
"v-on to listen to camelCase events when using in-DOM templates. " +
"You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
);
}
}
var cbs = vm._events[event];
if (cbs) {
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
var args = toArray(arguments, 1);
for (var i = 0, l = cbs.length; i < l; i++) {
try {
cbs[i].apply(vm, args);
} catch (e) {
handleError(e, vm, ("event handler for \"" + event + "\""));
}
}
}
return vm
};
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots (
children,
context
) {
var slots = {};
if (!children) {
return slots
}
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
var data = child.data;
// remove slot attribute if the node is resolved as a Vue slot node
if (data && data.attrs && data.attrs.slot) {
delete data.attrs.slot;
}
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.fnContext === context) &&
data && data.slot != null
) {
var name = data.slot;
var slot = (slots[name] || (slots[name] = []));
if (child.tag === 'template') {
slot.push.apply(slot, child.children || []);
} else {
slot.push(child);
}
} else {
(slots.default || (slots.default = [])).push(child);
}
}
// ignore slots that contains only whitespace
for (var name$1 in slots) {
if (slots[name$1].every(isWhitespace)) {
delete slots[name$1];
}
}
return slots
}
function isWhitespace (node) {
return (node.isComment && !node.asyncFactory) || node.text === ' '
}
function resolveScopedSlots (
fns, // see flow/vnode
res
) {
res = res || {};
for (var i = 0; i < fns.length; i++) {
if (Array.isArray(fns[i])) {
resolveScopedSlots(fns[i], res);
} else {
res[fns[i].key] = fns[i].fn;
}
}
return res
}
/* */
var activeInstance = null;
var isUpdatingChildComponent = false;
function initLifecycle (vm) {
var options = vm.$options;
// locate first non-abstract parent
var parent = options.parent;
if (parent && !options.abstract) {
while (parent.$options.abstract && parent.$parent) {
parent = parent.$parent;
}
parent.$children.push(vm);
}
vm.$parent = parent;
vm.$root = parent ? parent.$root : vm;
vm.$children = [];
vm.$refs = {};
vm._watcher = null;
vm._inactive = null;
vm._directInactive = false;
vm._isMounted = false;
vm._isDestroyed = false;
vm._isBeingDestroyed = false;
}
function lifecycleMixin (Vue) {
Vue.prototype._update = function (vnode, hydrating) {
var vm = this;
if (vm._isMounted) {
callHook(vm, 'beforeUpdate');
}
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var prevActiveInstance = activeInstance;
activeInstance = vm;
vm._vnode = vnode;
// Vue.prototype.__patch__ is injected in entry points
// based on the rendering backend used.
if (!prevVnode) {
// initial render
vm.$el = vm.__patch__(
vm.$el, vnode, hydrating, false /* removeOnly */,
vm.$options._parentElm,
vm.$options._refElm
);
// no need for the ref nodes after initial patch
// this prevents keeping a detached DOM tree in memory (#5851)
vm.$options._parentElm = vm.$options._refElm = null;
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
activeInstance = prevActiveInstance;
// update __vue__ reference
if (prevEl) {
prevEl.__vue__ = null;
}
if (vm.$el) {
vm.$el.__vue__ = vm;
}
// if parent is an HOC, update its $el as well
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
vm.$parent.$el = vm.$el;
}
// updated hook is called by the scheduler to ensure that children are
// updated in a parent's updated hook.
};
Vue.prototype.$forceUpdate = function () {
var vm = this;
if (vm._watcher) {
vm._watcher.update();
}
};
Vue.prototype.$destroy = function () {
var vm = this;
if (vm._isBeingDestroyed) {
return
}
callHook(vm, 'beforeDestroy');
vm._isBeingDestroyed = true;
// remove self from parent
var parent = vm.$parent;
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
remove(parent.$children, vm);
}
// teardown watchers
if (vm._watcher) {
vm._watcher.teardown();
}
var i = vm._watchers.length;
while (i--) {
vm._watchers[i].teardown();
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
vm._data.__ob__.vmCount--;
}
// call the last hook...
vm._isDestroyed = true;
// invoke destroy hooks on current rendered tree
vm.__patch__(vm._vnode, null);
// fire destroyed hook
callHook(vm, 'destroyed');
// turn off all instance listeners.
vm.$off();
// remove __vue__ reference
if (vm.$el) {
vm.$el.__vue__ = null;
}
// release circular reference (#6759)
if (vm.$vnode) {
vm.$vnode.parent = null;
}
};
}
function mountComponent (
vm,
el,
hydrating
) {
vm.$el = el;
if (!vm.$options.render) {
vm.$options.render = createEmptyVNode;
{
/* istanbul ignore if */
if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
vm.$options.el || el) {
warn(
'You are using the runtime-only build of Vue where the template ' +
'compiler is not available. Either pre-compile the templates into ' +
'render functions, or use the compiler-included build.',
vm
);
} else {
warn(
'Failed to mount component: template or render function not defined.',
vm
);
}
}
}
callHook(vm, 'beforeMount');
var updateComponent;
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
updateComponent = function () {
var name = vm._name;
var id = vm._uid;
var startTag = "vue-perf-start:" + id;
var endTag = "vue-perf-end:" + id;
mark(startTag);
var vnode = vm._render();
mark(endTag);
measure(("vue " + name + " render"), startTag, endTag);
mark(startTag);
vm._update(vnode, hydrating);
mark(endTag);
measure(("vue " + name + " patch"), startTag, endTag);
};
} else {
updateComponent = function () {
vm._update(vm._render(), hydrating);
};
}
// we set this to vm._watcher inside the watcher's constructor
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
// component's mounted hook), which relies on vm._watcher being already defined
new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);
hydrating = false;
// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) {
vm._isMounted = true;
callHook(vm, 'mounted');
}
return vm
}
function updateChildComponent (
vm,
propsData,
listeners,
parentVnode,
renderChildren
) {
{
isUpdatingChildComponent = true;
}
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren
var hasChildren = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
parentVnode.data.scopedSlots || // has new scoped slots
vm.$scopedSlots !== emptyObject // has old scoped slots
);
vm.$options._parentVnode = parentVnode;
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
if (vm._vnode) { // update child tree's parent
vm._vnode.parent = parentVnode;
}
vm.$options._renderChildren = renderChildren;
// update $attrs and $listeners hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = (parentVnode.data && parentVnode.data.attrs) || emptyObject;
vm.$listeners = listeners || emptyObject;
// update props
if (propsData && vm.$options.props) {
observerState.shouldConvert = false;
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
props[key] = validateProp(key, vm.$options.props, propsData, vm);
}
observerState.shouldConvert = true;
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// update listeners
if (listeners) {
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
}
// resolve slots + force update if has children
if (hasChildren) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
{
isUpdatingChildComponent = false;
}
}
function isInInactiveTree (vm) {
while (vm && (vm = vm.$parent)) {
if (vm._inactive) { return true }
}
return false
}
function activateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = false;
if (isInInactiveTree(vm)) {
return
}
} else if (vm._directInactive) {
return
}
if (vm._inactive || vm._inactive === null) {
vm._inactive = false;
for (var i = 0; i < vm.$children.length; i++) {
activateChildComponent(vm.$children[i]);
}
callHook(vm, 'activated');
}
}
function deactivateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = true;
if (isInInactiveTree(vm)) {
return
}
}
if (!vm._inactive) {
vm._inactive = true;
for (var i = 0; i < vm.$children.length; i++) {
deactivateChildComponent(vm.$children[i]);
}
callHook(vm, 'deactivated');
}
}
function callHook (vm, hook) {
var handlers = vm.$options[hook];
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
try {
handlers[i].call(vm);
} catch (e) {
handleError(e, vm, (hook + " hook"));
}
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook);
}
}
/* */
var MAX_UPDATE_COUNT = 100;
var queue = [];
var activatedChildren = [];
var has = {};
var circular = {};
var waiting = false;
var flushing = false;
var index = 0;
/**
* Reset the scheduler's state.
*/
function resetSchedulerState () {
index = queue.length = activatedChildren.length = 0;
has = {};
{
circular = {};
}
waiting = flushing = false;
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue () {
flushing = true;
var watcher, id;
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child)
// 2. A component's user watchers are run before its render watcher (because
// user watchers are created before the render watcher)
// 3. If a component is destroyed during a parent component's watcher run,
// its watchers can be skipped.
queue.sort(function (a, b) { return a.id - b.id; });
// do not cache length because more watchers might be pushed
// as we run existing watchers
for (index = 0; index < queue.length; index++) {
watcher = queue[index];
id = watcher.id;
has[id] = null;
watcher.run();
// in dev build, check and stop circular updates.
if ("development" !== 'production' && has[id] != null) {
circular[id] = (circular[id] || 0) + 1;
if (circular[id] > MAX_UPDATE_COUNT) {
warn(
'You may have an infinite update loop ' + (
watcher.user
? ("in watcher with expression \"" + (watcher.expression) + "\"")
: "in a component render function."
),
watcher.vm
);
break
}
}
}
// keep copies of post queues before resetting state
var activatedQueue = activatedChildren.slice();
var updatedQueue = queue.slice();
resetSchedulerState();
// call component updated and activated hooks
callActivatedHooks(activatedQueue);
callUpdatedHooks(updatedQueue);
// devtool hook
/* istanbul ignore if */
if (devtools && config.devtools) {
devtools.emit('flush');
}
}
function callUpdatedHooks (queue) {
var i = queue.length;
while (i--) {
var watcher = queue[i];
var vm = watcher.vm;
if (vm._watcher === watcher && vm._isMounted) {
callHook(vm, 'updated');
}
}
}
/**
* Queue a kept-alive component that was activated during patch.
* The queue will be processed after the entire tree has been patched.
*/
function queueActivatedComponent (vm) {
// setting _inactive to false here so that a render function can
// rely on checking whether it's in an inactive tree (e.g. router-view)
vm._inactive = false;
activatedChildren.push(vm);
}
function callActivatedHooks (queue) {
for (var i = 0; i < queue.length; i++) {
queue[i]._inactive = true;
activateChildComponent(queue[i], true /* true */);
}
}
/**
* Push a watcher into the watcher queue.
* Jobs with duplicate IDs will be skipped unless it's
* pushed when the queue is being flushed.
*/
function queueWatcher (watcher) {
var id = watcher.id;
if (has[id] == null) {
has[id] = true;
if (!flushing) {
queue.push(watcher);
} else {
// if already flushing, splice the watcher based on its id
// if already past its id, it will be run next immediately.
var i = queue.length - 1;
while (i > index && queue[i].id > watcher.id) {
i--;
}
queue.splice(i + 1, 0, watcher);
}
// queue the flush
if (!waiting) {
waiting = true;
nextTick(flushSchedulerQueue);
}
}
}
/* */
var uid$2 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*/
var Watcher = function Watcher (
vm,
expOrFn,
cb,
options,
isRenderWatcher
) {
this.vm = vm;
if (isRenderWatcher) {
vm._watcher = this;
}
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
} else {
this.deep = this.user = this.lazy = this.sync = false;
}
this.cb = cb;
this.id = ++uid$2; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = new _Set();
this.newDepIds = new _Set();
this.expression = expOrFn.toString();
// parse expression for getter
if (typeof expOrFn === 'function') {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = function () {};
"development" !== 'production' && warn(
"Failed watching path: \"" + expOrFn + "\" " +
'Watcher only accepts simple dot-delimited paths. ' +
'For full control, use a function instead.',
vm
);
}
}
this.value = this.lazy
? undefined
: this.get();
};
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function get () {
pushTarget(this);
var value;
var vm = this.vm;
try {
value = this.getter.call(vm, vm);
} catch (e) {
if (this.user) {
handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
} else {
throw e
}
} finally {
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
}
return value
};
/**
* Add a dependency to this directive.
*/
Watcher.prototype.addDep = function addDep (dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function cleanupDeps () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
var dep = this$1.deps[i];
if (!this$1.newDepIds.has(dep.id)) {
dep.removeSub(this$1);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
Watcher.prototype.update = function update () {
/* istanbul ignore else */
if (this.lazy) {
this.dirty = true;
} else if (this.sync) {
this.run();
} else {
queueWatcher(this);
}
};
/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
Watcher.prototype.run = function run () {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated.
isObject(value) ||
this.deep
) {
// set new value
var oldValue = this.value;
this.value = value;
if (this.user) {
try {
this.cb.call(this.vm, value, oldValue);
} catch (e) {
handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
}
} else {
this.cb.call(this.vm, value, oldValue);
}
}
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function evaluate () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function depend () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
this$1.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown () {
var this$1 = this;
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed.
if (!this.vm._isBeingDestroyed) {
remove(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this$1.deps[i].removeSub(this$1);
}
this.active = false;
}
};
/* */
var sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
};
function proxy (target, sourceKey, key) {
sharedPropertyDefinition.get = function proxyGetter () {
return this[sourceKey][key]
};
sharedPropertyDefinition.set = function proxySetter (val) {
this[sourceKey][key] = val;
};
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function initState (vm) {
vm._watchers = [];
vm._inlineComputed = null;
var opts = vm.$options;
if (opts.props) { initProps(vm, opts.props); }
if (opts.methods) { initMethods(vm, opts.methods); }
if (opts.data) {
initData(vm);
} else {
observe(vm._data = {}, true /* asRootData */);
}
if (opts.computed) { initComputed(vm, opts.computed); }
if (opts.watch && opts.watch !== nativeWatch) {
initWatch(vm, opts.watch);
}
}
function initProps (vm, propsOptions) {
var propsData = vm.$options.propsData || {};
var props = vm._props = {};
// cache prop keys so that future props updates can iterate using Array
// instead of dynamic object key enumeration.
var keys = vm.$options._propKeys = [];
var isRoot = !vm.$parent;
// root instance props should be converted
observerState.shouldConvert = isRoot;
var loop = function ( key ) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
{
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) ||
config.isReservedAttr(hyphenatedKey)) {
warn(
("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactive(props, key, value, function () {
if (vm.$parent && !isUpdatingChildComponent) {
warn(
"Avoid mutating a prop directly since the value will be " +
"overwritten whenever the parent component re-renders. " +
"Instead, use a data or computed property based on the prop's " +
"value. Prop being mutated: \"" + key + "\"",
vm
);
}
});
}
// static props are already proxied on the component's prototype
// during Vue.extend(). We only need to proxy props defined at
// instantiation here.
if (!(key in vm)) {
proxy(vm, "_props", key);
}
};
for (var key in propsOptions) { loop( key ); }
observerState.shouldConvert = true;
}
function initData (vm) {
var data = vm.$options.data;
data = vm._data = typeof data === 'function'
? getData(data, vm)
: data || {};
if (!isPlainObject(data)) {
data = {};
"development" !== 'production' && warn(
'data functions should return an object:\n' +
'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
vm
);
}
// proxy data on instance
var keys = Object.keys(data);
var props = vm.$options.props;
var methods = vm.$options.methods;
var i = keys.length;
while (i--) {
var key = keys[i];
{
if (methods && hasOwn(methods, key)) {
warn(
("Method \"" + key + "\" has already been defined as a data property."),
vm
);
}
}
if (props && hasOwn(props, key)) {
"development" !== 'production' && warn(
"The data property \"" + key + "\" is already declared as a prop. " +
"Use prop default value instead.",
vm
);
} else if (!isReserved(key)) {
proxy(vm, "_data", key);
}
}
// observe data
observe(data, true /* asRootData */);
}
function getData (data, vm) {
try {
return data.call(vm, vm)
} catch (e) {
handleError(e, vm, "data()");
return {}
}
}
var computedWatcherOptions = { lazy: true };
function initComputed (vm, computed) {
// $flow-disable-line
var watchers = vm._computedWatchers = Object.create(null);
// computed properties are just getters during SSR
var isSSR = isServerRendering();
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === 'function' ? userDef : userDef.get;
if ("development" !== 'production' && getter == null) {
warn(
("Getter is missing for computed property \"" + key + "\"."),
vm
);
}
if (!isSSR) {
// create internal watcher for the computed property.
watchers[key] = new Watcher(
vm,
getter || noop,
noop,
computedWatcherOptions
);
}
// component-defined computed properties are already defined on the
// component prototype. We only need to define computed properties defined
// at instantiation here.
if (!(key in vm)) {
defineComputed(vm, key, userDef);
} else {
if (key in vm.$data) {
warn(("The computed property \"" + key + "\" is already defined in data."), vm);
} else if (vm.$options.props && key in vm.$options.props) {
warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
}
}
}
}
function defineComputed (
target,
key,
userDef
) {
var shouldCache = !isServerRendering();
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = shouldCache
? createComputedGetter(key)
: userDef;
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: userDef.get
: noop;
sharedPropertyDefinition.set = userDef.set
? userDef.set
: noop;
}
if ("development" !== 'production' &&
sharedPropertyDefinition.set === noop) {
sharedPropertyDefinition.set = function () {
warn(
("Computed property \"" + key + "\" was assigned to but it has no setter."),
this
);
};
}
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function createComputedGetter (key) {
return function computedGetter () {
var watcher = this._computedWatchers && this._computedWatchers[key];
if (watcher) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
watcher.depend();
}
return watcher.value
}
}
}
function initMethods (vm, methods) {
var props = vm.$options.props;
for (var key in methods) {
{
if (methods[key] == null) {
warn(
"Method \"" + key + "\" has an undefined value in the component definition. " +
"Did you reference the function correctly?",
vm
);
}
if (props && hasOwn(props, key)) {
warn(
("Method \"" + key + "\" has already been defined as a prop."),
vm
);
}
if ((key in vm) && isReserved(key)) {
warn(
"Method \"" + key + "\" conflicts with an existing Vue instance method. " +
"Avoid defining component methods that start with _ or $."
);
}
}
vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
}
}
function initWatch (vm, watch) {
for (var key in watch) {
var handler = watch[key];
if (Array.isArray(handler)) {
for (var i = 0; i < handler.length; i++) {
createWatcher(vm, key, handler[i]);
}
} else {
createWatcher(vm, key, handler);
}
}
}
function createWatcher (
vm,
keyOrFn,
handler,
options
) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === 'string') {
handler = vm[handler];
}
return vm.$watch(keyOrFn, handler, options)
}
function stateMixin (Vue) {
// flow somehow has problems with directly declared definition object
// when using Object.defineProperty, so we have to procedurally build up
// the object here.
var dataDef = {};
dataDef.get = function () { return this._data };
var propsDef = {};
propsDef.get = function () { return this._props };
{
dataDef.set = function (newData) {
warn(
'Avoid replacing instance root $data. ' +
'Use nested data properties instead.',
this
);
};
propsDef.set = function () {
warn("$props is readonly.", this);
};
}
Object.defineProperty(Vue.prototype, '$data', dataDef);
Object.defineProperty(Vue.prototype, '$props', propsDef);
Vue.prototype.$set = set;
Vue.prototype.$delete = del;
Vue.prototype.$watch = function (
expOrFn,
cb,
options
) {
var vm = this;
if (isPlainObject(cb)) {
return createWatcher(vm, expOrFn, cb, options)
}
options = options || {};
options.user = true;
var watcher = new Watcher(vm, expOrFn, cb, options);
if (options.immediate) {
cb.call(vm, watcher.value);
}
return function unwatchFn () {
watcher.teardown();
}
};
}
/* */
function initProvide (vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === 'function'
? provide.call(vm)
: provide;
}
}
function initInjections (vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
observerState.shouldConvert = false;
Object.keys(result).forEach(function (key) {
/* istanbul ignore else */
{
defineReactive(vm, key, result[key], function () {
warn(
"Avoid mutating an injected value directly since the changes will be " +
"overwritten whenever the provided component re-renders. " +
"injection being mutated: \"" + key + "\"",
vm
);
});
}
});
observerState.shouldConvert = true;
}
}
function resolveInject (inject, vm) {
if (inject) {
// inject is :any because flow is not smart enough to figure out cached
var result = Object.create(null);
var keys = hasSymbol
? Reflect.ownKeys(inject).filter(function (key) {
/* istanbul ignore next */
return Object.getOwnPropertyDescriptor(inject, key).enumerable
})
: Object.keys(inject);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && provideKey in source._provided) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if (!source) {
if ('default' in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === 'function'
? provideDefault.call(vm)
: provideDefault;
} else {
warn(("Injection \"" + key + "\" not found"), vm);
}
}
}
return result
}
}
/* */
/**
* Runtime helper for rendering v-for lists.
*/
function renderList (
val,
render
) {
var ret, i, l, keys, key;
if (Array.isArray(val) || typeof val === 'string') {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i);
}
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i);
}
} else if (isObject(val)) {
keys = Object.keys(val);
ret = new Array(keys.length);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[i] = render(val[key], key, i);
}
}
if (isDef(ret)) {
(ret)._isVList = true;
}
return ret
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot (
name,
fallback,
props,
bindObject
) {
var scopedSlotFn = this.$scopedSlots[name];
var nodes;
if (scopedSlotFn) { // scoped slot
props = props || {};
if (bindObject) {
if ("development" !== 'production' && !isObject(bindObject)) {
warn(
'slot v-bind without argument expects an Object',
this
);
}
props = extend(extend({}, bindObject), props);
}
nodes = scopedSlotFn(props) || fallback;
} else {
var slotNodes = this.$slots[name];
// warn duplicate slot usage
if (slotNodes) {
if ("development" !== 'production' && slotNodes._rendered) {
warn(
"Duplicate presence of slot \"" + name + "\" found in the same render tree " +
"- this will likely cause render errors.",
this
);
}
slotNodes._rendered = true;
}
nodes = slotNodes || fallback;
}
var target = props && props.slot;
if (target) {
return this.$createElement('template', { slot: target }, nodes)
} else {
return nodes
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter (id) {
return resolveAsset(this.$options, 'filters', id, true) || identity
}
/* */
/**
* Runtime helper for checking keyCodes from config.
* exposed as Vue.prototype._k
* passing in eventKeyName as last argument separately for backwards compat
*/
function checkKeyCodes (
eventKeyCode,
key,
builtInAlias,
eventKeyName
) {
var keyCodes = config.keyCodes[key] || builtInAlias;
if (keyCodes) {
if (Array.isArray(keyCodes)) {
return keyCodes.indexOf(eventKeyCode) === -1
} else {
return keyCodes !== eventKeyCode
}
} else if (eventKeyName) {
return hyphenate(eventKeyName) !== key
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps (
data,
tag,
value,
asProp,
isSync
) {
if (value) {
if (!isObject(value)) {
"development" !== 'production' && warn(
'v-bind without argument expects an Object or Array value',
this
);
} else {
if (Array.isArray(value)) {
value = toObject(value);
}
var hash;
var loop = function ( key ) {
if (
key === 'class' ||
key === 'style' ||
isReservedAttribute(key)
) {
hash = data;
} else {
var type = data.attrs && data.attrs.type;
hash = asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {});
}
if (!(key in hash)) {
hash[key] = value[key];
if (isSync) {
var on = data.on || (data.on = {});
on[("update:" + key)] = function ($event) {
value[key] = $event;
};
}
}
};
for (var key in value) { loop( key ); }
}
}
return data
}
/* */
/**
* Runtime helper for rendering static trees.
*/
function renderStatic (
index,
isInFor
) {
var cached = this._staticTrees || (this._staticTrees = []);
var tree = cached[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree by doing a shallow clone.
if (tree && !isInFor) {
return Array.isArray(tree)
? cloneVNodes(tree)
: cloneVNode(tree)
}
// otherwise, render a fresh tree.
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
);
markStatic(tree, ("__static__" + index), false);
return tree
}
/**
* Runtime helper for v-once.
* Effectively it means marking the node as static with a unique key.
*/
function markOnce (
tree,
index,
key
) {
markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
return tree
}
function markStatic (
tree,
key,
isOnce
) {
if (Array.isArray(tree)) {
for (var i = 0; i < tree.length; i++) {
if (tree[i] && typeof tree[i] !== 'string') {
markStaticNode(tree[i], (key + "_" + i), isOnce);
}
}
} else {
markStaticNode(tree, key, isOnce);
}
}
function markStaticNode (node, key, isOnce) {
node.isStatic = true;
node.key = key;
node.isOnce = isOnce;
}
/* */
function bindObjectListeners (data, value) {
if (value) {
if (!isPlainObject(value)) {
"development" !== 'production' && warn(
'v-on without argument expects an Object value',
this
);
} else {
var on = data.on = data.on ? extend({}, data.on) : {};
for (var key in value) {
var existing = on[key];
var ours = value[key];
on[key] = existing ? [].concat(existing, ours) : ours;
}
}
}
return data
}
/* */
/**
* This runtime helper creates an inline computed property for component
* props that contain object or array literals. The caching ensures the same
* object/array is returned unless the value has indeed changed, thus avoiding
* the child component to always re-render when comparing props values.
*
* Installed to the instance as _a, requires special handling in parser that
* transforms the following
* <foo :bar="{ a: 1 }"/>
* to:
* <foo :bar="_a(0, function(){return { a: 1 }})"
*/
function createInlineComputed (id, getter) {
var vm = this;
var watchers = vm._inlineComputed || (vm._inlineComputed = {});
var cached$$1 = watchers[id];
if (cached$$1) {
return cached$$1.value
} else {
watchers[id] = new Watcher(vm, getter, noop, { sync: true });
return watchers[id].value
}
}
/* */
function installRenderHelpers (target) {
target._o = markOnce;
target._n = toNumber;
target._s = toString;
target._l = renderList;
target._t = renderSlot;
target._q = looseEqual;
target._i = looseIndexOf;
target._m = renderStatic;
target._f = resolveFilter;
target._k = checkKeyCodes;
target._b = bindObjectProps;
target._v = createTextVNode;
target._e = createEmptyVNode;
target._u = resolveScopedSlots;
target._g = bindObjectListeners;
target._a = createInlineComputed;
}
/* */
function FunctionalRenderContext (
data,
props,
children,
parent,
Ctor
) {
var options = Ctor.options;
this.data = data;
this.props = props;
this.children = children;
this.parent = parent;
this.listeners = data.on || emptyObject;
this.injections = resolveInject(options.inject, parent);
this.slots = function () { return resolveSlots(children, parent); };
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var contextVm = Object.create(parent);
var isCompiled = isTrue(options._compiled);
var needNormalization = !isCompiled;
// support for compiled functional template
if (isCompiled) {
// exposing $options for renderStatic()
this.$options = options;
// pre-resolve slots for renderSlot()
this.$slots = this.slots();
this.$scopedSlots = data.scopedSlots || emptyObject;
}
if (options._scopeId) {
this._c = function (a, b, c, d) {
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
if (vnode) {
vnode.fnScopeId = options._scopeId;
vnode.fnContext = parent;
}
return vnode
};
} else {
this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
}
}
installRenderHelpers(FunctionalRenderContext.prototype);
function createFunctionalComponent (
Ctor,
propsData,
data,
contextVm,
children
) {
var options = Ctor.options;
var props = {};
var propOptions = options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || emptyObject);
}
} else {
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
if (isDef(data.props)) { mergeProps(props, data.props); }
}
var renderContext = new FunctionalRenderContext(
data,
props,
children,
contextVm,
Ctor
);
var vnode = options.render.call(null, renderContext._c, renderContext);
if (vnode instanceof VNode) {
vnode.fnContext = contextVm;
vnode.fnOptions = options;
if (data.slot) {
(vnode.data || (vnode.data = {})).slot = data.slot;
}
}
return vnode
}
function mergeProps (to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
var RECYCLE_LIST_MARKER = '@inRecycleList';
// Register the component hook to weex native render engine.
// The hook will be triggered by native, not javascript.
function registerComponentHook (
componentId,
type, // hook type, could be "lifecycle" or "instance"
hook, // hook name
fn
) {
if (!document || !document.taskCenter) {
warn("Can't find available \"document\" or \"taskCenter\".");
return
}
if (typeof document.taskCenter.registerHook === 'function') {
return document.taskCenter.registerHook(componentId, type, hook, fn)
}
warn(("Failed to register component hook \"" + type + "@" + hook + "#" + componentId + "\"."));
}
// Updates the state of the component to weex native render engine.
function updateComponentData (
componentId,
newData,
callback
) {
if (!document || !document.taskCenter) {
warn("Can't find available \"document\" or \"taskCenter\".");
return
}
if (typeof document.taskCenter.updateData === 'function') {
return document.taskCenter.updateData(componentId, newData, callback)
}
warn(("Failed to update component data (" + componentId + ")."));
}
/* */
// https://github.com/Hanks10100/weex-native-directive/tree/master/component
var uid$3 = 0;
// override Vue.prototype._init
function initVirtualComponent (options) {
if ( options === void 0 ) { options = {}; }
var vm = this;
var componentId = options.componentId;
// virtual component uid
vm._uid = "virtual-component-" + (uid$3++);
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
);
}
/* istanbul ignore else */
{
initProxy(vm);
}
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
// send initial data to native
var data = vm.$options.data;
var params = typeof data === 'function'
? getData(data, vm)
: data || {};
if (isPlainObject(params)) {
updateComponentData(componentId, params);
}
registerComponentHook(componentId, 'lifecycle', 'attach', function () {
callHook(vm, 'beforeMount');
var updateComponent = function () {
vm._update(vm._vnode, false);
};
new Watcher(vm, updateComponent, noop, null, true);
vm._isMounted = true;
callHook(vm, 'mounted');
});
registerComponentHook(componentId, 'lifecycle', 'detach', function () {
vm.$destroy();
});
}
// override Vue.prototype._update
function updateVirtualComponent (vnode) {
var vm = this;
var componentId = vm.$options.componentId;
if (vm._isMounted) {
callHook(vm, 'beforeUpdate');
}
vm._vnode = vnode;
if (vm._isMounted && componentId) {
// TODO: data should be filtered and without bindings
var data = Object.assign({}, vm._data);
updateComponentData(componentId, data, function () {
callHook(vm, 'updated');
});
}
}
// listening on native callback
function resolveVirtualComponent (vnode) {
var BaseCtor = vnode.componentOptions.Ctor;
var VirtualComponent = BaseCtor.extend({});
var cid = VirtualComponent.cid;
VirtualComponent.prototype._init = initVirtualComponent;
VirtualComponent.prototype._update = updateVirtualComponent;
vnode.componentOptions.Ctor = BaseCtor.extend({
beforeCreate: function beforeCreate () {
// const vm: Component = this
// TODO: listen on all events and dispatch them to the
// corresponding virtual components according to the componentId.
// vm._virtualComponents = {}
var createVirtualComponent = function (componentId, propsData) {
// create virtual component
// const subVm =
new VirtualComponent({
componentId: componentId,
propsData: propsData
});
// if (vm._virtualComponents) {
// vm._virtualComponents[componentId] = subVm
// }
};
registerComponentHook(cid, 'lifecycle', 'create', createVirtualComponent);
},
beforeDestroy: function beforeDestroy () {
delete this._virtualComponents;
}
});
}
/* */
function isRecyclableComponent (vnode) {
return vnode.data.attrs
? (RECYCLE_LIST_MARKER in vnode.data.attrs)
: false
}
function renderRecyclableComponentTemplate (vnode) {
// $flow-disable-line
delete vnode.data.attrs[RECYCLE_LIST_MARKER];
resolveVirtualComponent(vnode);
var vm = createComponentInstanceForVnode(vnode);
var render = (vm.$options)['@render'];
if (render) {
try {
return render.call(vm)
} catch (err) {
handleError(err, vm, "@render");
}
} else {
warn(
"@render function not defined on component used in <recycle-list>. " +
"Make sure to declare `recyclable=\"true\"` on the component's template.",
vm
);
}
}
/* */
// hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init (
vnode,
hydrating,
parentElm,
refElm
) {
if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
var child = vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance,
parentElm,
refElm
);
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
} else if (vnode.data.keepAlive) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
}
},
prepatch: function prepatch (oldVnode, vnode) {
var options = vnode.componentOptions;
var child = vnode.componentInstance = oldVnode.componentInstance;
updateChildComponent(
child,
options.propsData, // updated props
options.listeners, // updated listeners
vnode, // new parent vnode
options.children // new children
);
},
insert: function insert (vnode) {
var context = vnode.context;
var componentInstance = vnode.componentInstance;
if (!componentInstance._isMounted) {
componentInstance._isMounted = true;
callHook(componentInstance, 'mounted');
}
if (vnode.data.keepAlive) {
if (context._isMounted) {
// vue-router#1212
// During updates, a kept-alive component's child components may
// change, so directly walking the tree here may call activated hooks
// on incorrect children. Instead we push them into a queue which will
// be processed after the whole patch process ended.
queueActivatedComponent(componentInstance);
} else {
activateChildComponent(componentInstance, true /* direct */);
}
}
},
destroy: function destroy (vnode) {
var componentInstance = vnode.componentInstance;
if (!componentInstance._isDestroyed) {
if (!vnode.data.keepAlive) {
componentInstance.$destroy();
} else {
deactivateChildComponent(componentInstance, true /* direct */);
}
}
}
};
var hooksToMerge = Object.keys(componentVNodeHooks);
function createComponent (
Ctor,
data,
context,
children,
tag
) {
if (isUndef(Ctor)) {
return
}
var baseCtor = context.$options._base;
// plain options object: turn it into a constructor
if (isObject(Ctor)) {
Ctor = baseCtor.extend(Ctor);
}
// if at this stage it's not a constructor or an async component factory,
// reject.
if (typeof Ctor !== 'function') {
{
warn(("Invalid Component definition: " + (String(Ctor))), context);
}
return
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
if (Ctor === undefined) {
// return a placeholder node for async component, which is rendered
// as a comment node but preserves all the raw information for the node.
// the information will be used for async server-rendering and hydration.
return createAsyncPlaceholder(
asyncFactory,
data,
context,
children,
tag
)
}
}
data = data || {};
// resolve constructor options in case global mixins are applied after
// component constructor creation
resolveConstructorOptions(Ctor);
// transform component v-model data into props & events
if (isDef(data.model)) {
transformModel(Ctor.options, data);
}
// extract props
var propsData = extractPropsFromVNodeData(data, Ctor, tag);
// functional component
if (isTrue(Ctor.options.functional)) {
return createFunctionalComponent(Ctor, propsData, data, context, children)
}
// extract listeners, since these needs to be treated as
// child component listeners instead of DOM listeners
var listeners = data.on;
// replace with listeners with .native modifier
// so it gets processed during parent component patch.
data.on = data.nativeOn;
if (isTrue(Ctor.options.abstract)) {
// abstract components do not keep anything
// other than props & listeners & slot
// work around flow
var slot = data.slot;
data = {};
if (slot) {
data.slot = slot;
}
}
// merge component management hooks onto the placeholder node
mergeHooks(data);
// return a placeholder vnode
var name = Ctor.options.name || tag;
var vnode = new VNode(
("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
data, undefined, undefined, undefined, context,
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
asyncFactory
);
// Weex specific: invoke recycle-list optimized @render function for
// extracting cell-slot template.
// https://github.com/Hanks10100/weex-native-directive/tree/master/component
/* istanbul ignore if */
if (true && isRecyclableComponent(vnode)) {
return renderRecyclableComponentTemplate(vnode)
}
return vnode
}
function createComponentInstanceForVnode (
vnode, // we know it's MountedComponentVNode but flow doesn't
parent, // activeInstance in lifecycle state
parentElm,
refElm
) {
var options = {
_isComponent: true,
parent: parent,
_parentVnode: vnode,
_parentElm: parentElm || null,
_refElm: refElm || null
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnode.componentOptions.Ctor(options)
}
function mergeHooks (data) {
if (!data.hook) {
data.hook = {};
}
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
var fromParent = data.hook[key];
var ours = componentVNodeHooks[key];
data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
}
}
function mergeHook$1 (one, two) {
return function (a, b, c, d) {
one(a, b, c, d);
two(a, b, c, d);
}
}
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel (options, data) {
var prop = (options.model && options.model.prop) || 'value';
var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
if (isDef(on[event])) {
on[event] = [data.model.callback].concat(on[event]);
} else {
on[event] = data.model.callback;
}
}
/* */
var SIMPLE_NORMALIZE = 1;
var ALWAYS_NORMALIZE = 2;
// wrapper function for providing a more flexible interface
// without getting yelled at by flow
function createElement (
context,
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (Array.isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = undefined;
}
if (isTrue(alwaysNormalize)) {
normalizationType = ALWAYS_NORMALIZE;
}
return _createElement(context, tag, data, children, normalizationType)
}
function _createElement (
context,
tag,
data,
children,
normalizationType
) {
if (isDef(data) && isDef((data).__ob__)) {
"development" !== 'production' && warn(
"Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
'Always create fresh vnode data objects in each render!',
context
);
return createEmptyVNode()
}
// object syntax in v-bind
if (isDef(data) && isDef(data.is)) {
tag = data.is;
}
if (!tag) {
// in case of component :is set to falsy value
return createEmptyVNode()
}
// warn against non-primitive key
if ("development" !== 'production' &&
isDef(data) && isDef(data.key) && !isPrimitive(data.key)
) {
if (!true || !('@binding' in data.key)) {
warn(
'Avoid using non-primitive value as key, ' +
'use string/number value instead.',
context
);
}
}
// support single function children as default scoped slot
if (Array.isArray(children) &&
typeof children[0] === 'function'
) {
data = data || {};
data.scopedSlots = { default: children[0] };
children.length = 0;
}
if (normalizationType === ALWAYS_NORMALIZE) {
children = normalizeChildren(children);
} else if (normalizationType === SIMPLE_NORMALIZE) {
children = simpleNormalizeChildren(children);
}
var vnode, ns;
if (typeof tag === 'string') {
var Ctor;
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
// platform built-in elements
vnode = new VNode(
config.parsePlatformTagName(tag), data, children,
undefined, undefined, context
);
} else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
// component
vnode = createComponent(Ctor, data, context, children, tag);
} else {
// unknown or unlisted namespaced elements
// check at runtime because it may get assigned a namespace when its
// parent normalizes children
vnode = new VNode(
tag, data, children,
undefined, undefined, context
);
}
} else {
// direct component options / constructor
vnode = createComponent(tag, data, context, children);
}
if (isDef(vnode)) {
if (ns) { applyNS(vnode, ns); }
return vnode
} else {
return createEmptyVNode()
}
}
function applyNS (vnode, ns, force) {
vnode.ns = ns;
if (vnode.tag === 'foreignObject') {
// use default namespace inside foreignObject
ns = undefined;
force = true;
}
if (isDef(vnode.children)) {
for (var i = 0, l = vnode.children.length; i < l; i++) {
var child = vnode.children[i];
if (isDef(child.tag) && (isUndef(child.ns) || isTrue(force))) {
applyNS(child, ns, force);
}
}
}
}
/* */
function initRender (vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null; // v-once cached trees
var options = vm.$options;
var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(options._renderChildren, renderContext);
vm.$scopedSlots = emptyObject;
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
// $attrs & $listeners are exposed for easier HOC creation.
// they need to be reactive so that HOCs using them are always updated
var parentData = parentVnode && parentVnode.data;
/* istanbul ignore else */
{
defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
}, true);
defineReactive(vm, '$listeners', options._parentListeners || emptyObject, function () {
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
}, true);
}
}
function renderMixin (Vue) {
// install runtime convenience helpers
installRenderHelpers(Vue.prototype);
Vue.prototype.$nextTick = function (fn) {
return nextTick(fn, this)
};
Vue.prototype._render = function () {
var vm = this;
var ref = vm.$options;
var render = ref.render;
var _parentVnode = ref._parentVnode;
if (vm._isMounted) {
// if the parent didn't update, the slot nodes will be the ones from
// last render. They need to be cloned to ensure "freshness" for this render.
for (var key in vm.$slots) {
var slot = vm.$slots[key];
// _rendered is a flag added by renderSlot, but may not be present
// if the slot is passed from manually written render functions
if (slot._rendered || (slot[0] && slot[0].elm)) {
vm.$slots[key] = cloneVNodes(slot, true /* deep */);
}
}
}
vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject;
// set parent vnode. this allows render functions to have access
// to the data on the placeholder node.
vm.$vnode = _parentVnode;
// render self
var vnode;
try {
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
{
if (vm.$options.renderError) {
try {
vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
} catch (e) {
handleError(e, vm, "renderError");
vnode = vm._vnode;
}
} else {
vnode = vm._vnode;
}
}
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
if ("development" !== 'production' && Array.isArray(vnode)) {
warn(
'Multiple root nodes returned from render function. Render function ' +
'should return a single root node.',
vm
);
}
vnode = createEmptyVNode();
}
// set parent
vnode.parent = _parentVnode;
return vnode
};
}
/* */
var uid = 0;
function initMixin (Vue) {
Vue.prototype._init = function (options) {
var vm = this;
// a uid
vm._uid = uid++;
var startTag, endTag;
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
startTag = "vue-perf-start:" + (vm._uid);
endTag = "vue-perf-end:" + (vm._uid);
mark(startTag);
}
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
);
}
/* istanbul ignore else */
{
initProxy(vm);
}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
vm._name = formatComponentName(vm, false);
mark(endTag);
measure(("vue " + (vm._name) + " init"), startTag, endTag);
}
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
};
}
function initInternalComponent (vm, options) {
var opts = vm.$options = Object.create(vm.constructor.options);
// doing this because it's faster than dynamic enumeration.
var parentVnode = options._parentVnode;
opts.parent = options.parent;
opts._parentVnode = parentVnode;
opts._parentElm = options._parentElm;
opts._refElm = options._refElm;
var vnodeComponentOptions = parentVnode.componentOptions;
opts.propsData = vnodeComponentOptions.propsData;
opts._parentListeners = vnodeComponentOptions.listeners;
opts._renderChildren = vnodeComponentOptions.children;
opts._componentTag = vnodeComponentOptions.tag;
if (options.render) {
opts.render = options.render;
opts.staticRenderFns = options.staticRenderFns;
}
}
function resolveConstructorOptions (Ctor) {
var options = Ctor.options;
if (Ctor.super) {
var superOptions = resolveConstructorOptions(Ctor.super);
var cachedSuperOptions = Ctor.superOptions;
if (superOptions !== cachedSuperOptions) {
// super option changed,
// need to resolve new options.
Ctor.superOptions = superOptions;
// check if there are any late-modified/attached options (#4976)
var modifiedOptions = resolveModifiedOptions(Ctor);
// update base extend options
if (modifiedOptions) {
extend(Ctor.extendOptions, modifiedOptions);
}
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
if (options.name) {
options.components[options.name] = Ctor;
}
}
}
return options
}
function resolveModifiedOptions (Ctor) {
var modified;
var latest = Ctor.options;
var extended = Ctor.extendOptions;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) { modified = {}; }
modified[key] = dedupe(latest[key], extended[key], sealed[key]);
}
}
return modified
}
function dedupe (latest, extended, sealed) {
// compare latest and sealed to ensure lifecycle hooks won't be duplicated
// between merges
if (Array.isArray(latest)) {
var res = [];
sealed = Array.isArray(sealed) ? sealed : [sealed];
extended = Array.isArray(extended) ? extended : [extended];
for (var i = 0; i < latest.length; i++) {
// push original options and not sealed options to exclude duplicated options
if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
res.push(latest[i]);
}
}
return res
} else {
return latest
}
}
function Vue$2 (options) {
if ("development" !== 'production' &&
!(this instanceof Vue$2)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
initMixin(Vue$2);
stateMixin(Vue$2);
eventsMixin(Vue$2);
lifecycleMixin(Vue$2);
renderMixin(Vue$2);
/* */
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this
};
}
/* */
function initMixin$1 (Vue) {
Vue.mixin = function (mixin) {
this.options = mergeOptions(this.options, mixin);
return this
};
}
/* */
function initExtend (Vue) {
/**
* Each instance constructor, including Vue, has a unique
* cid. This enables us to create wrapped "child
* constructors" for prototypal inheritance and cache them.
*/
Vue.cid = 0;
var cid = 1;
/**
* Class inheritance
*/
Vue.extend = function (extendOptions) {
extendOptions = extendOptions || {};
var Super = this;
var SuperId = Super.cid;
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
if (cachedCtors[SuperId]) {
return cachedCtors[SuperId]
}
var name = extendOptions.name || Super.options.name;
if ("development" !== 'production' && name) {
validateComponentName(name);
}
var Sub = function VueComponent (options) {
this._init(options);
};
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.cid = cid++;
Sub.options = mergeOptions(
Super.options,
extendOptions
);
Sub['super'] = Super;
// For props and computed properties, we define the proxy getters on
// the Vue instances at extension time, on the extended prototype. This
// avoids Object.defineProperty calls for each instance created.
if (Sub.options.props) {
initProps$1(Sub);
}
if (Sub.options.computed) {
initComputed$1(Sub);
}
// allow further extension/mixin/plugin usage
Sub.extend = Super.extend;
Sub.mixin = Super.mixin;
Sub.use = Super.use;
// create asset registers, so extended classes
// can have their private assets too.
ASSET_TYPES.forEach(function (type) {
Sub[type] = Super[type];
});
// enable recursive self-lookup
if (name) {
Sub.options.components[name] = Sub;
}
// keep a reference to the super options at extension time.
// later at instantiation we can check if Super's options have
// been updated.
Sub.superOptions = Super.options;
Sub.extendOptions = extendOptions;
Sub.sealedOptions = extend({}, Sub.options);
// cache constructor
cachedCtors[SuperId] = Sub;
return Sub
};
}
function initProps$1 (Comp) {
var props = Comp.options.props;
for (var key in props) {
proxy(Comp.prototype, "_props", key);
}
}
function initComputed$1 (Comp) {
var computed = Comp.options.computed;
for (var key in computed) {
defineComputed(Comp.prototype, key, computed[key]);
}
}
/* */
function initAssetRegisters (Vue) {
/**
* Create asset registration methods.
*/
ASSET_TYPES.forEach(function (type) {
Vue[type] = function (
id,
definition
) {
if (!definition) {
return this.options[type + 's'][id]
} else {
/* istanbul ignore if */
if ("development" !== 'production' && type === 'component') {
validateComponentName(id);
}
if (type === 'component' && isPlainObject(definition)) {
definition.name = definition.name || id;
definition = this.options._base.extend(definition);
}
if (type === 'directive' && typeof definition === 'function') {
definition = { bind: definition, update: definition };
}
this.options[type + 's'][id] = definition;
return definition
}
};
});
}
/* */
function getComponentName (opts) {
return opts && (opts.Ctor.options.name || opts.tag)
}
function matches (pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1
} else if (typeof pattern === 'string') {
return pattern.split(',').indexOf(name) > -1
} else if (isRegExp(pattern)) {
return pattern.test(name)
}
/* istanbul ignore next */
return false
}
function pruneCache (keepAliveInstance, filter) {
var cache = keepAliveInstance.cache;
var keys = keepAliveInstance.keys;
var _vnode = keepAliveInstance._vnode;
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
pruneCacheEntry(cache, key, keys, _vnode);
}
}
}
}
function pruneCacheEntry (
cache,
key,
keys,
current
) {
var cached$$1 = cache[key];
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
cached$$1.componentInstance.$destroy();
}
cache[key] = null;
remove(keys, key);
}
var patternTypes = [String, RegExp, Array];
var KeepAlive = {
name: 'keep-alive',
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes,
max: [String, Number]
},
created: function created () {
this.cache = Object.create(null);
this.keys = [];
},
destroyed: function destroyed () {
var this$1 = this;
for (var key in this$1.cache) {
pruneCacheEntry(this$1.cache, key, this$1.keys);
}
},
watch: {
include: function include (val) {
pruneCache(this, function (name) { return matches(val, name); });
},
exclude: function exclude (val) {
pruneCache(this, function (name) { return !matches(val, name); });
}
},
render: function render () {
var slot = this.$slots.default;
var vnode = getFirstComponentChild(slot);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
var ref = this;
var include = ref.include;
var exclude = ref.exclude;
if (
// not included
(include && (!name || !matches(include, name))) ||
// excluded
(exclude && name && matches(exclude, name))
) {
return vnode
}
var ref$1 = this;
var cache = ref$1.cache;
var keys = ref$1.keys;
var key = vnode.key == null
// same constructor may get registered as different local components
// so cid alone is not enough (#3269)
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
: vnode.key;
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance;
// make current key freshest
remove(keys, key);
keys.push(key);
} else {
cache[key] = vnode;
keys.push(key);
// prune oldest entry
if (this.max && keys.length > parseInt(this.max)) {
pruneCacheEntry(cache, keys[0], keys, this._vnode);
}
}
vnode.data.keepAlive = true;
}
return vnode || (slot && slot[0])
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI (Vue) {
// config
var configDef = {};
configDef.get = function () { return config; };
{
configDef.set = function () {
warn(
'Do not replace the Vue.config object, set individual fields instead.'
);
};
}
Object.defineProperty(Vue, 'config', configDef);
// exposed util methods.
// NOTE: these are not considered part of the public API - avoid relying on
// them unless you are aware of the risk.
Vue.util = {
warn: warn,
extend: extend,
mergeOptions: mergeOptions,
defineReactive: defineReactive
};
Vue.set = set;
Vue.delete = del;
Vue.nextTick = nextTick;
Vue.options = Object.create(null);
ASSET_TYPES.forEach(function (type) {
Vue.options[type + 's'] = Object.create(null);
});
// this is used to identify the "base" constructor to extend all plain-object
// components with in Weex's multi-instance scenarios.
Vue.options._base = Vue;
extend(Vue.options.components, builtInComponents);
initUse(Vue);
initMixin$1(Vue);
initExtend(Vue);
initAssetRegisters(Vue);
}
initGlobalAPI(Vue$2);
Object.defineProperty(Vue$2.prototype, '$isServer', {
get: isServerRendering
});
Object.defineProperty(Vue$2.prototype, '$ssrContext', {
get: function get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
});
Vue$2.version = '2.5.11';
var latestNodeId = 1;
function TextNode (text) {
this.instanceId = '';
this.nodeId = latestNodeId++;
this.parentNode = null;
this.nodeType = 3;
this.text = text;
}
/* globals document */
// document is injected by weex factory wrapper
var namespaceMap = {};
function createElement$1 (tagName) {
return document.createElement(tagName)
}
function createElementNS (namespace, tagName) {
return document.createElement(namespace + ':' + tagName)
}
function createTextNode (text) {
return new TextNode(text)
}
function createComment (text) {
return document.createComment(text)
}
function insertBefore (node, target, before) {
if (target.nodeType === 3) {
if (node.type === 'text') {
node.setAttr('value', target.text);
target.parentNode = node;
} else {
var text = createElement$1('text');
text.setAttr('value', target.text);
node.insertBefore(text, before);
}
return
}
node.insertBefore(target, before);
}
function removeChild (node, child) {
if (child.nodeType === 3) {
node.setAttr('value', '');
return
}
node.removeChild(child);
}
function appendChild (node, child) {
if (child.nodeType === 3) {
if (node.type === 'text') {
node.setAttr('value', child.text);
child.parentNode = node;
} else {
var text = createElement$1('text');
text.setAttr('value', child.text);
node.appendChild(text);
}
return
}
node.appendChild(child);
}
function parentNode (node) {
return node.parentNode
}
function nextSibling (node) {
return node.nextSibling
}
function tagName (node) {
return node.type
}
function setTextContent (node, text) {
node.parentNode.setAttr('value', text);
}
function setAttribute (node, key, val) {
node.setAttr(key, val);
}
var nodeOps = Object.freeze({
namespaceMap: namespaceMap,
createElement: createElement$1,
createElementNS: createElementNS,
createTextNode: createTextNode,
createComment: createComment,
insertBefore: insertBefore,
removeChild: removeChild,
appendChild: appendChild,
parentNode: parentNode,
nextSibling: nextSibling,
tagName: tagName,
setTextContent: setTextContent,
setAttribute: setAttribute
});
/* */
var ref = {
create: function create (_, vnode) {
registerRef(vnode);
},
update: function update (oldVnode, vnode) {
if (oldVnode.data.ref !== vnode.data.ref) {
registerRef(oldVnode, true);
registerRef(vnode);
}
},
destroy: function destroy (vnode) {
registerRef(vnode, true);
}
};
function registerRef (vnode, isRemoval) {
var key = vnode.data.ref;
if (!key) { return }
var vm = vnode.context;
var ref = vnode.componentInstance || vnode.elm;
var refs = vm.$refs;
if (isRemoval) {
if (Array.isArray(refs[key])) {
remove(refs[key], ref);
} else if (refs[key] === ref) {
refs[key] = undefined;
}
} else {
if (vnode.data.refInFor) {
if (!Array.isArray(refs[key])) {
refs[key] = [ref];
} else if (refs[key].indexOf(ref) < 0) {
// $flow-disable-line
refs[key].push(ref);
}
} else {
refs[key] = ref;
}
}
}
/* */
var isHTMLTag = makeMap(
'html,body,base,head,link,meta,style,title,' +
'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
'embed,object,param,source,canvas,script,noscript,del,ins,' +
'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
'output,progress,select,textarea,' +
'details,dialog,menu,menuitem,summary,' +
'content,element,shadow,template,blockquote,iframe,tfoot'
);
// this map is intentionally selective, only covering SVG elements that may
// contain child elements.
var isSVG = makeMap(
'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
true
);
var isTextInputType = makeMap('text,number,password,search,email,tel,url');
/**
* Virtual DOM patching algorithm based on Snabbdom by
* Simon Friis Vindum (@paldepind)
* Licensed under the MIT License
* https://github.com/paldepind/snabbdom/blob/master/LICENSE
*
* modified by Evan You (@yyx990803)
*
* Not type-checking this because this file is perf-critical and the cost
* of making flow understand it is not worth it.
*/
var emptyNode = new VNode('', {}, []);
var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
function sameVnode (a, b) {
return (
a.key === b.key && (
(
a.tag === b.tag &&
a.isComment === b.isComment &&
isDef(a.data) === isDef(b.data) &&
sameInputType(a, b)
) || (
isTrue(a.isAsyncPlaceholder) &&
a.asyncFactory === b.asyncFactory &&
isUndef(b.asyncFactory.error)
)
)
)
}
function sameInputType (a, b) {
if (a.tag !== 'input') { return true }
var i;
var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
}
function createKeyToOldIdx (children, beginIdx, endIdx) {
var i, key;
var map = {};
for (i = beginIdx; i <= endIdx; ++i) {
key = children[i].key;
if (isDef(key)) { map[key] = i; }
}
return map
}
function createPatchFunction (backend) {
var i, j;
var cbs = {};
var modules = backend.modules;
var nodeOps = backend.nodeOps;
for (i = 0; i < hooks.length; ++i) {
cbs[hooks[i]] = [];
for (j = 0; j < modules.length; ++j) {
if (isDef(modules[j][hooks[i]])) {
cbs[hooks[i]].push(modules[j][hooks[i]]);
}
}
}
function emptyNodeAt (elm) {
return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
}
function createRmCb (childElm, listeners) {
function remove () {
if (--remove.listeners === 0) {
removeNode(childElm);
}
}
remove.listeners = listeners;
return remove
}
function removeNode (el) {
var parent = nodeOps.parentNode(el);
// element may have already been removed due to v-html / v-text
if (isDef(parent)) {
nodeOps.removeChild(parent, el);
}
}
function isUnknownElement$$1 (vnode, inVPre) {
return (
!inVPre &&
!vnode.ns &&
!(
config.ignoredElements.length &&
config.ignoredElements.some(function (ignore) {
return isRegExp(ignore)
? ignore.test(vnode.tag)
: ignore === vnode.tag
})
) &&
config.isUnknownElement(vnode.tag)
)
}
var creatingElmInVPre = 0;
function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {
vnode.isRootInsert = !nested; // for transition enter check
if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
return
}
var data = vnode.data;
var children = vnode.children;
var tag = vnode.tag;
if (isDef(tag)) {
{
if (data && data.pre) {
creatingElmInVPre++;
}
if (isUnknownElement$$1(vnode, creatingElmInVPre)) {
warn(
'Unknown custom element: <' + tag + '> - did you ' +
'register the component correctly? For recursive components, ' +
'make sure to provide the "name" option.',
vnode.context
);
}
}
vnode.elm = vnode.ns
? nodeOps.createElementNS(vnode.ns, tag)
: nodeOps.createElement(tag, vnode);
setScope(vnode);
/* istanbul ignore if */
{
// in Weex, the default insertion order is parent-first.
// List items can be optimized to use children-first insertion
// with append="tree".
var appendAsTree = isDef(data) && isTrue(data.appendAsTree);
if (!appendAsTree) {
if (isDef(data)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
}
insert(parentElm, vnode.elm, refElm);
}
createChildren(vnode, children, insertedVnodeQueue);
if (appendAsTree) {
if (isDef(data)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
}
insert(parentElm, vnode.elm, refElm);
}
}
if ("development" !== 'production' && data && data.pre) {
creatingElmInVPre--;
}
} else if (isTrue(vnode.isComment)) {
vnode.elm = nodeOps.createComment(vnode.text);
insert(parentElm, vnode.elm, refElm);
} else {
vnode.elm = nodeOps.createTextNode(vnode.text);
insert(parentElm, vnode.elm, refElm);
}
}
function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i = vnode.data;
if (isDef(i)) {
var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
if (isDef(i = i.hook) && isDef(i = i.init)) {
i(vnode, false /* hydrating */, parentElm, refElm);
}
// after calling the init hook, if the vnode is a child component
// it should've created a child instance and mounted it. the child
// component also has set the placeholder vnode's elm.
// in that case we can just return the element and be done.
if (isDef(vnode.componentInstance)) {
initComponent(vnode, insertedVnodeQueue);
if (isTrue(isReactivated)) {
reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
}
return true
}
}
}
function initComponent (vnode, insertedVnodeQueue) {
if (isDef(vnode.data.pendingInsert)) {
insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
vnode.data.pendingInsert = null;
}
vnode.elm = vnode.componentInstance.$el;
if (isPatchable(vnode)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
setScope(vnode);
} else {
// empty component root.
// skip all element-related modules except for ref (#3455)
registerRef(vnode);
// make sure to invoke the insert hook
insertedVnodeQueue.push(vnode);
}
}
function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i;
// hack for #4339: a reactivated component with inner transition
// does not trigger because the inner node's created hooks are not called
// again. It's not ideal to involve module-specific logic in here but
// there doesn't seem to be a better way to do it.
var innerNode = vnode;
while (innerNode.componentInstance) {
innerNode = innerNode.componentInstance._vnode;
if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
for (i = 0; i < cbs.activate.length; ++i) {
cbs.activate[i](emptyNode, innerNode);
}
insertedVnodeQueue.push(innerNode);
break
}
}
// unlike a newly created component,
// a reactivated keep-alive component doesn't insert itself
insert(parentElm, vnode.elm, refElm);
}
function insert (parent, elm, ref$$1) {
if (isDef(parent)) {
if (isDef(ref$$1)) {
if (ref$$1.parentNode === parent) {
nodeOps.insertBefore(parent, elm, ref$$1);
}
} else {
nodeOps.appendChild(parent, elm);
}
}
}
function createChildren (vnode, children, insertedVnodeQueue) {
if (Array.isArray(children)) {
{
checkDuplicateKeys(children);
}
for (var i = 0; i < children.length; ++i) {
createElm(children[i], insertedVnodeQueue, vnode.elm, null, true);
}
} else if (isPrimitive(vnode.text)) {
nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text));
}
}
function isPatchable (vnode) {
while (vnode.componentInstance) {
vnode = vnode.componentInstance._vnode;
}
return isDef(vnode.tag)
}
function invokeCreateHooks (vnode, insertedVnodeQueue) {
for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
cbs.create[i$1](emptyNode, vnode);
}
i = vnode.data.hook; // Reuse variable
if (isDef(i)) {
if (isDef(i.create)) { i.create(emptyNode, vnode); }
if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
}
}
// set scope id attribute for scoped CSS.
// this is implemented as a special case to avoid the overhead
// of going through the normal attribute patching process.
function setScope (vnode) {
var i;
if (isDef(i = vnode.fnScopeId)) {
nodeOps.setAttribute(vnode.elm, i, '');
} else {
var ancestor = vnode;
while (ancestor) {
if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
nodeOps.setAttribute(vnode.elm, i, '');
}
ancestor = ancestor.parent;
}
}
// for slot content they should also get the scopeId from the host instance.
if (isDef(i = activeInstance) &&
i !== vnode.context &&
i !== vnode.fnContext &&
isDef(i = i.$options._scopeId)
) {
nodeOps.setAttribute(vnode.elm, i, '');
}
}
function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
for (; startIdx <= endIdx; ++startIdx) {
createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm);
}
}
function invokeDestroyHook (vnode) {
var i, j;
var data = vnode.data;
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
}
if (isDef(i = vnode.children)) {
for (j = 0; j < vnode.children.length; ++j) {
invokeDestroyHook(vnode.children[j]);
}
}
}
function removeVnodes (parentElm, vnodes, startIdx, endIdx) {
for (; startIdx <= endIdx; ++startIdx) {
var ch = vnodes[startIdx];
if (isDef(ch)) {
if (isDef(ch.tag)) {
removeAndInvokeRemoveHook(ch);
invokeDestroyHook(ch);
} else { // Text node
removeNode(ch.elm);
}
}
}
}
function removeAndInvokeRemoveHook (vnode, rm) {
if (isDef(rm) || isDef(vnode.data)) {
var i;
var listeners = cbs.remove.length + 1;
if (isDef(rm)) {
// we have a recursively passed down rm callback
// increase the listeners count
rm.listeners += listeners;
} else {
// directly removing
rm = createRmCb(vnode.elm, listeners);
}
// recursively invoke hooks on child component root node
if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
removeAndInvokeRemoveHook(i, rm);
}
for (i = 0; i < cbs.remove.length; ++i) {
cbs.remove[i](vnode, rm);
}
if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
i(vnode, rm);
} else {
rm();
}
} else {
removeNode(vnode.elm);
}
}
function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
var oldStartIdx = 0;
var newStartIdx = 0;
var oldEndIdx = oldCh.length - 1;
var oldStartVnode = oldCh[0];
var oldEndVnode = oldCh[oldEndIdx];
var newEndIdx = newCh.length - 1;
var newStartVnode = newCh[0];
var newEndVnode = newCh[newEndIdx];
var oldKeyToIdx, idxInOld, vnodeToMove, refElm;
// removeOnly is a special flag used only by <transition-group>
// to ensure removed elements stay in correct relative positions
// during leaving transitions
var canMove = !removeOnly;
{
checkDuplicateKeys(newCh);
}
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
if (isUndef(oldStartVnode)) {
oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
} else if (isUndef(oldEndVnode)) {
oldEndVnode = oldCh[--oldEndIdx];
} else if (sameVnode(oldStartVnode, newStartVnode)) {
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
oldStartVnode = oldCh[++oldStartIdx];
newStartVnode = newCh[++newStartIdx];
} else if (sameVnode(oldEndVnode, newEndVnode)) {
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
oldEndVnode = oldCh[--oldEndIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
oldStartVnode = oldCh[++oldStartIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
oldEndVnode = oldCh[--oldEndIdx];
newStartVnode = newCh[++newStartIdx];
} else {
if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
idxInOld = isDef(newStartVnode.key)
? oldKeyToIdx[newStartVnode.key]
: findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
if (isUndef(idxInOld)) { // New element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
} else {
vnodeToMove = oldCh[idxInOld];
if (sameVnode(vnodeToMove, newStartVnode)) {
patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue);
oldCh[idxInOld] = undefined;
canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
} else {
// same key but different element. treat as new element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
}
}
newStartVnode = newCh[++newStartIdx];
}
}
if (oldStartIdx > oldEndIdx) {
refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
} else if (newStartIdx > newEndIdx) {
removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
}
}
function checkDuplicateKeys (children) {
var seenKeys = {};
for (var i = 0; i < children.length; i++) {
var vnode = children[i];
var key = vnode.key;
if (isDef(key)) {
if (seenKeys[key]) {
warn(
("Duplicate keys detected: '" + key + "'. This may cause an update error."),
vnode.context
);
} else {
seenKeys[key] = true;
}
}
}
}
function findIdxInOld (node, oldCh, start, end) {
for (var i = start; i < end; i++) {
var c = oldCh[i];
if (isDef(c) && sameVnode(node, c)) { return i }
}
}
function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
if (oldVnode === vnode) {
return
}
var elm = vnode.elm = oldVnode.elm;
if (isTrue(oldVnode.isAsyncPlaceholder)) {
if (isDef(vnode.asyncFactory.resolved)) {
hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
} else {
vnode.isAsyncPlaceholder = true;
}
return
}
// reuse element for static trees.
// note we only do this if the vnode is cloned -
// if the new node is not cloned it means the render functions have been
// reset by the hot-reload-api and we need to do a proper re-render.
if (isTrue(vnode.isStatic) &&
isTrue(oldVnode.isStatic) &&
vnode.key === oldVnode.key &&
(isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
) {
vnode.componentInstance = oldVnode.componentInstance;
return
}
var i;
var data = vnode.data;
if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
i(oldVnode, vnode);
}
var oldCh = oldVnode.children;
var ch = vnode.children;
if (isDef(data) && isPatchable(vnode)) {
for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
}
if (isUndef(vnode.text)) {
if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
} else if (isDef(ch)) {
if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
} else if (isDef(oldCh)) {
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
} else if (isDef(oldVnode.text)) {
nodeOps.setTextContent(elm, '');
}
} else if (oldVnode.text !== vnode.text) {
nodeOps.setTextContent(elm, vnode.text);
}
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
}
}
function invokeInsertHook (vnode, queue, initial) {
// delay insert hooks for component root nodes, invoke them after the
// element is really inserted
if (isTrue(initial) && isDef(vnode.parent)) {
vnode.parent.data.pendingInsert = queue;
} else {
for (var i = 0; i < queue.length; ++i) {
queue[i].data.hook.insert(queue[i]);
}
}
}
var hydrationBailed = false;
// list of modules that can skip create hook during hydration because they
// are already rendered on the client or has no need for initialization
// Note: style is excluded because it relies on initial clone for future
// deep updates (#7063).
var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
// Note: this is a browser-only function so we can assume elms are DOM nodes.
function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
var i;
var tag = vnode.tag;
var data = vnode.data;
var children = vnode.children;
inVPre = inVPre || (data && data.pre);
vnode.elm = elm;
if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
vnode.isAsyncPlaceholder = true;
return true
}
// assert node match
{
if (!assertNodeMatch(elm, vnode, inVPre)) {
return false
}
}
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
if (isDef(i = vnode.componentInstance)) {
// child component. it should have hydrated its own tree.
initComponent(vnode, insertedVnodeQueue);
return true
}
}
if (isDef(tag)) {
if (isDef(children)) {
// empty element, allow client to pick up and populate children
if (!elm.hasChildNodes()) {
createChildren(vnode, children, insertedVnodeQueue);
} else {
// v-html and domProps: innerHTML
if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
if (i !== elm.innerHTML) {
/* istanbul ignore if */
if ("development" !== 'production' &&
typeof console !== 'undefined' &&
!hydrationBailed
) {
hydrationBailed = true;
console.warn('Parent: ', elm);
console.warn('server innerHTML: ', i);
console.warn('client innerHTML: ', elm.innerHTML);
}
return false
}
} else {
// iterate and compare children lists
var childrenMatch = true;
var childNode = elm.firstChild;
for (var i$1 = 0; i$1 < children.length; i$1++) {
if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
childrenMatch = false;
break
}
childNode = childNode.nextSibling;
}
// if childNode is not null, it means the actual childNodes list is
// longer than the virtual children list.
if (!childrenMatch || childNode) {
/* istanbul ignore if */
if ("development" !== 'production' &&
typeof console !== 'undefined' &&
!hydrationBailed
) {
hydrationBailed = true;
console.warn('Parent: ', elm);
console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
}
return false
}
}
}
}
if (isDef(data)) {
var fullInvoke = false;
for (var key in data) {
if (!isRenderedModule(key)) {
fullInvoke = true;
invokeCreateHooks(vnode, insertedVnodeQueue);
break
}
}
if (!fullInvoke && data['class']) {
// ensure collecting deps for deep class bindings for future updates
traverse(data['class']);
}
}
} else if (elm.data !== vnode.text) {
elm.data = vnode.text;
}
return true
}
function assertNodeMatch (node, vnode, inVPre) {
if (isDef(vnode.tag)) {
return vnode.tag.indexOf('vue-component') === 0 || (
!isUnknownElement$$1(vnode, inVPre) &&
vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
)
} else {
return node.nodeType === (vnode.isComment ? 8 : 3)
}
}
return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
if (isUndef(vnode)) {
if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
return
}
var isInitialPatch = false;
var insertedVnodeQueue = [];
if (isUndef(oldVnode)) {
// empty mount (likely as component), create new root element
isInitialPatch = true;
createElm(vnode, insertedVnodeQueue, parentElm, refElm);
} else {
var isRealElement = isDef(oldVnode.nodeType);
if (!isRealElement && sameVnode(oldVnode, vnode)) {
// patch existing root node
patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
} else {
if (isRealElement) {
// mounting to a real element
// check if this is server-rendered content and if we can perform
// a successful hydration.
if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
oldVnode.removeAttribute(SSR_ATTR);
hydrating = true;
}
if (isTrue(hydrating)) {
if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
invokeInsertHook(vnode, insertedVnodeQueue, true);
return oldVnode
} else {
warn(
'The client-side rendered virtual DOM tree is not matching ' +
'server-rendered content. This is likely caused by incorrect ' +
'HTML markup, for example nesting block-level elements inside ' +
'<p>, or missing <tbody>. Bailing hydration and performing ' +
'full client-side render.'
);
}
}
// either not server-rendered, or hydration failed.
// create an empty node and replace it
oldVnode = emptyNodeAt(oldVnode);
}
// replacing existing element
var oldElm = oldVnode.elm;
var parentElm$1 = nodeOps.parentNode(oldElm);
// create new node
createElm(
vnode,
insertedVnodeQueue,
// extremely rare edge case: do not insert if old element is in a
// leaving transition. Only happens when combining transition +
// keep-alive + HOCs. (#4590)
oldElm._leaveCb ? null : parentElm$1,
nodeOps.nextSibling(oldElm)
);
// update parent placeholder node element, recursively
if (isDef(vnode.parent)) {
var ancestor = vnode.parent;
var patchable = isPatchable(vnode);
while (ancestor) {
for (var i = 0; i < cbs.destroy.length; ++i) {
cbs.destroy[i](ancestor);
}
ancestor.elm = vnode.elm;
if (patchable) {
for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
cbs.create[i$1](emptyNode, ancestor);
}
// #6513
// invoke insert hooks that may have been merged by create hooks.
// e.g. for directives that uses the "inserted" hook.
var insert = ancestor.data.hook.insert;
if (insert.merged) {
// start at index 1 to avoid re-invoking component mounted hook
for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
insert.fns[i$2]();
}
}
} else {
registerRef(ancestor);
}
ancestor = ancestor.parent;
}
}
// destroy old node
if (isDef(parentElm$1)) {
removeVnodes(parentElm$1, [oldVnode], 0, 0);
} else if (isDef(oldVnode.tag)) {
invokeDestroyHook(oldVnode);
}
}
}
invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
return vnode.elm
}
}
/* */
var directives = {
create: updateDirectives,
update: updateDirectives,
destroy: function unbindDirectives (vnode) {
updateDirectives(vnode, emptyNode);
}
};
function updateDirectives (oldVnode, vnode) {
if (oldVnode.data.directives || vnode.data.directives) {
_update(oldVnode, vnode);
}
}
function _update (oldVnode, vnode) {
var isCreate = oldVnode === emptyNode;
var isDestroy = vnode === emptyNode;
var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
var dirsWithInsert = [];
var dirsWithPostpatch = [];
var key, oldDir, dir;
for (key in newDirs) {
oldDir = oldDirs[key];
dir = newDirs[key];
if (!oldDir) {
// new directive, bind
callHook$1(dir, 'bind', vnode, oldVnode);
if (dir.def && dir.def.inserted) {
dirsWithInsert.push(dir);
}
} else {
// existing directive, update
dir.oldValue = oldDir.value;
callHook$1(dir, 'update', vnode, oldVnode);
if (dir.def && dir.def.componentUpdated) {
dirsWithPostpatch.push(dir);
}
}
}
if (dirsWithInsert.length) {
var callInsert = function () {
for (var i = 0; i < dirsWithInsert.length; i++) {
callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
}
};
if (isCreate) {
mergeVNodeHook(vnode, 'insert', callInsert);
} else {
callInsert();
}
}
if (dirsWithPostpatch.length) {
mergeVNodeHook(vnode, 'postpatch', function () {
for (var i = 0; i < dirsWithPostpatch.length; i++) {
callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
}
});
}
if (!isCreate) {
for (key in oldDirs) {
if (!newDirs[key]) {
// no longer present, unbind
callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
}
}
}
}
var emptyModifiers = Object.create(null);
function normalizeDirectives$1 (
dirs,
vm
) {
var res = Object.create(null);
if (!dirs) {
// $flow-disable-line
return res
}
var i, dir;
for (i = 0; i < dirs.length; i++) {
dir = dirs[i];
if (!dir.modifiers) {
// $flow-disable-line
dir.modifiers = emptyModifiers;
}
res[getRawDirName(dir)] = dir;
dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
}
// $flow-disable-line
return res
}
function getRawDirName (dir) {
return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
}
function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
var fn = dir.def && dir.def[hook];
if (fn) {
try {
fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
} catch (e) {
handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
}
}
}
var baseModules = [
ref,
directives
];
/* */
function updateAttrs (oldVnode, vnode) {
if (!oldVnode.data.attrs && !vnode.data.attrs) {
return
}
var key, cur, old;
var elm = vnode.elm;
var oldAttrs = oldVnode.data.attrs || {};
var attrs = vnode.data.attrs || {};
// clone observed objects, as the user probably wants to mutate it
if (attrs.__ob__) {
attrs = vnode.data.attrs = extend({}, attrs);
}
var supportBatchUpdate = typeof elm.setAttrs === 'function';
var batchedAttrs = {};
for (key in attrs) {
cur = attrs[key];
old = oldAttrs[key];
if (old !== cur) {
supportBatchUpdate
? (batchedAttrs[key] = cur)
: elm.setAttr(key, cur);
}
}
for (key in oldAttrs) {
if (attrs[key] == null) {
supportBatchUpdate
? (batchedAttrs[key] = undefined)
: elm.setAttr(key);
}
}
if (supportBatchUpdate) {
elm.setAttrs(batchedAttrs);
}
}
var attrs = {
create: updateAttrs,
update: updateAttrs
};
/* */
function updateClass (oldVnode, vnode) {
var el = vnode.elm;
var ctx = vnode.context;
var data = vnode.data;
var oldData = oldVnode.data;
if (!data.staticClass &&
!data.class &&
(!oldData || (!oldData.staticClass && !oldData.class))
) {
return
}
var oldClassList = [];
// unlike web, weex vnode staticClass is an Array
var oldStaticClass = oldData.staticClass;
if (oldStaticClass) {
oldClassList.push.apply(oldClassList, oldStaticClass);
}
if (oldData.class) {
oldClassList.push.apply(oldClassList, oldData.class);
}
var classList = [];
// unlike web, weex vnode staticClass is an Array
var staticClass = data.staticClass;
if (staticClass) {
classList.push.apply(classList, staticClass);
}
if (data.class) {
classList.push.apply(classList, data.class);
}
var style = getStyle(oldClassList, classList, ctx);
if (typeof el.setStyles === 'function') {
el.setStyles(style);
} else {
for (var key in style) {
el.setStyle(key, style[key]);
}
}
}
function getStyle (oldClassList, classList, ctx) {
// style is a weex-only injected object
// compiled from <style> tags in weex files
var stylesheet = ctx.$options.style || {};
var result = {};
classList.forEach(function (name) {
var style = stylesheet[name];
extend(result, style);
});
oldClassList.forEach(function (name) {
var style = stylesheet[name];
for (var key in style) {
if (!result.hasOwnProperty(key)) {
result[key] = '';
}
}
});
return result
}
var klass = {
create: updateClass,
update: updateClass
};
/* */
var target$1;
function add$1 (
event,
handler,
once,
capture,
passive,
params
) {
if (capture) {
console.log('Weex do not support event in bubble phase.');
return
}
if (once) {
var oldHandler = handler;
var _target = target$1; // save current target element in closure
handler = function (ev) {
var res = arguments.length === 1
? oldHandler(ev)
: oldHandler.apply(null, arguments);
if (res !== null) {
remove$2(event, null, null, _target);
}
};
}
target$1.addEvent(event, handler, params);
}
function remove$2 (
event,
handler,
capture,
_target
) {
(_target || target$1).removeEvent(event);
}
function updateDOMListeners (oldVnode, vnode) {
if (!oldVnode.data.on && !vnode.data.on) {
return
}
var on = vnode.data.on || {};
var oldOn = oldVnode.data.on || {};
target$1 = vnode.elm;
updateListeners(on, oldOn, add$1, remove$2, vnode.context);
target$1 = undefined;
}
var events = {
create: updateDOMListeners,
update: updateDOMListeners
};
/* */
var normalize = cached(camelize);
function createStyle (oldVnode, vnode) {
if (!vnode.data.staticStyle) {
updateStyle(oldVnode, vnode);
return
}
var elm = vnode.elm;
var staticStyle = vnode.data.staticStyle;
var supportBatchUpdate = typeof elm.setStyles === 'function';
var batchedStyles = {};
for (var name in staticStyle) {
if (staticStyle[name]) {
supportBatchUpdate
? (batchedStyles[normalize(name)] = staticStyle[name])
: elm.setStyle(normalize(name), staticStyle[name]);
}
}
if (supportBatchUpdate) {
elm.setStyles(batchedStyles);
}
updateStyle(oldVnode, vnode);
}
function updateStyle (oldVnode, vnode) {
if (!oldVnode.data.style && !vnode.data.style) {
return
}
var cur, name;
var elm = vnode.elm;
var oldStyle = oldVnode.data.style || {};
var style = vnode.data.style || {};
var needClone = style.__ob__;
// handle array syntax
if (Array.isArray(style)) {
style = vnode.data.style = toObject$1(style);
}
// clone the style for future updates,
// in case the user mutates the style object in-place.
if (needClone) {
style = vnode.data.style = extend({}, style);
}
var supportBatchUpdate = typeof elm.setStyles === 'function';
var batchedStyles = {};
for (name in oldStyle) {
if (!style[name]) {
supportBatchUpdate
? (batchedStyles[normalize(name)] = '')
: elm.setStyle(normalize(name), '');
}
}
for (name in style) {
cur = style[name];
supportBatchUpdate
? (batchedStyles[normalize(name)] = cur)
: elm.setStyle(normalize(name), cur);
}
if (supportBatchUpdate) {
elm.setStyles(batchedStyles);
}
}
function toObject$1 (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
var style = {
create: createStyle,
update: updateStyle
};
/* */
/**
* Add class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
/**
* Remove class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
/* */
function resolveTransition (def) {
if (!def) {
return
}
/* istanbul ignore else */
if (typeof def === 'object') {
var res = {};
if (def.css !== false) {
extend(res, autoCssTransition(def.name || 'v'));
}
extend(res, def);
return res
} else if (typeof def === 'string') {
return autoCssTransition(def)
}
}
var autoCssTransition = cached(function (name) {
return {
enterClass: (name + "-enter"),
enterToClass: (name + "-enter-to"),
enterActiveClass: (name + "-enter-active"),
leaveClass: (name + "-leave"),
leaveToClass: (name + "-leave-to"),
leaveActiveClass: (name + "-leave-active")
}
});
var hasTransition = inBrowser && !isIE9;
// Transition property/event sniffing
if (hasTransition) {
/* istanbul ignore if */
if (window.ontransitionend === undefined &&
window.onwebkittransitionend !== undefined
) {
}
if (window.onanimationend === undefined &&
window.onwebkitanimationend !== undefined
) {
}
}
// binding to window is necessary to make hot reload work in IE in strict mode
var raf = inBrowser
? window.requestAnimationFrame
? window.requestAnimationFrame.bind(window)
: setTimeout
: /* istanbul ignore next */ function (fn) { return fn(); };
var transition = {
create: enter,
activate: enter,
remove: leave
};
function enter (_, vnode) {
var el = vnode.elm;
// call leave callback now
if (el._leaveCb) {
el._leaveCb.cancelled = true;
el._leaveCb();
}
var data = resolveTransition(vnode.data.transition);
if (!data) {
return
}
/* istanbul ignore if */
if (el._enterCb) {
return
}
var enterClass = data.enterClass;
var enterToClass = data.enterToClass;
var enterActiveClass = data.enterActiveClass;
var appearClass = data.appearClass;
var appearToClass = data.appearToClass;
var appearActiveClass = data.appearActiveClass;
var beforeEnter = data.beforeEnter;
var enter = data.enter;
var afterEnter = data.afterEnter;
var enterCancelled = data.enterCancelled;
var beforeAppear = data.beforeAppear;
var appear = data.appear;
var afterAppear = data.afterAppear;
var appearCancelled = data.appearCancelled;
var context = activeInstance;
var transitionNode = activeInstance.$vnode;
while (transitionNode && transitionNode.parent) {
transitionNode = transitionNode.parent;
context = transitionNode.context;
}
var isAppear = !context._isMounted || !vnode.isRootInsert;
if (isAppear && !appear && appear !== '') {
return
}
var startClass = isAppear ? appearClass : enterClass;
var toClass = isAppear ? appearToClass : enterToClass;
var activeClass = isAppear ? appearActiveClass : enterActiveClass;
var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter;
var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter;
var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter;
var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled;
var userWantsControl =
enterHook &&
// enterHook may be a bound method which exposes
// the length of original fn as _length
(enterHook._length || enterHook.length) > 1;
var stylesheet = vnode.context.$options.style || {};
var startState = stylesheet[startClass];
var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {};
var endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context);
var needAnimation = Object.keys(endState).length > 0;
var cb = el._enterCb = once(function () {
if (cb.cancelled) {
enterCancelledHook && enterCancelledHook(el);
} else {
afterEnterHook && afterEnterHook(el);
}
el._enterCb = null;
});
// We need to wait until the native element has been inserted, but currently
// there's no API to do that. So we have to wait "one frame" - not entirely
// sure if this is guaranteed to be enough (e.g. on slow devices?)
setTimeout(function () {
var parent = el.parentNode;
var pendingNode = parent && parent._pending && parent._pending[vnode.key];
if (pendingNode &&
pendingNode.context === vnode.context &&
pendingNode.tag === vnode.tag &&
pendingNode.elm._leaveCb
) {
pendingNode.elm._leaveCb();
}
enterHook && enterHook(el, cb);
if (needAnimation) {
var animation = vnode.context.$requireWeexModule('animation');
animation.transition(el.ref, {
styles: endState,
duration: transitionProperties.duration || 0,
delay: transitionProperties.delay || 0,
timingFunction: transitionProperties.timingFunction || 'linear'
}, userWantsControl ? noop : cb);
} else if (!userWantsControl) {
cb();
}
}, 16);
// start enter transition
beforeEnterHook && beforeEnterHook(el);
if (startState) {
if (typeof el.setStyles === 'function') {
el.setStyles(startState);
} else {
for (var key in startState) {
el.setStyle(key, startState[key]);
}
}
}
if (!needAnimation && !userWantsControl) {
cb();
}
}
function leave (vnode, rm) {
var el = vnode.elm;
// call enter callback now
if (el._enterCb) {
el._enterCb.cancelled = true;
el._enterCb();
}
var data = resolveTransition(vnode.data.transition);
if (!data) {
return rm()
}
if (el._leaveCb) {
return
}
var leaveClass = data.leaveClass;
var leaveToClass = data.leaveToClass;
var leaveActiveClass = data.leaveActiveClass;
var beforeLeave = data.beforeLeave;
var leave = data.leave;
var afterLeave = data.afterLeave;
var leaveCancelled = data.leaveCancelled;
var delayLeave = data.delayLeave;
var userWantsControl =
leave &&
// leave hook may be a bound method which exposes
// the length of original fn as _length
(leave._length || leave.length) > 1;
var stylesheet = vnode.context.$options.style || {};
var startState = stylesheet[leaveClass];
var endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass];
var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {};
var cb = el._leaveCb = once(function () {
if (el.parentNode && el.parentNode._pending) {
el.parentNode._pending[vnode.key] = null;
}
if (cb.cancelled) {
leaveCancelled && leaveCancelled(el);
} else {
rm();
afterLeave && afterLeave(el);
}
el._leaveCb = null;
});
if (delayLeave) {
delayLeave(performLeave);
} else {
performLeave();
}
function performLeave () {
var animation = vnode.context.$requireWeexModule('animation');
// the delayed leave may have already been cancelled
if (cb.cancelled) {
return
}
// record leaving element
if (!vnode.data.show) {
(el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;
}
beforeLeave && beforeLeave(el);
if (startState) {
animation.transition(el.ref, {
styles: startState
}, next);
} else {
next();
}
function next () {
animation.transition(el.ref, {
styles: endState,
duration: transitionProperties.duration || 0,
delay: transitionProperties.delay || 0,
timingFunction: transitionProperties.timingFunction || 'linear'
}, userWantsControl ? noop : cb);
}
leave && leave(el, cb);
if (!endState && !userWantsControl) {
cb();
}
}
}
// determine the target animation style for an entering transition.
function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) {
var targetState = {};
var startState = stylesheet[startClass];
var endState = stylesheet[endClass];
var activeState = stylesheet[activeClass];
// 1. fallback to element's default styling
if (startState) {
for (var key in startState) {
targetState[key] = el.style[key];
if (
"development" !== 'production' &&
targetState[key] == null &&
(!activeState || activeState[key] == null) &&
(!endState || endState[key] == null)
) {
warn(
"transition property \"" + key + "\" is declared in enter starting class (." + startClass + "), " +
"but not declared anywhere in enter ending class (." + endClass + "), " +
"enter active cass (." + activeClass + ") or the element's default styling. " +
"Note in Weex, CSS properties need explicit values to be transitionable."
);
}
}
}
// 2. if state is mixed in active state, extract them while excluding
// transition properties
if (activeState) {
for (var key$1 in activeState) {
if (key$1.indexOf('transition') !== 0) {
targetState[key$1] = activeState[key$1];
}
}
}
// 3. explicit endState has highest priority
if (endState) {
extend(targetState, endState);
}
return targetState
}
var platformModules = [
attrs,
klass,
events,
style,
transition
];
/* */
// the directive module should be applied last, after all
// built-in modules have been applied.
var modules = platformModules.concat(baseModules);
var patch = createPatchFunction({
nodeOps: nodeOps,
modules: modules,
LONG_LIST_THRESHOLD: 10
});
var platformDirectives = {
};
/* */
function getVNodeType (vnode) {
if (!vnode.tag) {
return ''
}
return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '')
}
function isSimpleSpan (vnode) {
return vnode.children &&
vnode.children.length === 1 &&
!vnode.children[0].tag
}
function parseStyle (vnode) {
if (!vnode || !vnode.data) {
return
}
var ref = vnode.data;
var staticStyle = ref.staticStyle;
var staticClass = ref.staticClass;
if (vnode.data.style || vnode.data.class || staticStyle || staticClass) {
var styles = Object.assign({}, staticStyle, vnode.data.style);
var cssMap = vnode.context.$options.style || {};
var classList = [].concat(staticClass, vnode.data.class);
classList.forEach(function (name) {
if (name && cssMap[name]) {
Object.assign(styles, cssMap[name]);
}
});
return styles
}
}
function convertVNodeChildren (children) {
if (!children.length) {
return
}
return children.map(function (vnode) {
var type = getVNodeType(vnode);
var props = { type: type };
// convert raw text node
if (!type) {
props.type = 'span';
props.attr = {
value: (vnode.text || '').trim()
};
} else {
props.style = parseStyle(vnode);
if (vnode.data) {
props.attr = vnode.data.attrs;
if (vnode.data.on) {
props.events = vnode.data.on;
}
}
if (type === 'span' && isSimpleSpan(vnode)) {
props.attr = props.attr || {};
props.attr.value = vnode.children[0].text.trim();
return props
}
}
if (vnode.children && vnode.children.length) {
props.children = convertVNodeChildren(vnode.children);
}
return props
})
}
var Richtext = {
name: 'richtext',
render: function render (h) {
return h('weex:richtext', {
on: this._events,
attrs: {
value: convertVNodeChildren(this.$options._renderChildren || [])
}
})
}
};
/* */
// Provides transition support for a single element/component.
// supports transition mode (out-in / in-out)
var transitionProps = {
name: String,
appear: Boolean,
css: Boolean,
mode: String,
type: String,
enterClass: String,
leaveClass: String,
enterToClass: String,
leaveToClass: String,
enterActiveClass: String,
leaveActiveClass: String,
appearClass: String,
appearActiveClass: String,
appearToClass: String,
duration: [Number, String, Object]
};
// in case the child is also an abstract component, e.g. <keep-alive>
// we want to recursively retrieve the real component to be rendered
function getRealChild (vnode) {
var compOptions = vnode && vnode.componentOptions;
if (compOptions && compOptions.Ctor.options.abstract) {
return getRealChild(getFirstComponentChild(compOptions.children))
} else {
return vnode
}
}
function extractTransitionData (comp) {
var data = {};
var options = comp.$options;
// props
for (var key in options.propsData) {
data[key] = comp[key];
}
// events.
// extract listeners and pass them directly to the transition methods
var listeners = options._parentListeners;
for (var key$1 in listeners) {
data[camelize(key$1)] = listeners[key$1];
}
return data
}
function placeholder (h, rawChild) {
if (/\d-keep-alive$/.test(rawChild.tag)) {
return h('keep-alive', {
props: rawChild.componentOptions.propsData
})
}
}
function hasParentTransition (vnode) {
while ((vnode = vnode.parent)) {
if (vnode.data.transition) {
return true
}
}
}
function isSameChild (child, oldChild) {
return oldChild.key === child.key && oldChild.tag === child.tag
}
var Transition$1 = {
name: 'transition',
props: transitionProps,
abstract: true,
render: function render (h) {
var this$1 = this;
var children = this.$slots.default;
if (!children) {
return
}
// filter out text nodes (possible whitespaces)
children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });
/* istanbul ignore if */
if (!children.length) {
return
}
// warn multiple elements
if ("development" !== 'production' && children.length > 1) {
warn(
'<transition> can only be used on a single element. Use ' +
'<transition-group> for lists.',
this.$parent
);
}
var mode = this.mode;
// warn invalid mode
if ("development" !== 'production' &&
mode && mode !== 'in-out' && mode !== 'out-in'
) {
warn(
'invalid <transition> mode: ' + mode,
this.$parent
);
}
var rawChild = children[0];
// if this is a component root node and the component's
// parent container node also has transition, skip.
if (hasParentTransition(this.$vnode)) {
return rawChild
}
// apply transition data to child
// use getRealChild() to ignore abstract components e.g. keep-alive
var child = getRealChild(rawChild);
/* istanbul ignore if */
if (!child) {
return rawChild
}
if (this._leaving) {
return placeholder(h, rawChild)
}
// ensure a key that is unique to the vnode type and to this transition
// component instance. This key will be used to remove pending leaving nodes
// during entering.
var id = "__transition-" + (this._uid) + "-";
child.key = child.key == null
? child.isComment
? id + 'comment'
: id + child.tag
: isPrimitive(child.key)
? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
: child.key;
var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
var oldRawChild = this._vnode;
var oldChild = getRealChild(oldRawChild);
// mark v-show
// so that the transition module can hand over the control to the directive
if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {
child.data.show = true;
}
if (
oldChild &&
oldChild.data &&
!isSameChild(child, oldChild) &&
!isAsyncPlaceholder(oldChild) &&
// #6687 component root is a comment node
!(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
) {
// replace old child transition data with fresh one
// important for dynamic transitions!
var oldData = oldChild.data.transition = extend({}, data);
// handle transition mode
if (mode === 'out-in') {
// return placeholder node and queue update when leave finishes
this._leaving = true;
mergeVNodeHook(oldData, 'afterLeave', function () {
this$1._leaving = false;
this$1.$forceUpdate();
});
return placeholder(h, rawChild)
} else if (mode === 'in-out') {
if (isAsyncPlaceholder(child)) {
return oldRawChild
}
var delayedLeave;
var performLeave = function () { delayedLeave(); };
mergeVNodeHook(data, 'afterEnter', performLeave);
mergeVNodeHook(data, 'enterCancelled', performLeave);
mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
}
}
return rawChild
}
};
// reuse same transition component logic from web
var props = extend({
tag: String,
moveClass: String
}, transitionProps);
delete props.mode;
var TransitionGroup = {
props: props,
created: function created () {
var dom = this.$requireWeexModule('dom');
this.getPosition = function (el) { return new Promise(function (resolve, reject) {
dom.getComponentRect(el.ref, function (res) {
if (!res.result) {
reject(new Error(("failed to get rect for element: " + (el.tag))));
} else {
resolve(res.size);
}
});
}); };
var animation = this.$requireWeexModule('animation');
this.animate = function (el, options) { return new Promise(function (resolve) {
animation.transition(el.ref, options, resolve);
}); };
},
render: function render (h) {
var tag = this.tag || this.$vnode.data.tag || 'span';
var map = Object.create(null);
var prevChildren = this.prevChildren = this.children;
var rawChildren = this.$slots.default || [];
var children = this.children = [];
var transitionData = extractTransitionData(this);
for (var i = 0; i < rawChildren.length; i++) {
var c = rawChildren[i];
if (c.tag) {
if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
children.push(c);
map[c.key] = c
;(c.data || (c.data = {})).transition = transitionData;
} else {
var opts = c.componentOptions;
var name = opts
? (opts.Ctor.options.name || opts.tag)
: c.tag;
warn(("<transition-group> children must be keyed: <" + name + ">"));
}
}
}
if (prevChildren) {
var kept = [];
var removed = [];
prevChildren.forEach(function (c) {
c.data.transition = transitionData;
// TODO: record before patch positions
if (map[c.key]) {
kept.push(c);
} else {
removed.push(c);
}
});
this.kept = h(tag, null, kept);
this.removed = removed;
}
return h(tag, null, children)
},
beforeUpdate: function beforeUpdate () {
// force removing pass
this.__patch__(
this._vnode,
this.kept,
false, // hydrating
true // removeOnly (!important avoids unnecessary moves)
);
this._vnode = this.kept;
},
updated: function updated () {
var children = this.prevChildren;
var moveClass = this.moveClass || ((this.name || 'v') + '-move');
var moveData = children.length && this.getMoveData(children[0].context, moveClass);
if (!moveData) {
return
}
// TODO: finish implementing move animations once
// we have access to sync getComponentRect()
// children.forEach(callPendingCbs)
// Promise.all(children.map(c => {
// const oldPos = c.data.pos
// const newPos = c.data.newPos
// const dx = oldPos.left - newPos.left
// const dy = oldPos.top - newPos.top
// if (dx || dy) {
// c.data.moved = true
// return this.animate(c.elm, {
// styles: {
// transform: `translate(${dx}px,${dy}px)`
// }
// })
// }
// })).then(() => {
// children.forEach(c => {
// if (c.data.moved) {
// this.animate(c.elm, {
// styles: {
// transform: ''
// },
// duration: moveData.duration || 0,
// delay: moveData.delay || 0,
// timingFunction: moveData.timingFunction || 'linear'
// })
// }
// })
// })
},
methods: {
getMoveData: function getMoveData (context, moveClass) {
var stylesheet = context.$options.style || {};
return stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][moveClass]
}
}
};
// function callPendingCbs (c) {
// /* istanbul ignore if */
// if (c.elm._moveCb) {
// c.elm._moveCb()
// }
// /* istanbul ignore if */
// if (c.elm._enterCb) {
// c.elm._enterCb()
// }
// }
var platformComponents = {
Richtext: Richtext,
Transition: Transition$1,
TransitionGroup: TransitionGroup
};
/* */
// These util functions are split into its own file because Rollup cannot drop
// makeMap() due to potential side effects, so these variables end up
// bloating the web builds.
var isReservedTag$1 = makeMap(
'template,script,style,element,content,slot,link,meta,svg,view,' +
'a,div,img,image,text,span,input,switch,textarea,spinner,select,' +
'slider,slider-neighbor,indicator,canvas,' +
'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' +
'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown',
true
);
// Elements that you can, intentionally, leave open (and which close themselves)
// more flexible than web
var canBeLeftOpenTag = makeMap(
'web,spinner,switch,video,textarea,canvas,' +
'indicator,marquee,countdown',
true
);
var isRuntimeComponent = makeMap(
'richtext,transition,transition-group',
true
);
var isUnaryTag = makeMap(
'embed,img,image,input,link,meta',
true
);
function mustUseProp (tag, type, name) {
return false
}
function isUnknownElement$1 (tag) {
return false
}
function query (el, document) {
// document is injected by weex factory wrapper
var placeholder = document.createComment('root');
placeholder.hasAttribute = placeholder.removeAttribute = function () {}; // hack for patch
document.documentElement.appendChild(placeholder);
return placeholder
}
/* */
// install platform specific utils
Vue$2.config.mustUseProp = mustUseProp;
Vue$2.config.isReservedTag = isReservedTag$1;
Vue$2.config.isRuntimeComponent = isRuntimeComponent;
Vue$2.config.isUnknownElement = isUnknownElement$1;
// install platform runtime directives and components
Vue$2.options.directives = platformDirectives;
Vue$2.options.components = platformComponents;
// install platform patch function
Vue$2.prototype.__patch__ = patch;
// wrap mount
Vue$2.prototype.$mount = function (
el,
hydrating
) {
return mountComponent(
this,
el && query(el, this.$document),
hydrating
)
};
// this entry is built and wrapped with a factory function
// used to generate a fresh copy of Vue for every Weex instance.
exports.Vue = Vue$2;
};
});
var index = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
/* */
// this will be preserved during build
// $flow-disable-line
var VueFactory = factory;
var instanceOptions = {};
/**
* Create instance context.
*/
function createInstanceContext (
instanceId,
runtimeContext,
data
) {
if ( data === void 0 ) { data = {}; }
var weex = runtimeContext.weex;
var instance = instanceOptions[instanceId] = {
instanceId: instanceId,
config: weex.config,
document: weex.document,
data: data
};
// Each instance has a independent `Vue` module instance
var Vue = instance.Vue = createVueModuleInstance(instanceId, weex);
// DEPRECATED
var timerAPIs = getInstanceTimer(instanceId, weex.requireModule);
var instanceContext = Object.assign({ Vue: Vue }, timerAPIs);
Object.freeze(instanceContext);
return instanceContext
}
/**
* Destroy an instance with id. It will make sure all memory of
* this instance released and no more leaks.
*/
function destroyInstance (instanceId) {
var instance = instanceOptions[instanceId];
if (instance && instance.app instanceof instance.Vue) {
try {
instance.app.$destroy();
instance.document.destroy();
} catch (e) {}
delete instance.document;
delete instance.app;
}
delete instanceOptions[instanceId];
}
/**
* Refresh an instance with id and new top-level component data.
* It will use `Vue.set` on all keys of the new data. So it's better
* define all possible meaningful keys when instance created.
*/
function refreshInstance (
instanceId,
data
) {
var instance = instanceOptions[instanceId];
if (!instance || !(instance.app instanceof instance.Vue)) {
return new Error(("refreshInstance: instance " + instanceId + " not found!"))
}
if (instance.Vue && instance.Vue.set) {
for (var key in data) {
instance.Vue.set(instance.app, key, data[key]);
}
}
// Finally `refreshFinish` signal needed.
instance.document.taskCenter.send('dom', { action: 'refreshFinish' }, []);
}
/**
* Create a fresh instance of Vue for each Weex instance.
*/
function createVueModuleInstance (
instanceId,
weex
) {
var exports = {};
VueFactory(exports, weex.document);
var Vue = exports.Vue;
var instance = instanceOptions[instanceId];
// patch reserved tag detection to account for dynamically registered
// components
var weexRegex = /^weex:/i;
var isReservedTag = Vue.config.isReservedTag || (function () { return false; });
var isRuntimeComponent = Vue.config.isRuntimeComponent || (function () { return false; });
Vue.config.isReservedTag = function (name) {
return (!isRuntimeComponent(name) && weex.supports(("@component/" + name))) ||
isReservedTag(name) ||
weexRegex.test(name)
};
Vue.config.parsePlatformTagName = function (name) { return name.replace(weexRegex, ''); };
// expose weex-specific info
Vue.prototype.$instanceId = instanceId;
Vue.prototype.$document = instance.document;
// expose weex native module getter on subVue prototype so that
// vdom runtime modules can access native modules via vnode.context
Vue.prototype.$requireWeexModule = weex.requireModule;
// Hack `Vue` behavior to handle instance information and data
// before root component created.
Vue.mixin({
beforeCreate: function beforeCreate () {
var options = this.$options;
// root component (vm)
if (options.el) {
// set external data of instance
var dataOption = options.data;
var internalData = (typeof dataOption === 'function' ? dataOption() : dataOption) || {};
options.data = Object.assign(internalData, instance.data);
// record instance by id
instance.app = this;
}
},
mounted: function mounted () {
var options = this.$options;
// root component (vm)
if (options.el && weex.document && instance.app === this) {
try {
// Send "createFinish" signal to native.
weex.document.taskCenter.send('dom', { action: 'createFinish' }, []);
} catch (e) {}
}
}
});
/**
* @deprecated Just instance variable `weex.config`
* Get instance config.
* @return {object}
*/
Vue.prototype.$getConfig = function () {
if (instance.app instanceof Vue) {
return instance.config
}
};
return Vue
}
/**
* DEPRECATED
* Generate HTML5 Timer APIs. An important point is that the callback
* will be converted into callback id when sent to native. So the
* framework can make sure no side effect of the callback happened after
* an instance destroyed.
*/
function getInstanceTimer (
instanceId,
moduleGetter
) {
var instance = instanceOptions[instanceId];
var timer = moduleGetter('timer');
var timerAPIs = {
setTimeout: function () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setTimeout(handler, args[1]);
return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
},
setInterval: function () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setInterval(handler, args[1]);
return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
},
clearTimeout: function (n) {
timer.clearTimeout(n);
},
clearInterval: function (n) {
timer.clearInterval(n);
}
};
return timerAPIs
}
exports.createInstanceContext = createInstanceContext;
exports.destroyInstance = destroyInstance;
exports.refreshInstance = refreshInstance;
});
var index$1 = unwrapExports(index);
var refreshInstance = index.refreshInstance;
var destroyInstance$1 = index.destroyInstance;
var createInstanceContext$1 = index.createInstanceContext;
var Vue = Object.freeze({
default: index$1,
__moduleExports: index,
refreshInstance: refreshInstance,
destroyInstance: destroyInstance$1,
createInstanceContext: createInstanceContext$1
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview The api for invoking with "$" prefix
*/
/**
* @deprecated use $vm instead
* find the vm by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Vm}
*/
function $ (id) {
console.warn('[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead');
var info = this._ids[id];
if (info) {
return info.vm
}
}
/**
* find the element by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Element}
*/
function $el (id) {
var info = this._ids[id];
if (info) {
return info.el
}
}
/**
* find the vm of the custom component by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Vm}
*/
function $vm (id) {
var info = this._ids[id];
if (info) {
return info.vm
}
}
/**
* Fire when differ rendering finished
*
* @param {Function} fn
*/
function $renderThen (fn) {
var app = this._app;
var differ = app.differ;
return differ.then(function () {
fn();
})
}
/**
* scroll an element specified by id into view,
* moreover specify a number of offset optionally
* @param {string} id
* @param {number} offset
*/
function $scrollTo (id, offset) {
console.warn('[JS Framework] Vm#$scrollTo is deprecated, ' +
'please use "require(\'@weex-module/dom\')' +
'.scrollTo(el, options)" instead');
var el = this.$el(id);
if (el) {
var dom = this._app.requireModule('dom');
dom.scrollToElement(el.ref, { offset: offset });
}
}
/**
* perform transition animation on an element specified by id
* @param {string} id
* @param {object} options
* @param {object} options.styles
* @param {object} options.duration(ms)
* @param {object} [options.timingFunction]
* @param {object} [options.delay=0(ms)]
* @param {Function} callback
*/
function $transition (id, options, callback) {
var this$1 = this;
var el = this.$el(id);
if (el && options && options.styles) {
var animation = this._app.requireModule('animation');
animation.transition(el.ref, options, function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
this$1._setStyle(el, options.styles);
callback && callback.apply(void 0, args);
});
}
}
/**
* get some config
* @return {object} some config for app instance
* @property {string} bundleUrl
* @property {boolean} debug
* @property {object} env
* @property {string} env.weexVersion(ex. 1.0.0)
* @property {string} env.appName(ex. TB/TM)
* @property {string} env.appVersion(ex. 5.0.0)
* @property {string} env.platform(ex. iOS/Android)
* @property {string} env.osVersion(ex. 7.0.0)
* @property {string} env.deviceModel **native only**
* @property {number} env.[deviceWidth=750]
* @property {number} env.deviceHeight
*/
function $getConfig (callback) {
var config = this._app.options;
if (typeof callback === 'function') {
console.warn('[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, ' +
'this api now can directly RETURN config info.');
callback(config);
}
return config
}
/**
* @deprecated
* request network via http protocol
* @param {object} params
* @param {Function} callback
*/
function $sendHttp (params, callback) {
console.warn('[JS Framework] Vm#$sendHttp is deprecated, ' +
'please use "require(\'@weex-module/stream\')' +
'.sendHttp(params, callback)" instead');
var stream = this._app.requireModule('stream');
stream.sendHttp(params, callback);
}
/**
* @deprecated
* open a url
* @param {string} url
*/
function $openURL (url) {
console.warn('[JS Framework] Vm#$openURL is deprecated, ' +
'please use "require(\'@weex-module/event\')' +
'.openURL(url)" instead');
var event = this._app.requireModule('event');
event.openURL(url);
}
/**
* @deprecated
* set a title for page
* @param {string} title
*/
function $setTitle (title) {
console.warn('[JS Framework] Vm#$setTitle is deprecated, ' +
'please use "require(\'@weex-module/pageInfo\')' +
'.setTitle(title)" instead');
var pageInfo = this._app.requireModule('pageInfo');
pageInfo.setTitle(title);
}
/**
* @deprecated use "require('@weex-module/moduleName') instead"
* invoke a native method by specifing the name of module and method
* @param {string} moduleName
* @param {string} methodName
* @param {...*} the rest arguments
*/
function $call (moduleName, methodName) {
var args = [], len = arguments.length - 2;
while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ];
console.warn('[JS Framework] Vm#$call is deprecated, ' +
'please use "require(\'@weex-module/moduleName\')" instead');
var module = this._app.requireModule(moduleName);
if (module && module[methodName]) {
module[methodName].apply(module, args);
}
}
var methods$1 = Object.freeze({
$: $,
$el: $el,
$vm: $vm,
$renderThen: $renderThen,
$scrollTo: $scrollTo,
$transition: $transition,
$getConfig: $getConfig,
$sendHttp: $sendHttp,
$openURL: $openURL,
$setTitle: $setTitle,
$call: $call
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Mix properties into target object.
*
* @param {Object} to
* @param {Object} from
*/
function extend (target) {
var src = [], len = arguments.length - 1;
while ( len-- > 0 ) src[ len ] = arguments[ len + 1 ];
/* istanbul ignore else */
if (typeof Object.assign === 'function') {
Object.assign.apply(Object, [ target ].concat( src ));
}
else {
var first = src.shift();
for (var key in first) {
target[key] = first[key];
}
if (src.length) {
extend.apply(void 0, [ target ].concat( src ));
}
}
return target
}
/**
* Define a property.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
* @param {Boolean} [enumerable]
*/
function def$1 (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Remove an item from an array
*
* @param {Array} arr
* @param {*} item
*/
function remove$1 (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether the object has the property.
*
* @param {Object} obj
* @param {String} key
* @return {Boolean}
*/
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty$1.call(obj, key)
}
/**
* Simple bind, faster than native
*
* @param {Function} fn
* @param {Object} ctx
* @return {Function}
*/
function bind (fn, ctx) {
return function (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*
* @param {*} obj
* @return {Boolean}
*/
function isObject$5 (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*
* @param {*} obj
* @return {Boolean}
*/
var toString$2 = Object.prototype.toString;
var OBJECT_STRING = '[object Object]';
function isPlainObject (obj) {
return toString$2.call(obj) === OBJECT_STRING
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Check if a string starts with $ or _
*
* @param {String} str
* @return {Boolean}
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
// can we use __proto__?
var hasProto = '__proto__' in {};
var _Set;
/* istanbul ignore next */
if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {
// use native Set when available.
_Set = Set;
}
else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = function () {
this.set = Object.create(null);
};
_Set.prototype.has = function (key) {
return this.set[key] !== undefined
};
_Set.prototype.add = function (key) {
if (key == null || this.set[key]) {
return
}
this.set[key] = 1;
};
_Set.prototype.clear = function () {
this.set = Object.create(null);
};
}
/**
* Polyfill in iOS7 by native because the JavaScript polyfill has memory problem.
* @return {object}
*/
function createNewSet () {
/* istanbul ignore next */
/* eslint-disable */
if (typeof nativeSet === 'object') {
return nativeSet.create()
}
/* eslint-enable */
return new _Set()
}
/**
* Create a cached version of a pure function.
*
* @param {Function} fn
* @return {Function}
*/
function typof$1 (v) {
var s = Object.prototype.toString.call(v);
return s.substring(8, s.length - 1).toLowerCase()
}
// weex name rules
var WEEX_COMPONENT_REG = /^@weex-component\//;
var WEEX_MODULE_REG = /^@weex-module\//;
var NORMAL_MODULE_REG = /^\.{1,2}\//;
var JS_SURFIX_REG = /\.js$/;
var isWeexComponent = function (name) { return !!name.match(WEEX_COMPONENT_REG); };
var isWeexModule = function (name) { return !!name.match(WEEX_MODULE_REG); };
var isNormalModule = function (name) { return !!name.match(NORMAL_MODULE_REG); };
var isNpmModule = function (name) { return !isWeexComponent(name) && !isWeexModule(name) && !isNormalModule(name); };
function removeWeexPrefix (str) {
var result = str.replace(WEEX_COMPONENT_REG, '').replace(WEEX_MODULE_REG, '');
return result
}
function removeJSSurfix (str) {
return str.replace(JS_SURFIX_REG, '')
}
/* eslint-disable */
var uid$2 = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*
* @constructor
*/
function Dep () {
this.id = uid$2++;
this.subs = [];
}
// the current target watcher being evaluated.
// this is globally unique because there could be only one
// watcher being evaluated at any time.
Dep.target = null;
var targetStack = [];
function pushTarget (_target) {
if (Dep.target) { targetStack.push(Dep.target); }
Dep.target = _target;
}
function popTarget () {
Dep.target = targetStack.pop();
}
function resetTarget () {
Dep.target = null;
targetStack = [];
}
/**
* Add a directive subscriber.
*
* @param {Directive} sub
*/
Dep.prototype.addSub = function (sub) {
this.subs.push(sub);
};
/**
* Remove a directive subscriber.
*
* @param {Directive} sub
*/
Dep.prototype.removeSub = function (sub) {
remove$1(this.subs, sub);
};
/**
* Add self as a dependency to the target watcher.
*/
Dep.prototype.depend = function () {
if (Dep.target) {
Dep.target.addDep(this);
}
};
/**
* Notify all subscribers of a new value.
*/
Dep.prototype.notify = function () {
// stablize the subscriber list first
var subs = this.subs.slice();
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
/* eslint-disable */
// import { pushWatcher } from './batcher'
var uid$1 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*
* @param {Vue} vm
* @param {String|Function} expOrFn
* @param {Function} cb
* @param {Object} options
* - {Array} filters
* - {Boolean} twoWay
* - {Boolean} deep
* - {Boolean} user
* - {Boolean} sync
* - {Boolean} lazy
* - {Function} [preProcess]
* - {Function} [postProcess]
* @constructor
*/
function Watcher (vm, expOrFn, cb, options) {
// mix in options
if (options) {
extend(this, options);
}
var isFn = typeof expOrFn === 'function';
this.vm = vm;
vm._watchers.push(this);
this.expression = expOrFn;
this.cb = cb;
this.id = ++uid$1; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = createNewSet(); // new Set()
this.newDepIds = createNewSet(); // new Set()
// parse expression for getter
if (isFn) {
this.getter = expOrFn;
}
this.value = this.lazy
? undefined
: this.get();
// state for avoiding false triggers for deep and Array
// watchers during vm._digest()
this.queued = this.shallow = false;
}
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function () {
pushTarget(this);
var value = this.getter.call(this.vm, this.vm);
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
return value
};
/**
* Add a dependency to this directive.
*
* @param {Dep} dep
*/
Watcher.prototype.addDep = function (dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
var dep = this$1.deps[i];
if (!this$1.newDepIds.has(dep.id)) {
dep.removeSub(this$1);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*
* @param {Boolean} shallow
*/
Watcher.prototype.update = function (shallow) {
if (this.lazy) {
this.dirty = true;
} else {
this.run();
}
// } else if (this.sync) {
// this.run()
// } else {
// // if queued, only overwrite shallow with non-shallow,
// // but not the other way around.
// this.shallow = this.queued
// ? shallow
// ? this.shallow
// : false
// : !!shallow
// this.queued = true
// pushWatcher(this)
// }
};
/**
* Batcher job interface.
* Will be called by the batcher.
*/
Watcher.prototype.run = function () {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated; but only do so if this is a
// non-shallow update (caused by a vm digest).
((isObject$5(value) || this.deep) && !this.shallow)
) {
// set new value
var oldValue = this.value;
this.value = value;
this.cb.call(this.vm, value, oldValue);
}
this.queued = this.shallow = false;
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
this$1.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subcriber list.
*/
Watcher.prototype.teardown = function () {
var this$1 = this;
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed or is performing a v-for
// re-render (the watcher list is then filtered by v-for).
if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {
remove$1(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this$1.deps[i].removeSub(this$1);
}
this.active = false;
this.vm = this.cb = this.value = null;
}
};
/**
* Recrusively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*
* @param {*} val
* @param {Set} seen
*/
var seenObjects = createNewSet(); // new Set()
/* istanbul ignore next */
function traverse (val, seen) {
var i, keys, isA, isO;
if (!seen) {
seen = seenObjects;
seen.clear();
}
isA = Array.isArray(val);
isO = isObject$5(val);
if (isA || isO) {
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
} else {
seen.add(depId);
}
}
if (isA) {
i = val.length;
while (i--) { traverse(val[i], seen); }
} else if (isO) {
keys = Object.keys(val);
i = keys.length;
while (i--) { traverse(val[keys[i]], seen); }
}
}
}
/* eslint-disable */
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
]
.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def$1(arrayMethods, method, function mutator () {
var arguments$1 = arguments;
// avoid leaking arguments:
// http://jsperf.com/closure-with-arguments
var i = arguments.length;
var args = new Array(i);
while (i--) {
args[i] = arguments$1[i];
}
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
inserted = args;
break
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/**
* Swap the element at the given index with a new value
* and emits corresponding event.
*
* @param {Number} index
* @param {*} val
* @return {*} - replaced element
*/
def$1(
arrayProto,
'$set',
function $set (index, val) {
console.warn("[JS Framework] \"Array.prototype.$set\" is not a standard API,"
+ " it will be removed in the next version.");
if (index >= this.length) {
this.length = index + 1;
}
return this.splice(index, 1, val)[0]
}
);
/**
* Convenience method to remove the element at given index.
*
* @param {Number} index
* @param {*} val
*/
def$1(
arrayProto,
'$remove',
function $remove (index) {
console.warn("[JS Framework] \"Array.prototype.$remove\" is not a standard API,"
+ " it will be removed in the next version.");
/* istanbul ignore if */
if (!this.length) { return }
/* istanbul ignore else */
if (typeof index !== 'number') {
index = this.indexOf(index);
}
/* istanbul ignore else */
if (index > -1) {
this.splice(index, 1);
}
}
);
/* eslint-disable */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* Observer class that are attached to each observed
* object. Once attached, the observer converts target
* object's property keys into getter/setters that
* collect dependencies and dispatches updates.
*
* @param {Array|Object} value
* @constructor
*/
function Observer$1 (value) {
this.value = value;
this.dep = new Dep();
def$1(value, '__ob__', this);
if (Array.isArray(value)) {
var augment = hasProto
? protoAugment
: copyAugment;
augment(value, arrayMethods, arrayKeys);
this.observeArray(value);
} else {
this.walk(value);
}
}
// Instance methods
/**
* Walk through each property and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*
* @param {Object} obj
*/
Observer$1.prototype.walk = function (obj) {
var this$1 = this;
for (var key in obj) {
this$1.convert(key, obj[key]);
}
};
/**
* Observe a list of Array items.
*
* @param {Array} items
*/
Observer$1.prototype.observeArray = function (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
/**
* Convert a property into getter/setter so we can emit
* the events when the property is accessed/changed.
*
* @param {String} key
* @param {*} val
*/
Observer$1.prototype.convert = function (key, val) {
defineReactive(this.value, key, val);
};
/**
* Add an owner vm, so that when $set/$delete mutations
* happen we can notify owner vms to proxy the keys and
* digest the watchers. This is only called when the object
* is observed as an instance's root $data.
*
* @param {Vue} vm
*/
Observer$1.prototype.addVm = function (vm) {
(this.vms || (this.vms = [])).push(vm);
};
/**
* Remove an owner vm. This is called when the object is
* swapped out as an instance's $data object.
*
* @param {Vue} vm
*/
/* istanbul ignore next */
Observer$1.prototype.removeVm = function (vm) {
remove$1(this.vms, vm);
};
// helpers
/**
* Augment an target Object or Array by intercepting
* the prototype chain using __proto__
*
* @param {Object|Array} target
* @param {Object} src
*/
function protoAugment (target, src) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment an target Object or Array by defining
* hidden properties.
*
* @param {Object|Array} target
* @param {Object} proto
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def$1(target, key, src[key]);
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*
* @param {*} value
* @param {Vue} [vm]
* @return {Observer|undefined}
* @static
*/
function observe (value, vm) {
if (!isObject$5(value)) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer$1) {
ob = value.__ob__;
} else if (
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer$1(value);
}
if (ob && vm) {
ob.addVm(vm);
}
return ob
}
/**
* Define a reactive property on an Object.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
*/
function defineReactive (obj, key, val) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
var childOb = observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
dep.depend();
if (childOb) {
childOb.dep.depend();
}
if (Array.isArray(value)) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
if (newVal === value) {
return
}
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = observe(newVal);
dep.notify();
}
});
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
* @public
*/
/* istanbul ignore next */
function set$1 (obj, key, val) {
if (Array.isArray(obj)) {
return obj.splice(key, 1, val)
}
if (hasOwn(obj, key)) {
obj[key] = val;
return
}
if (obj._isVue) {
set$1(obj._data, key, val);
return
}
var ob = obj.__ob__;
if (!ob) {
obj[key] = val;
return
}
ob.convert(key, val);
ob.dep.notify();
if (ob.vms) {
var i = ob.vms.length;
while (i--) {
var vm = ob.vms[i];
proxy(vm, key);
// vm.$forceUpdate()
}
}
return val
}
/**
* Delete a property and trigger change if necessary.
*
* @param {Object} obj
* @param {String} key
*/
/* istanbul ignore next */
function del (obj, key) {
if (!hasOwn(obj, key)) {
return
}
delete obj[key];
var ob = obj.__ob__;
if (!ob) {
if (obj._isVue) {
delete obj._data[key];
// obj.$forceUpdate()
}
return
}
ob.dep.notify();
if (ob.vms) {
var i = ob.vms.length;
while (i--) {
var vm = ob.vms[i];
unproxy(vm, key);
// vm.$forceUpdate()
}
}
}
var KEY_WORDS = ['$index', '$value', '$event'];
function proxy (vm, key) {
if (KEY_WORDS.indexOf(key) > -1 || !isReserved(key)) {
Object.defineProperty(vm, key, {
configurable: true,
enumerable: true,
get: function proxyGetter () {
return vm._data[key]
},
set: function proxySetter (val) {
vm._data[key] = val;
}
});
}
}
/* istanbul ignore next */
function unproxy (vm, key) {
if (!isReserved(key)) {
delete vm[key];
}
}
/* eslint-disable */
function initState (vm) {
vm._watchers = [];
initData(vm);
initComputed(vm);
initMethods(vm);
}
function initData (vm) {
var data = vm._data;
if (!isPlainObject(data)) {
data = {};
}
// proxy data on instance
var keys = Object.keys(data);
var i = keys.length;
while (i--) {
proxy(vm, keys[i]);
}
// observe data
observe(data, vm);
}
/* istanbul ignore next */
function noop () {
}
function initComputed (vm) {
var computed = vm._computed;
if (computed) {
for (var key in computed) {
var userDef = computed[key];
var def$$1 = {
enumerable: true,
configurable: true
};
if (typeof userDef === 'function') {
def$$1.get = makeComputedGetter(userDef, vm);
def$$1.set = noop;
} else {
def$$1.get = userDef.get
? userDef.cache !== false
? makeComputedGetter(userDef.get, vm)
: bind(userDef.get, vm)
: noop;
def$$1.set = userDef.set
? bind(userDef.set, vm)
: noop;
}
Object.defineProperty(vm, key, def$$1);
}
}
}
function makeComputedGetter (getter, owner) {
var watcher = new Watcher(owner, getter, null, {
lazy: true
});
return function computedGetter () {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
watcher.depend();
}
return watcher.value
}
}
function initMethods (vm) {
var methods = vm._methods;
if (methods) {
for (var key in methods) {
vm[key] = methods[key];
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// @todo: It should be registered by native from `registerComponents()`.
var config$3 = {
nativeComponentMap: {
text: true,
image: true,
container: true,
slider: {
type: 'slider',
append: 'tree'
},
cell: {
type: 'cell',
append: 'tree'
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Directive Parser
*/
var nativeComponentMap = config$3.nativeComponentMap;
var SETTERS = {
attr: 'setAttr',
style: 'setStyle',
event: 'addEvent'
};
/**
* apply the native component's options(specified by template.type)
* to the template
*/
function applyNaitveComponentOptions (template) {
var type = template.type;
var options = nativeComponentMap[type];
if (typeof options === 'object') {
for (var key in options) {
if (template[key] == null) {
template[key] = options[key];
}
else if (typof$1(template[key]) === 'object' &&
typof$1(options[key]) === 'object') {
for (var subkey in options[key]) {
if (template[key][subkey] == null) {
template[key][subkey] = options[key][subkey];
}
}
}
}
}
}
/**
* bind all id, attr, classnames, style, events to an element
*/
function bindElement (vm, el, template) {
setId$1(vm, el, template.id, vm);
setAttr$1(vm, el, template.attr);
setClass(vm, el, template.classList);
setStyle$1(vm, el, template.style);
bindEvents(vm, el, template.events);
}
/**
* bind all props to sub vm and bind all style, events to the root element
* of the sub vm if it doesn't have a replaced multi-node fragment
*/
function bindSubVm (vm, subVm, template, repeatItem) {
subVm = subVm || {};
template = template || {};
var options = subVm._options || {};
// bind props
var props = options.props;
if (Array.isArray(props)) {
props = props.reduce(function (result, value) {
result[value] = true;
return result
}, {});
}
mergeProps(repeatItem, props, vm, subVm);
mergeProps(template.attr, props, vm, subVm);
}
/**
* merge class and styles from vm to sub vm.
*/
function bindSubVmAfterInitialized (vm, subVm, template, target) {
if ( target === void 0 ) target = {};
mergeClassStyle(template.classList, vm, subVm);
mergeStyle(template.style, vm, subVm);
// bind subVm to the target element
if (target.children) {
target.children[target.children.length - 1]._vm = subVm;
}
else {
target._vm = subVm;
}
}
/**
* Bind props from vm to sub vm and watch their updates.
*/
function mergeProps (target, props, vm, subVm) {
if (!target) {
return
}
var loop = function ( key ) {
if (!props || props[key]) {
var value = target[key];
if (typeof value === 'function') {
var returnValue = watch(vm, value, function (v) {
subVm[key] = v;
});
subVm[key] = returnValue;
}
else {
subVm[key] = value;
}
}
};
for (var key in target) loop( key );
}
/**
* Bind style from vm to sub vm and watch their updates.
*/
function mergeStyle (target, vm, subVm) {
var loop = function ( key ) {
var value = target[key];
if (typeof value === 'function') {
var returnValue = watch(vm, value, function (v) {
if (subVm._rootEl) {
subVm._rootEl.setStyle(key, v);
}
});
subVm._rootEl.setStyle(key, returnValue);
}
else {
if (subVm._rootEl) {
subVm._rootEl.setStyle(key, value);
}
}
};
for (var key in target) loop( key );
}
/**
* Bind class & style from vm to sub vm and watch their updates.
*/
function mergeClassStyle (target, vm, subVm) {
var css = vm._options && vm._options.style || {};
/* istanbul ignore if */
if (!subVm._rootEl) {
return
}
var className = '@originalRootEl';
css[className] = subVm._rootEl.classStyle;
function addClassName (list, name) {
if (typof$1(list) === 'array') {
list.unshift(name);
}
}
if (typeof target === 'function') {
var value = watch(vm, target, function (v) {
addClassName(v, className);
setClassStyle$1(subVm._rootEl, css, v);
});
addClassName(value, className);
setClassStyle$1(subVm._rootEl, css, value);
}
else if (target != null) {
addClassName(target, className);
setClassStyle$1(subVm._rootEl, css, target);
}
}
/**
* bind id to an element
* each id is unique in a whole vm
*/
function setId$1 (vm, el, id, target) {
var map = Object.create(null);
Object.defineProperties(map, {
vm: {
value: target,
writable: false,
configurable: false
},
el: {
get: function () { return el || target._rootEl; },
configurable: false
}
});
if (typeof id === 'function') {
var handler = id;
id = handler.call(vm);
if (id || id === 0) {
vm._ids[id] = map;
}
watch(vm, handler, function (newId) {
if (newId) {
vm._ids[newId] = map;
}
});
}
else if (id && typeof id === 'string') {
vm._ids[id] = map;
}
}
/**
* bind attr to an element
*/
function setAttr$1 (vm, el, attr) {
bindDir(vm, el, 'attr', attr);
}
function setClassStyle$1 (el, css, classList) {
if (typeof classList === 'string') {
classList = classList.split(/\s+/);
}
classList.forEach(function (name, i) {
classList.splice.apply(classList, [ i, 1 ].concat( name.split(/\s+/) ));
});
var classStyle = {};
var length = classList.length;
var loop = function ( i ) {
var style = css[classList[i]];
if (style) {
Object.keys(style).forEach(function (key) {
classStyle[key] = style[key];
});
}
};
for (var i = 0; i < length; i++) loop( i );
el.setClassStyle(classStyle);
}
/**
* bind classnames to an element
*/
function setClass (vm, el, classList) {
if (typeof classList !== 'function' && !Array.isArray(classList)) {
return
}
if (Array.isArray(classList) && !classList.length) {
el.setClassStyle({});
return
}
var style = vm._options && vm._options.style || {};
if (typeof classList === 'function') {
var value = watch(vm, classList, function (v) {
setClassStyle$1(el, style, v);
});
setClassStyle$1(el, style, value);
}
else {
setClassStyle$1(el, style, classList);
}
}
/**
* bind style to an element
*/
function setStyle$1 (vm, el, style) {
bindDir(vm, el, 'style', style);
}
/**
* add an event type and handler to an element and generate a dom update
*/
function setEvent (vm, el, type, handler) {
el.addEvent(type, bind(handler, vm));
}
/**
* add all events of an element
*/
function bindEvents (vm, el, events) {
if (!events) {
return
}
var keys = Object.keys(events);
var i = keys.length;
while (i--) {
var key = keys[i];
var handler = events[key];
if (typeof handler === 'string') {
handler = vm[handler];
/* istanbul ignore if */
if (!handler) {
console.warn(("[JS Framework] The event handler \"" + handler + "\" is not defined."));
}
}
setEvent(vm, el, key, handler);
}
}
/**
* set a series of members as a kind of an element
* for example: style, attr, ...
* if the value is a function then bind the data changes
*/
function bindDir (vm, el, name, data) {
if (!data) {
return
}
var keys = Object.keys(data);
var i = keys.length;
while (i--) {
var key = keys[i];
var value = data[key];
if (typeof value === 'function') {
bindKey(vm, el, name, key, value);
}
else {
el[SETTERS[name]](key, value);
}
}
}
/**
* bind data changes to a certain key to a name series in an element
*/
function bindKey (vm, el, name, key, calc) {
var methodName = SETTERS[name];
// watch the calc, and returns a value by calc.call()
var value = watch(vm, calc, function (value) {
function handler () {
el[methodName](key, value);
}
var differ = vm && vm._app && vm._app.differ;
if (differ) {
differ.append('element', el.depth || 0, el.ref, handler);
}
else {
handler();
}
});
el[methodName](key, value);
}
/**
* watch a calc function and callback if the calc value changes
*/
function watch (vm, calc, callback) {
if (vm._static) {
return calc.call(vm, vm)
}
var watcher = new Watcher(vm, calc, function (value, oldValue) {
/* istanbul ignore if */
if (typeof value !== 'object' && value === oldValue) {
return
}
callback(value);
});
return watcher.value
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Document & Element Helpers.
*
* required:
* Document#: createElement, createComment, getRef
* Element#: appendChild, insertBefore, removeChild, nextSibling
*/
/**
* Create a body by type
* Using this._app.doc
*
* @param {string} type
*/
function createBody$1 (vm, type) {
var doc = vm._app.doc;
return doc.createBody(type)
}
/**
* Create an element by type
* Using this._app.doc
*
* @param {string} type
*/
function createElement$1 (vm, type) {
var doc = vm._app.doc;
return doc.createElement(type)
}
/**
* Create and return a frag block for an element.
* The frag block has a starter, ender and the element itself.
*
* @param {object} element
*/
function createBlock (vm, element) {
var start = createBlockStart(vm);
var end = createBlockEnd(vm);
var blockId = lastestBlockId++;
if (element.element) {
var updateMark = element.updateMark;
if (updateMark) {
if (updateMark.element) {
updateMark = updateMark.end;
}
element.element.insertAfter(end, updateMark);
element.element.insertAfter(start, updateMark);
element.updateMark = end;
}
else {
element.element.insertBefore(start, element.end);
element.element.insertBefore(end, element.end);
}
element = element.element;
}
else {
element.appendChild(start);
element.appendChild(end);
}
return { start: start, end: end, element: element, blockId: blockId }
}
var lastestBlockId = 1;
/**
* Create and return a block starter.
* Using this._app.doc
*/
function createBlockStart (vm) {
var doc = vm._app.doc;
var anchor = doc.createComment('start');
return anchor
}
/**
* Create and return a block ender.
* Using this._app.doc
*/
function createBlockEnd (vm) {
var doc = vm._app.doc;
var anchor = doc.createComment('end');
return anchor
}
/**
* Attach target to a certain dest using appendChild by default.
* If the dest is a frag block then insert before the ender.
* If the target is a frag block then attach the starter and ender in order.
*
* @param {object} target
* @param {object} dest
*/
function attachTarget (vm, target, dest) {
if (dest.element) {
var before = dest.end;
var after = dest.updateMark;
// push new target for watch list update later
if (dest.children) {
dest.children.push(target);
}
// for check repeat case
if (after) {
var signal = moveTarget(vm, target, after);
dest.updateMark = target.element ? target.end : target;
return signal
}
else if (target.element) {
dest.element.insertBefore(target.start, before);
dest.element.insertBefore(target.end, before);
}
else {
return dest.element.insertBefore(target, before)
}
}
else {
if (target.element) {
dest.appendChild(target.start);
dest.appendChild(target.end);
}
else {
return dest.appendChild(target)
}
}
}
/**
* Move target before a certain element. The target maybe block or element.
*
* @param {object} target
* @param {object} before
*/
function moveTarget (vm, target, after) {
if (target.element) {
return moveBlock(target, after)
}
return moveElement$1(target, after)
}
/**
* Move element before a certain element.
*
* @param {object} element
* @param {object} before
*/
function moveElement$1 (element, after) {
var parent = after.parentNode;
if (parent) {
return parent.insertAfter(element, after)
}
}
/**
* Move all elements of the block before a certain element.
*
* @param {object} fragBlock
* @param {object} before
*/
function moveBlock (fragBlock, after) {
var parent = after.parentNode;
if (parent) {
var el = fragBlock.start;
var signal;
var group = [el];
while (el && el !== fragBlock.end) {
el = el.nextSibling;
group.push(el);
}
var temp = after;
group.every(function (el) {
signal = parent.insertAfter(el, temp);
temp = el;
return signal !== -1
});
return signal
}
}
/**
* Remove target from DOM tree.
* If the target is a frag block then call _removeBlock
*
* @param {object} target
*/
function removeTarget (vm, target, preserveBlock) {
if ( preserveBlock === void 0 ) preserveBlock = false;
if (target.element) {
removeBlock(target, preserveBlock);
}
else {
removeElement$1(target);
}
if (target._vm) {
target._vm.$emit('hook:destroyed');
}
}
/**
* Remove a certain element.
* Using this._app.doc
*
* @param {object} target
*/
function removeElement$1 (target) {
var parent = target.parentNode;
if (parent) {
parent.removeChild(target);
}
}
/**
* Remove a frag block.
* The second param decides whether the block self should be removed too.
*
* @param {object} fragBlock
* @param {Boolean} preserveBlock=false
*/
function removeBlock (fragBlock, preserveBlock) {
if ( preserveBlock === void 0 ) preserveBlock = false;
var result = [];
var el = fragBlock.start.nextSibling;
while (el && el !== fragBlock.end) {
result.push(el);
el = el.nextSibling;
}
if (!preserveBlock) {
removeElement$1(fragBlock.start);
}
result.forEach(function (el) {
removeElement$1(el);
});
if (!preserveBlock) {
removeElement$1(fragBlock.end);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* ViewModel template parser & data-binding process
*/
/**
* build()
* compile(template, parentNode)
* if (type is content) create contentNode
* else if (dirs have v-for) foreach -> create context
* -> compile(templateWithoutFor, parentNode): diff(list) onchange
* else if (dirs have v-if) assert
* -> compile(templateWithoutIf, parentNode): toggle(shown) onchange
* else if (type is dynamic)
* -> compile(templateWithoutDynamicType, parentNode): watch(type) onchange
* else if (type is custom)
* addChildVm(vm, parentVm)
* build(externalDirs)
* foreach childNodes -> compile(childNode, template)
* else if (type is native)
* set(dirs): update(id/attr/style/class) onchange
* append(template, parentNode)
* foreach childNodes -> compile(childNode, template)
*/
function build (vm) {
var opt = vm._options || {};
var template = opt.template || {};
if (opt.replace) {
if (template.children && template.children.length === 1) {
compile(vm, template.children[0], vm._parentEl);
}
else {
compile(vm, template.children, vm._parentEl);
}
}
else {
compile(vm, template, vm._parentEl);
}
console.debug(("[JS Framework] \"ready\" lifecycle in Vm(" + (vm._type) + ")"));
vm.$emit('hook:ready');
vm._ready = true;
}
/**
* Generate elements by child or children and append to parent elements.
* Root element info would be merged if has. The first argument may be an array
* if the root element with options.replace has not only one child.
*
* @param {object|array} target
* @param {object} dest
* @param {object} meta
*/
function compile (vm, target, dest, meta) {
var app = vm._app || {};
if (app.lastSignal === -1) {
return
}
if (target.attr && target.attr.hasOwnProperty('static')) {
vm._static = true;
}
if (targetIsFragment(target)) {
compileFragment(vm, target, dest, meta);
return
}
meta = meta || {};
if (targetIsContent(target)) {
console.debug('[JS Framework] compile "content" block by', target);
vm._content = createBlock(vm, dest);
return
}
if (targetNeedCheckRepeat(target, meta)) {
console.debug('[JS Framework] compile "repeat" logic by', target);
if (dest.type === 'document') {
console.warn('[JS Framework] The root element does\'t support `repeat` directive!');
}
else {
compileRepeat(vm, target, dest);
}
return
}
if (targetNeedCheckShown(target, meta)) {
console.debug('[JS Framework] compile "if" logic by', target);
if (dest.type === 'document') {
console.warn('[JS Framework] The root element does\'t support `if` directive!');
}
else {
compileShown(vm, target, dest, meta);
}
return
}
var typeGetter = meta.type || target.type;
if (targetNeedCheckType(typeGetter, meta)) {
compileType(vm, target, dest, typeGetter, meta);
return
}
var type = typeGetter;
var component = targetIsComposed(vm, target, type);
if (component) {
console.debug('[JS Framework] compile composed component by', target);
compileCustomComponent(vm, component, target, dest, type, meta);
return
}
console.debug('[JS Framework] compile native component by', target);
compileNativeComponent(vm, target, dest, type);
}
/**
* Check if target is a fragment (an array).
*
* @param {object} target
* @return {boolean}
*/
function targetIsFragment (target) {
return Array.isArray(target)
}
/**
* Check if target type is content/slot.
*
* @param {object} target
* @return {boolean}
*/
function targetIsContent (target) {
return target.type === 'content' || target.type === 'slot'
}
/**
* Check if target need to compile by a list.
*
* @param {object} target
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckRepeat (target, meta) {
return !meta.hasOwnProperty('repeat') && target.repeat
}
/**
* Check if target need to compile by a boolean value.
*
* @param {object} target
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckShown (target, meta) {
return !meta.hasOwnProperty('shown') && target.shown
}
/**
* Check if target need to compile by a dynamic type.
*
* @param {string|function} typeGetter
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckType (typeGetter, meta) {
return (typeof typeGetter === 'function') && !meta.hasOwnProperty('type')
}
/**
* Check if this kind of component is composed.
*
* @param {string} type
* @return {boolean}
*/
function targetIsComposed (vm, target, type) {
var component;
if (vm._app && vm._app.customComponentMap) {
component = vm._app.customComponentMap[type];
}
if (vm._options && vm._options.components) {
component = vm._options.components[type];
}
if (target.component) {
component = component || {};
}
return component
}
/**
* Compile a list of targets.
*
* @param {object} target
* @param {object} dest
* @param {object} meta
*/
function compileFragment (vm, target, dest, meta) {
var fragBlock = createBlock(vm, dest);
target.forEach(function (child) {
compile(vm, child, fragBlock, meta);
});
}
/**
* Compile a target with repeat directive.
*
* @param {object} target
* @param {object} dest
*/
function compileRepeat (vm, target, dest) {
var repeat = target.repeat;
var oldStyle = typeof repeat === 'function';
var getter = repeat.getter || repeat.expression || repeat;
if (typeof getter !== 'function') {
getter = function () { return [] };
}
var key = repeat.key || '$index';
var value = repeat.value || '$value';
var trackBy = repeat.trackBy || target.trackBy ||
(target.attr && target.attr.trackBy);
var fragBlock = createBlock(vm, dest);
fragBlock.children = [];
fragBlock.data = [];
fragBlock.vms = [];
bindRepeat(vm, target, fragBlock, { getter: getter, key: key, value: value, trackBy: trackBy, oldStyle: oldStyle });
}
/**
* Compile a target with if directive.
*
* @param {object} target
* @param {object} dest
* @param {object} meta
*/
function compileShown (vm, target, dest, meta) {
var newMeta = { shown: true };
var fragBlock = createBlock(vm, dest);
if (dest.element && dest.children) {
dest.children.push(fragBlock);
}
if (meta.repeat) {
newMeta.repeat = meta.repeat;
}
bindShown(vm, target, fragBlock, newMeta);
}
/**
* Compile a target with dynamic component type.
*
* @param {object} target
* @param {object} dest
* @param {function} typeGetter
*/
function compileType (vm, target, dest, typeGetter, meta) {
var type = typeGetter.call(vm);
var newMeta = extend({ type: type }, meta);
var fragBlock = createBlock(vm, dest);
if (dest.element && dest.children) {
dest.children.push(fragBlock);
}
watch(vm, typeGetter, function (value) {
var newMeta = extend({ type: value }, meta);
removeTarget(vm, fragBlock, true);
compile(vm, target, fragBlock, newMeta);
});
compile(vm, target, fragBlock, newMeta);
}
/**
* Compile a composed component.
*
* @param {object} target
* @param {object} dest
* @param {string} type
*/
function compileCustomComponent (vm, component, target, dest, type, meta) {
var Ctor = vm.constructor;
var subVm = new Ctor(type, component, vm, dest, undefined, {
'hook:init': function () {
if (vm._static) {
this._static = vm._static;
}
setId$1(vm, null, target.id, this);
// bind template earlier because of lifecycle issues
this._externalBinding = {
parent: vm,
template: target
};
},
'hook:created': function () {
bindSubVm(vm, this, target, meta.repeat);
},
'hook:ready': function () {
if (this._content) {
compileChildren(vm, target, this._content);
}
}
});
bindSubVmAfterInitialized(vm, subVm, target, dest);
}
/**
* Generate element from template and attach to the dest if needed.
* The time to attach depends on whether the mode status is node or tree.
*
* @param {object} template
* @param {object} dest
* @param {string} type
*/
function compileNativeComponent (vm, template, dest, type) {
applyNaitveComponentOptions(template);
var element;
if (dest.ref === '_documentElement') {
// if its parent is documentElement then it's a body
console.debug(("[JS Framework] compile to create body for " + type));
element = createBody$1(vm, type);
}
else {
console.debug(("[JS Framework] compile to create element for " + type));
element = createElement$1(vm, type);
}
if (!vm._rootEl) {
vm._rootEl = element;
// bind event earlier because of lifecycle issues
var binding = vm._externalBinding || {};
var target = binding.template;
var parentVm = binding.parent;
if (target && target.events && parentVm && element) {
for (var type$1 in target.events) {
var handler = parentVm[target.events[type$1]];
if (handler) {
element.addEvent(type$1, bind(handler, parentVm));
}
}
}
}
bindElement(vm, element, template);
if (template.attr && template.attr.append) { // backward, append prop in attr
template.append = template.attr.append;
}
if (template.append) { // give the append attribute for ios adaptation
element.attr = element.attr || {};
element.attr.append = template.append;
}
var treeMode = template.append === 'tree';
var app = vm._app || {};
if (app.lastSignal !== -1 && !treeMode) {
console.debug('[JS Framework] compile to append single node for', element);
app.lastSignal = attachTarget(vm, element, dest);
}
if (app.lastSignal !== -1) {
compileChildren(vm, template, element);
}
if (app.lastSignal !== -1 && treeMode) {
console.debug('[JS Framework] compile to append whole tree for', element);
app.lastSignal = attachTarget(vm, element, dest);
}
}
/**
* Set all children to a certain parent element.
*
* @param {object} template
* @param {object} dest
*/
function compileChildren (vm, template, dest) {
var app = vm._app || {};
var children = template.children;
if (children && children.length) {
children.every(function (child) {
compile(vm, child, dest);
return app.lastSignal !== -1
});
}
}
/**
* Watch the list update and refresh the changes.
*
* @param {object} target
* @param {object} fragBlock {vms, data, children}
* @param {object} info {getter, key, value, trackBy, oldStyle}
*/
function bindRepeat (vm, target, fragBlock, info) {
var vms = fragBlock.vms;
var children = fragBlock.children;
var getter = info.getter;
var trackBy = info.trackBy;
var oldStyle = info.oldStyle;
var keyName = info.key;
var valueName = info.value;
function compileItem (item, index, context) {
var mergedData;
if (oldStyle) {
mergedData = item;
if (isObject$5(item)) {
mergedData[keyName] = index;
if (!mergedData.hasOwnProperty('INDEX')) {
Object.defineProperty(mergedData, 'INDEX', {
value: function () {
console.warn('[JS Framework] "INDEX" in repeat is deprecated, ' +
'please use "$index" instead');
}
});
}
}
else {
console.warn('[JS Framework] Each list item must be an object in old-style repeat, '
+ 'please use `repeat={{v in list}}` instead.');
mergedData = {};
mergedData[keyName] = index;
mergedData[valueName] = item;
}
}
else {
mergedData = {};
mergedData[keyName] = index;
mergedData[valueName] = item;
}
var newContext = mergeContext(context, mergedData);
vms.push(newContext);
compile(newContext, target, fragBlock, { repeat: item });
}
var list = watchBlock(vm, fragBlock, getter, 'repeat',
function (data) {
console.debug('[JS Framework] the "repeat" item has changed', data);
if (!fragBlock || !data) {
return
}
var oldChildren = children.slice();
var oldVms = vms.slice();
var oldData = fragBlock.data.slice();
// 1. collect all new refs track by
var trackMap = {};
var reusedMap = {};
data.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
/* istanbul ignore if */
if (key == null || key === '') {
return
}
trackMap[key] = item;
});
// 2. remove unused element foreach old item
var reusedList = [];
oldData.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
if (trackMap.hasOwnProperty(key)) {
reusedMap[key] = {
item: item, index: index, key: key,
target: oldChildren[index],
vm: oldVms[index]
};
reusedList.push(item);
}
else {
removeTarget(vm, oldChildren[index]);
}
});
// 3. create new element foreach new item
children.length = 0;
vms.length = 0;
fragBlock.data = data.slice();
fragBlock.updateMark = fragBlock.start;
data.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
var reused = reusedMap[key];
if (reused) {
if (reused.item === reusedList[0]) {
reusedList.shift();
}
else {
reusedList.$remove(reused.item);
moveTarget(vm, reused.target, fragBlock.updateMark, true);
}
children.push(reused.target);
vms.push(reused.vm);
if (oldStyle) {
reused.vm = item;
}
else {
reused.vm[valueName] = item;
}
reused.vm[keyName] = index;
fragBlock.updateMark = reused.target;
}
else {
compileItem(item, index, vm);
}
});
delete fragBlock.updateMark;
}
);
fragBlock.data = list.slice(0);
list.forEach(function (item, index) {
compileItem(item, index, vm);
});
}
/**
* Watch the display update and add/remove the element.
*
* @param {object} target
* @param {object} fragBlock
* @param {object} context
*/
function bindShown (vm, target, fragBlock, meta) {
var display = watchBlock(vm, fragBlock, target.shown, 'shown',
function (display) {
console.debug('[JS Framework] the "if" item was changed', display);
if (!fragBlock || !!fragBlock.display === !!display) {
return
}
fragBlock.display = !!display;
if (display) {
compile(vm, target, fragBlock, meta);
}
else {
removeTarget(vm, fragBlock, true);
}
}
);
fragBlock.display = !!display;
if (display) {
compile(vm, target, fragBlock, meta);
}
}
/**
* Watch calc value changes and append certain type action to differ.
* It is used for if or repeat data-binding generator.
*
* @param {object} fragBlock
* @param {function} calc
* @param {string} type
* @param {function} handler
* @return {any} init value of calc
*/
function watchBlock (vm, fragBlock, calc, type, handler) {
var differ = vm && vm._app && vm._app.differ;
var config = {};
var depth = (fragBlock.element.depth || 0) + 1;
return watch(vm, calc, function (value) {
config.latestValue = value;
if (differ && !config.recorded) {
differ.append(type, depth, fragBlock.blockId, function () {
var latestValue = config.latestValue;
handler(latestValue);
config.recorded = false;
config.latestValue = undefined;
});
}
config.recorded = true;
})
}
/**
* Clone a context and merge certain data.
*
* @param {object} mergedData
* @return {object}
*/
function mergeContext (context, mergedData) {
var newContext = Object.create(context);
newContext._data = mergedData;
initData(newContext);
initComputed(newContext);
newContext._realParent = context;
if (context._static) {
newContext._static = context._static;
}
return newContext
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Everything about component event which includes event object, event listener,
* event emitter and lifecycle hooks.
*/
/**
* Event object definition. An event object has `type`, `timestamp` and
* `detail` from which a component emit. The event object could be dispatched to
* parents or broadcasted to children except `this.stop()` is called.
* @param {string} type
* @param {any} detail
*/
function Evt (type, detail) {
if (detail instanceof Evt) {
return detail
}
this.timestamp = Date.now();
this.detail = detail;
this.type = type;
var shouldStop = false;
/**
* stop dispatch and broadcast
*/
this.stop = function () {
shouldStop = true;
};
/**
* check if it can't be dispatched or broadcasted
*/
this.hasStopped = function () {
return shouldStop
};
}
/**
* Emit an event but not broadcast down or dispatch up.
* @param {string} type
* @param {any} detail
*/
function $emit (type, detail) {
var this$1 = this;
var events = this._vmEvents;
var handlerList = events[type];
if (handlerList) {
var evt = new Evt(type, detail);
handlerList.forEach(function (handler) {
handler.call(this$1, evt);
});
}
}
/**
* Emit an event and dispatch it up.
* @param {string} type
* @param {any} detail
*/
function $dispatch (type, detail) {
var evt = new Evt(type, detail);
this.$emit(type, evt);
if (!evt.hasStopped() && this._parent && this._parent.$dispatch) {
this._parent.$dispatch(type, evt);
}
}
/**
* Emit an event and broadcast it down.
* @param {string} type
* @param {any} detail
*/
function $broadcast (type, detail) {
var evt = new Evt(type, detail);
this.$emit(type, evt);
if (!evt.hasStopped() && this._childrenVms) {
this._childrenVms.forEach(function (subVm) {
subVm.$broadcast(type, evt);
});
}
}
/**
* Add event listener.
* @param {string} type
* @param {function} handler
*/
function $on (type, handler) {
if (!type || typeof handler !== 'function') {
return
}
var events = this._vmEvents;
var handlerList = events[type] || [];
handlerList.push(handler);
events[type] = handlerList;
// fixed old version lifecycle design
/* istanbul ignore if */
if (type === 'hook:ready' && this._ready) {
this.$emit('hook:ready');
}
}
/**
* Remove event listener.
* @param {string} type
* @param {function} handler
*/
function $off (type, handler) {
if (!type) {
return
}
var events = this._vmEvents;
if (!handler) {
delete events[type];
return
}
var handlerList = events[type];
if (!handlerList) {
return
}
handlerList.$remove(handler);
}
var LIFE_CYCLE_TYPES = ['init', 'created', 'ready', 'destroyed'];
/**
* Init events:
* 1. listen `events` in component options & `externalEvents`.
* 2. bind lifecycle hooks.
* @param {Vm} vm
* @param {object} externalEvents
*/
function initEvents (vm, externalEvents) {
var options = vm._options || {};
var events = options.events || {};
for (var type1 in events) {
vm.$on(type1, events[type1]);
}
for (var type2 in externalEvents) {
vm.$on(type2, externalEvents[type2]);
}
LIFE_CYCLE_TYPES.forEach(function (type) {
vm.$on(("hook:" + type), options[type]);
});
}
/**
* Bind event related methods to ViewModel instance.
* @param {Vm} vm
*/
function mixinEvents (vm) {
vm.$emit = $emit;
vm.$dispatch = $dispatch;
vm.$broadcast = $broadcast;
vm.$on = $on;
vm.$off = $off;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* ViewModel Constructor & definition
*/
/**
* ViewModel constructor
*
* @param {string} type
* @param {object} options component options
* @param {object} parentVm which contains _app
* @param {object} parentEl root element or frag block
* @param {object} mergedData external data
* @param {object} externalEvents external events
*/
function Vm (
type,
options,
parentVm,
parentEl,
mergedData,
externalEvents
) {
parentVm = parentVm || {};
this._parent = parentVm._realParent ? parentVm._realParent : parentVm;
this._app = parentVm._app || {};
parentVm._childrenVms && parentVm._childrenVms.push(this);
if (!options && this._app.customComponentMap) {
options = this._app.customComponentMap[type];
}
options = options || {};
var data = options.data || {};
this._options = options;
this._methods = options.methods || {};
this._computed = options.computed || {};
this._css = options.style || {};
this._ids = {};
this._vmEvents = {};
this._childrenVms = [];
this._type = type;
// bind events and lifecycles
initEvents(this, externalEvents);
console.debug(("[JS Framework] \"init\" lifecycle in Vm(" + (this._type) + ")"));
this.$emit('hook:init');
this._inited = true;
// proxy data and methods
// observe data and add this to vms
this._data = typeof data === 'function' ? data() : data;
if (mergedData) {
extend(this._data, mergedData);
}
initState(this);
console.debug(("[JS Framework] \"created\" lifecycle in Vm(" + (this._type) + ")"));
this.$emit('hook:created');
this._created = true;
// backward old ready entry
if (options.methods && options.methods.ready) {
console.warn('"exports.methods.ready" is deprecated, ' +
'please use "exports.created" instead');
options.methods.ready.call(this);
}
if (!this._app.doc) {
return
}
// if no parentElement then specify the documentElement
this._parentEl = parentEl || this._app.doc.documentElement;
build(this);
}
mixinEvents(Vm.prototype);
/**
* Watch an function and bind all the data appeared in it. When the related
* data changes, the callback will be called with new value as 1st param.
*
* @param {Function} fn
* @param {Function} callback
*/
Vm.prototype.$watch = function (fn, callback) {
watch(this, fn, callback);
};
Vm.set = set$1;
Vm.delete = del;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var nativeModules = {};
// for testing
/**
* for testing
*/
/**
* for testing
*/
// for framework
/**
* init modules for an app instance
* the second param determines whether to replace an existed method
*/
function initModules (modules, ifReplace) {
var loop = function ( moduleName ) {
// init `modules[moduleName][]`
var methods = nativeModules[moduleName];
if (!methods) {
methods = {};
nativeModules[moduleName] = methods;
}
// push each non-existed new method
modules[moduleName].forEach(function (method) {
if (typeof method === 'string') {
method = {
name: method
};
}
if (!methods[method.name] || ifReplace) {
methods[method.name] = method;
}
});
};
for (var moduleName in modules) loop( moduleName );
}
/**
* init app methods
*/
function initMethods$1 (Vm, apis) {
var p = Vm.prototype;
for (var apiName in apis) {
if (!p.hasOwnProperty(apiName)) {
p[apiName] = apis[apiName];
}
}
}
/**
* get a module of methods for an app instance
*/
function requireModule$1 (app, name) {
var methods = nativeModules[name];
var target = {};
var loop = function ( methodName ) {
Object.defineProperty(target, methodName, {
configurable: true,
enumerable: true,
get: function moduleGetter () {
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return app.callTasks({
module: name,
method: methodName,
args: args
});
}
},
set: function moduleSetter (value) {
if (typeof value === 'function') {
return app.callTasks({
module: name,
method: methodName,
args: [value]
})
}
}
});
};
for (var methodName in methods) loop( methodName );
return target
}
/**
* get a custom component options
*/
function requireCustomComponent (app, name) {
var customComponentMap = app.customComponentMap;
return customComponentMap[name]
}
/**
* register a custom component options
*/
function registerCustomComponent (app, name, def) {
var customComponentMap = app.customComponentMap;
if (customComponentMap[name]) {
console.error(("[JS Framework] define a component(" + name + ") that already exists"));
return
}
customComponentMap[name] = def;
}
var semver = createCommonjsModule(function (module, exports) {
exports = module.exports = SemVer;
// The debug function is excluded entirely from the minified version.
/* nomin */ var debug;
/* nomin */ if (typeof process === 'object' &&
/* nomin */ process.env &&
/* nomin */ false &&
/* nomin */ /\bsemver\b/i.test(false))
/* nomin */ { debug = function() {
/* nomin */ var args = Array.prototype.slice.call(arguments, 0);
/* nomin */ args.unshift('SEMVER');
/* nomin */ console.log.apply(console, args);
/* nomin */ }; }
/* nomin */ else
/* nomin */ { debug = function() {}; }
// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0';
var MAX_LENGTH = 256;
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
// The actual regexps go on exports.re
var re = exports.re = [];
var src = exports.src = [];
var R = 0;
// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.
// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.
var NUMERICIDENTIFIER = R++;
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
var NUMERICIDENTIFIERLOOSE = R++;
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.
var NONNUMERICIDENTIFIER = R++;
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
// ## Main Version
// Three dot-separated numeric identifiers.
var MAINVERSION = R++;
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
'(' + src[NUMERICIDENTIFIER] + ')\\.' +
'(' + src[NUMERICIDENTIFIER] + ')';
var MAINVERSIONLOOSE = R++;
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
'(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
'(' + src[NUMERICIDENTIFIERLOOSE] + ')';
// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.
var PRERELEASEIDENTIFIER = R++;
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
'|' + src[NONNUMERICIDENTIFIER] + ')';
var PRERELEASEIDENTIFIERLOOSE = R++;
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
'|' + src[NONNUMERICIDENTIFIER] + ')';
// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.
var PRERELEASE = R++;
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
'(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
var PRERELEASELOOSE = R++;
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
'(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.
var BUILDIDENTIFIER = R++;
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.
var BUILD = R++;
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
'(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.
// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups. The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.
var FULL = R++;
var FULLPLAIN = 'v?' + src[MAINVERSION] +
src[PRERELEASE] + '?' +
src[BUILD] + '?';
src[FULL] = '^' + FULLPLAIN + '$';
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
src[PRERELEASELOOSE] + '?' +
src[BUILD] + '?';
var LOOSE = R++;
src[LOOSE] = '^' + LOOSEPLAIN + '$';
var GTLT = R++;
src[GTLT] = '((?:<|>)?=?)';
// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
var XRANGEIDENTIFIERLOOSE = R++;
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
var XRANGEIDENTIFIER = R++;
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
var XRANGEPLAIN = R++;
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
'(?:' + src[PRERELEASE] + ')?' +
src[BUILD] + '?' +
')?)?';
var XRANGEPLAINLOOSE = R++;
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:' + src[PRERELEASELOOSE] + ')?' +
src[BUILD] + '?' +
')?)?';
var XRANGE = R++;
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
var XRANGELOOSE = R++;
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++;
src[LONETILDE] = '(?:~>?)';
var TILDETRIM = R++;
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
var tildeTrimReplace = '$1~';
var TILDE = R++;
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
var TILDELOOSE = R++;
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++;
src[LONECARET] = '(?:\\^)';
var CARETTRIM = R++;
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
var caretTrimReplace = '$1^';
var CARET = R++;
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
var CARETLOOSE = R++;
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++;
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
var COMPARATOR = R++;
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++;
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
'\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
var comparatorTrimReplace = '$1$2$3';
// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
var HYPHENRANGE = R++;
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
'\\s+-\\s+' +
'(' + src[XRANGEPLAIN] + ')' +
'\\s*$';
var HYPHENRANGELOOSE = R++;
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
'\\s+-\\s+' +
'(' + src[XRANGEPLAINLOOSE] + ')' +
'\\s*$';
// Star ranges basically just allow anything at all.
var STAR = R++;
src[STAR] = '(<|>)?=?\\s*\\*';
// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
debug(i, src[i]);
if (!re[i])
{ re[i] = new RegExp(src[i]); }
}
exports.parse = parse;
function parse(version, loose) {
if (version instanceof SemVer)
{ return version; }
if (typeof version !== 'string')
{ return null; }
if (version.length > MAX_LENGTH)
{ return null; }
var r = loose ? re[LOOSE] : re[FULL];
if (!r.test(version))
{ return null; }
try {
return new SemVer(version, loose);
} catch (er) {
return null;
}
}
exports.valid = valid;
function valid(version, loose) {
var v = parse(version, loose);
return v ? v.version : null;
}
exports.clean = clean;
function clean(version, loose) {
var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
return s ? s.version : null;
}
exports.SemVer = SemVer;
function SemVer(version, loose) {
if (version instanceof SemVer) {
if (version.loose === loose)
{ return version; }
else
{ version = version.version; }
} else if (typeof version !== 'string') {
throw new TypeError('Invalid Version: ' + version);
}
if (version.length > MAX_LENGTH)
{ throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') }
if (!(this instanceof SemVer))
{ return new SemVer(version, loose); }
debug('SemVer', version, loose);
this.loose = loose;
var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
if (!m)
{ throw new TypeError('Invalid Version: ' + version); }
this.raw = version;
// these are actually numbers
this.major = +m[1];
this.minor = +m[2];
this.patch = +m[3];
if (this.major > MAX_SAFE_INTEGER || this.major < 0)
{ throw new TypeError('Invalid major version') }
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
{ throw new TypeError('Invalid minor version') }
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
{ throw new TypeError('Invalid patch version') }
// numberify any prerelease numeric ids
if (!m[4])
{ this.prerelease = []; }
else
{ this.prerelease = m[4].split('.').map(function(id) {
if (/^[0-9]+$/.test(id)) {
var num = +id;
if (num >= 0 && num < MAX_SAFE_INTEGER)
{ return num; }
}
return id;
}); }
this.build = m[5] ? m[5].split('.') : [];
this.format();
}
SemVer.prototype.format = function() {
this.version = this.major + '.' + this.minor + '.' + this.patch;
if (this.prerelease.length)
{ this.version += '-' + this.prerelease.join('.'); }
return this.version;
};
SemVer.prototype.toString = function() {
return this.version;
};
SemVer.prototype.compare = function(other) {
debug('SemVer.compare', this.version, this.loose, other);
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
return this.compareMain(other) || this.comparePre(other);
};
SemVer.prototype.compareMain = function(other) {
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
return compareIdentifiers(this.major, other.major) ||
compareIdentifiers(this.minor, other.minor) ||
compareIdentifiers(this.patch, other.patch);
};
SemVer.prototype.comparePre = function(other) {
var this$1 = this;
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
// NOT having a prerelease is > having one
if (this.prerelease.length && !other.prerelease.length)
{ return -1; }
else if (!this.prerelease.length && other.prerelease.length)
{ return 1; }
else if (!this.prerelease.length && !other.prerelease.length)
{ return 0; }
var i = 0;
do {
var a = this$1.prerelease[i];
var b = other.prerelease[i];
debug('prerelease compare', i, a, b);
if (a === undefined && b === undefined)
{ return 0; }
else if (b === undefined)
{ return 1; }
else if (a === undefined)
{ return -1; }
else if (a === b)
{ continue; }
else
{ return compareIdentifiers(a, b); }
} while (++i);
};
// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function(release, identifier) {
var this$1 = this;
switch (release) {
case 'premajor':
this.prerelease.length = 0;
this.patch = 0;
this.minor = 0;
this.major++;
this.inc('pre', identifier);
break;
case 'preminor':
this.prerelease.length = 0;
this.patch = 0;
this.minor++;
this.inc('pre', identifier);
break;
case 'prepatch':
// If this is already a prerelease, it will bump to the next version
// drop any prereleases that might already exist, since they are not
// relevant at this point.
this.prerelease.length = 0;
this.inc('patch', identifier);
this.inc('pre', identifier);
break;
// If the input is a non-prerelease version, this acts the same as
// prepatch.
case 'prerelease':
if (this.prerelease.length === 0)
{ this.inc('patch', identifier); }
this.inc('pre', identifier);
break;
case 'major':
// If this is a pre-major version, bump up to the same major version.
// Otherwise increment major.
// 1.0.0-5 bumps to 1.0.0
// 1.1.0 bumps to 2.0.0
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
{ this.major++; }
this.minor = 0;
this.patch = 0;
this.prerelease = [];
break;
case 'minor':
// If this is a pre-minor version, bump up to the same minor version.
// Otherwise increment minor.
// 1.2.0-5 bumps to 1.2.0
// 1.2.1 bumps to 1.3.0
if (this.patch !== 0 || this.prerelease.length === 0)
{ this.minor++; }
this.patch = 0;
this.prerelease = [];
break;
case 'patch':
// If this is not a pre-release version, it will increment the patch.
// If it is a pre-release it will bump up to the same patch version.
// 1.2.0-5 patches to 1.2.0
// 1.2.0 patches to 1.2.1
if (this.prerelease.length === 0)
{ this.patch++; }
this.prerelease = [];
break;
// This probably shouldn't be used publicly.
// 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
case 'pre':
if (this.prerelease.length === 0)
{ this.prerelease = [0]; }
else {
var i = this.prerelease.length;
while (--i >= 0) {
if (typeof this$1.prerelease[i] === 'number') {
this$1.prerelease[i]++;
i = -2;
}
}
if (i === -1) // didn't increment anything
{ this.prerelease.push(0); }
}
if (identifier) {
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
if (this.prerelease[0] === identifier) {
if (isNaN(this.prerelease[1]))
{ this.prerelease = [identifier, 0]; }
} else
{ this.prerelease = [identifier, 0]; }
}
break;
default:
throw new Error('invalid increment argument: ' + release);
}
this.format();
this.raw = this.version;
return this;
};
exports.inc = inc;
function inc(version, release, loose, identifier) {
if (typeof(loose) === 'string') {
identifier = loose;
loose = undefined;
}
try {
return new SemVer(version, loose).inc(release, identifier).version;
} catch (er) {
return null;
}
}
exports.diff = diff;
function diff(version1, version2) {
if (eq(version1, version2)) {
return null;
} else {
var v1 = parse(version1);
var v2 = parse(version2);
if (v1.prerelease.length || v2.prerelease.length) {
for (var key in v1) {
if (key === 'major' || key === 'minor' || key === 'patch') {
if (v1[key] !== v2[key]) {
return 'pre'+key;
}
}
}
return 'prerelease';
}
for (var key in v1) {
if (key === 'major' || key === 'minor' || key === 'patch') {
if (v1[key] !== v2[key]) {
return key;
}
}
}
}
}
exports.compareIdentifiers = compareIdentifiers;
var numeric = /^[0-9]+$/;
function compareIdentifiers(a, b) {
var anum = numeric.test(a);
var bnum = numeric.test(b);
if (anum && bnum) {
a = +a;
b = +b;
}
return (anum && !bnum) ? -1 :
(bnum && !anum) ? 1 :
a < b ? -1 :
a > b ? 1 :
0;
}
exports.rcompareIdentifiers = rcompareIdentifiers;
function rcompareIdentifiers(a, b) {
return compareIdentifiers(b, a);
}
exports.major = major;
function major(a, loose) {
return new SemVer(a, loose).major;
}
exports.minor = minor;
function minor(a, loose) {
return new SemVer(a, loose).minor;
}
exports.patch = patch;
function patch(a, loose) {
return new SemVer(a, loose).patch;
}
exports.compare = compare;
function compare(a, b, loose) {
return new SemVer(a, loose).compare(new SemVer(b, loose));
}
exports.compareLoose = compareLoose;
function compareLoose(a, b) {
return compare(a, b, true);
}
exports.rcompare = rcompare;
function rcompare(a, b, loose) {
return compare(b, a, loose);
}
exports.sort = sort;
function sort(list, loose) {
return list.sort(function(a, b) {
return exports.compare(a, b, loose);
});
}
exports.rsort = rsort;
function rsort(list, loose) {
return list.sort(function(a, b) {
return exports.rcompare(a, b, loose);
});
}
exports.gt = gt;
function gt(a, b, loose) {
return compare(a, b, loose) > 0;
}
exports.lt = lt;
function lt(a, b, loose) {
return compare(a, b, loose) < 0;
}
exports.eq = eq;
function eq(a, b, loose) {
return compare(a, b, loose) === 0;
}
exports.neq = neq;
function neq(a, b, loose) {
return compare(a, b, loose) !== 0;
}
exports.gte = gte;
function gte(a, b, loose) {
return compare(a, b, loose) >= 0;
}
exports.lte = lte;
function lte(a, b, loose) {
return compare(a, b, loose) <= 0;
}
exports.cmp = cmp;
function cmp(a, op, b, loose) {
var ret;
switch (op) {
case '===':
if (typeof a === 'object') { a = a.version; }
if (typeof b === 'object') { b = b.version; }
ret = a === b;
break;
case '!==':
if (typeof a === 'object') { a = a.version; }
if (typeof b === 'object') { b = b.version; }
ret = a !== b;
break;
case '': case '=': case '==': ret = eq(a, b, loose); break;
case '!=': ret = neq(a, b, loose); break;
case '>': ret = gt(a, b, loose); break;
case '>=': ret = gte(a, b, loose); break;
case '<': ret = lt(a, b, loose); break;
case '<=': ret = lte(a, b, loose); break;
default: throw new TypeError('Invalid operator: ' + op);
}
return ret;
}
exports.Comparator = Comparator;
function Comparator(comp, loose) {
if (comp instanceof Comparator) {
if (comp.loose === loose)
{ return comp; }
else
{ comp = comp.value; }
}
if (!(this instanceof Comparator))
{ return new Comparator(comp, loose); }
debug('comparator', comp, loose);
this.loose = loose;
this.parse(comp);
if (this.semver === ANY)
{ this.value = ''; }
else
{ this.value = this.operator + this.semver.version; }
debug('comp', this);
}
var ANY = {};
Comparator.prototype.parse = function(comp) {
var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
var m = comp.match(r);
if (!m)
{ throw new TypeError('Invalid comparator: ' + comp); }
this.operator = m[1];
if (this.operator === '=')
{ this.operator = ''; }
// if it literally is just '>' or '' then allow anything.
if (!m[2])
{ this.semver = ANY; }
else
{ this.semver = new SemVer(m[2], this.loose); }
};
Comparator.prototype.toString = function() {
return this.value;
};
Comparator.prototype.test = function(version) {
debug('Comparator.test', version, this.loose);
if (this.semver === ANY)
{ return true; }
if (typeof version === 'string')
{ version = new SemVer(version, this.loose); }
return cmp(version, this.operator, this.semver, this.loose);
};
Comparator.prototype.intersects = function(comp, loose) {
if (!(comp instanceof Comparator)) {
throw new TypeError('a Comparator is required');
}
var rangeTmp;
if (this.operator === '') {
rangeTmp = new Range(comp.value, loose);
return satisfies(this.value, rangeTmp, loose);
} else if (comp.operator === '') {
rangeTmp = new Range(this.value, loose);
return satisfies(comp.semver, rangeTmp, loose);
}
var sameDirectionIncreasing =
(this.operator === '>=' || this.operator === '>') &&
(comp.operator === '>=' || comp.operator === '>');
var sameDirectionDecreasing =
(this.operator === '<=' || this.operator === '<') &&
(comp.operator === '<=' || comp.operator === '<');
var sameSemVer = this.semver.version === comp.semver.version;
var differentDirectionsInclusive =
(this.operator === '>=' || this.operator === '<=') &&
(comp.operator === '>=' || comp.operator === '<=');
var oppositeDirectionsLessThan =
cmp(this.semver, '<', comp.semver, loose) &&
((this.operator === '>=' || this.operator === '>') &&
(comp.operator === '<=' || comp.operator === '<'));
var oppositeDirectionsGreaterThan =
cmp(this.semver, '>', comp.semver, loose) &&
((this.operator === '<=' || this.operator === '<') &&
(comp.operator === '>=' || comp.operator === '>'));
return sameDirectionIncreasing || sameDirectionDecreasing ||
(sameSemVer && differentDirectionsInclusive) ||
oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
};
exports.Range = Range;
function Range(range, loose) {
if (range instanceof Range) {
if (range.loose === loose) {
return range;
} else {
return new Range(range.raw, loose);
}
}
if (range instanceof Comparator) {
return new Range(range.value, loose);
}
if (!(this instanceof Range))
{ return new Range(range, loose); }
this.loose = loose;
// First, split based on boolean or ||
this.raw = range;
this.set = range.split(/\s*\|\|\s*/).map(function(range) {
return this.parseRange(range.trim());
}, this).filter(function(c) {
// throw out any that are not relevant for whatever reason
return c.length;
});
if (!this.set.length) {
throw new TypeError('Invalid SemVer Range: ' + range);
}
this.format();
}
Range.prototype.format = function() {
this.range = this.set.map(function(comps) {
return comps.join(' ').trim();
}).join('||').trim();
return this.range;
};
Range.prototype.toString = function() {
return this.range;
};
Range.prototype.parseRange = function(range) {
var loose = this.loose;
range = range.trim();
debug('range', range, loose);
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
range = range.replace(hr, hyphenReplace);
debug('hyphen replace', range);
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
debug('comparator trim', range, re[COMPARATORTRIM]);
// `~ 1.2.3` => `~1.2.3`
range = range.replace(re[TILDETRIM], tildeTrimReplace);
// `^ 1.2.3` => `^1.2.3`
range = range.replace(re[CARETTRIM], caretTrimReplace);
// normalize spaces
range = range.split(/\s+/).join(' ');
// At this point, the range is completely trimmed and
// ready to be split into comparators.
var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
var set = range.split(' ').map(function(comp) {
return parseComparator(comp, loose);
}).join(' ').split(/\s+/);
if (this.loose) {
// in loose mode, throw out any that are not valid comparators
set = set.filter(function(comp) {
return !!comp.match(compRe);
});
}
set = set.map(function(comp) {
return new Comparator(comp, loose);
});
return set;
};
Range.prototype.intersects = function(range, loose) {
if (!(range instanceof Range)) {
throw new TypeError('a Range is required');
}
return this.set.some(function(thisComparators) {
return thisComparators.every(function(thisComparator) {
return range.set.some(function(rangeComparators) {
return rangeComparators.every(function(rangeComparator) {
return thisComparator.intersects(rangeComparator, loose);
});
});
});
});
};
// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators;
function toComparators(range, loose) {
return new Range(range, loose).set.map(function(comp) {
return comp.map(function(c) {
return c.value;
}).join(' ').trim().split(' ');
});
}
// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator(comp, loose) {
debug('comp', comp);
comp = replaceCarets(comp, loose);
debug('caret', comp);
comp = replaceTildes(comp, loose);
debug('tildes', comp);
comp = replaceXRanges(comp, loose);
debug('xrange', comp);
comp = replaceStars(comp, loose);
debug('stars', comp);
return comp;
}
function isX(id) {
return !id || id.toLowerCase() === 'x' || id === '*';
}
// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes(comp, loose) {
return comp.trim().split(/\s+/).map(function(comp) {
return replaceTilde(comp, loose);
}).join(' ');
}
function replaceTilde(comp, loose) {
var r = loose ? re[TILDELOOSE] : re[TILDE];
return comp.replace(r, function(_, M, m, p, pr) {
debug('tilde', comp, _, M, m, p, pr);
var ret;
if (isX(M))
{ ret = ''; }
else if (isX(m))
{ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; }
else if (isX(p))
// ~1.2 == >=1.2.0 <1.3.0
{ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; }
else if (pr) {
debug('replaceTilde pr', pr);
if (pr.charAt(0) !== '-')
{ pr = '-' + pr; }
ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + (+m + 1) + '.0';
} else
// ~1.2.3 == >=1.2.3 <1.3.0
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + (+m + 1) + '.0'; }
debug('tilde return', ret);
return ret;
});
}
// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets(comp, loose) {
return comp.trim().split(/\s+/).map(function(comp) {
return replaceCaret(comp, loose);
}).join(' ');
}
function replaceCaret(comp, loose) {
debug('caret', comp, loose);
var r = loose ? re[CARETLOOSE] : re[CARET];
return comp.replace(r, function(_, M, m, p, pr) {
debug('caret', comp, _, M, m, p, pr);
var ret;
if (isX(M))
{ ret = ''; }
else if (isX(m))
{ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; }
else if (isX(p)) {
if (M === '0')
{ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; }
else
{ ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; }
} else if (pr) {
debug('replaceCaret pr', pr);
if (pr.charAt(0) !== '-')
{ pr = '-' + pr; }
if (M === '0') {
if (m === '0')
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + m + '.' + (+p + 1); }
else
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + (+m + 1) + '.0'; }
} else
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + (+M + 1) + '.0.0'; }
} else {
debug('no pr');
if (M === '0') {
if (m === '0')
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + m + '.' + (+p + 1); }
else
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + (+m + 1) + '.0'; }
} else
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + (+M + 1) + '.0.0'; }
}
debug('caret return', ret);
return ret;
});
}
function replaceXRanges(comp, loose) {
debug('replaceXRanges', comp, loose);
return comp.split(/\s+/).map(function(comp) {
return replaceXRange(comp, loose);
}).join(' ');
}
function replaceXRange(comp, loose) {
comp = comp.trim();
var r = loose ? re[XRANGELOOSE] : re[XRANGE];
return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
debug('xRange', comp, ret, gtlt, M, m, p, pr);
var xM = isX(M);
var xm = xM || isX(m);
var xp = xm || isX(p);
var anyX = xp;
if (gtlt === '=' && anyX)
{ gtlt = ''; }
if (xM) {
if (gtlt === '>' || gtlt === '<') {
// nothing is allowed
ret = '<0.0.0';
} else {
// nothing is forbidden
ret = '*';
}
} else if (gtlt && anyX) {
// replace X with 0
if (xm)
{ m = 0; }
if (xp)
{ p = 0; }
if (gtlt === '>') {
// >1 => >=2.0.0
// >1.2 => >=1.3.0
// >1.2.3 => >= 1.2.4
gtlt = '>=';
if (xm) {
M = +M + 1;
m = 0;
p = 0;
} else if (xp) {
m = +m + 1;
p = 0;
}
} else if (gtlt === '<=') {
// <=0.7.x is actually <0.8.0, since any 0.7.x should
// pass. Similarly, <=7.x is actually <8.0.0, etc.
gtlt = '<';
if (xm)
{ M = +M + 1; }
else
{ m = +m + 1; }
}
ret = gtlt + M + '.' + m + '.' + p;
} else if (xm) {
ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
} else if (xp) {
ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
}
debug('xRange return', ret);
return ret;
});
}
// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars(comp, loose) {
debug('replaceStars', comp, loose);
// Looseness is ignored here. star is always as loose as it gets!
return comp.trim().replace(re[STAR], '');
}
// This function is passed to string.replace(re[HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace($0,
from, fM, fm, fp, fpr, fb,
to, tM, tm, tp, tpr, tb) {
if (isX(fM))
{ from = ''; }
else if (isX(fm))
{ from = '>=' + fM + '.0.0'; }
else if (isX(fp))
{ from = '>=' + fM + '.' + fm + '.0'; }
else
{ from = '>=' + from; }
if (isX(tM))
{ to = ''; }
else if (isX(tm))
{ to = '<' + (+tM + 1) + '.0.0'; }
else if (isX(tp))
{ to = '<' + tM + '.' + (+tm + 1) + '.0'; }
else if (tpr)
{ to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; }
else
{ to = '<=' + to; }
return (from + ' ' + to).trim();
}
// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function(version) {
var this$1 = this;
if (!version)
{ return false; }
if (typeof version === 'string')
{ version = new SemVer(version, this.loose); }
for (var i = 0; i < this.set.length; i++) {
if (testSet(this$1.set[i], version))
{ return true; }
}
return false;
};
function testSet(set, version) {
for (var i = 0; i < set.length; i++) {
if (!set[i].test(version))
{ return false; }
}
if (version.prerelease.length) {
// Find the set of versions that are allowed to have prereleases
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
// That should allow `1.2.3-pr.2` to pass.
// However, `1.2.4-alpha.notready` should NOT be allowed,
// even though it's within the range set by the comparators.
for (var i = 0; i < set.length; i++) {
debug(set[i].semver);
if (set[i].semver === ANY)
{ continue; }
if (set[i].semver.prerelease.length > 0) {
var allowed = set[i].semver;
if (allowed.major === version.major &&
allowed.minor === version.minor &&
allowed.patch === version.patch)
{ return true; }
}
}
// Version has a -pre, but it's not one of the ones we like.
return false;
}
return true;
}
exports.satisfies = satisfies;
function satisfies(version, range, loose) {
try {
range = new Range(range, loose);
} catch (er) {
return false;
}
return range.test(version);
}
exports.maxSatisfying = maxSatisfying;
function maxSatisfying(versions, range, loose) {
var max = null;
var maxSV = null;
try {
var rangeObj = new Range(range, loose);
} catch (er) {
return null;
}
versions.forEach(function (v) {
if (rangeObj.test(v)) { // satisfies(v, range, loose)
if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
max = v;
maxSV = new SemVer(max, loose);
}
}
});
return max;
}
exports.minSatisfying = minSatisfying;
function minSatisfying(versions, range, loose) {
var min = null;
var minSV = null;
try {
var rangeObj = new Range(range, loose);
} catch (er) {
return null;
}
versions.forEach(function (v) {
if (rangeObj.test(v)) { // satisfies(v, range, loose)
if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
min = v;
minSV = new SemVer(min, loose);
}
}
});
return min;
}
exports.validRange = validRange;
function validRange(range, loose) {
try {
// Return '*' instead of '' so that truthiness works.
// This will throw if it's invalid anyway
return new Range(range, loose).range || '*';
} catch (er) {
return null;
}
}
// Determine if version is less than all the versions possible in the range
exports.ltr = ltr;
function ltr(version, range, loose) {
return outside(version, range, '<', loose);
}
// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr;
function gtr(version, range, loose) {
return outside(version, range, '>', loose);
}
exports.outside = outside;
function outside(version, range, hilo, loose) {
version = new SemVer(version, loose);
range = new Range(range, loose);
var gtfn, ltefn, ltfn, comp, ecomp;
switch (hilo) {
case '>':
gtfn = gt;
ltefn = lte;
ltfn = lt;
comp = '>';
ecomp = '>=';
break;
case '<':
gtfn = lt;
ltefn = gte;
ltfn = gt;
comp = '<';
ecomp = '<=';
break;
default:
throw new TypeError('Must provide a hilo val of "<" or ">"');
}
// If it satisifes the range it is not outside
if (satisfies(version, range, loose)) {
return false;
}
// From now on, variable terms are as if we're in "gtr" mode.
// but note that everything is flipped for the "ltr" function.
for (var i = 0; i < range.set.length; ++i) {
var comparators = range.set[i];
var high = null;
var low = null;
comparators.forEach(function(comparator) {
if (comparator.semver === ANY) {
comparator = new Comparator('>=0.0.0');
}
high = high || comparator;
low = low || comparator;
if (gtfn(comparator.semver, high.semver, loose)) {
high = comparator;
} else if (ltfn(comparator.semver, low.semver, loose)) {
low = comparator;
}
});
// If the edge version comparator has a operator then our version
// isn't outside it
if (high.operator === comp || high.operator === ecomp) {
return false;
}
// If the lowest version comparator has an operator and our version
// is less than it then it isn't higher than the range
if ((!low.operator || low.operator === comp) &&
ltefn(version, low.semver)) {
return false;
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
return false;
}
}
return true;
}
exports.prerelease = prerelease;
function prerelease(version, loose) {
var parsed = parse(version, loose);
return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
}
exports.intersects = intersects;
function intersects(r1, r2, loose) {
r1 = new Range(r1, loose);
r2 = new Range(r2, loose);
return r1.intersects(r2)
}
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Normalize a version string.
* @param {String} Version. ie: 1, 1.0, 1.0.0
* @return {String} Version
*/
function normalizeVersion (v) {
var isValid = semver.valid(v);
if (isValid) {
return v
}
v = typeof (v) === 'string' ? v : '';
var split = v.split('.');
var i = 0;
var result = [];
while (i < 3) {
var s = typeof (split[i]) === 'string' && split[i] ? split[i] : '0';
result.push(s);
i++;
}
return result.join('.')
}
/**
* Get informations from different error key. Like:
* - code
* - errorMessage
* - errorType
* - isDowngrade
* @param {string} key
* @param {string} val
* @param {string} criteria
* @return {object}
*/
function getError (key, val, criteria) {
var result = {
isDowngrade: true,
errorType: 1,
code: 1000
};
var getMsg = function (key, val, criteria) {
return 'Downgrade[' + key + '] :: deviceInfo '
+ val + ' matched criteria ' + criteria
};
var _key = key.toLowerCase();
result.errorMessage = getMsg(key, val, criteria);
if (_key.indexOf('osversion') >= 0) {
result.code = 1001;
}
else if (_key.indexOf('appversion') >= 0) {
result.code = 1002;
}
else if (_key.indexOf('weexversion') >= 0) {
result.code = 1003;
}
else if (_key.indexOf('devicemodel') >= 0) {
result.code = 1004;
}
return result
}
/**
* WEEX framework input(deviceInfo)
* {
* platform: 'iOS' or 'android'
* osVersion: '1.0.0' or '1.0' or '1'
* appVersion: '1.0.0' or '1.0' or '1'
* weexVersion: '1.0.0' or '1.0' or '1'
* dDeviceModel: 'MODEL_NAME'
* }
*
* downgrade config(config)
* {
* ios: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* },
* android: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* }
* }
*
*
* @param {object} deviceInfo Weex SDK framework input
* @param {object} config user input
* @return {Object} { isDowngrade: true/false, errorMessage... }
*/
function check (config, deviceInfo) {
deviceInfo = deviceInfo || global.WXEnvironment;
deviceInfo = isPlainObject(deviceInfo) ? deviceInfo : {};
var result = {
isDowngrade: false // defautl is pass
};
if (typof$1(config) === 'function') {
var customDowngrade = config.call(this, deviceInfo, {
semver: semver,
normalizeVersion: normalizeVersion
});
customDowngrade = !!customDowngrade;
result = customDowngrade ? getError('custom', '', 'custom params') : result;
}
else {
config = isPlainObject(config) ? config : {};
var platform = deviceInfo.platform || 'unknow';
var dPlatform = platform.toLowerCase();
var cObj = config[dPlatform] || {};
for (var i in deviceInfo) {
var key = i;
var keyLower = key.toLowerCase();
var val = deviceInfo[i];
var isVersion = keyLower.indexOf('version') >= 0;
var isDeviceModel = keyLower.indexOf('devicemodel') >= 0;
var criteria = cObj[i];
if (criteria && isVersion) {
var c = normalizeVersion(criteria);
var d = normalizeVersion(deviceInfo[i]);
if (semver.satisfies(d, c)) {
result = getError(key, val, criteria);
break
}
}
else if (isDeviceModel) {
var _criteria = typof$1(criteria) === 'array' ? criteria : [criteria];
if (_criteria.indexOf(val) >= 0) {
result = getError(key, val, criteria);
break
}
}
}
}
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function setViewport (app, configs) {
if ( configs === void 0 ) configs = {};
/* istanbul ignore if */
{
console.debug(("[JS Framework] Set viewport (width: " + (configs.width) + ") for app#" + (app.id) + "."));
validateViewport(configs);
}
// Send viewport configs to native
if (app && app.callTasks) {
return app.callTasks([{
module: 'meta',
method: 'setViewport',
args: [configs]
}])
}
/* istanbul ignore next */
else {
console.warn("[JS Framework] Can't find \"callTasks\" method on current app.");
}
}
/**
* Validate the viewport config.
* @param {Object} configs
*/
function validateViewport (configs) {
if ( configs === void 0 ) configs = {};
var width = configs.width;
if (width) {
if (typeof width !== 'number' && width !== 'device-width') {
console.warn(("[JS Framework] Not support to use " + width + " as viewport width."));
return false
}
return true
}
console.warn('[JS Framework] the viewport config should contain the "width" property.');
return false
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* bootstrap app from a certain custom component with config & data
*/
function bootstrap (app, name, config, data) {
console.debug(("[JS Framework] bootstrap for " + name));
// 1. validate custom component name first
var cleanName;
if (isWeexComponent(name)) {
cleanName = removeWeexPrefix(name);
}
else if (isNpmModule(name)) {
cleanName = removeJSSurfix(name);
// check if define by old 'define' method
/* istanbul ignore if */
if (!requireCustomComponent(app, cleanName)) {
return new Error(("It's not a component: " + name))
}
}
else {
return new Error(("Wrong component name: " + name))
}
// 2. validate configuration
config = isPlainObject(config) ? config : {};
// 2.1 transformer version check
if (typeof config.transformerVersion === 'string' &&
typeof global.transformerVersion === 'string' &&
!semver.satisfies(config.transformerVersion,
global.transformerVersion)) {
return new Error("JS Bundle version: " + (config.transformerVersion) + " " +
"not compatible with " + (global.transformerVersion))
}
// 2.2 downgrade version check
var downgradeResult = check(config.downgrade);
/* istanbul ignore if */
if (downgradeResult.isDowngrade) {
app.callTasks([{
module: 'instanceWrap',
method: 'error',
args: [
downgradeResult.errorType,
downgradeResult.code,
downgradeResult.errorMessage
]
}]);
return new Error(("Downgrade[" + (downgradeResult.code) + "]: " + (downgradeResult.errorMessage)))
}
// set viewport
if (config.viewport) {
setViewport(app, config.viewport);
}
// 3. create a new Vm with custom component name and data
app.vm = new Vm(cleanName, null, { _app: app }, null, data);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* define(name, factory) for primary usage
* or
* define(name, deps, factory) for compatibility
* Notice: DO NOT use function define() {},
* it will cause error after builded by webpack
*/
var defineFn = function (app, name) {
var args = [], len = arguments.length - 2;
while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ];
console.debug(("[JS Framework] define a component " + name));
// adapt args:
// 1. name, deps[], factory()
// 2. name, factory()
// 3. name, definition{}
var factory, definition;
if (args.length > 1) {
definition = args[1];
}
else {
definition = args[0];
}
if (typeof definition === 'function') {
factory = definition;
definition = null;
}
// resolve definition from factory
if (factory) {
var r = function (name) {
if (isWeexComponent(name)) {
var cleanName = removeWeexPrefix(name);
return requireCustomComponent(app, cleanName)
}
if (isWeexModule(name)) {
var cleanName$1 = removeWeexPrefix(name);
return app.requireModule(cleanName$1)
}
if (isNormalModule(name) || isNpmModule(name)) {
var cleanName$2 = removeJSSurfix(name);
return app.commonModules[cleanName$2]
}
};
var m = { exports: {}};
factory(r, m.exports, m);
definition = m.exports;
}
// apply definition
if (isWeexComponent(name)) {
var cleanName = removeWeexPrefix(name);
registerCustomComponent(app, cleanName, definition);
}
else if (isWeexModule(name)) {
var cleanName$1 = removeWeexPrefix(name);
var obj;
initModules(( obj = {}, obj[cleanName$1] = definition, obj ));
}
else if (isNormalModule(name)) {
var cleanName$2 = removeJSSurfix(name);
app.commonModules[cleanName$2] = definition;
}
else if (isNpmModule(name)) {
var cleanName$3 = removeJSSurfix(name);
if (definition.template ||
definition.style ||
definition.methods) {
// downgrade to old define method (define('componentName', factory))
// the exports contain one key of template, style or methods
// but it has risk!!!
registerCustomComponent(app, cleanName$3, definition);
}
else {
app.commonModules[cleanName$3] = definition;
}
}
};
/**
* @deprecated
*/
function register$2 (app, type, options) {
console.warn('[JS Framework] Register is deprecated, please install lastest transformer.');
registerCustomComponent(app, type, options);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* api that invoked by js bundle code
*
* - define(name, factory): define a new composed component type
* - bootstrap(type, config, data): require a certain type &
* render with (optional) data
*
* deprecated:
* - register(type, options): register a new composed component type
* - render(type, data): render by a certain type with (optional) data
* - require(type)(data): require a type then render with data
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - fire event
* - callback
* - refresh
* - destroy
*
* corresponded with the API of instance manager (framework.js)
*/
/**
* Refresh an app with data to its root component options.
* @param {object} app
* @param {any} data
*/
function refresh (app, data) {
console.debug("[JS Framework] Refresh with", data,
("in instance[" + (app.id) + "]"));
var vm = app.vm;
if (vm && data) {
if (typeof vm.refreshData === 'function') {
vm.refreshData(data);
}
else {
extend(vm, data);
}
app.differ.flush();
app.doc.taskCenter.send('dom', { action: 'refreshFinish' }, []);
return
}
return new Error(("invalid data \"" + data + "\""))
}
/**
* Destroy an app.
* @param {object} app
*/
function destroy$1 (app) {
console.debug(("[JS Framework] Destory an instance(" + (app.id) + ")"));
if (app.vm) {
destroyVm(app.vm);
}
app.id = '';
app.options = null;
app.blocks = null;
app.vm = null;
app.doc.taskCenter.destroyCallback();
app.doc.destroy();
app.doc = null;
app.customComponentMap = null;
app.commonModules = null;
}
/**
* Destroy an Vm.
* @param {object} vm
*/
function destroyVm (vm) {
delete vm._app;
delete vm._computed;
delete vm._css;
delete vm._data;
delete vm._ids;
delete vm._methods;
delete vm._options;
delete vm._parent;
delete vm._parentEl;
delete vm._rootEl;
// remove all watchers
if (vm._watchers) {
var watcherCount = vm._watchers.length;
while (watcherCount--) {
vm._watchers[watcherCount].teardown();
}
delete vm._watchers;
}
// destroy child vms recursively
if (vm._childrenVms) {
var vmCount = vm._childrenVms.length;
while (vmCount--) {
destroyVm(vm._childrenVms[vmCount]);
}
delete vm._childrenVms;
}
console.debug(("[JS Framework] \"destroyed\" lifecycle in Vm(" + (vm._type) + ")"));
vm.$emit('hook:destroyed');
delete vm._type;
delete vm._vmEvents;
}
/**
* Get a JSON object to describe the document body.
* @param {object} app
* @return {object}
*/
function getRootElement (app) {
var doc = app.doc || {};
var body = doc.body || {};
return body.toJSON ? body.toJSON() : {}
}
/**
* Fire an event from renderer. The event has type, an event object and an
* element ref. If the event comes with some virtual-DOM changes, it should
* have one more parameter to describe the changes.
* @param {object} app
* @param {string} ref
* @param {type} type
* @param {object} e
* @param {object} domChanges
*/
function fireEvent$2 (app, ref, type, e, domChanges) {
console.debug(("[JS Framework] Fire a \"" + type + "\" event on an element(" + ref + ") in instance(" + (app.id) + ")"));
if (Array.isArray(ref)) {
ref.some(function (ref) {
return fireEvent$2(app, ref, type, e) !== false
});
return
}
var el = app.doc.getRef(ref);
if (el) {
var result = app.doc.fireEvent(el, type, e, domChanges);
app.differ.flush();
app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []);
return result
}
return new Error(("invalid element reference \"" + ref + "\""))
}
/**
* Make a callback for a certain app.
* @param {object} app
* @param {number} callbackId
* @param {any} data
* @param {boolean} ifKeepAlive
*/
function callback$2 (app, callbackId, data, ifKeepAlive) {
console.debug(("[JS Framework] Invoke a callback(" + callbackId + ") with"), data,
("in instance(" + (app.id) + ")"));
var result = app.doc.taskCenter.callback(callbackId, data, ifKeepAlive);
updateActions(app);
app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []);
return result
}
/**
* Collect all virtual-DOM mutations together and send them to renderer.
* @param {object} app
*/
function updateActions (app) {
app.differ.flush();
}
/**
* Call all tasks from an app to renderer (native).
* @param {object} app
* @param {array} tasks
*/
function callTasks (app, tasks) {
var result;
/* istanbul ignore next */
if (typof$1(tasks) !== 'array') {
tasks = [tasks];
}
tasks.forEach(function (task) {
result = app.doc.taskCenter.send(
'module',
{
module: task.module,
method: task.method
},
task.args
);
});
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - init bundle
*
* corresponded with the API of instance manager (framework.js)
*/
/**
* Init an app by run code witgh data
* @param {object} app
* @param {string} code
* @param {object} data
*/
function init$4 (app, code, data, services) {
console.debug('[JS Framework] Intialize an instance with:\n', data);
var result;
// prepare app env methods
var bundleDefine = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return defineFn.apply(void 0, [ app ].concat( args ));
};
var bundleBootstrap = function (name, config, _data) {
result = bootstrap(app, name, config, _data || data);
updateActions(app);
app.doc.listener.createFinish();
console.debug(("[JS Framework] After intialized an instance(" + (app.id) + ")"));
};
var bundleVm = Vm;
/* istanbul ignore next */
var bundleRegister = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return register$2.apply(void 0, [ app ].concat( args ));
};
/* istanbul ignore next */
var bundleRender = function (name, _data) {
result = bootstrap(app, name, {}, _data);
};
/* istanbul ignore next */
var bundleRequire = function (name) { return function (_data) {
result = bootstrap(app, name, {}, _data);
}; };
var bundleDocument = app.doc;
/* istanbul ignore next */
var bundleRequireModule = function (name) { return app.requireModule(removeWeexPrefix(name)); };
var weexGlobalObject = {
config: app.options,
define: bundleDefine,
bootstrap: bundleBootstrap,
requireModule: bundleRequireModule,
document: bundleDocument,
Vm: bundleVm
};
Object.freeze(weexGlobalObject);
// prepare code
var functionBody;
/* istanbul ignore if */
if (typeof code === 'function') {
// `function () {...}` -> `{...}`
// not very strict
functionBody = code.toString().substr(12);
}
/* istanbul ignore next */
else if (code) {
functionBody = code.toString();
}
// wrap IFFE and use strict mode
functionBody = "(function(global){\n\n\"use strict\";\n\n " + functionBody + " \n\n})(Object.create(this))";
// run code and get result
var WXEnvironment = global.WXEnvironment;
var timerAPIs = {};
/* istanbul ignore if */
if (WXEnvironment && WXEnvironment.platform !== 'Web') {
// timer APIs polyfill in native
var timer = app.requireModule('timer');
Object.assign(timerAPIs, {
setTimeout: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setTimeout(handler, args[1]);
return app.doc.taskCenter.callbackManager.lastCallbackId.toString()
},
setInterval: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setInterval(handler, args[1]);
return app.doc.taskCenter.callbackManager.lastCallbackId.toString()
},
clearTimeout: function (n) {
timer.clearTimeout(n);
},
clearInterval: function (n) {
timer.clearInterval(n);
}
});
}
// run code and get result
var globalObjects = Object.assign({
define: bundleDefine,
require: bundleRequire,
bootstrap: bundleBootstrap,
register: bundleRegister,
render: bundleRender,
__weex_define__: bundleDefine, // alias for define
__weex_bootstrap__: bundleBootstrap, // alias for bootstrap
__weex_document__: bundleDocument,
__weex_require__: bundleRequireModule,
__weex_viewmodel__: bundleVm,
weex: weexGlobalObject
}, timerAPIs, services);
if (!callFunctionNative(globalObjects, functionBody)) {
// If failed to compile functionBody on native side,
// fallback to callFunction.
callFunction(globalObjects, functionBody);
}
return result
}
/**
* Call a new function body with some global objects.
* @param {object} globalObjects
* @param {string} code
* @return {any}
*/
function callFunction (globalObjects, body) {
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
globalKeys.push(body);
var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) ));
return result.apply(void 0, globalValues)
}
/**
* Call a new function generated on the V8 native side.
* @param {object} globalObjects
* @param {string} body
* @return {boolean} return true if no error occurred.
*/
function callFunctionNative (globalObjects, body) {
if (typeof compileAndRunBundle !== 'function') {
return false
}
var fn = void 0;
var isNativeCompileOk = false;
var script = '(function (';
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
for (var i = 0; i < globalKeys.length - 1; ++i) {
script += globalKeys[i];
script += ',';
}
script += globalKeys[globalKeys.length - 1];
script += ') {';
script += body;
script += '} )';
try {
var weex = globalObjects.weex || {};
var config = weex.config || {};
fn = compileAndRunBundle(script,
config.bundleUrl,
config.bundleDigest,
config.codeCachePath);
if (fn && typeof fn === 'function') {
fn.apply(void 0, globalValues);
isNativeCompileOk = true;
}
}
catch (e) {
console.error(e);
}
return isNativeCompileOk
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - init bundle
* - fire event
* - callback
* - destroy
*
* corresponded with the API of instance manager (framework.js)
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Differ = function Differ (id) {
this.id = id;
this.map = [];
this.hooks = [];
};
Differ.prototype.isEmpty = function isEmpty () {
return this.map.length === 0
};
Differ.prototype.append = function append (type, depth, ref, handler) {
var this$1 = this;
if ( depth === void 0 ) depth = 0;
if (!this.hasTimer) {
this.hasTimer = true;
setTimeout(function () {
this$1.hasTimer = false;
this$1.flush(true);
}, 0);
}
var map = this.map;
if (!map[depth]) {
map[depth] = {};
}
var group = map[depth];
if (!group[type]) {
group[type] = {};
}
if (type === 'element') {
if (!group[type][ref]) {
group[type][ref] = [];
}
group[type][ref].push(handler);
}
else {
group[type][ref] = handler;
}
};
Differ.prototype.flush = function flush (isTimeout) {
var map = this.map.slice();
this.map.length = 0;
map.forEach(function (group) {
callTypeMap(group, 'repeat');
callTypeMap(group, 'shown');
callTypeList(group, 'element');
});
var hooks = this.hooks.slice();
this.hooks.length = 0;
hooks.forEach(function (fn) {
fn();
});
if (!this.isEmpty()) {
this.flush();
}
};
Differ.prototype.then = function then (fn) {
this.hooks.push(fn);
};
function callTypeMap (group, type) {
var map = group[type];
for (var ref in map) {
map[ref]();
}
}
function callTypeList (group, type) {
var map = group[type];
for (var ref in map) {
var list = map[ref];
list.forEach(function (handler) { handler(); });
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Weex App constructor & definition
*/
/**
* App constructor for Weex framework.
* @param {string} id
* @param {object} options
*/
function App$1 (id, options) {
this.id = id;
this.options = options || {};
this.vm = null;
this.customComponentMap = {};
this.commonModules = {};
// document
this.doc = new config$3.Document(
id,
this.options.bundleUrl,
null,
config$3.Listener
);
this.differ = new Differ(id);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Weex instance constructor & definition
*/
/**
* @deprecated
*/
App$1.prototype.requireModule = function (name) {
return requireModule$1(this, name)
};
/**
* @deprecated
*/
App$1.prototype.updateActions = function () {
return updateActions(this)
};
/**
* @deprecated
*/
App$1.prototype.callTasks = function (tasks) {
return callTasks(this, tasks)
};
/**
* Prevent modification of App and App.prototype
*/
Object.freeze(App$1);
Object.freeze(App$1.prototype);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var instanceMap$1 = {};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Create a Weex instance.
*
* @param {string} id
* @param {string} code
* @param {object} options
* option `HAS_LOG` enable print log
* @param {object} data
* @param {object} info { created, ... services }
*/
function createInstance$2 (id, code, options, data, info) {
var ref = info || {};
var services = ref.services;
resetTarget();
var instance = instanceMap$1[id];
/* istanbul ignore else */
options = options || {};
var result;
/* istanbul ignore else */
if (!instance) {
instance = new App$1(id, options);
instanceMap$1[id] = instance;
result = init$4(instance, code, data, services);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return (result instanceof Error) ? result : instance
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Init config informations for Weex framework
* @param {object} cfg
*/
function init$5 (cfg) {
config$3.Document = cfg.Document;
config$3.Element = cfg.Element;
config$3.Comment = cfg.Comment;
config$3.sendTasks = cfg.sendTasks;
config$3.Listener = cfg.Listener;
}
/**
* Refresh a Weex instance with data.
*
* @param {string} id
* @param {object} data
*/
function refreshInstance$1 (id, data) {
var instance = instanceMap$1[id];
var result;
/* istanbul ignore else */
if (instance) {
result = refresh(instance, data);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return result
}
/**
* Destroy a Weex instance.
* @param {string} id
*/
function destroyInstance$2 (id) {
// Markup some global state in native side
if (typeof markupState === 'function') {
markupState();
}
resetTarget();
var instance = instanceMap$1[id];
/* istanbul ignore else */
if (!instance) {
return new Error(("invalid instance id \"" + id + "\""))
}
destroy$1(instance);
delete instanceMap$1[id];
// notifyContextDisposed is used to tell v8 to do a full GC,
// but this would have a negative performance impact on weex,
// because all the inline cache in v8 would get cleared
// during a full GC.
// To take care of both memory and performance, just tell v8
// to do a full GC every eighteen times.
var idNum = Math.round(id);
var round = 18;
if (idNum > 0) {
var remainder = idNum % round;
if (!remainder && typeof notifyTrimMemory === 'function') {
notifyTrimMemory();
}
}
return instanceMap$1
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var nativeComponentMap$1 = config$3.nativeComponentMap;
/**
* Register the name of each native component.
* @param {array} components array of name
*/
function registerComponents$1 (components) {
if (Array.isArray(components)) {
components.forEach(function register (name) {
/* istanbul ignore if */
if (!name) {
return
}
if (typeof name === 'string') {
nativeComponentMap$1[name] = true;
}
/* istanbul ignore else */
else if (typeof name === 'object' && typeof name.type === 'string') {
nativeComponentMap$1[name.type] = name;
}
});
}
}
/**
* Register the name and methods of each module.
* @param {object} modules a object of modules
*/
function registerModules$1 (modules) {
/* istanbul ignore else */
if (typeof modules === 'object') {
initModules(modules);
}
}
/**
* Register the name and methods of each api.
* @param {object} apis a object of apis
*/
function registerMethods (methods) {
/* istanbul ignore else */
if (typeof methods === 'object') {
initMethods$1(Vm, methods);
}
}
// @todo: Hack for this framework only. Will be re-designed or removed later.
global.registerMethods = registerMethods;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var jsHandlers = {
fireEvent: function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return fireEvent$2.apply(void 0, [ instanceMap$1[id] ].concat( args ))
},
callback: function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return callback$2.apply(void 0, [ instanceMap$1[id] ].concat( args ))
}
};
/**
* Accept calls from native (event or callback).
*
* @param {string} id
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks$2 (id, tasks) {
var instance = instanceMap$1[id];
if (instance && Array.isArray(tasks)) {
var results = [];
tasks.forEach(function (task) {
var handler = jsHandlers[task.method];
var args = [].concat( task.args );
/* istanbul ignore else */
if (typeof handler === 'function') {
args.unshift(id);
results.push(handler.apply(void 0, args));
}
});
return results
}
return new Error(("invalid instance id \"" + id + "\" or tasks"))
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Get a whole element tree of an instance for debugging.
* @param {string} id
* @return {object} a virtual dom tree
*/
function getRoot$2 (id) {
var instance = instanceMap$1[id];
var result;
/* istanbul ignore else */
if (instance) {
result = getRootElement(instance);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Weex framework entry.
*/
// register special methods for Weex framework
registerMethods(methods$1);
/**
* Prevent modification of Vm and Vm.prototype
*/
Object.freeze(Vm);
var Weex = Object.freeze({
registerComponents: registerComponents$1,
registerModules: registerModules$1,
registerMethods: registerMethods,
createInstance: createInstance$2,
init: init$5,
refreshInstance: refreshInstance$1,
destroyInstance: destroyInstance$2,
receiveTasks: receiveTasks$2,
getRoot: getRoot$2
});
var framework_weex = createCommonjsModule(function (module) {
module.exports = /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 3);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/*!***********************************************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/commons.js ***!
\***********************************************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
/**
* Creates a unique key.
*
* @param {string} name - A name to create.
* @returns {symbol|string} Generated unique key.
* @private
*/
var createUniqueKey = module.exports.createUniqueKey = (
typeof Symbol !== "undefined" ? Symbol : //eslint-disable-line no-undef
/* otherwise */ function createUniqueKey(name) {
return "[[" + name + "_" + Math.random().toFixed(8).slice(2) + "]]"
}
);
/**
* Checks whether the given value is a non-null object or not.
*
* @param {any} x - The value to be check.
* @returns {boolean} `true` if the value is a non-null object.
* @private
*/
var isObject = module.exports.isObject = function isObject(x) {
return typeof x === "object" && x !== null
};
/**
* The key of listeners.
*
* @type {symbol|string}
* @private
*/
module.exports.LISTENERS = createUniqueKey("listeners");
/**
* A value of kind for listeners which are registered in the capturing phase.
*
* @type {number}
* @private
*/
module.exports.CAPTURE = 1;
/**
* A value of kind for listeners which are registered in the bubbling phase.
*
* @type {number}
* @private
*/
module.exports.BUBBLE = 2;
/**
* A value of kind for listeners which are registered as an attribute.
*
* @type {number}
* @private
*/
module.exports.ATTRIBUTE = 3;
/**
* @typedef object ListenerNode
* @property {function} listener - A listener function.
* @property {number} kind - The kind of the listener.
* @property {ListenerNode|null} next - The next node.
* If this node is the last, this is `null`.
*/
/**
* Creates a node of singly linked list for a list of listeners.
*
* @param {function} listener - A listener function.
* @param {number} kind - The kind of the listener.
* @param {object} [options] - The option object.
* @param {boolean} [options.once] - The flag to remove the listener at the first call.
* @param {boolean} [options.passive] - The flag to ignore `event.preventDefault` method.
* @returns {ListenerNode} The created listener node.
*/
module.exports.newNode = function newNode(listener, kind, options) {
var obj = isObject(options);
return {
listener: listener,
kind: kind,
once: obj && Boolean(options.once),
passive: obj && Boolean(options.passive),
next: null,
}
};
/***/ }),
/* 1 */
/*!****************************************************!*\
!*** ./packages/weex-rax-framework/src/emitter.js ***!
\****************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var EventEmitter = function () {
function EventEmitter() {
_classCallCheck(this, EventEmitter);
this._listeners = {};
}
/**
* Adds a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @param {Boolean} once
*/
_createClass(EventEmitter, [{
key: "_addListener",
value: function _addListener(type, listener, once) {
this._listeners[type] = this._listeners[type] || [];
this._listeners[type].push({ listener: listener, once: once });
return this;
}
/**
* Adds a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "on",
value: function on(type, listener) {
return this._addListener(type, listener, false);
}
}, {
key: "once",
value: function once(type, listener) {
return this._addListener(type, listener, true);
}
/**
* Removes a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "off",
value: function off(type, listener) {
// alias
if (!this._listeners[type]) {
return this;
}
if (!this._listeners[type].length) {
return this;
}
if (!listener) {
delete this._listeners[type];
return this;
}
this._listeners[type] = this._listeners[type].filter(function (_listener) {
return !(_listener.listener === listener);
});
return this;
}
/**
* Emits an specified event.
* @param {String} type
* @param {Object} payload
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "emit",
value: function emit(type, payload) {
var _this = this;
if (!this._listeners[type]) {
return this;
}
this._listeners[type].forEach(function (_listener) {
_listener.listener.apply(_this, [payload]);
if (_listener.once) {
_this.removeListener(type, _listener.listener);
}
});
return this;
}
}]);
return EventEmitter;
}();
exports.default = EventEmitter;
module.exports = exports["default"];
/***/ }),
/* 2 */
/*!****************************************************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/event-target.js ***!
\****************************************************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
/*globals window */
var Commons = __webpack_require__(/*! ./commons */ 0);
var CustomEventTarget = __webpack_require__(/*! ./custom-event-target */ 15);
var EventWrapper = __webpack_require__(/*! ./event-wrapper */ 16);
var isObject = Commons.isObject;
var LISTENERS = Commons.LISTENERS;
var CAPTURE = Commons.CAPTURE;
var BUBBLE = Commons.BUBBLE;
var ATTRIBUTE = Commons.ATTRIBUTE;
var newNode = Commons.newNode;
var defineCustomEventTarget = CustomEventTarget.defineCustomEventTarget;
var createEventWrapper = EventWrapper.createEventWrapper;
var STOP_IMMEDIATE_PROPAGATION_FLAG = EventWrapper.STOP_IMMEDIATE_PROPAGATION_FLAG;
var PASSIVE_LISTENER_FLAG = EventWrapper.PASSIVE_LISTENER_FLAG;
//------------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------------
/**
* A flag which shows there is the native `EventTarget` interface object.
*
* @type {boolean}
* @private
*/
var HAS_EVENTTARGET_INTERFACE = (
typeof window !== "undefined" &&
typeof window.EventTarget !== "undefined"
);
//------------------------------------------------------------------------------
// Public Interface
//------------------------------------------------------------------------------
/**
* An implementation for `EventTarget` interface.
*
* @constructor
* @public
*/
var EventTarget = module.exports = function EventTarget() {
var arguments$1 = arguments;
if (this instanceof EventTarget) {
// this[LISTENERS] is a Map.
// Its key is event type.
// Its value is ListenerNode object or null.
//
// interface ListenerNode {
// var listener: Function
// var kind: CAPTURE|BUBBLE|ATTRIBUTE
// var next: ListenerNode|null
// }
Object.defineProperty(this, LISTENERS, {value: Object.create(null)});
}
else if (arguments.length === 1 && Array.isArray(arguments[0])) {
return defineCustomEventTarget(EventTarget, arguments[0])
}
else if (arguments.length > 0) {
var types = Array(arguments.length);
for (var i = 0; i < arguments.length; ++i) {
types[i] = arguments$1[i];
}
// To use to extend with attribute listener properties.
// e.g.
// class MyCustomObject extends EventTarget("message", "error") {
// //...
// }
return defineCustomEventTarget(EventTarget, types)
}
else {
throw new TypeError("Cannot call a class as a function")
}
};
EventTarget.prototype = Object.create(
(HAS_EVENTTARGET_INTERFACE ? window.EventTarget : Object).prototype,
{
constructor: {
value: EventTarget,
writable: true,
configurable: true,
},
addEventListener: {
value: function addEventListener(type, listener, options) {
if (listener == null) {
return false
}
if (typeof listener !== "function" && typeof listener !== "object") {
throw new TypeError("\"listener\" is not an object.")
}
var capture = isObject(options) ? Boolean(options.capture) : Boolean(options);
var kind = (capture ? CAPTURE : BUBBLE);
var node = this[LISTENERS][type];
if (node == null) {
this[LISTENERS][type] = newNode(listener, kind, options);
return true
}
var prev = null;
while (node != null) {
if (node.listener === listener && node.kind === kind) {
// Should ignore a duplicated listener.
return false
}
prev = node;
node = node.next;
}
prev.next = newNode(listener, kind, options);
return true
},
configurable: true,
writable: true,
},
removeEventListener: {
value: function removeEventListener(type, listener, options) {
var this$1 = this;
if (listener == null) {
return false
}
var capture = isObject(options) ? Boolean(options.capture) : Boolean(options);
var kind = (capture ? CAPTURE : BUBBLE);
var prev = null;
var node = this[LISTENERS][type];
while (node != null) {
if (node.listener === listener && node.kind === kind) {
if (prev == null) {
this$1[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
return true
}
prev = node;
node = node.next;
}
return false
},
configurable: true,
writable: true,
},
dispatchEvent: {
value: function dispatchEvent(event) {
var this$1 = this;
// If listeners aren't registered, terminate.
var type = event.type;
var node = this[LISTENERS][type];
if (node == null) {
return true
}
// Since we cannot rewrite several properties, so wrap object.
var wrapped = createEventWrapper(event, this);
// This doesn't process capturing phase and bubbling phase.
// This isn't participating in a tree.
var prev = null;
while (node != null) {
// Remove this listener if it's once
if (node.once) {
if (prev == null) {
this$1[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
}
else {
prev = node;
}
// Call this listener
wrapped[PASSIVE_LISTENER_FLAG] = node.passive;
if (typeof node.listener === "function") {
node.listener.call(this$1, wrapped);
}
else if (node.kind !== ATTRIBUTE && typeof node.listener.handleEvent === "function") {
node.listener.handleEvent(wrapped);
}
// Break if `event.stopImmediatePropagation` was called.
if (wrapped[STOP_IMMEDIATE_PROPAGATION_FLAG]) {
break
}
node = node.next;
}
return !wrapped.defaultPrevented
},
configurable: true,
writable: true,
},
}
);
/***/ }),
/* 3 */
/*!**************************************************!*\
!*** ./packages/weex-rax-framework/src/index.js ***!
\**************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) { break; } } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) { _i["return"](); } } finally { if (_d) { throw _e; } } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) { var source = arguments$1[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.getInstance = getInstance;
exports.init = init;
exports.registerComponents = registerComponents;
exports.registerMethods = registerMethods;
exports.registerModules = registerModules;
exports.createInstance = createInstance;
exports.refreshInstance = refreshInstance;
exports.destroyInstance = destroyInstance;
exports.getRoot = getRoot;
exports.receiveTasks = receiveTasks;
var _builtin = __webpack_require__(/*! ./builtin */ 4);
var _emitter = __webpack_require__(/*! ./emitter */ 1);
var _emitter2 = _interopRequireDefault(_emitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var NativeComponents = {};
var NativeModules = {};
var Document = void 0;
var Element = void 0;
var Comment = void 0;
var MODULE_NAME_PREFIX = '@weex-module/';
var MODAL_MODULE = MODULE_NAME_PREFIX + 'modal';
var NAVIGATOR_MODULE = MODULE_NAME_PREFIX + 'navigator';
// Instance hub
var instances = {};
// Bundles hub
var bundles = {};
var noop = function noop() {};
function dispatchEventToInstance(event, targetOrigin) {
var instance;
for (var i in instances) {
if (instances.hasOwnProperty(i)) {
instance = instances[i];
if (targetOrigin === '*' || targetOrigin === instance.origin) {
event.target = instance.window;
// FIXME: Need async?
instance.window.dispatchEvent(event);
}
}
}
}
function getInstance(instanceId) {
var instance = instances[instanceId];
if (!instance) {
throw new Error('Invalid instance id "' + instanceId + '"');
}
return instance;
}
function init(config) {
Document = config.Document;
Element = config.Element;
Comment = config.Comment;
}
/**
* register the name of each native component
* @param {array} components array of name
*/
function registerComponents(components) {
if (Array.isArray(components)) {
components.forEach(function register(name) {
/* istanbul ignore if */
if (!name) {
return;
}
if (typeof name === 'string') {
NativeComponents[name] = true;
} else if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object' && typeof name.type === 'string') {
NativeComponents[name.type] = name;
}
});
}
}
function __weex_module_supports__(name) {
var parts = name.split('.');
if (parts.length === 1) {
return Boolean(NativeModules[name]);
} else {
var moduleName = parts[0];
var methodName = parts[1];
var moduleMethods = NativeModules[moduleName];
if (moduleMethods) {
for (var i = 0; i < moduleMethods.length; i++) {
var method = moduleMethods[i];
if ((typeof method === 'undefined' ? 'undefined' : _typeof(method)) === 'object' && method.name === methodName || method === methodName) {
return true;
}
}
}
return false;
}
}
function __weex_tag_supports__(name) {
return Boolean(NativeComponents[name]);
}
/**
* register the name and methods of each api
* @param {object} apis a object of apis
*/
function registerMethods(apis) {}
// Noop
/**
* register the name and methods of each module
* @param {object} modules a object of modules
*/
function registerModules(newModules) {
if ((typeof newModules === 'undefined' ? 'undefined' : _typeof(newModules)) === 'object') {
for (var name in newModules) {
if (Object.prototype.hasOwnProperty.call(newModules, name)) {
NativeModules[name] = newModules[name];
}
}
}
}
function genBuiltinModules(modules, moduleFactories, context) {
for (var moduleName in moduleFactories) {
modules[moduleName] = {
factory: moduleFactories[moduleName].bind(context),
module: { exports: {} },
isInitialized: false
};
}
return modules;
}
function genNativeModules(modules, document) {
if ((typeof NativeModules === 'undefined' ? 'undefined' : _typeof(NativeModules)) === 'object') {
var _loop = function _loop(name) {
var moduleName = MODULE_NAME_PREFIX + name;
modules[moduleName] = {
module: { exports: {} },
isInitialized: true
};
NativeModules[name].forEach(function (method) {
if (typeof method === 'string') {
method = {
name: method
};
}
var methodName = method.name;
modules[moduleName].module.exports[methodName] = function () {
var arguments$1 = arguments;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments$1[_key];
}
var options = {};
var lastArg = args[args.length - 1];
if (lastArg && (typeof lastArg === 'undefined' ? 'undefined' : _typeof(lastArg)) === 'object' && lastArg.__weex_options__) {
options = lastArg.__weex_options__;
// Remove the last in args
args.pop();
}
// https://github.com/alibaba/weex/issues/1677
return document.taskCenter.send('module', {
module: name,
method: methodName
}, args, options);
};
});
};
for (var name in NativeModules) {
_loop(name);
}
}
return modules;
}
/**
* create a Weex instance
*
* @param {string} instanceId
* @param {string} __weex_code__
* @param {object} [__weex_options__] {bundleUrl, debug}
*/
function createInstance(instanceId, __weex_code__, __weex_options__, __weex_data__, __weex_config__) {
var instance = instances[instanceId];
if (instance == undefined) {
// Mark start time
var responseEnd = Date.now();
var __weex_env__ = (typeof WXEnvironment === 'undefined' ? 'undefined' : _typeof(WXEnvironment)) === 'object' && WXEnvironment || {};
// For better performance use built-in promise first
var shared = __webpack_require__(/*! runtime-shared/dist/shared.function */ 6)();
var _Promise = typeof _Promise === 'function' ? _Promise : shared.Promise;
var _Symbol = typeof _Symbol === 'function' ? _Symbol : shared.Symbol;
var _Set = typeof _Set === 'function' ? _Set : shared.Set;
var _Map = typeof _Map === 'function' ? _Map : shared.Map;
var _WeakMap = typeof _WeakMap === 'function' ? _WeakMap : shared.WeakMap;
var _WeakSet = typeof _WeakSet === 'function' ? _WeakSet : shared.WeakSet;
var URL = shared.URL,
URLSearchParams = shared.URLSearchParams,
FontFace = shared.FontFace,
matchMedia = shared.matchMedia;
var bundleUrl = __weex_options__.bundleUrl || 'about:blank';
if (!__weex_options__.bundleUrl) {
console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".');
} else if (!bundleUrl.split('//')[0]) {
bundleUrl = 'https:' + bundleUrl;
}
var document = new Document(instanceId, bundleUrl);
var documentURL = new URL(bundleUrl);
var modules = {};
instance = instances[instanceId] = {
document: document,
instanceId: instanceId,
bundleUrl: bundleUrl,
bundleCode: __weex_code__,
modules: modules,
origin: documentURL.origin,
uid: 0
};
// Generate native modules map at instance init
genNativeModules(modules, document);
var __weex_define__ = __webpack_require__(/*! ./define.weex */ 7)(modules);
var __weex_require__ = __webpack_require__(/*! ./require.weex */ 8)(modules);
var __weex_downgrade__ = __webpack_require__(/*! ./downgrade.weex */ 9)(__weex_require__);
// Extend document
__webpack_require__(/*! ./document.weex */ 11)(__weex_require__, document);
var location = __webpack_require__(/*! ./location.weex */ 12)(__weex_require__, documentURL);
var _require = __webpack_require__(/*! ./fetch.weex */ 13)(__weex_require__, _Promise),
fetch = _require.fetch,
Headers = _require.Headers,
Request = _require.Request,
Response = _require.Response;
var XMLHttpRequest = __webpack_require__(/*! ./xmlhttprequest.weex */ 14)(__weex_require__);
var WebSocket = __webpack_require__(/*! ./websocket.weex */ 17)(__weex_require__);
var _require2 = __webpack_require__(/*! ./timer.weex */ 18)(__weex_require__, document),
setTimeout = _require2.setTimeout,
clearTimeout = _require2.clearTimeout,
setInterval = _require2.setInterval,
clearInterval = _require2.clearInterval,
requestAnimationFrame = _require2.requestAnimationFrame,
cancelAnimationFrame = _require2.cancelAnimationFrame;
var _require3 = __webpack_require__(/*! ./base64.weex */ 19)(),
atob = _require3.atob,
btoa = _require3.btoa;
var performance = __webpack_require__(/*! ./performance.weex */ 20)(responseEnd);
var _require4 = __webpack_require__(/*! ./event.weex */ 21)(),
Event = _require4.Event,
CustomEvent = _require4.CustomEvent;
var windowEmitter = new _emitter2.default();
var window = {
// ES
Promise: _Promise,
Symbol: _Symbol,
Map: _Map,
Set: _Set,
WeakMap: _WeakMap,
WeakSet: _WeakSet,
// W3C: https://www.w3.org/TR/html5/browsers.html#browsing-context-name
name: '',
// This read-only property indicates whether the referenced window is closed or not.
closed: false,
atob: atob,
btoa: btoa,
performance: performance,
// W3C
document: document,
location: location,
// https://www.w3.org/TR/2009/WD-html5-20090423/browsers.html#dom-navigator
navigator: {
product: 'Weex',
platform: __weex_env__.platform,
appName: __weex_env__.appName,
appVersion: __weex_env__.appVersion,
// Weex/0.12 iOS/9.3 (iPhone7,2) AppName/0.12
userAgent: 'Weex/' + __weex_env__.weexVersion + ' ' + __weex_env__.platform + '/' + __weex_env__.osVersion + ' (' + __weex_env__.deviceModel + ') ' + __weex_env__.appName + '/' + __weex_env__.appVersion
},
// https://drafts.csswg.org/cssom-view/#the-screen-interface
screen: {
width: __weex_env__.deviceWidth,
height: __weex_env__.deviceHeight,
availWidth: __weex_env__.deviceWidth,
availHeight: __weex_env__.deviceHeight,
colorDepth: 24,
pixelDepth: 24
},
devicePixelRatio: __weex_env__.scale,
fetch: fetch,
Headers: Headers,
Response: Response,
Request: Request,
XMLHttpRequest: XMLHttpRequest,
URL: URL,
URLSearchParams: URLSearchParams,
FontFace: FontFace,
WebSocket: WebSocket,
Event: Event,
CustomEvent: CustomEvent,
matchMedia: matchMedia,
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
requestAnimationFrame: requestAnimationFrame,
cancelAnimationFrame: cancelAnimationFrame,
alert: function alert(message) {
var modal = __weex_require__(MODAL_MODULE);
modal.alert({
message: message
}, function () {});
},
open: function open(url) {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.push({
url: url,
animated: true
}, noop);
},
close: function close() {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.close({
animated: true
}, noop, noop);
},
postMessage: function postMessage(message, targetOrigin) {
var event = {
origin: location.origin,
data: JSON.parse(JSON.stringify(message)),
type: 'message',
source: window // FIXME: maybe not export window
};
dispatchEventToInstance(event, targetOrigin);
},
addEventListener: function addEventListener(type, listener) {
windowEmitter.on(type, listener);
},
removeEventListener: function removeEventListener(type, listener) {
windowEmitter.off(type, listener);
},
dispatchEvent: function dispatchEvent(e) {
windowEmitter.emit(e.type, e);
},
// ModuleJS
define: __weex_define__,
require: __weex_require__,
// Weex
__weex_document__: document,
__weex_module_supports__: __weex_module_supports__,
__weex_tag_supports__: __weex_tag_supports__,
__weex_define__: __weex_define__,
__weex_require__: __weex_require__,
__weex_downgrade__: __weex_downgrade__,
__weex_env__: __weex_env__,
__weex_code__: __weex_code__,
__weex_options__: __weex_options__,
__weex_data__: __weex_data__,
__weex_config__: __weex_config__
};
instance.window = window.self = window.window = window;
var builtinGlobals = {};
var builtinModules = {};
try {
builtinGlobals = __weex_config__.services.builtinGlobals;
// Modules should wrap as module factory format
builtinModules = __weex_config__.services.builtinModules;
} catch (e) {}
Object.assign(window, builtinGlobals);
var moduleFactories = _extends({}, _builtin.ModuleFactories, builtinModules);
genBuiltinModules(modules, moduleFactories, window);
// In weex iOS or Android
if (__weex_env__.platform !== 'Web') {
var timing = performance.timing;
timing.domLoading = Date.now();
// Use the cached init function, if existed in bundles
var _init = bundles[__weex_code__] ? bundles[__weex_code__] : new Function('with(this){(function(){"use strict";\n' + __weex_code__ + '\n}).call(this)}');
_init.call(
// Context is window
window);
timing.domInteractive = timing.domComplete = timing.domInteractive = Date.now();
// Cache the init function
bundles[__weex_code__] = _init;
} else {
// In weex h5
var _init2 = new Function('"use strict";\n' + __weex_code__);
_init2.call(window);
}
} else {
throw new Error('Instance id "' + instanceId + '" existed when create instance');
}
}
/**
* refresh a Weex instance
*
* @param {string} instanceId
* @param {object} data
*/
function refreshInstance(instanceId, data) {
var instance = getInstance(instanceId);
var document = instance.document;
document.documentElement.fireEvent('refresh', {
timestamp: Date.now(),
data: data
});
document.taskCenter.send('dom', { action: 'refreshFinish' }, []);
}
/**
* destroy a Weex instance
* @param {string} instanceId
*/
function destroyInstance(instanceId) {
var instance = getInstance(instanceId);
var bundleCode = instance.bundleCode;
instance.window.closed = true;
var document = instance.document;
document.documentElement.fireEvent('destory', {
timestamp: Date.now()
});
if (document.destroy) {
document.destroy();
}
if (document.taskCenter && document.taskCenter.destroyCallback) {
document.taskCenter.destroyCallback();
}
delete instances[instanceId];
delete bundles[bundleCode];
}
/**
* get a whole element tree of an instance
* for debugging
* @param {string} instanceId
* @return {object} a virtual dom tree
*/
function getRoot(instanceId) {
var instance = getInstance(instanceId);
var document = instance.document;
return document.toJSON ? document.toJSON() : {};
}
function fireEvent(doc, ref, type, e, domChanges, params) {
if (Array.isArray(ref)) {
ref.some(function (ref) {
return fireEvent(doc, ref, type, e) !== false;
});
return;
}
var el = doc.getRef(ref);
if (el) {
var result = doc.fireEvent(el, type, e, domChanges, params);
return result;
}
return new Error('Invalid element reference "' + ref + '"');
}
/**
* accept calls from native (event or callback)
*
* @param {string} instanceId
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks(instanceId, tasks) {
var instance = getInstance(instanceId);
if (Array.isArray(tasks)) {
var document = instance.document;
var results = [];
tasks.forEach(function (task) {
var result = void 0;
if (task.method === 'fireEvent') {
var _task$args = _slicedToArray(task.args, 5),
nodeId = _task$args[0],
type = _task$args[1],
data = _task$args[2],
domChanges = _task$args[3],
params = _task$args[4];
result = fireEvent(document, nodeId, type, data, domChanges, params);
} else if (task.method === 'callback') {
var _task$args2 = _slicedToArray(task.args, 3),
uid = _task$args2[0],
_data = _task$args2[1],
ifKeepAlive = _task$args2[2];
result = document.taskCenter.callback(uid, _data, ifKeepAlive);
}
results.push(result);
});
return results;
}
}
// FIXME: Hack for rollup build "import Rax from 'weex-rax-framework'", in rollup if `module.exports` has `__esModule` key must return by export default
exports.default = exports;
/***/ }),
/* 4 */
/*!****************************************************!*\
!*** ./packages/weex-rax-framework/src/builtin.js ***!
\****************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var ModuleFactories = exports.ModuleFactories = {
'rax': __webpack_require__(/*! rax/dist/rax.factory */ 5)
};
/***/ }),
/* 5 */
/*!******************************************!*\
!*** ./packages/rax/dist/rax.factory.js ***!
\******************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports) {
module.exports = function(require, exports, module) {
var __weex_document__ = this["__weex_document__"];
var document = this["document"];
module.exports = /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 17);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Stateful things in runtime
*/
exports.default = {
component: null,
mountID: 1,
sandbox: true,
// Roots
rootComponents: {},
rootInstances: {},
// Inject
hook: null,
driver: null,
monitor: null
};
module.exports = exports["default"];
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _element = __webpack_require__(6);
var _unmountComponentAtNode = __webpack_require__(9);
var _unmountComponentAtNode2 = _interopRequireDefault(_unmountComponentAtNode);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(3);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _root = __webpack_require__(19);
var _root2 = _interopRequireDefault(_root);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Instance manager
*/
var KEY = '$$instance';
exports.default = {
set: function set(node, instance) {
if (!node[KEY]) {
node[KEY] = instance;
// Record root instance to roots map
if (instance.rootID) {
_host2.default.rootInstances[instance.rootID] = instance;
_host2.default.rootComponents[instance.rootID] = instance._internal;
}
}
},
get: function get(node) {
return node[KEY];
},
remove: function remove(node) {
var instance = this.get(node);
if (instance) {
node[KEY] = null;
if (instance.rootID) {
delete _host2.default.rootComponents[instance.rootID];
delete _host2.default.rootInstances[instance.rootID];
}
}
},
mount: function mount(element, container, parentInstance) {
_host2.default.driver.beforeRender && _host2.default.driver.beforeRender();
// Real native root node is body
if (container == null) {
container = _host2.default.driver.createBody();
}
// Get the context from the conceptual parent component.
var parentContext = void 0;
if (parentInstance) {
var parentInternal = parentInstance._internal;
parentContext = parentInternal._processChildContext(parentInternal._context);
}
var prevRootInstance = this.get(container);
var hasPrevRootInstance = prevRootInstance && prevRootInstance.isRootComponent;
if (hasPrevRootInstance) {
var prevRenderedComponent = prevRootInstance.getRenderedComponent();
var prevElement = prevRenderedComponent._currentElement;
if ((0, _shouldUpdateComponent2.default)(prevElement, element)) {
var prevUnmaskedContext = prevRenderedComponent._context;
prevRenderedComponent.updateComponent(prevElement, element, prevUnmaskedContext, parentContext || prevUnmaskedContext);
return prevRootInstance;
} else {
_host2.default.hook.Reconciler.unmountComponent(prevRootInstance);
(0, _unmountComponentAtNode2.default)(container);
}
}
var wrappedElement = (0, _element.createElement)(_root2.default, null, element);
var renderedComponent = (0, _instantiateComponent2.default)(wrappedElement);
var defaultContext = parentContext || {};
var rootInstance = renderedComponent.mountComponent(container, null, defaultContext);
this.set(container, rootInstance);
// After render callback
_host2.default.driver.afterRender && _host2.default.driver.afterRender(rootInstance);
// Devtool render new root hook
_host2.default.hook.Mount._renderNewRootComponent(rootInstance._internal);
return rootInstance;
}
};
module.exports = exports['default'];
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function instantiateComponent(element) {
var instance = void 0;
if (element === undefined || element === null || element === false || element === true) {
instance = new _host2.default.EmptyComponent();
} else if (Array.isArray(element)) {
instance = new _host2.default.FragmentComponent(element);
} else if ((typeof element === 'undefined' ? 'undefined' : _typeof(element)) === 'object' && element.type) {
// Special case string values
if (typeof element.type === 'string') {
instance = new _host2.default.NativeComponent(element);
} else {
instance = new _host2.default.CompositeComponent(element);
}
} else if (typeof element === 'string' || typeof element === 'number') {
instance = new _host2.default.TextComponent(element);
} else {
throw new Error('Invalid element type: ' + element + '. (keys: ' + Object.keys(element) + ')');
}
instance._mountIndex = 0;
return instance;
}
exports.default = instantiateComponent;
module.exports = exports['default'];
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function shouldUpdateComponent(prevElement, nextElement) {
// TODO: prevElement and nextElement could be array
var prevEmpty = prevElement === null;
var nextEmpty = nextElement === null;
if (prevEmpty || nextEmpty) {
return prevEmpty === nextEmpty;
}
var prevType = typeof prevElement === 'undefined' ? 'undefined' : _typeof(prevElement);
var nextType = typeof nextElement === 'undefined' ? 'undefined' : _typeof(nextElement);
if (prevType === 'string' || prevType === 'number') {
return nextType === 'string' || nextType === 'number';
} else {
return prevType === 'object' && nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;
}
}
exports.default = shouldUpdateComponent;
module.exports = exports['default'];
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Base component class.
*/
var Component = function () {
function Component(props, context, updater) {
_classCallCheck(this, Component);
this.props = props;
this.context = context;
this.refs = {};
this.updater = updater;
}
_createClass(Component, [{
key: "isComponentClass",
value: function isComponentClass() {}
}, {
key: "setState",
value: function setState(partialState, callback) {
this.updater.setState(this, partialState, callback);
}
}, {
key: "forceUpdate",
value: function forceUpdate(callback) {
this.updater.forceUpdate(this, callback);
}
}]);
return Component;
}();
exports.default = Component;
module.exports = exports["default"];
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = {
ComponentTree: {
getClosestInstanceFromNode: function getClosestInstanceFromNode(node) {
return _instance2.default.get(node);
},
getNodeFromInstance: function getNodeFromInstance(inst) {
// inst is an internal instance (but could be a composite)
while (inst._renderedComponent) {
inst = inst._renderedComponent;
}
if (inst) {
return inst._nativeNode;
} else {
return null;
}
}
},
Mount: {
_instancesByReactRootID: _host2.default.rootComponents,
// Stub - React DevTools expects to find this method and replace it
// with a wrapper in order to observe new root components being added
_renderNewRootComponent: function _renderNewRootComponent() {}
},
Reconciler: {
// Stubs - React DevTools expects to find these methods and replace them
// with wrappers in order to observe components being mounted, updated and
// unmounted
mountComponent: function mountComponent() {},
receiveComponent: function receiveComponent() {},
unmountComponent: function unmountComponent() {}
},
// monitor the info of all components
monitor: null
};
module.exports = exports['default'];
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.createElement = createElement;
exports.createFactory = createFactory;
exports.cloneElement = cloneElement;
exports.isValidElement = isValidElement;
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _flattenChildren = __webpack_require__(7);
var _flattenChildren2 = _interopRequireDefault(_flattenChildren);
var _universalEnv = __webpack_require__(8);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var RESERVED_PROPS = {
key: true,
ref: true
};
function getRenderErrorInfo() {
if (_host2.default.component) {
var name = _host2.default.component.getName();
if (name) {
return ' Check the render method of `' + name + '`.';
}
}
return '';
}
function Element(type, key, ref, props, owner) {
if (_universalEnv.isWeex) {
props = filterProps(type, props);
}
return {
// Built-in properties that belong on the element
type: type,
key: key,
ref: ref,
props: props,
// Record the component responsible for creating this element.
_owner: owner
};
}
exports.default = Element;
function flattenStyle(style) {
if (!style) {
return undefined;
}
if (!Array.isArray(style)) {
return style;
} else {
var result = {};
for (var i = 0; i < style.length; ++i) {
var computedStyle = flattenStyle(style[i]);
if (computedStyle) {
for (var key in computedStyle) {
result[key] = computedStyle[key];
}
}
}
return result;
}
}
// TODO: move to weex-drvier
function filterProps(type, props) {
// Only for weex text
if (type === 'text') {
var children = props.children;
var value = props.value;
// Value is first
if (value == null && children != null) {
if (Array.isArray(children)) {
children = children.map(function (val) {
if (typeof val === 'number' || typeof val === 'string') {
return val;
} else {
return '';
}
}).join('');
} else if (typeof children !== 'number' && typeof children !== 'string') {
children = '';
}
props.value = String(children);
}
props.children = null;
}
return props;
}
function createElement(type, config, children) {
var arguments$1 = arguments;
if (type == null) {
throw Error('createElement: type should not be null or undefined.' + getRenderErrorInfo());
}
// Reserved names are extracted
var props = {};
var propName = void 0;
var key = null;
var ref = null;
if (config != null) {
ref = config.ref === undefined ? null : config.ref;
key = config.key === undefined ? null : String(config.key);
// Remaining properties are added to a new props object
for (propName in config) {
if (!RESERVED_PROPS[propName]) {
props[propName] = config[propName];
}
}
}
var childrenLength = arguments.length - 2;
if (childrenLength > 0) {
if (childrenLength === 1 && !Array.isArray(children)) {
props.children = children;
} else {
var childArray = children;
if (childrenLength > 1) {
childArray = new Array(childrenLength);
for (var i = 0; i < childrenLength; i++) {
childArray[i] = arguments$1[i + 2];
}
}
props.children = (0, _flattenChildren2.default)(childArray);
}
}
// Resolve default props
if (type && type.defaultProps) {
var defaultProps = type.defaultProps;
for (propName in defaultProps) {
if (props[propName] === undefined) {
props[propName] = defaultProps[propName];
}
}
}
if (props.style && (Array.isArray(props.style) || _typeof(props.style) === 'object')) {
props.style = flattenStyle(props.style);
}
return new Element(type, key, ref, props, _host2.default.component);
}
function createFactory(type) {
var factory = createElement.bind(null, type);
// Expose the type on the factory and the prototype so that it can be
// easily accessed on elements. E.g. `<Foo />.type === Foo`.
// This should not be named `constructor` since this may not be the function
// that created the element, and it may not even be a constructor.
factory.type = type;
return factory;
}
function cloneElement(element, config) {
var arguments$1 = arguments;
if (!isValidElement(element)) {
throw Error('cloneElement: not a valid element.' + getRenderErrorInfo());
}
// Original props are copied
var props = Object.assign({}, element.props);
// Reserved names are extracted
var key = element.key;
var ref = element.ref;
// Owner will be preserved, unless ref is overridden
var owner = element._owner;
if (config) {
// Should reset ref and owner if has a new ref
if (config.ref !== undefined) {
ref = config.ref;
owner = _host2.default.component;
}
if (config.key !== undefined) {
key = String(config.key);
}
// Resolve default props
var defaultProps = void 0;
if (element.type && element.type.defaultProps) {
defaultProps = element.type.defaultProps;
}
// Remaining properties override existing props
var propName = void 0;
for (propName in config) {
if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
if (config[propName] === undefined && defaultProps !== undefined) {
// Resolve default props
props[propName] = defaultProps[propName];
} else {
props[propName] = config[propName];
}
}
}
}
for (var _len = arguments.length, children = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
children[_key - 2] = arguments$1[_key];
}
if (children.length) {
props.children = (0, _flattenChildren2.default)(children);
}
return new Element(element.type, key, ref, props, owner);
}
function isValidElement(object) {
return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object !== null && object.type && object.props;
}
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = flattenChildren;
function traverseChildren(children, result) {
if (Array.isArray(children)) {
for (var i = 0, l = children.length; i < l; i++) {
traverseChildren(children[i], result);
}
} else {
result.push(children);
}
}
function flattenChildren(children) {
if (children == null) {
return children;
}
var result = [];
traverseChildren(children, result);
if (result.length === 1) {
result = result[0];
}
return result;
}
module.exports = exports["default"];
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
// https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appcodename
var isWeb = exports.isWeb = (typeof navigator === 'undefined' ? 'undefined' : _typeof(navigator)) === 'object' && (navigator.appCodeName === 'Mozilla' || navigator.product === 'Gecko');
var isNode = exports.isNode = typeof process !== 'undefined' && !!(process.versions && process.versions.node);
var isWeex = exports.isWeex = typeof callNative === 'function';
var isReactNative = exports.isReactNative = typeof __fbBatchedBridgeConfig !== 'undefined';
exports['default'] = module.exports;
exports.default = module.exports;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = unmountComponentAtNode;
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function unmountComponentAtNode(node) {
var component = _instance2.default.get(node);
if (!component) {
return false;
}
_instance2.default.remove(node);
component._internal.unmountComponent();
return true;
}
module.exports = exports['default'];
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _inject = __webpack_require__(22);
var _inject2 = _interopRequireDefault(_inject);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function render(element, container, options, callback) {
// Compatible with `render(element, container, callback)`
if (typeof options === 'function') {
callback = options;
options = null;
}
options = options || {};
// Init inject
(0, _inject2.default)(options);
var rootComponent = _instance2.default.mount(element, container, options.parent);
var componentInstance = rootComponent.getPublicInstance();
if (callback) {
callback.call(componentInstance);
}
return componentInstance;
}
exports.default = render;
module.exports = exports['default'];
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _ref = __webpack_require__(12);
var _ref2 = _interopRequireDefault(_ref);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(3);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _getElementKeyName = __webpack_require__(13);
var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var STYLE = 'style';
var CHILDREN = 'children';
var TREE = 'tree';
var EVENT_PREFIX_REGEXP = /on[A-Z]/;
/**
* Native Component
*/
var NativeComponent = function () {
function NativeComponent(element) {
_classCallCheck(this, NativeComponent);
this._currentElement = element;
}
_createClass(NativeComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, parentInstance, context, childMounter) {
// Parent native element
this._parent = parent;
this._parentInstance = parentInstance;
this._context = context;
this._mountID = _host2.default.mountID++;
var props = this._currentElement.props;
var type = this._currentElement.type;
var instance = {
_internal: this,
type: type,
props: props
};
var appendType = props.append; // Default is node
this._instance = instance;
// Clone a copy for style diff
this._prevStyleCopy = Object.assign({}, props.style);
var nativeNode = this.getNativeNode();
if (appendType !== TREE) {
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
}
if (this._currentElement && this._currentElement.ref) {
_ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this);
}
// Process children
var children = props.children;
if (children != null) {
this.mountChildren(children, context);
}
if (appendType === TREE) {
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
}
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'mountChildren',
value: function mountChildren(children, context) {
var _this = this;
if (!Array.isArray(children)) {
children = [children];
}
var renderedChildren = this._renderedChildren = {};
var renderedChildrenImage = children.map(function (element, index) {
var renderedChild = (0, _instantiateComponent2.default)(element);
var name = (0, _getElementKeyName2.default)(renderedChildren, element, index);
renderedChildren[name] = renderedChild;
renderedChild._mountIndex = index;
// Mount
var mountImage = renderedChild.mountComponent(_this.getNativeNode(), _this._instance, context, null);
return mountImage;
});
return renderedChildrenImage;
}
}, {
key: 'unmountChildren',
value: function unmountChildren(notRemoveChild) {
var renderedChildren = this._renderedChildren;
if (renderedChildren) {
for (var name in renderedChildren) {
var renderedChild = renderedChildren[name];
renderedChild.unmountComponent(notRemoveChild);
}
this._renderedChildren = null;
}
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode) {
var ref = this._currentElement.ref;
if (ref) {
_ref2.default.detach(this._currentElement._owner, ref, this);
}
_instance2.default.remove(this._nativeNode);
if (!notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
_host2.default.driver.removeAllEventListeners(this._nativeNode);
}
this.unmountChildren(notRemoveChild);
_host2.default.hook.Reconciler.unmountComponent(this);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._parentInstance = null;
this._context = null;
this._instance = null;
this._prevStyleCopy = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevContext, nextContext) {
// Replace current element
this._currentElement = nextElement;
_ref2.default.update(prevElement, nextElement, this);
var prevProps = prevElement.props;
var nextProps = nextElement.props;
this.updateProperties(prevProps, nextProps);
this.updateChildren(nextProps.children, nextContext);
_host2.default.hook.Reconciler.receiveComponent(this);
}
}, {
key: 'updateProperties',
value: function updateProperties(prevProps, nextProps) {
var this$1 = this;
var propKey = void 0;
var styleName = void 0;
var styleUpdates = void 0;
for (propKey in prevProps) {
if (propKey === CHILDREN || nextProps.hasOwnProperty(propKey) || !prevProps.hasOwnProperty(propKey) || prevProps[propKey] == null) {
continue;
}
if (propKey === STYLE) {
var lastStyle = this$1._prevStyleCopy;
for (styleName in lastStyle) {
if (lastStyle.hasOwnProperty(styleName)) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = '';
}
}
this$1._prevStyleCopy = null;
} else if (EVENT_PREFIX_REGEXP.test(propKey)) {
if (typeof prevProps[propKey] === 'function') {
_host2.default.driver.removeEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), prevProps[propKey]);
}
} else {
_host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]);
}
}
for (propKey in nextProps) {
var nextProp = nextProps[propKey];
var prevProp = propKey === STYLE ? this$1._prevStyleCopy : prevProps != null ? prevProps[propKey] : undefined;
if (propKey === CHILDREN || !nextProps.hasOwnProperty(propKey) || nextProp === prevProp || nextProp == null && prevProp == null) {
continue;
}
// Update style
if (propKey === STYLE) {
if (nextProp) {
// Clone property
nextProp = this$1._prevStyleCopy = Object.assign({}, nextProp);
} else {
this$1._prevStyleCopy = null;
}
if (prevProp != null) {
// Unset styles on `prevProp` but not on `nextProp`.
for (styleName in prevProp) {
if (prevProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = '';
}
}
// Update styles that changed since `prevProp`.
for (styleName in nextProp) {
if (nextProp.hasOwnProperty(styleName) && prevProp[styleName] !== nextProp[styleName]) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = nextProp[styleName];
}
}
} else {
// Assign next prop when prev style is null
styleUpdates = nextProp;
}
// Update event binding
} else if (EVENT_PREFIX_REGEXP.test(propKey)) {
var eventName = propKey.slice(2).toLowerCase();
if (typeof prevProp === 'function') {
_host2.default.driver.removeEventListener(this$1.getNativeNode(), eventName, prevProp, nextProps);
}
if (typeof nextProp === 'function') {
_host2.default.driver.addEventListener(this$1.getNativeNode(), eventName, nextProp, nextProps);
}
// Update other property
} else {
var payload = {};
payload[propKey] = nextProp;
if (nextProp != null) {
_host2.default.driver.setAttribute(this$1.getNativeNode(), propKey, nextProp);
} else {
_host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]);
}
}
}
if (styleUpdates) {
_host2.default.driver.setStyles(this.getNativeNode(), styleUpdates);
}
}
}, {
key: 'updateChildren',
value: function updateChildren(nextChildrenElements, context) {
var _this2 = this;
// prev rendered children
var prevChildren = this._renderedChildren;
if (nextChildrenElements == null && prevChildren == null) {
return;
}
var nextChildren = {};
var oldNodes = {};
if (nextChildrenElements != null) {
if (!Array.isArray(nextChildrenElements)) {
nextChildrenElements = [nextChildrenElements];
}
// Update next children elements
for (var index = 0, length = nextChildrenElements.length; index < length; index++) {
var nextElement = nextChildrenElements[index];
var name = (0, _getElementKeyName2.default)(nextChildren, nextElement, index);
var prevChild = prevChildren && prevChildren[name];
var prevElement = prevChild && prevChild._currentElement;
if (prevChild != null && (0, _shouldUpdateComponent2.default)(prevElement, nextElement)) {
// Pass the same context when updating chidren
prevChild.updateComponent(prevElement, nextElement, context, context);
nextChildren[name] = prevChild;
} else {
// Unmount the prevChild when nextChild is different element type.
if (prevChild) {
var oldNativeNode = prevChild.getNativeNode();
// Delay remove child
prevChild.unmountComponent(true);
oldNodes[name] = oldNativeNode;
}
// The child must be instantiated before it's mounted.
nextChildren[name] = (0, _instantiateComponent2.default)(nextElement);
}
}
}
var firstPrevChild = void 0;
var delayRemoveFirstPrevChild = void 0;
// Unmount children that are no longer present.
if (prevChildren != null) {
for (var _name in prevChildren) {
if (!prevChildren.hasOwnProperty(_name)) {
continue;
}
var _prevChild = prevChildren[_name];
var shouldRemove = !nextChildren[_name];
// Store old first child ref for append node ahead and maybe delay remove it
if (!firstPrevChild) {
firstPrevChild = _prevChild;
delayRemoveFirstPrevChild = shouldRemove;
} else if (shouldRemove) {
_prevChild.unmountComponent();
}
}
}
if (nextChildren != null) {
(function () {
// `nextIndex` will increment for each child in `nextChildren`, but
// `lastIndex` will be the last index visited in `prevChildren`.
var lastIndex = 0;
var nextIndex = 0;
var lastPlacedNode = null;
var nextNativeNode = [];
var _loop = function _loop(_name2) {
if (!nextChildren.hasOwnProperty(_name2)) {
return 'continue';
}
var nextChild = nextChildren[_name2];
var prevChild = prevChildren && prevChildren[_name2];
if (prevChild === nextChild) {
var prevChildNativeNode = prevChild.getNativeNode();
// Convert to array type
if (!Array.isArray(prevChildNativeNode)) {
prevChildNativeNode = [prevChildNativeNode];
}
// If the index of `child` is less than `lastIndex`, then it needs to
// be moved. Otherwise, we do not need to move it because a child will be
// inserted or moved before `child`.
if (prevChild._mountIndex < lastIndex) {
// Get the last child
if (Array.isArray(lastPlacedNode)) {
lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
}
for (var _i = prevChildNativeNode.length - 1; _i >= 0; _i--) {
_host2.default.driver.insertAfter(prevChildNativeNode[_i], lastPlacedNode);
}
}
nextNativeNode = nextNativeNode.concat(prevChildNativeNode);
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
prevChild._mountIndex = nextIndex;
} else {
if (prevChild != null) {
// Update `lastIndex` before `_mountIndex` gets unset by unmounting.
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
}
var parent = _this2.getNativeNode();
// Fragment extended native component, so if parent is fragment should get this._parent
if (Array.isArray(parent)) {
parent = _this2._parent;
}
nextChild.mountComponent(parent, _this2._instance, context, function (newChild, parent) {
// TODO: Rework the duplicate code
var oldChild = oldNodes[_name2];
if (!Array.isArray(newChild)) {
newChild = [newChild];
}
if (oldChild) {
// The oldChild or newChild all maybe fragment
if (!Array.isArray(oldChild)) {
oldChild = [oldChild];
}
// If newChild count large then oldChild
var lastNewChild = void 0;
for (var _i2 = 0; _i2 < newChild.length; _i2++) {
var child = newChild[_i2];
if (oldChild[_i2]) {
_host2.default.driver.replaceChild(child, oldChild[_i2]);
} else {
_host2.default.driver.insertAfter(child, lastNewChild);
}
lastNewChild = child;
}
// If newChild count less then oldChild
if (newChild.length < oldChild.length) {
for (var _i3 = newChild.length; _i3 < oldChild.length; _i3++) {
_host2.default.driver.removeChild(oldChild[_i3]);
}
}
} else {
// Insert child at a specific index
// Get the last child
if (Array.isArray(lastPlacedNode)) {
lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
}
var prevFirstNativeNode = void 0;
if (firstPrevChild && !lastPlacedNode) {
prevFirstNativeNode = firstPrevChild.getNativeNode();
if (Array.isArray(prevFirstNativeNode)) {
prevFirstNativeNode = prevFirstNativeNode[0];
}
}
for (var _i4 = newChild.length - 1; _i4 >= 0; _i4--) {
var _child = newChild[_i4];
if (lastPlacedNode) {
_host2.default.driver.insertAfter(_child, lastPlacedNode);
} else if (prevFirstNativeNode) {
_host2.default.driver.insertBefore(_child, prevFirstNativeNode);
} else {
_host2.default.driver.appendChild(_child, parent);
}
}
}
nextNativeNode = nextNativeNode.concat(newChild);
});
nextChild._mountIndex = nextIndex;
}
nextIndex++;
lastPlacedNode = nextChild.getNativeNode();
};
for (var _name2 in nextChildren) {
var _ret2 = _loop(_name2);
if (_ret2 === 'continue') { continue; }
}
// Sync update native refs
if (Array.isArray(_this2._nativeNode)) {
// Clear all and push the new array
_this2._nativeNode.splice(0, _this2._nativeNode.length);
for (var i = 0; i < nextNativeNode.length; i++) {
_this2._nativeNode.push(nextNativeNode[i]);
}
}
})();
}
if (delayRemoveFirstPrevChild) {
firstPrevChild.unmountComponent();
}
this._renderedChildren = nextChildren;
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createElement(this._instance);
_instance2.default.set(this._nativeNode, this._instance);
}
return this._nativeNode;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getNativeNode();
}
}, {
key: 'getName',
value: function getName() {
return this._currentElement.type;
}
}]);
return NativeComponent;
}();
exports.default = NativeComponent;
module.exports = exports['default'];
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Ref manager
*/
exports.default = {
update: function update(prevElement, nextElement, component) {
var prevRef = prevElement != null && prevElement.ref;
var nextRef = nextElement != null && nextElement.ref;
// Update refs in owner component
if (prevRef !== nextRef) {
// Detach prev RenderedElement's ref
prevRef != null && this.detach(prevElement._owner, prevRef, component);
// Attach next RenderedElement's ref
nextRef != null && this.attach(nextElement._owner, nextRef, component);
}
},
attach: function attach(ownerComponent, ref, component) {
if (!ownerComponent) {
throw new Error('You might be adding a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of Rax loaded.');
}
var instance = component.getPublicInstance();
if (typeof ref === 'function') {
ref(instance);
} else {
ownerComponent._instance.refs[ref] = instance;
}
},
detach: function detach(ownerComponent, ref, component) {
if (typeof ref === 'function') {
// When the referenced component is unmounted and whenever the ref changes, the old ref will be called with null as an argument.
ref(null);
} else {
// Must match component and ref could detach the ref on owner when A's before ref is B's current ref
var instance = component.getPublicInstance();
if (ownerComponent._instance.refs[ref] === instance) {
delete ownerComponent._instance.refs[ref];
}
}
}
};
module.exports = exports['default'];
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (children, element, index) {
var elementKey = element && element.key;
var hasKey = typeof elementKey === 'string';
var defaultName = '.' + index.toString(36);
if (hasKey) {
var keyName = '$' + elementKey;
// Child keys must be unique.
var keyUnique = children[keyName] === undefined;
// Only the first child will be used when encountered two children with the same key
if (!keyUnique) { console.warn('Encountered two children with the same key "' + elementKey + '".'); }
return keyUnique ? keyName : defaultName;
} else {
return defaultName;
}
};
module.exports = exports['default'];
/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isRem = isRem;
exports.calcRem = calcRem;
exports.getRem = getRem;
exports.setRem = setRem;
exports.isUnitNumber = isUnitNumber;
exports.convertUnit = convertUnit;
/**
* CSS properties which accept numbers but are not in units of "px".
*/
var UNITLESS_NUMBER_PROPS = {
animationIterationCount: true,
borderImageOutset: true,
borderImageSlice: true,
borderImageWidth: true,
boxFlex: true,
boxFlexGroup: true,
boxOrdinalGroup: true,
columnCount: true,
flex: true,
flexGrow: true,
flexPositive: true,
flexShrink: true,
flexNegative: true,
flexOrder: true,
gridRow: true,
gridColumn: true,
fontWeight: true,
lineClamp: true,
// We make lineHeight default is px that is diff with w3c spec
// lineHeight: true,
opacity: true,
order: true,
orphans: true,
tabSize: true,
widows: true,
zIndex: true,
zoom: true,
// Weex only
lines: true
};
var SUFFIX = 'rem';
var REM_REG = /[-+]?\d*\.?\d+rem/g;
// Default 1 rem to 1 px
var defaultRemUnit = 1;
/**
* Is string contains rem
* @param {String} str
* @returns {Boolean}
*/
function isRem(str) {
return typeof str === 'string' && str.indexOf(SUFFIX) !== -1;
}
/**
* Calculate rem to pixels: '1.2rem' => 1.2 * rem
* @param {String} str
* @param {Number} rem
* @returns {number}
*/
function calcRem(str) {
var remUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultRemUnit;
return str.replace(REM_REG, function (rem) {
return parseFloat(rem) * remUnit + 'px';
});
}
function getRem() {
return defaultRemUnit;
}
function setRem(rem) {
defaultRemUnit = rem;
}
function isUnitNumber(val, prop) {
return typeof val === 'number' && !UNITLESS_NUMBER_PROPS[prop];
}
function convertUnit(val, prop) {
var remUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultRemUnit;
if (prop && isUnitNumber(val, prop)) {
return val * remUnit + 'px';
} else if (isRem(val)) {
return calcRem(val, remUnit);
}
return val;
}
exports['default'] = module.exports;
exports.default = module.exports;
/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.transformPropsAttrsToStyle = transformPropsAttrsToStyle;
exports.renamePropsAttr = renamePropsAttr;
/**
* transformPropAttrsToStyle
*
* @param {Object} props
* @param {Array} attrs
*/
function transformPropsAttrsToStyle(props, attrs) {
props.style = props.style || {};
attrs.forEach(function (attr) {
if (props[attr] && !props.style[attr]) {
props.style[attr] = props[attr];
delete props[attr];
}
});
return props;
}
/**
* renamePropsAttr
*
* @param {Object} props
* @param {String} originalAttrName
* @param {String} newAttrName
*/
function renamePropsAttr(props, originalAttrName, newAttrName) {
if (props[originalAttrName] && !props[newAttrName]) {
props[newAttrName] = props[originalAttrName];
delete props[originalAttrName];
}
return props;
}
exports["default"] = module.exports;
exports.default = module.exports;
/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findDOMNode(instance) {
if (instance == null) {
return null;
}
// If a native node, weex may not export ownerDocument property
if (instance.ownerDocument || instance.nodeType) {
return instance;
}
// Native component
if (instance._nativeNode) {
return instance._nativeNode;
}
if (typeof instance == 'string') {
return _host2.default.driver.getElementById(instance);
}
if (typeof instance.render !== 'function') {
throw new Error('findDOMNode: find by neither component nor DOM node.');
}
// Composite component
var internal = instance._internal;
if (internal) {
while (!internal._nativeNode) {
internal = internal._renderedComponent;
// If not mounted
if (internal == null) {
return null;
}
}
return internal._nativeNode;
} else {
throw new Error('findDOMNode: find on an unmounted component.');
}
}
exports.default = findDOMNode;
module.exports = exports['default'];
/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Children = exports.version = exports.setNativeProps = exports.findComponentInstance = exports.unmountComponentAtNode = exports.findDOMNode = exports.hydrate = exports.render = exports.PropTypes = exports.PureComponent = exports.Component = exports.createFactory = exports.isValidElement = exports.cloneElement = exports.createElement = undefined;
__webpack_require__(18);
var _element = __webpack_require__(6);
var _component = __webpack_require__(4);
var _component2 = _interopRequireDefault(_component);
var _purecomponent = __webpack_require__(20);
var _purecomponent2 = _interopRequireDefault(_purecomponent);
var _proptypes = __webpack_require__(21);
var _proptypes2 = _interopRequireDefault(_proptypes);
var _render2 = __webpack_require__(10);
var _render3 = _interopRequireDefault(_render2);
var _hydrate2 = __webpack_require__(42);
var _hydrate3 = _interopRequireDefault(_hydrate2);
var _findDOMNode2 = __webpack_require__(16);
var _findDOMNode3 = _interopRequireDefault(_findDOMNode2);
var _unmountComponentAtNode2 = __webpack_require__(9);
var _unmountComponentAtNode3 = _interopRequireDefault(_unmountComponentAtNode2);
var _findComponentInstance2 = __webpack_require__(43);
var _findComponentInstance3 = _interopRequireDefault(_findComponentInstance2);
var _setNativeProps2 = __webpack_require__(44);
var _setNativeProps3 = _interopRequireDefault(_setNativeProps2);
var _version2 = __webpack_require__(45);
var _version3 = _interopRequireDefault(_version2);
var _children = __webpack_require__(46);
var _children2 = _interopRequireDefault(_children);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.createElement = _element.createElement;
exports.cloneElement = _element.cloneElement;
exports.isValidElement = _element.isValidElement;
exports.createFactory = _element.createFactory;
exports.Component = _component2.default;
exports.PureComponent = _purecomponent2.default;
exports.PropTypes = _proptypes2.default;
exports.render = _render3.default;
exports.hydrate = _hydrate3.default;
exports.findDOMNode = _findDOMNode3.default;
exports.unmountComponentAtNode = _unmountComponentAtNode3.default;
exports.findComponentInstance = _findComponentInstance3.default;
exports.setNativeProps = _setNativeProps3.default;
exports.version = _version3.default;
exports.Children = _children2.default;
/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _hook = __webpack_require__(5);
var _hook2 = _interopRequireDefault(_hook);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
__REACT_DEVTOOLS_GLOBAL_HOOK__.inject(_hook2.default);
}
/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _component = __webpack_require__(4);
var _component2 = _interopRequireDefault(_component);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
var rootCounter = 1;
var Root = function (_Component) {
_inherits(Root, _Component);
function Root() {
var arguments$1 = arguments;
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Root);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments$1[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Root.__proto__ || Object.getPrototypeOf(Root)).call.apply(_ref, [this].concat(args))), _this), _this.rootID = rootCounter++, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Root, [{
key: 'isRootComponent',
value: function isRootComponent() {}
}, {
key: 'render',
value: function render() {
return this.props.children;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getRenderedComponent().getPublicInstance();
}
}, {
key: 'getRenderedComponent',
value: function getRenderedComponent() {
return this._internal._renderedComponent;
}
}]);
return Root;
}(_component2.default);
exports.default = Root;
module.exports = exports['default'];
/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _component = __webpack_require__(4);
var _component2 = _interopRequireDefault(_component);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
/**
* Pure component class.
*/
var PureComponent = function (_Component) {
_inherits(PureComponent, _Component);
function PureComponent(props, context) {
_classCallCheck(this, PureComponent);
return _possibleConstructorReturn(this, (PureComponent.__proto__ || Object.getPrototypeOf(PureComponent)).call(this, props, context));
}
_createClass(PureComponent, [{
key: 'isPureComponentClass',
value: function isPureComponentClass() {}
}]);
return PureComponent;
}(_component2.default);
exports.default = PureComponent;
module.exports = exports['default'];
/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Current PropTypes only export some api with react, not validate in runtime.
*/
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName, location, propFullName) {
return typeChecker;
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName) {
// Noop
}
return createChainableTypeChecker(validate);
}
var typeChecker = createTypeChecker();
exports.default = {
array: typeChecker,
bool: typeChecker,
func: typeChecker,
number: typeChecker,
object: typeChecker,
string: typeChecker,
symbol: typeChecker,
element: typeChecker,
node: typeChecker,
any: typeChecker,
arrayOf: typeChecker,
instanceOf: typeChecker,
objectOf: typeChecker,
oneOf: typeChecker,
oneOfType: typeChecker,
shape: typeChecker
};
module.exports = exports["default"];
/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = inject;
var _universalEnv = __webpack_require__(8);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _empty = __webpack_require__(23);
var _empty2 = _interopRequireDefault(_empty);
var _native = __webpack_require__(11);
var _native2 = _interopRequireDefault(_native);
var _text = __webpack_require__(24);
var _text2 = _interopRequireDefault(_text);
var _composite = __webpack_require__(25);
var _composite2 = _interopRequireDefault(_composite);
var _fragment = __webpack_require__(29);
var _fragment2 = _interopRequireDefault(_fragment);
var _driverWeex = __webpack_require__(30);
var _driverWeex2 = _interopRequireDefault(_driverWeex);
var _driverBrowser = __webpack_require__(40);
var _driverBrowser2 = _interopRequireDefault(_driverBrowser);
var _hook = __webpack_require__(5);
var _hook2 = _interopRequireDefault(_hook);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function inject(_ref) {
var driver = _ref.driver,
hook = _ref.hook,
measurer = _ref.measurer,
deviceWidth = _ref.deviceWidth,
viewportWidth = _ref.viewportWidth,
eventRegistry = _ref.eventRegistry;
// Inject component class
_host2.default.EmptyComponent = _empty2.default;
_host2.default.NativeComponent = _native2.default;
_host2.default.TextComponent = _text2.default;
_host2.default.FragmentComponent = _fragment2.default;
_host2.default.CompositeComponent = _composite2.default;
// Inject devtool hook
_host2.default.hook = hook || _hook2.default;
// Inject performance measurer
_host2.default.measurer = measurer;
// Inject render driver
if (!_host2.default.driver) {
if (!driver) {
if (_universalEnv.isWeex) {
driver = _driverWeex2.default;
} else if (_universalEnv.isWeb) {
driver = _driverBrowser2.default;
} else {
throw Error('No builtin driver matched');
}
}
_host2.default.driver = driver;
}
if (deviceWidth && _host2.default.driver.setDeviceWidth) {
_host2.default.driver.setDeviceWidth(deviceWidth);
}
if (viewportWidth && _host2.default.driver.setViewportWidth) {
_host2.default.driver.setViewportWidth(viewportWidth);
}
if (eventRegistry) {
_host2.default.driver.eventRegistry = eventRegistry;
}
}
module.exports = exports['default'];
/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Empty Component
*/
var EmptyComponent = function () {
function EmptyComponent() {
_classCallCheck(this, EmptyComponent);
this._currentElement = null;
}
_createClass(EmptyComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, parentInstance, context, childMounter) {
this._parent = parent;
this._parentInstance = parentInstance;
this._context = context;
var instance = {
_internal: this
};
var nativeNode = this.getNativeNode();
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode && !notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
this._nativeNode = null;
this._parent = null;
this._parentInstance = null;
this._context = null;
}
}, {
key: 'updateComponent',
value: function updateComponent() {
// Noop
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
// Weex native node
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createEmpty();
}
return this._nativeNode;
}
}]);
return EmptyComponent;
}();
exports.default = EmptyComponent;
module.exports = exports['default'];
/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Text Component
*/
var TextComponent = function () {
function TextComponent(element) {
_classCallCheck(this, TextComponent);
this._currentElement = element;
this._stringText = String(element);
}
_createClass(TextComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, parentInstance, context, childMounter) {
this._parent = parent;
this._parentInstance = parentInstance;
this._context = context;
this._mountID = _host2.default.mountID++;
// Weex dom operation
var nativeNode = this.getNativeNode();
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
var instance = {
_internal: this
};
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode && !notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
_host2.default.hook.Reconciler.unmountComponent(this);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._parentInstance = null;
this._context = null;
this._stringText = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, context) {
// If some text do noting
if (prevElement !== nextElement) {
// Replace current element
this._currentElement = nextElement;
// Devtool read the latest stringText value
this._stringText = String(nextElement);
_host2.default.driver.updateText(this.getNativeNode(), this._stringText);
_host2.default.hook.Reconciler.receiveComponent(this);
}
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createText(this._stringText);
}
return this._nativeNode;
}
}]);
return TextComponent;
}();
exports.default = TextComponent;
module.exports = exports['default'];
/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _stateless = __webpack_require__(26);
var _stateless2 = _interopRequireDefault(_stateless);
var _updater = __webpack_require__(27);
var _updater2 = _interopRequireDefault(_updater);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _ref = __webpack_require__(12);
var _ref2 = _interopRequireDefault(_ref);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(3);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _shallowEqual = __webpack_require__(28);
var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function performInSandbox(fn, instance, callback) {
try {
return fn();
} catch (e) {
if (callback) {
callback(e);
} else {
handleError(instance, e);
}
}
}
function handleError(instance, error) {
var boundary = void 0;
while (instance) {
if (typeof instance.componentDidCatch === 'function') {
boundary = instance;
break;
} else if (instance._internal && instance._internal._parentInstance) {
instance = instance._internal._parentInstance;
} else {
break;
}
}
if (boundary) {
boundary.componentDidCatch(error);
} else {
if (_host2.default.sandbox) {
setTimeout(function () {
throw error;
}, 0);
} else {
throw error;
}
}
}
var measureLifeCycle = void 0;
var CompositeComponent = function () {
function CompositeComponent(element) {
_classCallCheck(this, CompositeComponent);
this._currentElement = element;
}
_createClass(CompositeComponent, [{
key: 'getName',
value: function getName() {
var type = this._currentElement.type;
var constructor = this._instance && this._instance.constructor;
return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;
}
}, {
key: 'mountComponent',
value: function mountComponent(parent, parentInstance, context, childMounter) {
var _this = this;
this._parent = parent;
this._parentInstance = parentInstance;
this._context = context;
this._mountID = _host2.default.mountID++;
this._updateCount = 0;
var Component = this._currentElement.type;
var publicProps = this._currentElement.props;
var isClass = Component.prototype;
var isComponentClass = isClass && Component.prototype.isComponentClass;
// Class stateless component without state but have lifecycles
var isStatelessClass = isClass && Component.prototype.render;
// Context process
var publicContext = this._processContext(context);
// Initialize the public class
var instance = void 0;
var renderedElement = void 0;
if (isComponentClass || isStatelessClass) {
// Component instance
instance = new Component(publicProps, publicContext, _updater2.default);
} else if (typeof Component === 'function') {
// Functional stateless component without state and lifecycles
instance = new _stateless2.default(Component);
} else {
throw new Error('Invalid component type: ' + Component + '. (keys: ' + Object.keys(Component) + ')');
}
// These should be set up in the constructor, but as a convenience for
// simpler class abstractions, we set them up after the fact.
instance.props = publicProps;
instance.context = publicContext;
instance.refs = {};
// Inject the updater into instance
instance.updater = _updater2.default;
instance._internal = this;
this._instance = instance;
// Init state, must be set to an object or null
var initialState = instance.state;
if (initialState === undefined) {
// TODO clone the state?
instance.state = initialState = null;
}
var error = null;
var errorCallback = function errorCallback(e) {
error = e;
};
if (instance.componentWillMount) {
performInSandbox(function () {
{
instance.componentWillMount();
}
}, instance, errorCallback);
}
if (renderedElement == null) {
_host2.default.component = this;
// Process pending state when call setState in componentWillMount
instance.state = this._processPendingState(publicProps, publicContext);
performInSandbox(function () {
{
renderedElement = instance.render();
}
}, instance, errorCallback);
_host2.default.component = null;
}
this._renderedComponent = (0, _instantiateComponent2.default)(renderedElement);
this._renderedComponent.mountComponent(this._parent, instance, this._processChildContext(context), childMounter);
if (error) {
handleError(instance, error);
}
if (this._currentElement && this._currentElement.ref) {
_ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this);
}
if (instance.componentDidMount) {
performInSandbox(function () {
{
instance.componentDidMount();
}
}, instance);
}
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
var instance = this._instance;
if (instance.componentWillUnmount) {
performInSandbox(function () {
instance.componentWillUnmount();
}, instance);
}
_host2.default.hook.Reconciler.unmountComponent(this);
instance._internal = null;
if (this._renderedComponent != null) {
var ref = this._currentElement.ref;
if (ref) {
_ref2.default.detach(this._currentElement._owner, ref, this);
}
this._renderedComponent.unmountComponent(notRemoveChild);
this._renderedComponent = null;
this._instance = null;
}
this._currentElement = null;
this._parentInstance = null;
// Reset pending fields
// Even if this component is scheduled for another update in ReactUpdates,
// it would still be ignored because these fields are reset.
this._pendingStateQueue = null;
this._pendingForceUpdate = false;
// These fields do not really need to be reset since this object is no
// longer accessible.
this._context = null;
}
/**
* Filters the context object to only contain keys specified in
* `contextTypes`
*/
}, {
key: '_processContext',
value: function _processContext(context) {
var Component = this._currentElement.type;
var contextTypes = Component.contextTypes;
if (!contextTypes) {
return {};
}
var maskedContext = {};
for (var contextName in contextTypes) {
maskedContext[contextName] = context[contextName];
}
return maskedContext;
}
}, {
key: '_processChildContext',
value: function _processChildContext(currentContext) {
var instance = this._instance;
var childContext = instance.getChildContext && instance.getChildContext();
if (childContext) {
return Object.assign({}, currentContext, childContext);
}
return currentContext;
}
}, {
key: '_processPendingState',
value: function _processPendingState(props, context) {
var instance = this._instance;
var queue = this._pendingStateQueue;
if (!queue) {
return instance.state;
}
// Reset pending queue
this._pendingStateQueue = null;
var nextState = Object.assign({}, instance.state);
for (var i = 0; i < queue.length; i++) {
var partial = queue[i];
Object.assign(nextState, typeof partial === 'function' ? partial.call(instance, nextState, props, context) : partial);
}
return nextState;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevUnmaskedContext, nextUnmaskedContext) {
var instance = this._instance;
if (!instance) {
console.error('Update component \'' + this.getName() + '\' that has already been unmounted (or failed to mount).');
}
var willReceive = false;
var nextContext = void 0;
var nextProps = void 0;
// Determine if the context has changed or not
if (this._context === nextUnmaskedContext) {
nextContext = instance.context;
} else {
nextContext = this._processContext(nextUnmaskedContext);
willReceive = true;
}
// Distinguish between a props update versus a simple state update
if (prevElement === nextElement) {
// Skip checking prop types again -- we don't read component.props to avoid
// warning for DOM component props in this upgrade
nextProps = nextElement.props;
} else {
nextProps = nextElement.props;
willReceive = true;
}
var hasReceived = willReceive && instance.componentWillReceiveProps;
if (hasReceived) {
// Calling this.setState() within componentWillReceiveProps will not trigger an additional render.
this._pendingState = true;
performInSandbox(function () {
instance.componentWillReceiveProps(nextProps, nextContext);
}, instance);
this._pendingState = false;
}
// Update refs
_ref2.default.update(prevElement, nextElement, this);
// Shoud update always default
var shouldUpdate = true;
var prevProps = instance.props;
var prevState = instance.state;
// TODO: could delay execution processPendingState
var nextState = this._processPendingState(nextProps, nextContext);
// ShouldComponentUpdate is not called when forceUpdate is used
if (!this._pendingForceUpdate) {
if (instance.shouldComponentUpdate) {
shouldUpdate = performInSandbox(function () {
return instance.shouldComponentUpdate(nextProps, nextState, nextContext);
}, instance);
} else if (instance.isPureComponentClass) {
shouldUpdate = !(0, _shallowEqual2.default)(prevProps, nextProps) || !(0, _shallowEqual2.default)(prevState, nextState);
}
}
if (shouldUpdate) {
this._pendingForceUpdate = false;
// Will set `this.props`, `this.state` and `this.context`.
var prevContext = instance.context;
// Cannot use this.setState() in componentWillUpdate.
// If need to update state in response to a prop change, use componentWillReceiveProps instead.
performInSandbox(function () {
if (instance.componentWillUpdate) {
instance.componentWillUpdate(nextProps, nextState, nextContext);
}
}, instance);
// Replace with next
this._currentElement = nextElement;
this._context = nextUnmaskedContext;
instance.props = nextProps;
instance.state = nextState;
instance.context = nextContext;
this._updateRenderedComponent(nextUnmaskedContext);
performInSandbox(function () {
if (instance.componentDidUpdate) {
instance.componentDidUpdate(prevProps, prevState, prevContext);
}
}, instance);
this._updateCount++;
} else {
// If it's determined that a component should not update, we still want
// to set props and state but we shortcut the rest of the update.
this._currentElement = nextElement;
this._context = nextUnmaskedContext;
instance.props = nextProps;
instance.state = nextState;
instance.context = nextContext;
}
// Flush setState callbacks set in componentWillReceiveProps
if (hasReceived) {
var callbacks = this._pendingCallbacks;
this._pendingCallbacks = null;
_updater2.default.runCallbacks(callbacks, instance);
}
_host2.default.hook.Reconciler.receiveComponent(this);
}
/**
* Call the component's `render` method and update the DOM accordingly.
*/
}, {
key: '_updateRenderedComponent',
value: function _updateRenderedComponent(context) {
var _this2 = this;
var prevRenderedComponent = this._renderedComponent;
var prevRenderedElement = prevRenderedComponent._currentElement;
var instance = this._instance;
var nextRenderedElement = void 0;
_host2.default.component = this;
performInSandbox(function () {
{
nextRenderedElement = instance.render();
}
}, instance);
_host2.default.component = null;
if ((0, _shouldUpdateComponent2.default)(prevRenderedElement, nextRenderedElement)) {
prevRenderedComponent.updateComponent(prevRenderedElement, nextRenderedElement, prevRenderedComponent._context, this._processChildContext(context));
} else {
var oldChild = prevRenderedComponent.getNativeNode();
prevRenderedComponent.unmountComponent(true);
this._renderedComponent = (0, _instantiateComponent2.default)(nextRenderedElement);
this._renderedComponent.mountComponent(this._parent, instance, this._processChildContext(context), function (newChild, parent) {
// TODO: Duplicate code in native component file
if (!Array.isArray(newChild)) {
newChild = [newChild];
}
// oldChild or newChild all maybe fragment
if (!Array.isArray(oldChild)) {
oldChild = [oldChild];
}
// If newChild count large then oldChild
var lastNewChild = void 0;
for (var i = 0; i < newChild.length; i++) {
var child = newChild[i];
if (oldChild[i]) {
_host2.default.driver.replaceChild(child, oldChild[i]);
} else {
_host2.default.driver.insertAfter(child, lastNewChild);
}
lastNewChild = child;
}
// If newChild count less then oldChild
if (newChild.length < oldChild.length) {
for (var _i = newChild.length; _i < oldChild.length; _i++) {
_host2.default.driver.removeChild(oldChild[_i]);
}
}
});
}
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
var renderedComponent = this._renderedComponent;
if (renderedComponent) {
return renderedComponent.getNativeNode();
}
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
var instance = this._instance;
// The Stateless components cannot be given refs
if (instance instanceof _stateless2.default) {
return null;
}
return instance;
}
}]);
return CompositeComponent;
}();
exports.default = CompositeComponent;
module.exports = exports['default'];
/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Stateless Component Class Wrapper
*/
var StatelessComponent = function () {
function StatelessComponent(pureRender) {
_classCallCheck(this, StatelessComponent);
// A stateless function
this.pureRender = pureRender;
}
_createClass(StatelessComponent, [{
key: 'render',
value: function render() {
return this.pureRender(this.props, this.context);
}
}]);
return StatelessComponent;
}();
exports.default = StatelessComponent;
module.exports = exports['default'];
/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function enqueueCallback(internal, callback) {
if (callback) {
var callbackQueue = internal._pendingCallbacks || (internal._pendingCallbacks = []);
callbackQueue.push(callback);
}
}
function enqueueState(internal, partialState) {
if (partialState) {
var stateQueue = internal._pendingStateQueue || (internal._pendingStateQueue = []);
stateQueue.push(partialState);
}
}
var Updater = {
setState: function setState(component, partialState, callback) {
var internal = component._internal;
if (!internal) {
return;
}
enqueueState(internal, partialState);
enqueueCallback(internal, callback);
// pending in componentWillReceiveProps and componentWillMount
if (!internal._pendingState && internal._renderedComponent) {
this.runUpdate(component);
}
},
forceUpdate: function forceUpdate(component, callback) {
var internal = component._internal;
if (!internal) {
return;
}
internal._pendingForceUpdate = true;
enqueueCallback(internal, callback);
// pending in componentWillMount
if (internal._renderedComponent) {
this.runUpdate(component);
}
},
runUpdate: function runUpdate(component) {
var internal = component._internal;
// If updateComponent happens to enqueue any new updates, we
// shouldn't execute the callbacks until the next render happens, so
// stash the callbacks first
var callbacks = internal._pendingCallbacks;
internal._pendingCallbacks = null;
var prevElement = internal._currentElement;
var prevUnmaskedContext = internal._context;
if (internal._pendingStateQueue || internal._pendingForceUpdate) {
internal.updateComponent(prevElement, prevElement, prevUnmaskedContext, prevUnmaskedContext);
}
this.runCallbacks(callbacks, component);
},
runCallbacks: function runCallbacks(callbacks, context) {
if (callbacks) {
for (var i = 0; i < callbacks.length; i++) {
callbacks[i].call(context);
}
}
}
};
exports.default = Updater;
module.exports = exports["default"];
/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var hasOwnProperty = Object.prototype.hasOwnProperty;
/**
* inlined Object.is polyfill to avoid requiring consumers ship their own
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
*/
function is(x, y) {
// SameValue algorithm
if (x === y) {
// Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
}
/**
* Performs equality by iterating through keys on an object and returning false
* when any key has values which are not strictly equal between the arguments.
* Returns true when the values of all keys are strictly equal.
*/
function shallowEqual(objA, objB) {
if (is(objA, objB)) {
return true;
}
if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
// Test for A's keys different from B.
for (var i = 0; i < keysA.length; i++) {
if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
return false;
}
}
return true;
}
exports.default = shallowEqual;
module.exports = exports['default'];
/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _native = __webpack_require__(11);
var _native2 = _interopRequireDefault(_native);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _getElementKeyName = __webpack_require__(13);
var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
/**
* Fragment Component
*/
var FragmentComponent = function (_NativeComponent) {
_inherits(FragmentComponent, _NativeComponent);
function FragmentComponent(element) {
_classCallCheck(this, FragmentComponent);
return _possibleConstructorReturn(this, (FragmentComponent.__proto__ || Object.getPrototypeOf(FragmentComponent)).call(this, element));
}
_createClass(FragmentComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, parentInstance, context, childMounter) {
// Parent native element
this._parent = parent;
this._parentInstance = parentInstance;
this._context = context;
this._mountID = _host2.default.mountID++;
var instance = {
_internal: this
};
this._instance = instance;
var fragment = this.getNativeNode();
var children = this._currentElement;
// Process children
this.mountChildren(children, context);
if (childMounter) {
childMounter(fragment, parent);
} else {
var isFragmentParent = Array.isArray(parent);
for (var i = 0; i < fragment.length; i++) {
var child = fragment[i];
// When the parent is also a fragment
if (isFragmentParent) {
parent.push(child);
} else {
_host2.default.driver.appendChild(child, parent);
}
}
}
return instance;
}
}, {
key: 'mountChildren',
value: function mountChildren(children, context) {
var _this2 = this;
var renderedChildren = this._renderedChildren = {};
var fragment = this.getNativeNode();
var renderedChildrenImage = children.map(function (element, index) {
var renderedChild = (0, _instantiateComponent2.default)(element);
var name = (0, _getElementKeyName2.default)(renderedChildren, element, index);
renderedChildren[name] = renderedChild;
renderedChild._mountIndex = index;
// Mount
var mountImage = renderedChild.mountComponent(_this2._parent, _this2._instance, context, function (nativeNode) {
if (Array.isArray(nativeNode)) {
for (var i = 0; i < nativeNode.length; i++) {
fragment.push(nativeNode[i]);
}
} else {
fragment.push(nativeNode);
}
});
return mountImage;
});
return renderedChildrenImage;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
var this$1 = this;
if (this._nativeNode) {
_instance2.default.remove(this._nativeNode);
if (!notRemoveChild) {
for (var i = 0; i < this._nativeNode.length; i++) {
_host2.default.driver.removeChild(this$1._nativeNode[i]);
}
}
}
// Do not need remove child when their parent is removed
this.unmountChildren(true);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._parentInstance = null;
this._context = null;
this._instance = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevContext, nextContext) {
// Replace current element
this._currentElement = nextElement;
this.updateChildren(this._currentElement, nextContext);
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = [];
}
return this._nativeNode;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getNativeNode();
}
}, {
key: 'getName',
value: function getName() {
return 'fragment';
}
}]);
return FragmentComponent;
}(_native2.default);
exports.default = FragmentComponent;
module.exports = exports['default'];
/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
}; /**
* Weex driver
*/
var _styleUnit = __webpack_require__(14);
var _elements = __webpack_require__(31);
var _elements2 = _interopRequireDefault(_elements);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var STYLE = 'style';
var ID = 'id';
var TEXT = 'text';
var CHILDREN = 'children';
var EVENT_PREFIX_REGEXP = /^on[A-Z]/;
var ARIA_PREFIX_REGEXP = /^aria-/;
var nodeMaps = {};
/* global __weex_document__ */
var document = (typeof __weex_document__ === 'undefined' ? 'undefined' : _typeof(__weex_document__)) === 'object' ? __weex_document__ : (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object' ? document : null;
var Driver = {
deviceWidth: 750,
viewportWidth: 750,
getDeviceWidth: function getDeviceWidth() {
return this.deviceWidth;
},
setDeviceWidth: function setDeviceWidth(width) {
this.deviceWidth = width;
},
getViewportWidth: function getViewportWidth() {
return this.viewportWidth;
},
setViewportWidth: function setViewportWidth(width) {
this.viewportWidth = width;
},
getElementById: function getElementById(id) {
return nodeMaps[id];
},
createBody: function createBody() {
if (document.body) {
return document.body;
}
var documentElement = document.documentElement;
var body = document.createBody();
documentElement.appendChild(body);
return body;
},
createComment: function createComment(content) {
return document.createComment(content);
},
createEmpty: function createEmpty() {
return this.createComment(' empty ');
},
createText: function createText(text) {
return Driver.createElement({
type: TEXT,
props: {
value: text
}
});
},
updateText: function updateText(node, content) {
this.setAttribute(node, 'value', content);
},
createElement: function createElement(component) {
var htmlElement = _elements2.default[component.type];
if (htmlElement) {
component = htmlElement.parse(component);
}
var props = component.props;
var events = [];
var style = {};
var originStyle = props[STYLE];
for (var prop in originStyle) {
style[prop] = (0, _styleUnit.convertUnit)(originStyle[prop], prop);
}
var node = document.createElement(component.type, {
style: style
});
this.setNativeProps(node, props, true);
return node;
},
appendChild: function appendChild(node, parent) {
return parent.appendChild(node);
},
removeChild: function removeChild(node, parent) {
parent = parent || node.parentNode;
var id = node.attr && node.attr[ID];
if (id != null) {
nodeMaps[id] = null;
}
return parent.removeChild(node);
},
replaceChild: function replaceChild(newChild, oldChild, parent) {
parent = parent || oldChild.parentNode;
var previousSibling = oldChild.previousSibling;
var nextSibling = oldChild.nextSibling;
this.removeChild(oldChild, parent);
if (previousSibling) {
this.insertAfter(newChild, previousSibling, parent);
} else if (nextSibling) {
this.insertBefore(newChild, nextSibling, parent);
} else {
this.appendChild(newChild, parent);
}
},
insertAfter: function insertAfter(node, after, parent) {
parent = parent || after.parentNode;
return parent.insertAfter(node, after);
},
insertBefore: function insertBefore(node, before, parent) {
parent = parent || before.parentNode;
return parent.insertBefore(node, before);
},
addEventListener: function addEventListener(node, eventName, eventHandler, props) {
var params = props[eventName + 'EventParams'];
return node.addEvent(eventName, eventHandler, params);
},
removeEventListener: function removeEventListener(node, eventName, eventHandler) {
return node.removeEvent(eventName, eventHandler);
},
removeAllEventListeners: function removeAllEventListeners(node) {
// Noop
},
removeAttribute: function removeAttribute(node, propKey, propValue) {
if (propKey == ID) {
nodeMaps[propValue] = null;
}
// Weex native will crash when pass null value
return node.setAttr(propKey, undefined, false);
},
setAttribute: function setAttribute(node, propKey, propValue) {
if (propKey == ID) {
nodeMaps[propValue] = node;
}
// Weex only support `ariaLabel` format, convert `aria-label` format to camelcase
if (ARIA_PREFIX_REGEXP.test(propKey)) {
propKey = propKey.replace(/\-(\w)/, function (m, p1) {
return p1.toUpperCase();
});
}
return node.setAttr(propKey, propValue, false);
},
setStyles: function setStyles(node, styles) {
// TODO if more then one style update, call setStyles will be better performance
for (var key in styles) {
var val = styles[key];
val = (0, _styleUnit.convertUnit)(val, key);
node.setStyle(key, val);
}
},
beforeRender: function beforeRender() {
// Turn off batched updates
document.open();
// Init rem unit
(0, _styleUnit.setRem)(this.getDeviceWidth() / this.getViewportWidth());
},
afterRender: function afterRender() {
if (document.listener && document.listener.createFinish) {
document.listener.createFinish();
}
// Turn on batched updates
document.close();
},
setNativeProps: function setNativeProps(node, props, skipSetStyles) {
var this$1 = this;
for (var prop in props) {
var value = props[prop];
if (prop === CHILDREN) {
continue;
}
if (value != null) {
if (prop === STYLE) {
if (skipSetStyles) {
continue;
}
this$1.setStyles(node, value);
} else if (EVENT_PREFIX_REGEXP.test(prop)) {
var eventName = prop.slice(2).toLowerCase();
this$1.addEventListener(node, eventName, value, props);
} else {
this$1.setAttribute(node, prop, value);
}
}
}
}
};
exports.default = Driver;
module.exports = exports['default'];
/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _img = __webpack_require__(32);
var _img2 = _interopRequireDefault(_img);
var _video = __webpack_require__(33);
var _video2 = _interopRequireDefault(_video);
var _textarea = __webpack_require__(34);
var _textarea2 = _interopRequireDefault(_textarea);
var _span = __webpack_require__(35);
var _span2 = _interopRequireDefault(_span);
var _p = __webpack_require__(36);
var _p2 = _interopRequireDefault(_p);
var _button = __webpack_require__(37);
var _button2 = _interopRequireDefault(_button);
var _heading = __webpack_require__(38);
var _heading2 = _interopRequireDefault(_heading);
var _block = __webpack_require__(39);
var _block2 = _interopRequireDefault(_block);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
exports.default = {
span: _span2.default,
p: _p2.default,
img: _img2.default,
button: _button2.default,
video: _video2.default,
textarea: _textarea2.default,
h1: _heading2.default,
h2: _heading2.default,
h3: _heading2.default,
h4: _heading2.default,
h5: _heading2.default,
h6: _heading2.default,
nav: _block2.default,
article: _block2.default,
section: _block2.default,
// Conflict with weex header tag
// header: block,
footer: _block2.default,
aside: _block2.default,
main: _block2.default
};
module.exports = exports['default'];
/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _parseProps = __webpack_require__(15);
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
component.type = 'image';
// modify props
component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']);
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _parseProps = __webpack_require__(15);
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
// modify props
component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']);
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
parse: function parse(component) {
var props = component.props;
component.type = 'text';
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
var BASE_FONT_SIZE = 28;
var defaultParagraphStyle = {
fontSize: BASE_FONT_SIZE,
marginTop: BASE_FONT_SIZE,
marginBottom: BASE_FONT_SIZE
};
var TypographyElements = {
u: {
textDecoration: 'underline'
},
s: {
textDecoration: 'line-through'
},
i: {
fontStyle: 'italic'
},
b: {
fontWeight: 'bold'
},
del: {
textDecoration: 'line-through'
},
em: {
fontStyle: 'italic'
},
strong: {
fontWeight: 'bold'
},
big: {
fontSize: BASE_FONT_SIZE * 1.2
},
small: {
fontSize: BASE_FONT_SIZE * 0.8
}
};
function transformString(string) {
return {
type: 'span',
attr: {
value: string
}
};
}
function transformChild(child) {
var type = child.type;
var props = child.props;
var style = props.style;
var nestedChildren = props.children;
// Alias img tag
if (type === 'img') {
type = 'image';
}
// Transfrom to span
if (TypographyElements[type]) {
style = _extends({}, TypographyElements[type], style);
type = 'span';
}
props.style = null;
props.children = null;
var element = {
type: type,
style: style,
attr: props || {}
};
if (nestedChildren) {
if (type === 'span' && typeof nestedChildren === 'string') {
element.attr.value = nestedChildren;
} else {
element.children = transformChildren(nestedChildren);
}
}
return element;
}
function transformChildren(children) {
var elements = [];
if (!Array.isArray(children)) {
children = [children];
}
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (typeof child === 'string') {
elements.push(transformString(child));
} else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') {
elements.push(transformChild(child));
}
}
return elements;
}
exports.default = {
parse: function parse(component) {
var props = component.props;
var children = props.children;
component.type = 'richtext';
props.style = _extends({}, defaultParagraphStyle, props.style);
props.value = transformChildren(children);
props.children = null;
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
/**
* weex button
*
* props: disabled, style
*/
exports.default = {
parse: function parse(component) {
var props = component.props;
component.type = 'text';
var style = props.style,
disabled = props.disabled,
children = props.children;
var textStyle = _extends({
textAlign: 'center',
fontSize: 22,
paddingTop: 4,
paddingRight: 12,
paddingBottom: 6,
paddingLeft: 12,
borderWidth: 4,
borderStyle: 'solid',
borderColor: '#000000',
backgroudColor: '#c0c0c0'
}, style);
if (disabled) {
props.onClick = null;
textStyle = _extends({}, textStyle, {
color: '#7f7f7f',
borderColor: '#7f7f7f'
});
}
if (typeof children === 'string') {
props.value = children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
var BASE_FONT_SIZE = 28;
function generateHeadingStyle(baseFontSize, fontMultiplier, marginMultiplier) {
return {
fontSize: baseFontSize * fontMultiplier,
marginTop: baseFontSize * fontMultiplier * marginMultiplier,
marginBottom: baseFontSize * fontMultiplier * marginMultiplier,
fontWeight: 'bold'
};
}
var HeadingElements = {
h1: generateHeadingStyle(BASE_FONT_SIZE, 2, 0.67),
h2: generateHeadingStyle(BASE_FONT_SIZE, 1.5, 0.83),
h3: generateHeadingStyle(BASE_FONT_SIZE, 1.17, 1),
h4: generateHeadingStyle(BASE_FONT_SIZE, 1, 1.33),
h5: generateHeadingStyle(BASE_FONT_SIZE, 0.83, 1.67),
h6: generateHeadingStyle(BASE_FONT_SIZE, 0.67, 2.33)
};
exports.default = {
parse: function parse(component) {
var type = component.type,
props = component.props;
component.type = 'text';
props.style = _extends({}, HeadingElements[type] || HeadingElements.h6, props.style);
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
component.type = 'div';
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _styleUnit = __webpack_require__(14);
var _flexbox = __webpack_require__(41);
var _flexbox2 = _interopRequireDefault(_flexbox);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Web Browser driver
**/
/* global DEVICE_WIDTH, VIEWPORT_WIDTH */
var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
var CLASS_NAME = 'className';
var CLASS = 'class';
var STYLE = 'style';
var CHILDREN = 'children';
var EVENT_PREFIX_REGEXP = /on[A-Z]/;
var ADD_EVENT = 'addEvent';
var REMOVE_EVENT = 'removeEvent';
var Driver = {
deviceWidth: typeof DEVICE_WIDTH !== 'undefined' && DEVICE_WIDTH || null,
viewportWidth: typeof VIEWPORT_WIDTH !== 'undefined' && VIEWPORT_WIDTH || 750,
eventRegistry: {},
getDeviceWidth: function getDeviceWidth() {
return this.deviceWidth || document.documentElement.clientWidth;
},
setDeviceWidth: function setDeviceWidth(width) {
this.deviceWidth = width;
},
getViewportWidth: function getViewportWidth() {
return this.viewportWidth;
},
setViewportWidth: function setViewportWidth(width) {
this.viewportWidth = width;
},
getElementById: function getElementById(id) {
return document.getElementById(id);
},
createBody: function createBody() {
return document.body;
},
createComment: function createComment(content) {
return document.createComment(content);
},
createEmpty: function createEmpty() {
return this.createComment(' empty ');
},
createText: function createText(text) {
return document.createTextNode(text);
},
updateText: function updateText(node, text) {
var textContentAttr = 'textContent' in document ? 'textContent' : 'nodeValue';
node[textContentAttr] = text;
},
createElement: function createElement(component) {
var node = document.createElement(component.type);
var props = component.props;
this.setNativeProps(node, props);
return node;
},
appendChild: function appendChild(node, parent) {
return parent.appendChild(node);
},
removeChild: function removeChild(node, parent) {
parent = parent || node.parentNode;
// Maybe has been removed when remove child
if (parent) {
parent.removeChild(node);
}
},
replaceChild: function replaceChild(newChild, oldChild, parent) {
parent = parent || oldChild.parentNode;
parent.replaceChild(newChild, oldChild);
},
insertAfter: function insertAfter(node, after, parent) {
parent = parent || after.parentNode;
var nextSibling = after.nextSibling;
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
},
insertBefore: function insertBefore(node, before, parent) {
parent = parent || before.parentNode;
parent.insertBefore(node, before);
},
addEventListener: function addEventListener(node, eventName, eventHandler, props) {
if (this.eventRegistry[eventName]) {
return this.eventRegistry[eventName](ADD_EVENT, node, eventName, eventHandler, props);
} else {
return node.addEventListener(eventName, eventHandler);
}
},
removeEventListener: function removeEventListener(node, eventName, eventHandler, props) {
if (this.eventRegistry[eventName]) {
return this.eventRegistry[eventName](REMOVE_EVENT, node, eventName, eventHandler, props);
} else {
return node.removeEventListener(eventName, eventHandler);
}
},
removeAllEventListeners: function removeAllEventListeners(node) {
// noop
},
removeAttribute: function removeAttribute(node, propKey) {
if (propKey === DANGEROUSLY_SET_INNER_HTML) {
return node.innerHTML = null;
}
if (propKey === CLASS_NAME) {
propKey = CLASS;
}
if (propKey in node) {
try {
// Some node property is readonly when in strict mode
node[propKey] = null;
} catch (e) {}
}
node.removeAttribute(propKey);
},
setAttribute: function setAttribute(node, propKey, propValue) {
if (propKey === DANGEROUSLY_SET_INNER_HTML) {
return node.innerHTML = propValue.__html;
}
if (propKey === CLASS_NAME) {
propKey = CLASS;
}
if (propKey in node) {
try {
// Some node property is readonly when in strict mode
node[propKey] = propValue;
} catch (e) {
node.setAttribute(propKey, propValue);
}
} else {
node.setAttribute(propKey, propValue);
}
},
setStyles: function setStyles(node, styles) {
var tranformedStyles = {};
for (var prop in styles) {
var val = styles[prop];
if (_flexbox2.default.isFlexProp(prop)) {
_flexbox2.default[prop](val, tranformedStyles);
} else {
tranformedStyles[prop] = (0, _styleUnit.convertUnit)(val, prop);
}
}
for (var _prop in tranformedStyles) {
var transformValue = tranformedStyles[_prop];
// hack handle compatibility issue
if (Array.isArray(transformValue)) {
for (var i = 0; i < transformValue.length; i++) {
node.style[_prop] = transformValue[i];
}
} else {
node.style[_prop] = transformValue;
}
}
},
beforeRender: function beforeRender() {
// Init rem unit
(0, _styleUnit.setRem)(this.getDeviceWidth() / this.getViewportWidth());
},
setNativeProps: function setNativeProps(node, props) {
var this$1 = this;
for (var prop in props) {
var value = props[prop];
if (prop === CHILDREN) {
continue;
}
if (value != null) {
if (prop === STYLE) {
this$1.setStyles(node, value);
} else if (EVENT_PREFIX_REGEXP.test(prop)) {
var eventName = prop.slice(2).toLowerCase();
this$1.addEventListener(node, eventName, value);
} else {
this$1.setAttribute(node, prop, value);
}
}
}
}
};
exports.default = Driver;
module.exports = exports['default'];
/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var BOX_ALIGN = {
stretch: 'stretch',
'flex-start': 'start',
'flex-end': 'end',
center: 'center'
};
var BOX_ORIENT = {
row: 'horizontal',
column: 'vertical'
};
var BOX_PACK = {
'flex-start': 'start',
'flex-end': 'end',
center: 'center',
'space-between': 'justify',
'space-around': 'justify' // Just same as `space-between`
};
var FLEX_PROPS = {
display: true,
flex: true,
alignItems: true,
alignSelf: true,
flexDirection: true,
justifyContent: true,
flexWrap: true
};
var Flexbox = {
isFlexProp: function isFlexProp(prop) {
return FLEX_PROPS[prop];
},
display: function display(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (value === 'flex') {
style.display = ['-webkit-box', '-webkit-flex', 'flex'];
} else {
style.display = value;
}
return style;
},
flex: function flex(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxFlex = value;
style.webkitFlex = value;
style.flex = value;
return style;
},
flexWrap: function flexWrap(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.flexWrap = value;
return style;
},
alignItems: function alignItems(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxAlign = BOX_ALIGN[value];
style.webkitAlignItems = value;
style.alignItems = value;
return style;
},
alignSelf: function alignSelf(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitAlignSelf = value;
style.alignSelf = value;
return style;
},
flexDirection: function flexDirection(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxOrient = BOX_ORIENT[value];
style.webkitFlexDirection = value;
style.flexDirection = value;
return style;
},
justifyContent: function justifyContent(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxPack = BOX_PACK[value];
style.webkitJustifyContent = value;
style.justifyContent = value;
return style;
}
};
exports.default = Flexbox;
module.exports = exports['default'];
/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _render = __webpack_require__(10);
var _render2 = _interopRequireDefault(_render);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function hydrate(element, container, options, callback) {
// Handle server rendered element
if (container.childNodes) {
// Clone childNodes, Because removeChild will causing change in childNodes length
var childNodes = [].concat(_toConsumableArray(container.childNodes));
for (var i = 0; i < childNodes.length; i++) {
var rootChildNode = childNodes[i];
container.removeChild(rootChildNode);
}
}
return (0, _render2.default)(element, container, options, callback);
}
exports.default = hydrate;
module.exports = exports['default'];
/***/ }),
/* 43 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findComponentInstance(node) {
if (node == null) {
return null;
}
return _instance2.default.get(node);
}
exports.default = findComponentInstance;
module.exports = exports['default'];
/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = setNativeProps;
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _findDOMNode = __webpack_require__(16);
var _findDOMNode2 = _interopRequireDefault(_findDOMNode);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function setNativeProps(node, props) {
node = (0, _findDOMNode2.default)(node);
_host2.default.driver.setNativeProps(node, props);
}
module.exports = exports['default'];
/***/ }),
/* 45 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = '0.4.20';
module.exports = exports['default'];
/***/ }),
/* 46 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _flattenChildren = __webpack_require__(7);
var _flattenChildren2 = _interopRequireDefault(_flattenChildren);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function convertChildrenToArray(children) {
// flatten children
children = (0, _flattenChildren2.default)(children, []);
return Array.isArray(children) ? children : [].concat(children);
}
var Children = {
map: function map(children, fn, ctx) {
if (children == null) { return null; }
children = convertChildrenToArray(children);
return children.map(function (child, index) {
return fn.call(ctx, child, index);
});
},
forEach: function forEach(children, fn, ctx) {
if (children == null) { return null; }
children = convertChildrenToArray(children);
children.forEach(function (child, index) {
return fn.call(ctx, child, index);
});
},
count: function count(children) {
if (children == null) { return 0; }
return convertChildrenToArray(children).length;
},
only: function only(children) {
// `only` receive rax element child
// null value is not acceptable
children = Children.toArray(children);
if (children.length !== 1) { throw new Error('Children.only: expected to receive a single element child.'); }
return children[0];
},
toArray: function toArray(children) {
if (children == null) { return []; }
// `toArray` filter null value
return convertChildrenToArray(children).filter(function (child) {
return child !== null;
});
}
};
exports.default = Children;
module.exports = exports['default'];
/***/ })
/******/ ]);};
/***/ }),
/* 6 */
/*!*********************************************************!*\
!*** ./packages/runtime-shared/dist/shared.function.js ***!
\*********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports) {
module.exports = function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 2);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off", new-cap: "off" */
var defineProperties = Object.defineProperties,
defineProperty = Object.defineProperty,
SymbolPolyfill,
HiddenSymbol,
globalSymbols = Object.create(null);
function isSymbol(x) {
if (!x) { return false; }
if ((typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'symbol') { return true; }
if (!x.constructor) { return false; }
if (x.constructor.name !== 'Symbol') { return false; }
return x[x.constructor.toStringTag] === 'Symbol';
}
function validateSymbol(value) {
if (!isSymbol(value)) { throw new TypeError(value + ' is not a symbol'); }
return value;
}
var generateName = function () {
var created = Object.create(null);
return function (desc) {
var postfix = 0,
name;
while (created[desc + (postfix || '')]) {
++postfix;
}desc += postfix || '';
created[desc] = true;
name = '@@' + desc;
return name;
};
}();
// Internal constructor (not one exposed) for creating Symbol instances.
// This one is used to ensure that `someSymbol instanceof Symbol` always return false
HiddenSymbol = function _Symbol(description) {
if (this instanceof HiddenSymbol) { throw new TypeError('Symbol is not a constructor'); }
return SymbolPolyfill(description);
};
// Exposed `Symbol` constructor
// (returns instances of HiddenSymbol)
module.exports = SymbolPolyfill = function _Symbol2(description) {
var symbol;
if (this instanceof _Symbol2) { throw new TypeError('Symbol is not a constructor'); }
symbol = Object.create(HiddenSymbol.prototype);
description = description === undefined ? '' : String(description);
return defineProperties(symbol, {
__description__: { value: description },
__name__: { value: generateName(description) }
});
};
defineProperties(SymbolPolyfill, {
for: { value: function value(key) {
if (globalSymbols[key]) { return globalSymbols[key]; }
return globalSymbols[key] = SymbolPolyfill(String(key));
} },
keyFor: { value: function value(s) {
var key;
validateSymbol(s);
for (key in globalSymbols) {
if (globalSymbols[key] === s) { return key; }
}
} },
// To ensure proper interoperability with other native functions (e.g. Array.from)
// fallback to eventual native implementation of given symbol
hasInstance: { value: SymbolPolyfill('hasInstance') },
isConcatSpreadable: { value: SymbolPolyfill('isConcatSpreadable') },
iterator: { value: SymbolPolyfill('iterator') },
match: { value: SymbolPolyfill('match') },
replace: { value: SymbolPolyfill('replace') },
search: { value: SymbolPolyfill('search') },
species: { value: SymbolPolyfill('species') },
split: { value: SymbolPolyfill('split') },
toPrimitive: { value: SymbolPolyfill('toPrimitive') },
toStringTag: { value: SymbolPolyfill('toStringTag') },
unscopables: { value: SymbolPolyfill('unscopables') }
});
// Internal tweaks for real symbol producer
defineProperties(HiddenSymbol.prototype, {
constructor: { value: SymbolPolyfill },
toString: { value: function value() {
return this.__name__;
} }
});
// Proper implementation of methods exposed on Symbol.prototype
// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
defineProperties(SymbolPolyfill.prototype, {
toString: { value: function value() {
return 'Symbol (' + validateSymbol(this).__description__ + ')';
} },
valueOf: { value: function value() {
return validateSymbol(this);
} }
});
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, {
value: function value() {
var symbol = validateSymbol(this);
if ((typeof symbol === 'undefined' ? 'undefined' : _typeof(symbol)) === 'symbol') { return symbol; }
return symbol.toString();
}
});
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, { value: 'Symbol' });
// Proper implementaton of toPrimitive and toStringTag for returned symbol instances
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag, { value: SymbolPolyfill.prototype[SymbolPolyfill.toStringTag] });
// Note: It's important to define `toPrimitive` as last one, as some implementations
// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
// And that may invoke error in definition flow:
// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive, { value: SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive] });
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
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; }; }(); // https://github.com/WebReflection/url-search-params
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var find = /[!'\(\)~]|%20|%00/g;
var plus = /\+/g;
var replace = {
'!': '%21',
"'": '%27',
'(': '%28',
')': '%29',
'~': '%7E',
'%20': '+',
'%00': '\x00'
};
var replacer = function replacer(match) {
return replace[match];
};
var secret = '__URLSearchParams__';
function encode(str) {
return encodeURIComponent(str).replace(find, replacer);
}
function decode(str) {
return decodeURIComponent(str.replace(plus, ' '));
}
var URLSearchParams = function () {
function URLSearchParams(query) {
var this$1 = this;
_classCallCheck(this, URLSearchParams);
this[secret] = Object.create(null);
if (!query) { return; }
if (query.charAt(0) === '?') {
query = query.slice(1);
}
for (var index, value, pairs = (query || '').split('&'), i = 0, length = pairs.length; i < length; i++) {
value = pairs[i];
index = value.indexOf('=');
if (-1 < index) {
this$1.append(decode(value.slice(0, index)), decode(value.slice(index + 1)));
} else if (value.length) {
this$1.append(decode(value), '');
}
}
}
_createClass(URLSearchParams, [{
key: 'append',
value: function append(name, value) {
var dict = this[secret];
if (name in dict) {
dict[name].push('' + value);
} else {
dict[name] = ['' + value];
}
}
}, {
key: 'delete',
value: function _delete(name) {
delete this[secret][name];
}
}, {
key: 'get',
value: function get(name) {
var dict = this[secret];
return name in dict ? dict[name][0] : null;
}
}, {
key: 'getAll',
value: function getAll(name) {
var dict = this[secret];
return name in dict ? dict[name].slice(0) : [];
}
}, {
key: 'has',
value: function has(name) {
return name in this[secret];
}
}, {
key: 'set',
value: function set(name, value) {
this[secret][name] = ['' + value];
}
}, {
key: 'forEach',
value: function forEach(callback, thisArg) {
var dict = this[secret];
Object.getOwnPropertyNames(dict).forEach(function (name) {
dict[name].forEach(function (value) {
callback.call(thisArg, value, name, this);
}, this);
}, this);
}
}, {
key: 'keys',
value: function keys() {
var items = [];
this.forEach(function (value, name) {
items.push(name);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'values',
value: function values() {
var items = [];
this.forEach(function (value) {
items.push(value);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'entries',
value: function entries() {
var items = [];
this.forEach(function (value, name) {
items.push([name, value]);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'toString',
value: function toString() {
var dict = this[secret],
query = [],
i,
key,
name,
value;
for (key in dict) {
name = encode(key);
for (i = 0, value = dict[key]; i < value.length; i++) {
query.push(name + '=' + encode(value[i]));
}
}
return query.join('&');
}
}]);
return URLSearchParams;
}();
URLSearchParams.prototype[_symbol2.default.iterator] = URLSearchParams.prototype.entries;
module.exports = URLSearchParams;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = {
get Promise() {
return __webpack_require__(3);
},
get Symbol() {
return __webpack_require__(0);
},
get Map() {
return __webpack_require__(4);
},
get Set() {
return __webpack_require__(5);
},
get WeakMap() {
return __webpack_require__(6);
},
get WeakSet() {
return __webpack_require__(7);
},
get FontFace() {
return __webpack_require__(8);
},
get URL() {
return __webpack_require__(9);
},
get URLSearchParams() {
return __webpack_require__(1);
},
get matchMedia() {
return __webpack_require__(10);
}
};
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off" */
function noop() {}
// Use polyfill for setImmediate for performance gains
var asap = typeof setImmediate === 'function' && setImmediate || function (fn) {
if (typeof setTimeout === 'function') {
setTimeout(fn, 0);
} else {
fn();
}
};
var onUnhandledRejection = function onUnhandledRejection(err) {
if (typeof console !== 'undefined' && console) {
console.log('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
}
};
// Polyfill for Function.prototype.bind
function bind(fn, thisArg) {
return function () {
fn.apply(thisArg, arguments);
};
}
function Promise(fn) {
if (_typeof(this) !== 'object') { throw new TypeError('Promises must be constructed via new'); }
if (typeof fn !== 'function') { throw new TypeError('Promise resolver is not a function'); }
this._state = 0;
this._handled = false;
this._value = undefined;
this._deferreds = [];
doResolve(fn, this);
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value;
}
if (self._state === 0) {
self._deferreds.push(deferred);
return;
}
self._handled = true;
asap(function () {
var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self._state === 1 ? resolve : reject)(deferred.promise, self._value);
return;
}
var ret;
try {
ret = cb(self._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self, newValue) {
try {
// Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
if (newValue === self) { throw new TypeError('A promise cannot be resolved with itself.'); }
if (newValue && ((typeof newValue === 'undefined' ? 'undefined' : _typeof(newValue)) === 'object' || typeof newValue === 'function')) {
var then = newValue.then;
if (newValue instanceof Promise) {
self._state = 3;
self._value = newValue;
finale(self);
return;
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self);
return;
}
}
self._state = 1;
self._value = newValue;
finale(self);
} catch (e) {
reject(self, e);
}
}
function reject(self, newValue) {
self._state = 2;
self._value = newValue;
finale(self);
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
asap(function () {
if (!self._handled) {
onUnhandledRejection(self._value);
}
});
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i]);
}
self._deferreds = null;
}
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
this.onRejected = typeof onRejected === 'function' ? onRejected : null;
this.promise = promise;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*/
function doResolve(fn, self) {
var done = false;
try {
fn(function (value) {
if (done) { return; }
done = true;
resolve(self, value);
}, function (reason) {
if (done) { return; }
done = true;
reject(self, reason);
});
} catch (ex) {
if (done) { return; }
done = true;
reject(self, ex);
}
}
Promise.prototype.catch = function (onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function (onFulfilled, onRejected) {
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise.all = function (arr) {
var args = Array.prototype.slice.call(arr);
return new Promise(function (resolve, reject) {
if (args.length === 0) { return resolve([]); }
var remaining = args.length;
function res(i, val) {
try {
if (val && ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' || typeof val === 'function')) {
var then = val.then;
if (typeof then === 'function') {
then.call(val, function (val) {
res(i, val);
}, reject);
return;
}
}
args[i] = val;
if (--remaining === 0) {
resolve(args);
}
} catch (ex) {
reject(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise.resolve = function (value) {
if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.constructor === Promise) {
return value;
}
return new Promise(function (resolve) {
resolve(value);
});
};
Promise.reject = function (value) {
return new Promise(function (resolve, reject) {
reject(value);
});
};
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject);
}
});
};
/**
* Set the immediate function to execute callbacks
* @param fn {function} Function to execute
* @private
*/
Promise._setImmediateFn = function _setImmediateFn(fn) {
asap = fn;
};
Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
onUnhandledRejection = fn;
};
module.exports = Promise;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol.
var undefMarker = (0, _symbol2.default)('undef');
// NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol.
/* eslint no-extend-native: "off" */
var NaNMarker = (0, _symbol2.default)('NaN');
var ACCESSOR_SUPPORT = true;
function encodeKey(key) {
return Number.isNaN(key) ? NaNMarker : key;
}
function decodeKey(encodedKey) {
return encodedKey === NaNMarker ? NaN : encodedKey;
}
function makeIterator(mapInst, getter) {
var nextIdx = 0;
var done = false;
return {
next: function next() {
if (nextIdx === mapInst._keys.length) { done = true; }
if (!done) {
while (mapInst._keys[nextIdx] === undefMarker) {
nextIdx++;
}return { value: getter.call(mapInst, nextIdx++), done: false };
} else {
return { value: void 0, done: true };
}
}
};
}
function calcSize(mapInst) {
var size = 0;
for (var i = 0, s = mapInst._keys.length; i < s; i++) {
if (mapInst._keys[i] !== undefMarker) { size++; }
}
return size;
}
function hasProtoMethod(instance, method) {
return typeof instance[method] === 'function';
}
var Map = function Map(data) {
this._keys = [];
this._values = [];
// If `data` is iterable (indicated by presence of a forEach method), pre-populate the map
if (data && hasProtoMethod(data, 'forEach')) {
// Fastpath: If `data` is a Map, shortcircuit all following the checks
if (data instanceof Map ||
// If `data` is not an instance of Map, it could be because you have a Map from an iframe or a worker or something.
// Check if `data` has all the `Map` methods and if so, assume data is another Map
hasProtoMethod(data, 'clear') && hasProtoMethod(data, 'delete') && hasProtoMethod(data, 'entries') && hasProtoMethod(data, 'forEach') && hasProtoMethod(data, 'get') && hasProtoMethod(data, 'has') && hasProtoMethod(data, 'keys') && hasProtoMethod(data, 'set') && hasProtoMethod(data, 'values')) {
data.forEach(function (value, key) {
this.set.apply(this, [key, value]);
}, this);
} else {
data.forEach(function (item) {
this.set.apply(this, item);
}, this);
}
}
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
};
Map.prototype = {};
// Some old engines do not support ES5 getters/setters. Since Map only requires these for the size property, we can fall back to setting the size property statically each time the size of the map changes.
try {
Object.defineProperty(Map.prototype, 'size', {
get: function get() {
return calcSize(this);
}
});
} catch (e) {
ACCESSOR_SUPPORT = false;
}
Map.prototype.get = function (key) {
var idx = this._keys.indexOf(encodeKey(key));
return idx !== -1 ? this._values[idx] : undefined;
};
Map.prototype.set = function (key, value) {
var idx = this._keys.indexOf(encodeKey(key));
if (idx !== -1) {
this._values[idx] = value;
} else {
this._keys.push(encodeKey(key));
this._values.push(value);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
}
return this;
};
Map.prototype.has = function (key) {
return this._keys.indexOf(encodeKey(key)) !== -1;
};
Map.prototype.delete = function (key) {
var idx = this._keys.indexOf(encodeKey(key));
if (idx === -1) { return false; }
this._keys[idx] = undefMarker;
this._values[idx] = undefMarker;
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
return true;
};
Map.prototype.clear = function () {
this._keys = this._values = [];
if (!ACCESSOR_SUPPORT) { this.size = 0; }
};
Map.prototype.values = function () {
return makeIterator(this, function (i) {
return this._values[i];
});
};
Map.prototype.keys = function () {
return makeIterator(this, function (i) {
return decodeKey(this._keys[i]);
});
};
Map.prototype.entries = Map.prototype[_symbol2.default.iterator] = function () {
return makeIterator(this, function (i) {
return [decodeKey(this._keys[i]), this._values[i]];
});
};
Map.prototype.forEach = function (callbackFn, thisArg) {
var this$1 = this;
thisArg = thisArg || commonjsGlobal;
var iterator = this.entries();
var result = iterator.next();
while (result.done === false) {
callbackFn.call(thisArg, result.value[1], result.value[0], this$1);
result = iterator.next();
}
};
Map.prototype[_symbol2.default.species] = Map;
Object.defineProperty(Map, 'constructor', {
value: Map
});
try {
Object.defineProperty(Map, 'length', {
value: 0
});
} catch (e) {}
module.exports = Map;
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol.
var undefMarker = (0, _symbol2.default)('undef');
// NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol.
/* eslint no-extend-native: "off" */
var NaNMarker = (0, _symbol2.default)('NaN');
var ACCESSOR_SUPPORT = true;
function encodeVal(data) {
return Number.isNaN(data) ? NaNMarker : data;
}
function decodeVal(encodedData) {
return encodedData === NaNMarker ? NaN : encodedData;
}
function makeIterator(setInst, getter) {
var nextIdx = 0;
return {
next: function next() {
while (setInst._values[nextIdx] === undefMarker) {
nextIdx++;
}if (nextIdx === setInst._values.length) {
return { value: void 0, done: true };
} else {
return { value: getter.call(setInst, nextIdx++), done: false };
}
}
};
}
function calcSize(setInst) {
var size = 0;
for (var i = 0, s = setInst._values.length; i < s; i++) {
if (setInst._values[i] !== undefMarker) { size++; }
}
return size;
}
var Set = function Set(data) {
this._values = [];
// If `data` is iterable (indicated by presence of a forEach method), pre-populate the set
data && typeof data.forEach === 'function' && data.forEach(function (item) {
this.add.call(this, item);
}, this);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
};
// Some old engines do not support ES5 getters/setters. Since Set only requires these for the size property, we can fall back to setting the size property statically each time the size of the set changes.
try {
Object.defineProperty(Set.prototype, 'size', {
get: function get() {
return calcSize(this);
}
});
} catch (e) {
ACCESSOR_SUPPORT = false;
}
Set.prototype.add = function (value) {
value = encodeVal(value);
if (this._values.indexOf(value) === -1) {
this._values.push(value);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
}
return this;
};
Set.prototype.has = function (value) {
return this._values.indexOf(encodeVal(value)) !== -1;
};
Set.prototype.delete = function (value) {
var idx = this._values.indexOf(encodeVal(value));
if (idx === -1) { return false; }
this._values[idx] = undefMarker;
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
return true;
};
Set.prototype.clear = function () {
this._values = [];
if (!ACCESSOR_SUPPORT) { this.size = 0; }
};
Set.prototype.values = Set.prototype.keys = function () {
return makeIterator(this, function (i) {
return decodeVal(this._values[i]);
});
};
Set.prototype.entries = Set.prototype[_symbol2.default.iterator] = function () {
return makeIterator(this, function (i) {
return [decodeVal(this._values[i]), decodeVal(this._values[i])];
});
};
Set.prototype.forEach = function (callbackFn, thisArg) {
var this$1 = this;
thisArg = thisArg || commonjsGlobal;
var iterator = this.entries();
var result = iterator.next();
while (result.done === false) {
callbackFn.call(thisArg, result.value[1], result.value[0], this$1);
result = iterator.next();
}
};
Set.prototype[_symbol2.default.species] = Set;
Object.defineProperty(Set, 'constructor', {
value: Set
});
try {
Object.defineProperty(Set, 'length', {
value: 0
});
} catch (e) {}
module.exports = Set;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off" */
var defineProperty = Object.defineProperty;
var counter = Date.now() % 1e9;
var WeakMap = function WeakMap(data) {
this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
// If data is iterable (indicated by presence of a forEach method), pre-populate the map
data && data.forEach && data.forEach(function (item) {
this.set.apply(this, item);
}, this);
};
WeakMap.prototype.set = function (key, value) {
if ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) !== 'object' && typeof key !== 'function') { throw new TypeError('Invalid value used as weak map key'); }
var entry = key[this.name];
if (entry && entry[0] === key) { entry[1] = value; }else { defineProperty(key, this.name, { value: [key, value], writable: true }); }
return this;
};
WeakMap.prototype.get = function (key) {
var entry;
return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
};
WeakMap.prototype.delete = function (key) {
var entry = key[this.name];
if (!entry || entry[0] !== key) { return false; }
entry[0] = entry[1] = undefined;
return true;
};
WeakMap.prototype.has = function (key) {
var entry = key[this.name];
if (!entry) { return false; }
return entry[0] === key;
};
module.exports = WeakMap;
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* eslint no-extend-native: "off" */
var counter = Date.now() % 1e9;
var WeakSet = function WeakSet(data) {
this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
data && data.forEach && data.forEach(this.add, this);
};
WeakSet.prototype.add = function (obj) {
var name = this.name;
if (!obj[name]) { Object.defineProperty(obj, name, { value: true, writable: true }); }
return this;
};
WeakSet.prototype.delete = function (obj) {
if (!obj[this.name]) { return false; }
obj[this.name] = undefined;
return true;
};
WeakSet.prototype.has = function (obj) {
return !!obj[this.name];
};
module.exports = WeakSet;
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var FontFace = function FontFace(family, source) {
_classCallCheck(this, FontFace);
this.family = family;
this.source = source;
};
module.exports = FontFace;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// https://github.com/Polymer/URL
var URLSearchParams = __webpack_require__(1);
var relative = Object.create(null);
relative.ftp = 21;
relative.file = 0;
relative.gopher = 70;
relative.http = 80;
relative.https = 443;
relative.ws = 80;
relative.wss = 443;
var relativePathDotMapping = Object.create(null);
relativePathDotMapping['%2e'] = '.';
relativePathDotMapping['.%2e'] = '..';
relativePathDotMapping['%2e.'] = '..';
relativePathDotMapping['%2e%2e'] = '..';
function isRelativeScheme(scheme) {
return relative[scheme] !== undefined;
}
function invalid() {
clear.call(this);
this._isInvalid = true;
}
function IDNAToASCII(h) {
if ('' == h) {
invalid.call(this);
}
// XXX
return h.toLowerCase();
}
function percentEscape(c) {
var unicode = c.charCodeAt(0);
if (unicode > 0x20 && unicode < 0x7F &&
// " # < > ? `
[0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1) {
return c;
}
return encodeURIComponent(c);
}
function percentEscapeQuery(c) {
// XXX This actually needs to encode c using encoding and then
// convert the bytes one-by-one.
var unicode = c.charCodeAt(0);
if (unicode > 0x20 && unicode < 0x7F &&
// " # < > ` (do not escape '?')
[0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1) {
return c;
}
return encodeURIComponent(c);
}
var EOF = undefined,
ALPHA = /[a-zA-Z]/,
ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
function parse(input, stateOverride, base) {
var this$1 = this;
function err(message) {
errors.push(message);
}
var state = stateOverride || 'scheme start',
cursor = 0,
buffer = '',
seenAt = false,
seenBracket = false,
errors = [];
loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
var c = input[cursor];
switch (state) {
case 'scheme start':
if (c && ALPHA.test(c)) {
buffer += c.toLowerCase(); // ASCII-safe
state = 'scheme';
} else if (!stateOverride) {
buffer = '';
state = 'no scheme';
continue;
} else {
err('Invalid scheme.');
break loop;
}
break;
case 'scheme':
if (c && ALPHANUMERIC.test(c)) {
buffer += c.toLowerCase(); // ASCII-safe
} else if (':' == c) {
this$1._scheme = buffer;
buffer = '';
if (stateOverride) {
break loop;
}
if (isRelativeScheme(this$1._scheme)) {
this$1._isRelative = true;
}
if ('file' == this$1._scheme) {
state = 'relative';
} else if (this$1._isRelative && base && base._scheme == this$1._scheme) {
state = 'relative or authority';
} else if (this$1._isRelative) {
state = 'authority first slash';
} else {
state = 'scheme data';
}
} else if (!stateOverride) {
buffer = '';
cursor = 0;
state = 'no scheme';
continue;
} else if (EOF == c) {
break loop;
} else {
err('Code point not allowed in scheme: ' + c);
break loop;
}
break;
case 'scheme data':
if ('?' == c) {
state = 'query';
} else if ('#' == c) {
this$1._fragment = '#';
state = 'fragment';
} else {
// XXX error handling
if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._schemeData += percentEscape(c);
}
}
break;
case 'no scheme':
if (!base || !isRelativeScheme(base._scheme)) {
err('Missing scheme.');
invalid.call(this$1);
} else {
state = 'relative';
continue;
}
break;
case 'relative or authority':
if ('/' == c && '/' == input[cursor + 1]) {
state = 'authority ignore slashes';
} else {
err('Expected /, got: ' + c);
state = 'relative';
continue;
}
break;
case 'relative':
this$1._isRelative = true;
if ('file' != this$1._scheme) { this$1._scheme = base._scheme; }
if (EOF == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = base._query;
this$1._username = base._username;
this$1._password = base._password;
break loop;
} else if ('/' == c || '\\' == c) {
if ('\\' == c) { err('\\ is an invalid code point.'); }
state = 'relative slash';
} else if ('?' == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = '?';
this$1._username = base._username;
this$1._password = base._password;
state = 'query';
} else if ('#' == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = base._query;
this$1._fragment = '#';
this$1._username = base._username;
this$1._password = base._password;
state = 'fragment';
} else {
var nextC = input[cursor + 1];
var nextNextC = input[cursor + 2];
if ('file' != this$1._scheme || !ALPHA.test(c) || nextC != ':' && nextC != '|' || EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC) {
this$1._host = base._host;
this$1._port = base._port;
this$1._username = base._username;
this$1._password = base._password;
this$1._path = base._path.slice();
this$1._path.pop();
}
state = 'relative path';
continue;
}
break;
case 'relative slash':
if ('/' == c || '\\' == c) {
if ('\\' == c) {
err('\\ is an invalid code point.');
}
if ('file' == this$1._scheme) {
state = 'file host';
} else {
state = 'authority ignore slashes';
}
} else {
if ('file' != this$1._scheme) {
this$1._host = base._host;
this$1._port = base._port;
this$1._username = base._username;
this$1._password = base._password;
}
state = 'relative path';
continue;
}
break;
case 'authority first slash':
if ('/' == c) {
state = 'authority second slash';
} else {
err("Expected '/', got: " + c);
state = 'authority ignore slashes';
continue;
}
break;
case 'authority second slash':
state = 'authority ignore slashes';
if ('/' != c) {
err("Expected '/', got: " + c);
continue;
}
break;
case 'authority ignore slashes':
if ('/' != c && '\\' != c) {
state = 'authority';
continue;
} else {
err('Expected authority, got: ' + c);
}
break;
case 'authority':
if ('@' == c) {
if (seenAt) {
err('@ already seen.');
buffer += '%40';
}
seenAt = true;
for (var i = 0; i < buffer.length; i++) {
var cp = buffer[i];
if ('\t' == cp || '\n' == cp || '\r' == cp) {
err('Invalid whitespace in authority.');
continue;
}
// XXX check URL code points
if (':' == cp && null === this$1._password) {
this$1._password = '';
continue;
}
var tempC = percentEscape(cp);
null !== this$1._password ? this$1._password += tempC : this$1._username += tempC;
}
buffer = '';
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
cursor -= buffer.length;
buffer = '';
state = 'host';
continue;
} else {
buffer += c;
}
break;
case 'file host':
if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
state = 'relative path';
} else if (buffer.length == 0) {
state = 'relative path start';
} else {
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'relative path start';
}
continue;
} else if ('\t' == c || '\n' == c || '\r' == c) {
err('Invalid whitespace in file host.');
} else {
buffer += c;
}
break;
case 'host':
case 'hostname':
if (':' == c && !seenBracket) {
// XXX host parsing
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'port';
if ('hostname' == stateOverride) {
break loop;
}
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'relative path start';
if (stateOverride) {
break loop;
}
continue;
} else if ('\t' != c && '\n' != c && '\r' != c) {
if ('[' == c) {
seenBracket = true;
} else if (']' == c) {
seenBracket = false;
}
buffer += c;
} else {
err('Invalid code point in host/hostname: ' + c);
}
break;
case 'port':
if (/[0-9]/.test(c)) {
buffer += c;
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
if ('' != buffer) {
var temp = parseInt(buffer, 10);
if (temp != relative[this$1._scheme]) {
this$1._port = temp + '';
}
buffer = '';
}
if (stateOverride) {
break loop;
}
state = 'relative path start';
continue;
} else if ('\t' == c || '\n' == c || '\r' == c) {
err('Invalid code point in port: ' + c);
} else {
invalid.call(this$1);
}
break;
case 'relative path start':
if ('\\' == c) { err("'\\' not allowed in path."); }
state = 'relative path';
if ('/' != c && '\\' != c) {
continue;
}
break;
case 'relative path':
if (EOF == c || '/' == c || '\\' == c || !stateOverride && ('?' == c || '#' == c)) {
if ('\\' == c) {
err('\\ not allowed in relative path.');
}
var tmp;
if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
buffer = tmp;
}
if ('..' == buffer) {
this$1._path.pop();
if ('/' != c && '\\' != c) {
this$1._path.push('');
}
} else if ('.' == buffer && '/' != c && '\\' != c) {
this$1._path.push('');
} else if ('.' != buffer) {
if ('file' == this$1._scheme && this$1._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
buffer = buffer[0] + ':';
}
this$1._path.push(buffer);
}
buffer = '';
if ('?' == c) {
this$1._query = '?';
state = 'query';
} else if ('#' == c) {
this$1._fragment = '#';
state = 'fragment';
}
} else if ('\t' != c && '\n' != c && '\r' != c) {
buffer += percentEscape(c);
}
break;
case 'query':
if (!stateOverride && '#' == c) {
this$1._fragment = '#';
state = 'fragment';
} else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._query += percentEscapeQuery(c);
}
break;
case 'fragment':
if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._fragment += c;
}
break;
}
cursor++;
}
}
function clear() {
this._scheme = '';
this._schemeData = '';
this._username = '';
this._password = null;
this._host = '';
this._port = '';
this._path = [];
this._query = '';
this._fragment = '';
this._isInvalid = false;
this._isRelative = false;
}
// Does not process domain names or IP addresses.
// Does not handle encoding for the query parameter.
function URL(url, base /* , encoding */) {
if (base !== undefined && !(base instanceof URL)) { base = new URL(String(base)); }
this._url = url;
clear.call(this);
var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
// encoding = encoding || 'utf-8'
parse.call(this, input, null, base);
}
URL.prototype = {
toString: function toString() {
return this.href;
},
get href() {
if (this._isInvalid) { return this._url; }
var authority = '';
if ('' != this._username || null != this._password) {
authority = this._username + (null != this._password ? ':' + this._password : '') + '@';
}
return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
},
set href(href) {
clear.call(this);
parse.call(this, href);
},
get protocol() {
return this._scheme + ':';
},
set protocol(protocol) {
if (this._isInvalid) { return; }
parse.call(this, protocol + ':', 'scheme start');
},
get host() {
return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
},
set host(host) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, host, 'host');
},
get hostname() {
return this._host;
},
set hostname(hostname) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, hostname, 'hostname');
},
get port() {
return this._port;
},
set port(port) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, port, 'port');
},
get pathname() {
return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
},
set pathname(pathname) {
if (this._isInvalid || !this._isRelative) { return; }
this._path = [];
parse.call(this, pathname, 'relative path start');
},
get search() {
return this._isInvalid || !this._query || '?' == this._query ? '' : this._query;
},
set search(search) {
if (this._isInvalid || !this._isRelative) { return; }
this._query = '?';
if ('?' == search[0]) { search = search.slice(1); }
parse.call(this, search, 'query');
},
get searchParams() {
return new URLSearchParams(this.search);
},
get hash() {
return this._isInvalid || !this._fragment || '#' == this._fragment ? '' : this._fragment;
},
set hash(hash) {
if (this._isInvalid) { return; }
this._fragment = '#';
if ('#' == hash[0]) { hash = hash.slice(1); }
parse.call(this, hash, 'fragment');
},
get origin() {
var host;
if (this._isInvalid || !this._scheme) {
return '';
}
// javascript: Gecko returns String(""), WebKit/Blink String("null")
// Gecko throws error for "data://"
// data: Gecko returns "", Blink returns "data://", WebKit returns "null"
// Gecko returns String("") for file: mailto:
// WebKit/Blink returns String("SCHEME://") for file: mailto:
switch (this._scheme) {
case 'data':
case 'file':
case 'javascript':
case 'mailto':
return 'null';
}
host = this.host;
if (!host) {
return '';
}
return this._scheme + '://' + host;
}
};
module.exports = URL;
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// https://github.com/ericf/css-mediaquery
var RE_MEDIA_QUERY = /^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i,
RE_MQ_EXPRESSION = /^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/,
RE_MQ_FEATURE = /^(?:(min|max)-)?(.+)/;
function _matches(media, values) {
return _parseQuery(media).some(function (query) {
var inverse = query.inverse;
var typeMatch = query.type === 'all' || values.type === query.type;
if (typeMatch && inverse || !(typeMatch || inverse)) {
return false;
}
var expressionsMatch = query.expressions.every(function (expression) {
var feature = expression.feature,
modifier = expression.modifier,
expValue = expression.value,
value = values[feature];
if (!value) {
return false;
}
switch (feature) {
case 'width':
case 'height':
expValue = parseFloat(expValue);
value = parseFloat(value);
break;
}
switch (modifier) {
case 'min':
return value >= expValue;
case 'max':
return value <= expValue;
default:
return value === expValue;
}
});
return expressionsMatch && !inverse || !expressionsMatch && inverse;
});
}
function _parseQuery(media) {
return media.split(',').map(function (query) {
query = query.trim();
var captures = query.match(RE_MEDIA_QUERY);
if (!captures) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
var modifier = captures[1],
type = captures[2],
expressions = ((captures[3] || '') + (captures[4] || '')).trim(),
parsed = {};
parsed.inverse = !!modifier && modifier.toLowerCase() === 'not';
parsed.type = type ? type.toLowerCase() : 'all';
if (!expressions) {
parsed.expressions = [];
return parsed;
}
expressions = expressions.match(/\([^\)]+\)/g);
if (!expressions) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
parsed.expressions = expressions.map(function (expression) {
var captures = expression.match(RE_MQ_EXPRESSION);
if (!captures) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
var feature = captures[1].toLowerCase().match(RE_MQ_FEATURE);
return {
modifier: feature[1],
feature: feature[2],
value: captures[2]
};
});
return parsed;
});
}
function matchMedia(media) {
var mql = {
matches: false,
media: media
};
if (media === '') {
mql.matches = true;
return mql;
}
mql.matches = _matches(media, {
type: 'screen',
width: window.screen.width,
height: window.screen.height
});
return mql;
}
module.exports = matchMedia;
/***/ })
/******/ ])};
/***/ }),
/* 7 */
/*!********************************************************!*\
!*** ./packages/weex-rax-framework/src/define.weex.js ***!
\********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (modules) {
function define(name, deps, factory) {
if (deps instanceof Function) {
factory = deps;
deps = [];
}
modules[name] = {
factory: factory,
deps: deps,
module: { exports: {} },
isInitialized: false,
hasError: false
};
}
return define;
};
/***/ }),
/* 8 */
/*!*********************************************************!*\
!*** ./packages/weex-rax-framework/src/require.weex.js ***!
\*********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (modules) {
function require(name) {
var mod = modules[name];
if (mod && mod.isInitialized) {
return mod.module.exports;
}
if (!mod) {
throw new Error('Requiring unknown module "' + name + '"');
}
if (mod.hasError) {
throw new Error('Requiring module "' + name + '" which threw an exception');
}
try {
mod.isInitialized = true;
mod.factory(require, mod.module.exports, mod.module);
} catch (e) {
mod.hasError = true;
mod.isInitialized = false;
throw e;
}
return mod.module.exports;
}
return require;
};
/***/ }),
/* 9 */
/*!***********************************************************!*\
!*** ./packages/weex-rax-framework/src/downgrade.weex.js ***!
\***********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _semver = __webpack_require__(/*! ./semver */ 10);
var _semver2 = _interopRequireDefault(_semver);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function normalizeVersion(v) {
if (v == '*') {
return v;
}
v = typeof v === 'string' ? v : '';
var split = v.split('.');
var i = 0;
var result = [];
while (i < 3) {
var s = typeof split[i] === 'string' && split[i] ? split[i] : '0';
result.push(s);
i++;
}
return result.join('.');
} /* global WXEnvironment */
function getError(key, val, criteria) {
var result = {
isDowngrade: true,
errorType: 1,
code: 1000
};
var getMsg = function getMsg(key, val, criteria) {
return 'Downgrade[' + key + '] :: deviceInfo ' + val + ' matched criteria ' + criteria;
};
var _key = key.toLowerCase();
if (_key.indexOf('osversion') >= 0) {
result.code = 1001;
} else if (_key.indexOf('appversion') >= 0) {
result.code = 1002;
} else if (_key.indexOf('weexversion') >= 0) {
result.code = 1003;
} else if (_key.indexOf('devicemodel') >= 0) {
result.code = 1004;
}
result.errorMessage = getMsg(key, val, criteria);
return result;
}
/**
* config
*
* {
* ios: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* },
* android: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* }
* }
*
*/
function check(config) {
var result = {
isDowngrade: false
};
var deviceInfo = WXEnvironment;
var platform = deviceInfo.platform || 'unknow';
var dPlatform = platform.toLowerCase();
var cObj = config[dPlatform] || {};
for (var i in deviceInfo) {
var key = i;
var keyLower = key.toLowerCase();
var val = deviceInfo[i];
var isVersion = keyLower.indexOf('version') >= 0;
var isDeviceModel = keyLower.indexOf('devicemodel') >= 0;
var criteria = cObj[i];
if (criteria && isVersion) {
var c = normalizeVersion(criteria);
var d = normalizeVersion(deviceInfo[i]);
if (_semver2.default.satisfies(d, c)) {
result = getError(key, val, criteria);
break;
}
} else if (isDeviceModel) {
var _criteria = Array.isArray(criteria) ? criteria : [criteria];
if (_criteria.indexOf(val) >= 0) {
result = getError(key, val, criteria);
break;
}
}
}
return result;
}
module.exports = function (__weex_require__) {
return function (config) {
var nativeInstanceWrap = __weex_require__('@weex-module/instanceWrap');
var result = check(config);
if (result.isDowngrade) {
nativeInstanceWrap.error(result.errorType, result.code, result.errorMessage);
return true;
}
return false;
};
};
/***/ }),
/* 10 */
/*!***************************************************!*\
!*** ./packages/weex-rax-framework/src/semver.js ***!
\***************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.default = {
satisfies: function satisfies(left, right) {
var regex = /(\W+)?([\d|.]+)/;
if ((typeof left === 'undefined' ? 'undefined' : _typeof(left)) + (typeof right === 'undefined' ? 'undefined' : _typeof(right)) != 'stringstring') { return false; }
if (right == '*') {
return true;
}
var arr = right.match(regex);
var a = left.split('.'),
i = 0,
b = arr[2].split('.'),
len = Math.max(a.length, b.length);
var flag = 0;
for (var _i = 0; _i < len; _i++) {
if (a[_i] && !b[_i] && parseInt(a[_i]) > 0 || parseInt(a[_i]) > parseInt(b[_i])) {
flag = 1;
break;
} else if (b[_i] && !a[_i] && parseInt(b[_i]) > 0 || parseInt(a[_i]) < parseInt(b[_i])) {
flag = -1;
break;
}
}
switch (arr[1]) {
case '<':
if (flag === -1) {
return true;
}
break;
case '<=':
if (flag !== 1) {
return true;
}
break;
case '>':
if (flag === 1) {
return true;
}
break;
case '>=':
if (flag !== -1) {
return true;
}
break;
default:
if (flag === 0) {
return true;
}
break;
}
return false;
}
};
module.exports = exports['default'];
/***/ }),
/* 11 */
/*!**********************************************************!*\
!*** ./packages/weex-rax-framework/src/document.weex.js ***!
\**********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _emitter = __webpack_require__(/*! ./emitter */ 1);
var _emitter2 = _interopRequireDefault(_emitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DOM_MODULE = '@weex-module/dom';
var VISIBLE = 'visible';
var HIDDEN = 'hidden';
var VISIBILITY_CHANGE_EVENT = 'visibilitychange';
function addBodyAppearListener(document) {
document.body.addEvent('viewappear', function (e) {
document.visibilityState = VISIBLE;
e.type = VISIBILITY_CHANGE_EVENT;
document.dispatchEvent(e);
});
document.body.addEvent('viewdisappear', function (e) {
document.visibilityState = HIDDEN;
e.type = VISIBILITY_CHANGE_EVENT;
document.dispatchEvent(e);
});
}
function removeBodyAppearListener(document) {
if (document.body) {
document.body.removeEvent('viewappear');
document.body.removeEvent('viewdisappear');
}
}
module.exports = function (__weex_require__, document) {
// Add w3c events
var documentEmitter = new _emitter2.default();
var hasVisibilityEventPending = false;
// Weex freezed the document maybe throw error
try {
document.addEventListener = function (type, listener) {
if (type === VISIBILITY_CHANGE_EVENT) {
if (document.body) {
addBodyAppearListener(document);
} else {
hasVisibilityEventPending = true;
}
}
documentEmitter.on(type, listener);
};
document.removeEventListener = function (type, listener) {
if (type === VISIBILITY_CHANGE_EVENT) {
removeBodyAppearListener(document);
}
documentEmitter.off(type, listener);
};
document.dispatchEvent = function (e) {
documentEmitter.emit(e.type, e);
};
// FontFace
document.fonts = {
add: function add(fontFace) {
var domModule = __weex_require__(DOM_MODULE);
domModule.addRule('fontFace', {
fontFamily: fontFace.family,
src: fontFace.source // url('uri') : single quotes are required around uri, and double quotes can not work in weex
});
}
};
// Init visibility state
document.visibilityState = VISIBLE;
// Hijack the origin createBody
var originCreateBody = document.createBody;
Object.defineProperty(document, 'createBody', {
value: function value() {
var body = originCreateBody.apply(document, arguments);
if (hasVisibilityEventPending) {
addBodyAppearListener(document);
}
return body;
}
});
} catch (e) {
console.log(e);
}
return document;
};
/***/ }),
/* 12 */
/*!**********************************************************!*\
!*** ./packages/weex-rax-framework/src/location.weex.js ***!
\**********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var LOCATION_MODULE = '@weex-module/location';
var NAVIGATOR_MODULE = '@weex-module/navigator';
module.exports = function (__weex_require__, location) {
location.assign = function (url) {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.push({
url: url,
animated: 'true'
}, function (e) {
// noop
});
};
location.replace = function (url) {
var weexLocation = __weex_require__(LOCATION_MODULE);
weexLocation.replace(url);
};
location.reload = function (forceReload) {
var weexLocation = __weex_require__(LOCATION_MODULE);
weexLocation.reload(forceReload);
};
return location;
};
/***/ }),
/* 13 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/fetch.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var STREAM_MODULE = '@weex-module/stream';
module.exports = function (__weex_require__, Promise) {
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name);
}
// FIXME: In spdy the response header has name like ":version" that is invalid
// if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
// throw new TypeError('Invalid character in header field name');
// }
return name.toLowerCase();
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value);
}
return value;
}
function Headers(headers) {
this.originHeaders = headers;
this.map = {};
if (headers instanceof Headers) {
headers.forEach(function (value, name) {
this.append(name, value);
}, this);
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function (name) {
this.append(name, headers[name]);
}, this);
}
}
Headers.prototype.append = function (name, value) {
name = normalizeName(name);
value = normalizeValue(value);
var oldValue = this.map[name];
this.map[name] = oldValue ? oldValue + ',' + value : value;
};
Headers.prototype.delete = function (name) {
delete this.map[normalizeName(name)];
};
Headers.prototype.get = function (name) {
name = normalizeName(name);
return this.has(name) ? this.map[name] : null;
};
Headers.prototype.has = function (name) {
return this.map.hasOwnProperty(normalizeName(name));
};
Headers.prototype.set = function (name, value) {
this.map[normalizeName(name)] = [normalizeValue(value)];
};
Headers.prototype.forEach = function (callback, thisArg) {
var this$1 = this;
for (var name in this.map) {
if (this$1.map.hasOwnProperty(name)) {
callback.call(thisArg, this$1.map[name], name, this$1);
}
}
};
function consumed(body) {
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'));
}
body.bodyUsed = true;
}
function Body() {
this.bodyUsed = false;
this._initBody = function (body, options) {
this._bodyInit = body;
if (typeof body === 'string') {
this._bodyText = body;
} else if (!body) {
this._bodyText = '';
} else {
throw new Error('unsupported BodyInit type');
}
};
this.text = function () {
var rejected = consumed(this);
return rejected ? rejected : Promise.resolve(this._bodyText);
};
this.json = function () {
return this.text().then(JSON.parse);
};
return this;
}
// HTTP methods whose capitalization should be normalized
var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
function normalizeMethod(method) {
var upcased = method.toUpperCase();
return methods.indexOf(upcased) > -1 ? upcased : method;
}
function Request(input, options) {
options = options || {};
var body = options.body;
if (Request.prototype.isPrototypeOf(input)) {
if (input.bodyUsed) {
throw new TypeError('Already read');
}
this.url = input.url;
this.credentials = input.credentials;
if (!options.headers) {
this.headers = new Headers(input.headers);
}
this.method = input.method;
this.mode = input.mode;
if (!body) {
body = input._bodyInit;
input.bodyUsed = true;
}
} else {
this.url = input;
}
this.credentials = options.credentials || this.credentials || 'omit';
if (options.headers || !this.headers) {
this.headers = new Headers(options.headers);
}
this.method = normalizeMethod(options.method || this.method || 'GET');
this.mode = options.mode || this.mode || null;
this.referrer = null;
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
throw new TypeError('Body not allowed for GET or HEAD requests');
}
this._initBody(body, options);
}
Request.prototype.clone = function () {
return new Request(this);
};
function headers(xhr) {
var head = new Headers();
var pairs = xhr.getAllResponseHeaders().trim().split('\n');
pairs.forEach(function (header) {
var split = header.trim().split(':');
var key = split.shift().trim();
var value = split.join(':').trim();
head.append(key, value);
});
return head;
}
Body.call(Request.prototype);
function Response(bodyInit, options) {
if (!options) {
options = {};
}
this.type = 'default';
this.status = 'status' in options ? options.status : 200;
this.ok = this.status >= 200 && this.status < 300;
this.statusText = 'statusText' in options ? options.statusText : 'OK';
this.headers = new Headers(options.headers);
this.url = options.url || '';
this._initBody(bodyInit, options);
}
Body.call(Response.prototype);
Response.prototype.clone = function () {
return new Response(this._bodyInit, {
status: this.status,
statusText: this.statusText,
headers: new Headers(this.headers),
url: this.url
});
};
Response.error = function () {
var response = new Response(null, { status: 0, statusText: '' });
response.type = 'error';
return response;
};
var redirectStatuses = [301, 302, 303, 307, 308];
Response.redirect = function (url, status) {
if (redirectStatuses.indexOf(status) === -1) {
throw new RangeError('Invalid status code');
}
return new Response(null, { status: status, headers: { location: url } });
};
var fetch = function fetch(input, init) {
return new Promise(function (resolve, reject) {
var request;
if (Request.prototype.isPrototypeOf(input) && !init) {
request = input;
} else {
request = new Request(input, init);
}
var params = {
url: request.url,
method: request.method,
headers: request.headers && request.headers.originHeaders
};
if (typeof request._bodyInit !== 'undefined') {
params.body = request._bodyInit;
}
params.type = init && init.dataType ? init.dataType : 'text';
var nativeFetch = __weex_require__(STREAM_MODULE).fetch;
nativeFetch(params, function (response) {
try {
typeof response === 'string' && (response = JSON.parse(response));
var data = typeof response.data === 'string' ? response.data : JSON.stringify(response.data);
var res = new Response(data, {
status: response.status,
statusText: response.statusText,
headers: response.headers,
url: request.url
});
resolve(res);
} catch (err) {
reject(err);
}
}, function (progress) {});
});
};
return {
fetch: fetch,
Headers: Headers,
Request: Request,
Response: Response
};
};
/***/ }),
/* 14 */
/*!****************************************************************!*\
!*** ./packages/weex-rax-framework/src/xmlhttprequest.weex.js ***!
\****************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
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; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
var STREAM_MODULE = '@weex-module/stream';
var eventTarget = __webpack_require__(/*! event-target-shim */ 2);
var UNSENT = 0;
var OPENED = 1;
var HEADERS_RECEIVED = 2;
var LOADING = 3;
var DONE = 4;
var XHR_EVENTS = ['abort', 'error', 'load', 'loadstart', 'progress', 'timeout', 'loadend', 'readystatechange'];
module.exports = function (__weex_require__) {
var XMLHttpRequest = function (_eventTarget) {
_inherits(XMLHttpRequest, _eventTarget);
// EventTarget automatically initializes these to `null`.
function XMLHttpRequest() {
_classCallCheck(this, XMLHttpRequest);
var _this = _possibleConstructorReturn(this, (XMLHttpRequest.__proto__ || Object.getPrototypeOf(XMLHttpRequest)).call(this));
_this.UNSENT = UNSENT;
_this.OPENED = OPENED;
_this.HEADERS_RECEIVED = HEADERS_RECEIVED;
_this.LOADING = LOADING;
_this.DONE = DONE;
_this.readyState = UNSENT;
_this.status = 0;
_this.statusText = '';
_this.timeout = 0;
_this._aborted = false;
_this._hasError = false;
_this._method = null;
_this._response = '';
_this._url = null;
_this._timedOut = false;
_this._reset();
return _this;
}
_createClass(XMLHttpRequest, [{
key: '_reset',
value: function _reset() {
this.readyState = this.UNSENT;
this.responseHeaders = undefined;
this.status = 0;
this._hasError = false;
this._headers = {};
this._response = '';
this._responseType = '';
this._sent = false;
this._lowerCaseResponseHeaders = {};
this._timedOut = false;
}
}, {
key: 'getAllResponseHeaders',
value: function getAllResponseHeaders() {
if (!this.responseHeaders) {
// according to the spec, return null if no response has been received
return null;
}
var headers = this.responseHeaders || {};
return Object.keys(headers).map(function (headerName) {
return headerName + ': ' + headers[headerName];
}).join('\r\n');
}
}, {
key: 'getResponseHeader',
value: function getResponseHeader(header) {
var value = this._lowerCaseResponseHeaders[header.toLowerCase()];
return value !== undefined ? value : null;
}
}, {
key: 'setRequestHeader',
value: function setRequestHeader(header, value) {
if (this.readyState !== this.OPENED) {
throw new Error('Request has not been opened');
}
this._headers[header.toLowerCase()] = String(value);
}
}, {
key: 'open',
value: function open(method, url, async) {
/* Other optional arguments are not supported yet */
if (this.readyState !== this.UNSENT) {
throw new Error('Cannot open, already sending');
}
if (async !== undefined && !async) {
// async is default
throw new Error('Synchronous http requests are not supported');
}
if (!url) {
throw new Error('Cannot load an empty url');
}
this._method = method.toUpperCase();
this._url = url;
this._aborted = false;
this.setReadyState(this.OPENED);
}
}, {
key: 'send',
value: function send(data) {
var _this2 = this;
if (this.readyState !== this.OPENED) {
throw new Error('Request has not been opened');
}
if (this._sent) {
throw new Error('Request has already been sent');
}
this._sent = true;
var nativeFetch = __weex_require__(STREAM_MODULE).fetch;
nativeFetch({
method: this._method,
url: this._url,
headers: this._headers,
body: data,
type: 'text'
}, function (response) {
try {
typeof response === 'string' && (response = JSON.parse(response));
_this2.status = response.status;
_this2.statusText = response.statusText;
_this2.setResponseHeaders(response.headers);
if (response.ok) {
_this2._response = response.data;
} else {
if (_this2._responseType === '' || _this2._responseType === 'text') {
_this2._response = response.data;
}
_this2._hasError = true;
}
} catch (err) {}
_this2.setReadyState(_this2.DONE);
}, function (progress) {
_this2.status = progress.status;
_this2.statusText = progress.statusText;
_this2.setResponseHeaders(progress.headers);
_this2.setReadyState(progress.readyState);
});
}
}, {
key: 'abort',
value: function abort() {
this._aborted = true;
// TODO: Weex native not support abort now
// only call onreadystatechange if there is something to abort,
// below logic is per spec
if (!(this.readyState === this.UNSENT || this.readyState === this.OPENED && !this._sent || this.readyState === this.DONE)) {
this._reset();
this.setReadyState(this.DONE);
}
// Reset again after, in case modified in handler
this._reset();
}
}, {
key: 'setResponseHeaders',
value: function setResponseHeaders(responseHeaders) {
this.responseHeaders = responseHeaders || null;
var headers = responseHeaders || {};
this._lowerCaseResponseHeaders = Object.keys(headers).reduce(function (lcaseHeaders, headerName) {
lcaseHeaders[headerName.toLowerCase()] = headers[headerName];
return lcaseHeaders;
}, {});
}
}, {
key: 'setReadyState',
value: function setReadyState(newState) {
this.readyState = newState;
this.dispatchEvent({ type: 'readystatechange' });
if (newState === this.DONE) {
if (this._aborted) {
this.dispatchEvent({ type: 'abort' });
} else if (this._hasError) {
if (this._timedOut) {
this.dispatchEvent({ type: 'timeout' });
} else {
this.dispatchEvent({ type: 'error' });
}
} else {
this.dispatchEvent({ type: 'load' });
}
this.dispatchEvent({ type: 'loadend' });
}
}
}, {
key: 'responseType',
get: function get() {
return this._responseType;
},
set: function set(responseType) {
if (this._sent) {
throw new Error('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The ' + 'response type cannot be set after the request has been sent.');
}
this._responseType = responseType;
}
}, {
key: 'responseText',
get: function get() {
if (this._responseType !== '' && this._responseType !== 'text') {
throw new Error("The 'responseText' property is only available if 'responseType' " + ('is set to \'\' or \'text\', but it is \'' + this._responseType + '\'.'));
}
if (this.readyState < LOADING) {
return '';
}
return this._response;
}
}, {
key: 'response',
get: function get() {
var responseType = this.responseType;
if (responseType === '' || responseType === 'text') {
return this.readyState < LOADING || this._hasError ? '' : this._response;
}
if (this.readyState !== DONE) {
return null;
}
}
}]);
return XMLHttpRequest;
}(eventTarget.apply(undefined, XHR_EVENTS));
XMLHttpRequest.UNSENT = UNSENT;
XMLHttpRequest.OPENED = OPENED;
XMLHttpRequest.HEADERS_RECEIVED = HEADERS_RECEIVED;
XMLHttpRequest.LOADING = LOADING;
XMLHttpRequest.DONE = DONE;
return XMLHttpRequest;
};
/***/ }),
/* 15 */
/*!***********************************************************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/custom-event-target.js ***!
\***********************************************************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//-----------------------------------------------------------------------------
// Requirements
//-----------------------------------------------------------------------------
var Commons = __webpack_require__(/*! ./commons */ 0);
var LISTENERS = Commons.LISTENERS;
var ATTRIBUTE = Commons.ATTRIBUTE;
var newNode = Commons.newNode;
//-----------------------------------------------------------------------------
// Helpers
//-----------------------------------------------------------------------------
/**
* Gets a specified attribute listener from a given EventTarget object.
*
* @param {EventTarget} eventTarget - An EventTarget object to get.
* @param {string} type - An event type to get.
* @returns {function|null} The found attribute listener.
*/
function getAttributeListener(eventTarget, type) {
var node = eventTarget[LISTENERS][type];
while (node != null) {
if (node.kind === ATTRIBUTE) {
return node.listener
}
node = node.next;
}
return null
}
/**
* Sets a specified attribute listener to a given EventTarget object.
*
* @param {EventTarget} eventTarget - An EventTarget object to set.
* @param {string} type - An event type to set.
* @param {function|null} listener - A listener to be set.
* @returns {void}
*/
function setAttributeListener(eventTarget, type, listener) {
if (typeof listener !== "function" && typeof listener !== "object") {
listener = null; // eslint-disable-line no-param-reassign
}
var prev = null;
var node = eventTarget[LISTENERS][type];
while (node != null) {
if (node.kind === ATTRIBUTE) {
// Remove old value.
if (prev == null) {
eventTarget[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
}
else {
prev = node;
}
node = node.next;
}
// Add new value.
if (listener != null) {
if (prev == null) {
eventTarget[LISTENERS][type] = newNode(listener, ATTRIBUTE);
}
else {
prev.next = newNode(listener, ATTRIBUTE);
}
}
}
//-----------------------------------------------------------------------------
// Public Interface
//-----------------------------------------------------------------------------
/**
* Defines an `EventTarget` implementation which has `onfoobar` attributes.
*
* @param {EventTarget} EventTargetBase - A base implementation of EventTarget.
* @param {string[]} types - A list of event types which are defined as attribute listeners.
* @returns {EventTarget} The defined `EventTarget` implementation which has attribute listeners.
*/
module.exports.defineCustomEventTarget = function(EventTargetBase, types) {
/**
* The constructor of custom event target.
* @constructor
*/
function EventTarget() {
EventTargetBase.call(this);
}
var descripter = {
constructor: {
value: EventTarget,
configurable: true,
writable: true,
},
};
types.forEach(function(type) {
descripter["on" + type] = {
get: function() {
return getAttributeListener(this, type)
},
set: function(listener) {
setAttributeListener(this, type, listener);
},
configurable: true,
enumerable: true,
};
});
EventTarget.prototype = Object.create(EventTargetBase.prototype, descripter);
return EventTarget
};
/***/ }),
/* 16 */
/*!*****************************************************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/event-wrapper.js ***!
\*****************************************************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//-----------------------------------------------------------------------------
// Requirements
//-----------------------------------------------------------------------------
var createUniqueKey = __webpack_require__(/*! ./commons */ 0).createUniqueKey;
//-----------------------------------------------------------------------------
// Constsnts
//-----------------------------------------------------------------------------
/**
* The key of the flag which is turned on by `stopImmediatePropagation` method.
*
* @type {symbol|string}
* @private
*/
var STOP_IMMEDIATE_PROPAGATION_FLAG =
createUniqueKey("stop_immediate_propagation_flag");
/**
* The key of the flag which is turned on by `preventDefault` method.
*
* @type {symbol|string}
* @private
*/
var CANCELED_FLAG = createUniqueKey("canceled_flag");
/**
* The key of the flag that it cannot use `preventDefault` method.
*
* @type {symbol|string}
* @private
*/
var PASSIVE_LISTENER_FLAG = createUniqueKey("passive_listener_flag");
/**
* The key of the original event object.
*
* @type {symbol|string}
* @private
*/
var ORIGINAL_EVENT = createUniqueKey("original_event");
/**
* Method definitions for the event wrapper.
*
* @type {object}
* @private
*/
var wrapperPrototypeDefinition = Object.freeze({
stopPropagation: Object.freeze({
value: function stopPropagation() {
var e = this[ORIGINAL_EVENT];
if (typeof e.stopPropagation === "function") {
e.stopPropagation();
}
},
writable: true,
configurable: true,
}),
stopImmediatePropagation: Object.freeze({
value: function stopImmediatePropagation() {
this[STOP_IMMEDIATE_PROPAGATION_FLAG] = true;
var e = this[ORIGINAL_EVENT];
if (typeof e.stopImmediatePropagation === "function") {
e.stopImmediatePropagation();
}
},
writable: true,
configurable: true,
}),
preventDefault: Object.freeze({
value: function preventDefault() {
if (this[PASSIVE_LISTENER_FLAG]) {
return
}
if (this.cancelable === true) {
this[CANCELED_FLAG] = true;
}
var e = this[ORIGINAL_EVENT];
if (typeof e.preventDefault === "function") {
e.preventDefault();
}
},
writable: true,
configurable: true,
}),
defaultPrevented: Object.freeze({
get: function defaultPrevented() {
return this[CANCELED_FLAG]
},
enumerable: true,
configurable: true,
}),
});
//-----------------------------------------------------------------------------
// Public Interface
//-----------------------------------------------------------------------------
module.exports.STOP_IMMEDIATE_PROPAGATION_FLAG = STOP_IMMEDIATE_PROPAGATION_FLAG;
module.exports.PASSIVE_LISTENER_FLAG = PASSIVE_LISTENER_FLAG;
/**
* Creates an event wrapper.
*
* We cannot modify several properties of `Event` object, so we need to create the wrapper.
* Plus, this wrapper supports non `Event` objects.
*
* @param {Event|{type: string}} event - An original event to create the wrapper.
* @param {EventTarget} eventTarget - The event target of the event.
* @returns {Event} The created wrapper. This object is implemented `Event` interface.
* @private
*/
module.exports.createEventWrapper = function createEventWrapper(event, eventTarget) {
var timeStamp = (
typeof event.timeStamp === "number" ? event.timeStamp : Date.now()
);
var propertyDefinition = {
type: {value: event.type, enumerable: true},
target: {value: eventTarget, enumerable: true},
currentTarget: {value: eventTarget, enumerable: true},
eventPhase: {value: 2, enumerable: true},
bubbles: {value: Boolean(event.bubbles), enumerable: true},
cancelable: {value: Boolean(event.cancelable), enumerable: true},
timeStamp: {value: timeStamp, enumerable: true},
isTrusted: {value: false, enumerable: true},
};
propertyDefinition[STOP_IMMEDIATE_PROPAGATION_FLAG] = {value: false, writable: true};
propertyDefinition[CANCELED_FLAG] = {value: false, writable: true};
propertyDefinition[PASSIVE_LISTENER_FLAG] = {value: false, writable: true};
propertyDefinition[ORIGINAL_EVENT] = {value: event};
// For CustomEvent.
if (typeof event.detail !== "undefined") {
propertyDefinition.detail = {value: event.detail, enumerable: true};
}
return Object.create(
Object.create(event, wrapperPrototypeDefinition),
propertyDefinition
)
};
/***/ }),
/* 17 */
/*!***********************************************************!*\
!*** ./packages/weex-rax-framework/src/websocket.weex.js ***!
\***********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
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; }; }();
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var eventTarget = __webpack_require__(/*! event-target-shim */ 2);
var WEB_SOCKET_MODULE = '@weex-module/webSocket';
var CONNECTING = 0;
var OPEN = 1;
var CLOSING = 2;
var CLOSED = 3;
var CLOSE_NORMAL = 1000;
var WEBSOCKET_EVENTS = ['close', 'error', 'message', 'open'];
/**
* Event object passed to the `onopen`, `onclose`, `onmessage`, `onerror`
* callbacks of `WebSocket`.
*
* The `type` property is "open", "close", "message", "error" respectively.
*
* In case of "message", the `data` property contains the incoming data.
*/
var WebSocketEvent = function WebSocketEvent(type, eventInitDict) {
_classCallCheck(this, WebSocketEvent);
this.type = type.toString();
Object.assign(this, eventInitDict);
};
module.exports = function (__weex_require__) {
/**
* Browser-compatible WebSockets implementation.
*
* See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
* See https://github.com/websockets/ws
*/
var WebSocket = function (_eventTarget) {
_inherits(WebSocket, _eventTarget);
function WebSocket(url, protocols) {
_classCallCheck(this, WebSocket);
var _this = _possibleConstructorReturn(this, (WebSocket.__proto__ || Object.getPrototypeOf(WebSocket)).call(this));
var websocket = __weex_require__(WEB_SOCKET_MODULE);
// eslint-disable-next-line new-cap
websocket.WebSocket(url, protocols);
_this.readyState = CONNECTING;
_this.websocket = websocket;
websocket.onmessage(function (ev) {
_this.dispatchEvent(new WebSocketEvent('message', ev));
});
websocket.onopen(function (ev) {
_this.readyState = OPEN;
_this.dispatchEvent(new WebSocketEvent('open'));
});
websocket.onclose(function (ev) {
_this.readyState = CLOSED;
_this.dispatchEvent(new WebSocketEvent('close', {
code: ev.code,
reason: ev.reason
}));
});
websocket.onerror(function (ev) {
_this.dispatchEvent(new WebSocketEvent('error', ev));
});
return _this;
}
_createClass(WebSocket, [{
key: 'close',
value: function close(code, reason) {
if (this.readyState === CLOSING || this.readyState === CLOSED) {
return;
}
this.readyState = CLOSING;
this.websocket.close(code, reason);
}
}, {
key: 'send',
value: function send(data) {
if (typeof data === 'string') {
this.websocket.send(data);
return;
}
throw new Error('Unsupported data type');
}
}]);
return WebSocket;
}(eventTarget(WEBSOCKET_EVENTS));
WebSocket.CONNECTING = CONNECTING;
WebSocket.OPEN = OPEN;
WebSocket.CLOSING = CLOSING;
WebSocket.CLOSED = CLOSED;
return WebSocket;
};
/***/ }),
/* 18 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/timer.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var TIMER_MODULE = '@weex-module/timer';
module.exports = function (__weex_require__, document) {
var setTimeout = function setTimeout(handler, time) {
var timer = __weex_require__(TIMER_MODULE);
timer.setTimeout(handler, time);
return document.taskCenter.callbackManager.lastCallbackId.toString();
};
var setInterval = function setInterval(handler, time) {
var timer = __weex_require__(TIMER_MODULE);
timer.setInterval(handler, time);
return document.taskCenter.callbackManager.lastCallbackId.toString();
};
var clearTimeout = function clearTimeout(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearTimeout(n);
};
var clearInterval = function clearInterval(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearInterval(n);
};
var requestAnimationFrame = function requestAnimationFrame(callback) {
var timer = __weex_require__(TIMER_MODULE);
return timer.setTimeout(callback, 16);
};
var cancelAnimationFrame = function cancelAnimationFrame(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearTimeout(n);
};
return {
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
requestAnimationFrame: requestAnimationFrame,
cancelAnimationFrame: cancelAnimationFrame
};
};
/***/ }),
/* 19 */
/*!********************************************************!*\
!*** ./packages/weex-rax-framework/src/base64.weex.js ***!
\********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function () {
var base64 = {};
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
// encoder
// [https://gist.github.com/999166] by [https://github.com/nignag]
base64.btoa = function (input) {
var str = String(input);
for (
// initialize result and counter
var block, charCode, idx = 0, map = chars, output = '';
// if the next str index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
str.charAt(idx | 0) || (map = '=', idx % 1);
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {
charCode = str.charCodeAt(idx += 3 / 4);
if (charCode > 0xFF) {
throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
}
block = block << 8 | charCode;
}
return output;
};
// decoder
// [https://gist.github.com/1020396] by [https://github.com/atk]
base64.atob = function (input) {
var str = String(input).replace(/=+$/, '');
if (str.length % 4 == 1) {
throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
}
for (
// initialize result and counters
var bc = 0, bs, buffer, idx = 0, output = '';
// get next character
buffer = str.charAt(idx++);
// character found in table? initialize bit storage and add its ascii value;
~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
// and if not first of each 4 characters,
// convert the first 8 bits to one ascii character
bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {
// try to find character in table (0-63, not found => -1)
buffer = chars.indexOf(buffer);
}
return output;
};
return base64;
};
/***/ }),
/* 20 */
/*!*************************************************************!*\
!*** ./packages/weex-rax-framework/src/performance.weex.js ***!
\*************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
module.exports = function (responseEnd) {
var _performance$timing;
var performance = {};
// TODO: current can not get navigationStart time
performance.timing = (_performance$timing = {
unloadEventStart: 0,
unloadEventEnd: 0,
navigationStart: responseEnd,
redirectStart: 0,
redirectEnd: 0,
fetchStart: responseEnd,
domainLookupStart: responseEnd,
domainLookupEnd: responseEnd,
connectStart: responseEnd,
secureConnectionStart: responseEnd
}, _defineProperty(_performance$timing, "connectStart", responseEnd), _defineProperty(_performance$timing, "requestStart", responseEnd), _defineProperty(_performance$timing, "responseStart", responseEnd), _defineProperty(_performance$timing, "responseEnd", responseEnd), _defineProperty(_performance$timing, "domLoading", 0), _defineProperty(_performance$timing, "domInteractive", 0), _defineProperty(_performance$timing, "domComplete", 0), _defineProperty(_performance$timing, "domContentLoadedEventStart", 0), _defineProperty(_performance$timing, "domContentLoadedEventEnd", 0), _defineProperty(_performance$timing, "loadEventStart", 0), _defineProperty(_performance$timing, "loadEventEnd", 0), _performance$timing);
performance.now = function () {
return Date.now() - performance.timing.navigationStart;
};
return performance;
};
/***/ }),
/* 21 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/event.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
module.exports = function () {
var Event = function Event(type) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, Event);
this.type = type;
this.bubbles = Boolean(params.bubbles);
this.cancelable = Boolean(params.cancelable);
};
var CustomEvent = function (_Event) {
_inherits(CustomEvent, _Event);
function CustomEvent(type) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, CustomEvent);
var _this = _possibleConstructorReturn(this, (CustomEvent.__proto__ || Object.getPrototypeOf(CustomEvent)).call(this, type, params));
_this.detail = params.detail;
return _this;
}
return CustomEvent;
}(Event);
return {
Event: Event,
CustomEvent: CustomEvent
};
};
/***/ })
/******/ ]);
});
var Rax = unwrapExports(framework_weex);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var frameworks$1 = {
Vanilla: Vanilla,
Vue: Vue,
Rax: Rax,
Weex: Weex
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
setup(frameworks$1);
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uLy4uL2h0bWw1L3NoYXJlZC9hcnJheUZyb20uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9vYmplY3RBc3NpZ24uanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvb2JqZWN0U2V0UHJvdG90eXBlT2YuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvcHJvbWlzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vLi4vaHRtbDUvc2hhcmVkL2NvbnNvbGUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvc2V0VGltZW91dC5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9mcmVlemUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3V0aWxzLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2Uvbm9ybWFsaXplLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvQ2FsbGJhY2tNYW5hZ2VyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL29wZXJhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9Ob2RlLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL1dlZXhFbGVtZW50LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL0VsZW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2JyaWRnZS9UYXNrQ2VudGVyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvcmVjZWl2ZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9tb2R1bGUuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9jb21wb25lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9zZXJ2aWNlLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvZGVidWcuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vQ29tbWVudC5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYnJpZGdlL0xpc3RlbmVyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvSGFuZGxlci5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9Eb2N1bWVudC5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYXBpL1dlZXhJbnN0YW5jZS5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYXBpL2luaXQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvc2VydmljZXMvYnJvYWRjYXN0LWNoYW5uZWwvbWVzc2FnZS1ldmVudC5qcyIsIi4uLy4uL2h0bWw1L3NlcnZpY2VzL2Jyb2FkY2FzdC1jaGFubmVsL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvc2VydmljZXMvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvbmF0aXZlL3NldHVwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy92YW5pbGxhL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9mYWN0b3J5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwaS9tZXRob2RzLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdXRpbC9zaGFyZWQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS91dGlsL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9kZXAuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL3dhdGNoZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL2FycmF5LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9vYnNlcnZlci5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2NvcmUvc3RhdGUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kaXJlY3RpdmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kb20taGVscGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdm0vY29tcGlsZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9ldmVudHMuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9yZWdpc3Rlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zZW12ZXIvc2VtdmVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2Rvd25ncmFkZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC92aWV3cG9ydC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9idW5kbGUvYm9vdHN0cmFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2J1bmRsZS9kZWZpbmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvYnVuZGxlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2N0cmwvbWlzYy5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9jdHJsL2luaXQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvY3RybC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9kaWZmZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5zdGFuY2UuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5kZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9zdGF0aWMvbWFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2NyZWF0ZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9saWZlLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL3JlZ2lzdGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2JyaWRnZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9taXNjLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvd2VleC1yYXgtZnJhbWV3b3JrL2Rpc3QvZnJhbWV3b3JrLndlZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL25hdGl2ZS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA2LCAyMi4xLjIuMVxuLy8gUmVmZXJlbmNlOiBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtYXJyYXkuZnJvbVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICghQXJyYXkuZnJvbSkge1xuICBBcnJheS5mcm9tID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgdmFyIGlzQ2FsbGFibGUgPSBmdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9O1xuICAgIHZhciB0b0ludGVnZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPT09IDAgfHwgIWlzRmluaXRlKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuICAgIH07XG4gICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgICB2YXIgdG9MZW5ndGggPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGxlbiA9IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuLCAwKSwgbWF4U2FmZUludGVnZXIpO1xuICAgIH07XG5cbiAgICAvLyBUaGUgbGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBmcm9tIG1ldGhvZCBpcyAxLlxuICAgIHJldHVybiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgICAgLy8gMS4gTGV0IEMgYmUgdGhlIHRoaXMgdmFsdWUuXG4gICAgICB2YXIgQyA9IHRoaXM7XG5cbiAgICAgIC8vIDIuIExldCBpdGVtcyBiZSBUb09iamVjdChhcnJheUxpa2UpLlxuICAgICAgdmFyIGl0ZW1zID0gT2JqZWN0KGFycmF5TGlrZSk7XG5cbiAgICAgIC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cbiAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIG1hcGZuIGlzIHVuZGVmaW5lZCwgdGhlbiBsZXQgbWFwcGluZyBiZSBmYWxzZS5cbiAgICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCB1bmRlZmluZWQ7XG4gICAgICB2YXIgVDtcbiAgICAgIGlmICh0eXBlb2YgbWFwRm4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIDUuIGVsc2VcbiAgICAgICAgLy8gNS4gYSBJZiBJc0NhbGxhYmxlKG1hcGZuKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUobWFwRm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIGIuIElmIHRoaXNBcmcgd2FzIHN1cHBsaWVkLCBsZXQgVCBiZSB0aGlzQXJnOyBlbHNlIGxldCBUIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgVCA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMC4gTGV0IGxlblZhbHVlIGJlIEdldChpdGVtcywgXCJsZW5ndGhcIikuXG4gICAgICAvLyAxMS4gTGV0IGxlbiBiZSBUb0xlbmd0aChsZW5WYWx1ZSkuXG4gICAgICB2YXIgbGVuID0gdG9MZW5ndGgoaXRlbXMubGVuZ3RoKTtcblxuICAgICAgLy8gMTMuIElmIElzQ29uc3RydWN0b3IoQykgaXMgdHJ1ZSwgdGhlblxuICAgICAgLy8gMTMuIGEuIExldCBBIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2Qgb2YgQyB3aXRoIGFuIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2luZ2xlIGl0ZW0gbGVuLlxuICAgICAgLy8gMTQuIGEuIEVsc2UsIExldCBBIGJlIEFycmF5Q3JlYXRlKGxlbikuXG4gICAgICB2YXIgQSA9IGlzQ2FsbGFibGUoQykgPyBPYmplY3QobmV3IEMobGVuKSkgOiBuZXcgQXJyYXkobGVuKTtcblxuICAgICAgLy8gMTYuIExldCBrIGJlIDAuXG4gICAgICB2YXIgayA9IDA7XG4gICAgICAvLyAxNy4gUmVwZWF0LCB3aGlsZSBrIDwgbGVu4oCmIChhbHNvIHN0ZXBzIGEgLSBoKVxuICAgICAgdmFyIGtWYWx1ZTtcbiAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgIGtWYWx1ZSA9IGl0ZW1zW2tdO1xuICAgICAgICBpZiAobWFwRm4pIHtcbiAgICAgICAgICBBW2tdID0gdHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gbWFwRm4oa1ZhbHVlLCBrKSA6IG1hcEZuLmNhbGwoVCwga1ZhbHVlLCBrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBW2tdID0ga1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gMTtcbiAgICAgIH1cbiAgICAgIC8vIDE4LiBMZXQgcHV0U3RhdHVzIGJlIFB1dChBLCBcImxlbmd0aFwiLCBsZW4sIHRydWUpLlxuICAgICAgQS5sZW5ndGggPSBsZW47XG4gICAgICAvLyAyMC4gUmV0dXJuIEEuXG4gICAgICByZXR1cm4gQTtcbiAgICB9O1xuICB9KCkpO1xufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS4zJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikgaWYgKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpIFRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICdjb3JlLWpzL2ZuL29iamVjdC9hc3NpZ24nXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi81NTkzNTU0XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gKGZ1bmN0aW9uKE9iamVjdCwgbWFnaWMpIHtcbiAgICB2YXIgc2V0O1xuICAgIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICBzZXQuY2FsbChPLCBwcm90byk7XG4gICAgICByZXR1cm4gTztcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIHRoaXMgd29ya3MgYWxyZWFkeSBpbiBGaXJlZm94IGFuZCBTYWZhcmlcbiAgICAgIHNldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgbWFnaWMpLnNldDtcbiAgICAgIHNldC5jYWxsKHt9LCBudWxsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIElFIDwgMTEgY2Fubm90IGJlIHNoaW1tZWRcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZSAhPT0ge31bbWFnaWNdIHx8XG4gICAgICAgIC8vIG5laXRoZXIgY2FuIGFueSBicm93c2VyIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgX19wcm90b19fIGNvcnJlY3RseVxuICAgICAgICAvLyAoYWxsIGJ1dCBvbGQgVjggd2lsbCByZXR1cm4gaGVyZSlcbiAgICAgICAge19fcHJvdG9fXzogbnVsbH0uX19wcm90b19fID09PSB2b2lkIDBcbiAgICAgICAgLy8gdGhpcyBjYXNlIG1lYW5zIG51bGwgb2JqZWN0cyBjYW5ub3QgYmUgcGFzc2VkXG4gICAgICAgIC8vIHRocm91Z2ggc2V0UHJvdG90eXBlT2YgaW4gYSByZWxpYWJsZSB3YXlcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgaGVyZSBhICoqU2hhbSoqIGlzIG5lZWRlZCBpbnN0ZWFkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gbm9kZWpzIDAuOCBhbmQgMC4xMCBhcmUgKGJ1Z2d5IGFuZC4uKSBmaW5lIGhlcmVcbiAgICAgIC8vIHByb2JhYmx5IENocm9tZSBvciBzb21lIG9sZCBNb2JpbGUgc3RvY2sgYnJvd3NlclxuICAgICAgc2V0ID0gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgdGhpc1ttYWdpY10gPSBwcm90bztcbiAgICAgIH07XG4gICAgICAvLyBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCAqKm5vdCoqIHdvcmtcbiAgICAgIC8vIGluIHRob3NlIGJyb3dzZXJzIHRoYXQgZG8gbm90IGluaGVyaXRcbiAgICAgIC8vIF9fcHJvdG9fXyBieSBtaXN0YWtlIGZyb20gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgLy8gaW4gdGhlc2UgY2FzZXMgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IGFuIGVycm9yXG4gICAgICAvLyBvciBhdCBsZWFzdCBiZSBpbmZvcm1lZCBhYm91dCB0aGUgaXNzdWVcbiAgICAgIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID0gc2V0UHJvdG90eXBlT2YoXG4gICAgICAgIHNldFByb3RvdHlwZU9mKHt9LCBudWxsKSxcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgKSBpbnN0YW5jZW9mIE9iamVjdDtcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09PSB0cnVlIG1lYW5zIGl0IHdvcmtzIGFzIG1lYW50XG4gICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PT0gZmFsc2UgbWVhbnMgaXQncyBub3QgMTAwJSByZWxpYWJsZVxuICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT09IHVuZGVmaW5lZFxuICAgICAgLy8gb3JcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09ICBudWxsIG1lYW5zIGl0J3Mgbm90IGEgcG9seWZpbGxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgICAvLyB3ZSBjYW4gZXZlbiBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX187XG4gICAgfVxuICAgIHJldHVybiBzZXRQcm90b3R5cGVPZjtcbiAgfShPYmplY3QsICdfX3Byb3RvX18nKSk7XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gZml4IFByb21pc2UgUHJvYmxlbSBvbiBKU0NvbnRleHQgb2YgaU9TN344XG4vLyBAc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU4NjZcblxuY29uc3QgeyBXWEVudmlyb25tZW50IH0gPSBnbG9iYWxcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChXWEVudmlyb25tZW50ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0gPT09ICdpT1MnKSB7XG4gIGdsb2JhbC5Qcm9taXNlID0gdW5kZWZpbmVkXG59XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gKCFCVUdHWSAmJiAkbmF0aXZlKSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVGhpcyBmaWxlIHdpbGwgaGFjayBgY29uc29sZWAgbWV0aG9kcyBieSBgV1hFbnZpcm9ubWVudC5sb2dMZXZlbGAuXG4gKiBTbyB3ZSBjYW4gY29udHJvbCBob3cgbWFueSBhbmQgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBzZW50IGJ5IGNoYW5nZSB0aGUgbG9nIGxldmVsLlxuICogQWRkaXRpb25hbGx5IGluIG5hdGl2ZSBwbGF0Zm9ybSB0aGUgbWVzc2FnZSBjb250ZW50IG11c3QgYmUgcHJpbWl0aXZlIHZhbHVlcyBhbmRcbiAqIHVzaW5nIGBuYXRpdmVMb2coLi4uYXJncywgbG9nTGV2ZWxNYXJrKWAgc28gd2UgY3JlYXRlIGEgbmV3IGBjb25zb2xlYCBvYmplY3QgaW5cbiAqIGdsb2JhbCBhZGQgYSBmb3JtYXQgcHJvY2VzcyBmb3IgaXRzIG1ldGhvZHMuXG4gKi9cblxuY29uc3QgTEVWRUxTID0gWydvZmYnLCAnZXJyb3InLCAnd2FybicsICdpbmZvJywgJ2xvZycsICdkZWJ1ZyddXG5sZXQgbGV2ZWxNYXAgPSB7fVxuXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSBnbG9iYWwuY29uc29sZVxuXG4vKipcbiAqIEhhY2sgY29uc29sZSBmb3IgbmF0aXZlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlQ29uc29sZSAoKSB7XG4gIGdlbmVyYXRlTGV2ZWxNYXAoKVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8vIG1vY2sgY29uc29sZSBpbiBuYXRpdmUgZW52aXJvbm1lbnRcbiAgaWYgKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtICE9PSAnV2ViJykge1xuICAgIGdsb2JhbC5jb25zb2xlID0ge1xuICAgICAgZGVidWc6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGdsb2JhbC5uYXRpdmVMb2coLi4uZm9ybWF0KGFyZ3MpLCAnX19ERUJVRycpIH1cbiAgICAgIH0sXG4gICAgICBsb2c6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fTE9HJykgfVxuICAgICAgfSxcbiAgICAgIGluZm86ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0lORk8nKSB9XG4gICAgICB9LFxuICAgICAgd2FybjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fV0FSTicpIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0VSUk9SJykgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdlYiBvciBOb2RlXG4gIGVsc2Uge1xuICAgIGNvbnN0IHsgZGVidWcsIGxvZywgaW5mbywgd2FybiwgZXJyb3IgfSA9IGNvbnNvbGVcbiAgICBjb25zb2xlLl9fb3JpX18gPSB7IGRlYnVnLCBsb2csIGluZm8sIHdhcm4sIGVycm9yIH1cbiAgICBjb25zb2xlLmRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSwgYXJncykgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBoYWNrZWQgY29uc29sZSB0byBvcmlnaW5hbC5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZUNvbnNvbGUgKCkge1xuICBsZXZlbE1hcCA9IHt9XG4gIGdsb2JhbC5jb25zb2xlID0gb3JpZ2luYWxDb25zb2xlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgbWFwIGZvciB3aGljaCB0eXBlcyBvZiBtZXNzYWdlIHdpbGwgYmUgc2VudCBpbiBhIGNlcnRhaW4gbWVzc2FnZSBsZXZlbFxuICogYXMgdGhlIG9yZGVyIG9mIExFVkVMUy5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVMZXZlbE1hcCAoKSB7XG4gIExFVkVMUy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gTEVWRUxTLmluZGV4T2YobGV2ZWwpXG4gICAgbGV2ZWxNYXBbbGV2ZWxdID0ge31cbiAgICBMRVZFTFMuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGNvbnN0IHR5cGVJbmRleCA9IExFVkVMUy5pbmRleE9mKHR5cGUpXG4gICAgICBpZiAodHlwZUluZGV4IDw9IGxldmVsSW5kZXgpIHtcbiAgICAgICAgbGV2ZWxNYXBbbGV2ZWxdW3R5cGVdID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjZXJ0YWluIHR5cGUgb2YgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW4gY3VycmVudCBsb2cgbGV2ZWwgb2YgZW52LlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVja0xldmVsICh0eXBlKSB7XG4gIGNvbnN0IGxvZ0xldmVsID0gKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsKSB8fCAnbG9nJ1xuICByZXR1cm4gbGV2ZWxNYXBbbG9nTGV2ZWxdICYmIGxldmVsTWFwW2xvZ0xldmVsXVt0eXBlXVxufVxuXG4vKipcbiAqIENvbnZlcnQgYWxsIGxvZyBhcmd1bWVudHMgaW50byBwcmltaXRpdmUgdmFsdWVzLlxuICogQHBhcmFtICB7YXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZm9ybWF0IChhcmdzKSB7XG4gIHJldHVybiBhcmdzLm1hcCgodikgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodilcbiAgICBpZiAodHlwZS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdiA9IFN0cmluZyh2KVxuICAgIH1cbiAgICByZXR1cm4gdlxuICB9KVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUG9seWZpbGwgYHNldFRpbWVvdXRgIG9uIEFuZHJvaWQgVjggdXNpbmcgbmF0aXZlIG1ldGhvZFxuICogYHNldFRpbWVvdXROYXRpdmUoY2FsbGJhY2tJZCwgdGltZSlgIGFuZCBKUyBtZXRob2RcbiAqIGBzZXRUaW1lb3V0Q2FsbGJhY2soY2FsbGJhY2tJZClgLlxuICogVGhpcyBwb2x5ZmlsbCBpcyBvbmx5IHVzZWQgaW4gdmlydHVhbC1ET00gZGlmZiAmIGZsdXNoIGFnb3JpdGhtLiBOb3RcbiAqIGFjY2Vzc2VkIGJ5IEpTIEJ1bmRsZSBjb2RlIChUaGUgdGltZXIgQVBJcyBwb2x5ZmlsbCBmb3IgSlMgQnVuZGxlIGlzIGluXG4gKiBgaHRtbDUvZGVmYXVsdC9hcHAvY3RybC5qc2ApLlxuICovXG5cbmNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0XG5jb25zdCBzZXRUaW1lb3V0TmF0aXZlID0gZ2xvYmFsLnNldFRpbWVvdXROYXRpdmVcblxuLyoqXG4gKiBTZXQgdXAgbmF0aXZlIHRpbWVyXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlVGltZXIgKCkge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBzZXRUaW1lb3V0TmF0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGltZW91dE1hcCA9IHt9XG4gICAgbGV0IHRpbWVvdXRJZCA9IDBcblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0ID0gKGNiLCB0aW1lKSA9PiB7XG4gICAgICB0aW1lb3V0TWFwWysrdGltZW91dElkXSA9IGNiXG4gICAgICBzZXRUaW1lb3V0TmF0aXZlKHRpbWVvdXRJZC50b1N0cmluZygpLCB0aW1lKVxuICAgIH1cblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0Q2FsbGJhY2sgPSAoaWQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGltZW91dE1hcFtpZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGltZW91dE1hcFtpZF0oKVxuICAgICAgICBkZWxldGUgdGltZW91dE1hcFtpZF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZVRpbWVyICgpIHtcbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBvcmlnaW5hbFNldFRpbWVvdXRcbiAgZ2xvYmFsLnNldFRpbWVvdXRDYWxsYmFjayA9IG51bGxcbn1cblxuc2V0TmF0aXZlVGltZXIoKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZyZWV6ZSB0aGUgcHJvdG90eXBlIG9mIGphdmFzY3JpcHQgYnVpbGQtaW4gb2JqZWN0cy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemVQcm90b3R5cGUgKCkge1xuICBPYmplY3QuZnJlZXplKE9iamVjdClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheSlcblxuICAvLyBPYmplY3QuZnJlZXplKE9iamVjdC5wcm90b3R5cGUpXG4gIGZyZWV6ZU9iamVjdFByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheS5wcm90b3R5cGUpXG4gIE9iamVjdC5mcmVlemUoU3RyaW5nLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShOdW1iZXIucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKEJvb2xlYW4ucHJvdG90eXBlKVxuXG4gIC8vIE9iamVjdC5mcmVlemUoRXJyb3IucHJvdG90eXBlKVxuICBmcmVlemVFcnJvclByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShEYXRlLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShSZWdFeHAucHJvdG90eXBlKVxufVxuXG5mdW5jdGlvbiBmcmVlemVPYmplY3RQcm90byAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZVxuICBjb25zdCBwcm90b05hbWUgPSAnT2JqZWN0LnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fZGVmaW5lR2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdfX2RlZmluZVNldHRlcl9fJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnX19sb29rdXBHZXR0ZXJfXycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fbG9va3VwU2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ2hhc093blByb3BlcnR5JywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnaXNQcm90b3R5cGVPZicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9Mb2NhbGVTdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICd0b1N0cmluZycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3ZhbHVlT2YnLCBwcm90b05hbWUpXG4gIE9iamVjdC5zZWFsKHByb3RvKVxufVxuXG5mdW5jdGlvbiBmcmVlemVFcnJvclByb3RvICgpIHtcbiAgY29uc3QgcHJvdG8gPSBFcnJvci5wcm90b3R5cGVcbiAgY29uc3QgcHJvdG9OYW1lID0gJ0Vycm9yLnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ25hbWUnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdtZXNzYWdlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9TdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgT2JqZWN0LnNlYWwocHJvdG8pXG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvUHJvcGVydHkgKHByb3RvLCBwcm9wZXJ0eU5hbWUsIHByb3RvTmFtZSkge1xuICBpZiAoIXByb3RvLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG9yaWdpbiA9IHByb3RvW3Byb3BlcnR5TmFtZV1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvcmlnaW5cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gcHJvdG8pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBvZiAke3Byb3RvTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuL2FycmF5RnJvbSdcbmltcG9ydCAnLi9vYmplY3RBc3NpZ24nXG5pbXBvcnQgJy4vb2JqZWN0U2V0UHJvdG90eXBlT2YnXG5cbi8vIGltcG9ydCBwcm9taXNlIGhhY2sgYW5kIHBvbHlmaWxsc1xuaW1wb3J0ICcuL3Byb21pc2UnXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZydcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJ1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UnXG5cbmV4cG9ydCAqIGZyb20gJy4vY29uc29sZSdcbmV4cG9ydCAqIGZyb20gJy4vc2V0VGltZW91dCdcbmV4cG9ydCAqIGZyb20gJy4vZnJlZXplJ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogR2V0IGEgdW5pcXVlIGlkLlxuICovXG5sZXQgbmV4dE5vZGVSZWYgPSAxXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlSWQgKCkge1xuICByZXR1cm4gKG5leHROb2RlUmVmKyspLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cG9mICh2KSB7XG4gIGNvbnN0IHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodilcbiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlclRvQmFzZTY0IChidWZmZXIpIHtcbiAgaWYgKHR5cGVvZiBidG9hICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3Qgc3RyaW5nID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKFxuICAgIG5ldyBVaW50OEFycmF5KGJ1ZmZlciksXG4gICAgY29kZSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpXG4gICkuam9pbignJylcbiAgcmV0dXJuIGJ0b2Eoc3RyaW5nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0J1ZmZlciAoYmFzZTY0KSB7XG4gIGlmICh0eXBlb2YgYXRvYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMClcbiAgfVxuICBjb25zdCBzdHJpbmcgPSBhdG9iKGJhc2U2NCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHN0cmluZy5sZW5ndGgpXG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc3RyaW5nLCAoY2gsIGkpID0+IHtcbiAgICBhcnJheVtpXSA9IGNoLmNoYXJDb2RlQXQoMClcbiAgfSlcbiAgcmV0dXJuIGFycmF5LmJ1ZmZlclxufVxuXG4vKipcbiAqIERldGVjdCBpZiB0aGUgcGFyYW0gaXMgZmFsc3kgb3IgZW1wdHlcbiAqIEBwYXJhbSB7YW55fSBhbnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkgKGFueSkge1xuICBpZiAoIWFueSB8fCB0eXBlb2YgYW55ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFueSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgdHlwb2YsIGJ1ZmZlclRvQmFzZTY0LCBiYXNlNjRUb0J1ZmZlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHByaW1pdGl2ZSB2YWx1ZS5cbiAqIEBwYXJhbSAge2FueX0gICAgICAgIHZcbiAqIEByZXR1cm4ge3ByaW1pdGl2ZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByaW1pdGl2ZSAodikge1xuICBjb25zdCB0eXBlID0gdHlwb2YodilcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdVbmRlZmluZWQnOlxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuICcnXG5cbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKVxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIHYudG9JU09TdHJpbmcoKVxuXG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIHZcblxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdAdHlwZSc6ICdiaW5hcnknLFxuICAgICAgICBkYXRhVHlwZTogdHlwZSxcbiAgICAgICAgYmFzZTY0OiBidWZmZXJUb0Jhc2U2NCh2KVxuICAgICAgfVxuXG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnQHR5cGUnOiAnYmluYXJ5JyxcbiAgICAgICAgZGF0YVR5cGU6IHR5cGUsXG4gICAgICAgIGJhc2U2NDogYnVmZmVyVG9CYXNlNjQodi5idWZmZXIpXG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW1pdGl2ZSAoZGF0YSkge1xuICBpZiAodHlwb2YoZGF0YSkgPT09ICdPYmplY3QnKSB7XG4gICAgLy8gZGVjb2RlIGJhc2U2NCBpbnRvIGJpbmFyeVxuICAgIGlmIChkYXRhWydAdHlwZSddICYmIGRhdGFbJ0B0eXBlJ10gPT09ICdiaW5hcnknKSB7XG4gICAgICByZXR1cm4gYmFzZTY0VG9CdWZmZXIoZGF0YS5iYXNlNjQgfHwgJycpXG4gICAgfVxuXG4gICAgY29uc3QgcmVhbERhdGEgPSB7fVxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIHJlYWxEYXRhW2tleV0gPSBkZWNvZGVQcmltaXRpdmUoZGF0YVtrZXldKVxuICAgIH1cbiAgICByZXR1cm4gcmVhbERhdGFcbiAgfVxuICBpZiAodHlwb2YoZGF0YSkgPT09ICdBcnJheScpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoZGVjb2RlUHJpbWl0aXZlKVxuICB9XG4gIHJldHVybiBkYXRhXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZGVjb2RlUHJpbWl0aXZlIH0gZnJvbSAnLi9ub3JtYWxpemUnXG5cbmZ1bmN0aW9uIGdldEhvb2tLZXkgKGNvbXBvbmVudElkLCB0eXBlLCBob29rTmFtZSkge1xuICByZXR1cm4gYCR7dHlwZX1AJHtob29rTmFtZX0jJHtjb21wb25lbnRJZH1gXG59XG5cbi8qKlxuICogRm9yIGdlbmVyYWwgY2FsbGJhY2sgbWFuYWdlbWVudCBvZiBhIGNlcnRhaW4gV2VleCBpbnN0YW5jZS5cbiAqIEJlY2F1c2UgZnVuY3Rpb24gY2FuIG5vdCBwYXNzZWQgaW50byBuYXRpdmUsIHNvIHdlIGNyZWF0ZSBjYWxsYmFja1xuICogY2FsbGJhY2sgaWQgZm9yIGVhY2ggZnVuY3Rpb24gYW5kIHBhc3MgdGhlIGNhbGxiYWNrIGlkIGludG8gbmF0aXZlXG4gKiBpbiBmYWN0LiBBbmQgd2hlbiBhIGNhbGxiYWNrIGNhbGxlZCBmcm9tIG5hdGl2ZSwgd2UgY2FuIGZpbmQgdGhlIHJlYWxcbiAqIGNhbGxiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrIGlkIHdlIGhhdmUgcGFzc2VkIGJlZm9yZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FsbGJhY2tNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IgKGluc3RhbmNlSWQpIHtcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBTdHJpbmcoaW5zdGFuY2VJZClcbiAgICB0aGlzLmxhc3RDYWxsYmFja0lkID0gMFxuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgICB0aGlzLmhvb2tzID0ge31cbiAgfVxuICBhZGQgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5sYXN0Q2FsbGJhY2tJZCsrXG4gICAgdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF0gPSBjYWxsYmFja1xuICAgIHJldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkXG4gIH1cbiAgcmVtb3ZlIChjYWxsYmFja0lkKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrc1tjYWxsYmFja0lkXVxuICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tjYWxsYmFja0lkXVxuICAgIHJldHVybiBjYWxsYmFja1xuICB9XG4gIHJlZ2lzdGVySG9vayAoY29tcG9uZW50SWQsIHR5cGUsIGhvb2tOYW1lLCBob29rRnVuY3Rpb24pIHtcbiAgICAvLyBUT0RPOiB2YWxpZGF0ZSBhcmd1bWVudHNcbiAgICBjb25zdCBrZXkgPSBnZXRIb29rS2V5KGNvbXBvbmVudElkLCB0eXBlLCBob29rTmFtZSlcbiAgICBpZiAodGhpcy5ob29rc1trZXldKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE92ZXJyaWRlIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBob29rIFwiJHtrZXl9XCIuYClcbiAgICB9XG4gICAgdGhpcy5ob29rc1trZXldID0gaG9va0Z1bmN0aW9uXG4gIH1cbiAgdHJpZ2dlckhvb2sgKGNvbXBvbmVudElkLCB0eXBlLCBob29rTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gVE9ETzogdmFsaWRhdGUgYXJndW1lbnRzXG4gICAgY29uc3Qga2V5ID0gZ2V0SG9va0tleShjb21wb25lbnRJZCwgdHlwZSwgaG9va05hbWUpXG4gICAgY29uc3QgaG9va0Z1bmN0aW9uID0gdGhpcy5ob29rc1trZXldXG4gICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEludmFsaWQgaG9vayBmdW5jdGlvbiB0eXBlICgke3R5cGVvZiBob29rRnVuY3Rpb259KSBvbiBcIiR7a2V5fVwiLmApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gbnVsbFxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBob29rRnVuY3Rpb24uYXBwbHkobnVsbCwgb3B0aW9ucy5hcmdzIHx8IFtdKVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGhvb2sgZnVuY3Rpb24gb24gXCIke2tleX1cIi5gKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgY29uc3VtZSAoY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgaWYgKHR5cGVvZiBpZktlZXBBbGl2ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWZLZWVwQWxpdmUgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbY2FsbGJhY2tJZF1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGRlY29kZVByaW1pdGl2ZShkYXRhKSlcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBjYWxsYmFjayBpZCBcIiR7Y2FsbGJhY2tJZH1cImApXG4gIH1cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgICB0aGlzLmhvb2tzID0ge31cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IGRvY01hcCA9IHt9XG5cbi8qKlxuICogQWRkIGEgZG9jdW1lbnQgb2JqZWN0IGludG8gZG9jTWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvYyAoaWQsIGRvYykge1xuICBpZiAoaWQpIHtcbiAgICBkb2NNYXBbaWRdID0gZG9jXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRvY3VtZW50IG9iamVjdCBieSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jIChpZCkge1xuICByZXR1cm4gZG9jTWFwW2lkXVxufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgZG9jdW1lbnQgZnJvbSBkb2NNYXAgYnkgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvYyAoaWQpIHtcbiAgZGVsZXRlIGRvY01hcFtpZF1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogR2V0IGxpc3RlbmVyIGJ5IGRvY3VtZW50IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0ZW5lciAoaWQpIHtcbiAgY29uc3QgZG9jID0gZG9jTWFwW2lkXVxuICBpZiAoZG9jICYmIGRvYy5saXN0ZW5lcikge1xuICAgIHJldHVybiBkb2MubGlzdGVuZXJcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEdldCBUYXNrQ2VudGVyIGluc3RhbmNlIGJ5IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IFRhc2tDZW50ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhc2tDZW50ZXIgKGlkKSB7XG4gIGNvbnN0IGRvYyA9IGRvY01hcFtpZF1cbiAgaWYgKGRvYyAmJiBkb2MudGFza0NlbnRlcikge1xuICAgIHJldHVybiBkb2MudGFza0NlbnRlclxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQXBwZW5kIGJvZHkgbm9kZSB0byBkb2N1bWVudEVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRCb2R5IChkb2MsIG5vZGUsIGJlZm9yZSkge1xuICBjb25zdCB7IGRvY3VtZW50RWxlbWVudCB9ID0gZG9jXG5cbiAgaWYgKGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBub2RlLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBjaGlsZHJlbiA9IGRvY3VtZW50RWxlbWVudC5jaGlsZHJlblxuICBjb25zdCBiZWZvcmVJbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKVxuICBpZiAoYmVmb3JlSW5kZXggPCAwKSB7XG4gICAgY2hpbGRyZW4ucHVzaChub2RlKVxuICB9XG4gIGVsc2Uge1xuICAgIGNoaWxkcmVuLnNwbGljZShiZWZvcmVJbmRleCwgMCwgbm9kZSlcbiAgfVxuXG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgaWYgKG5vZGUucm9sZSA9PT0gJ2JvZHknKSB7XG4gICAgICBub2RlLmRvY0lkID0gZG9jLmlkXG4gICAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBkb2NcbiAgICAgIG5vZGUucGFyZW50Tm9kZSA9IGRvY3VtZW50RWxlbWVudFxuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IG5vZGVcbiAgICAgIH0pXG4gICAgICBzZXRCb2R5KGRvYywgbm9kZSlcbiAgICAgIG5vZGUuZG9jSWQgPSBkb2MuaWRcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudCA9IGRvY1xuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgICBkZWxldGUgZG9jLm5vZGVNYXBbbm9kZS5ub2RlSWRdXG4gICAgfVxuICAgIGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ucHVzaChub2RlKVxuICAgIHNlbmRCb2R5KGRvYywgbm9kZSlcbiAgfVxuICBlbHNlIHtcbiAgICBub2RlLnBhcmVudE5vZGUgPSBkb2N1bWVudEVsZW1lbnRcbiAgICBkb2Mubm9kZU1hcFtub2RlLnJlZl0gPSBub2RlXG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEJvZHkgKGRvYywgbm9kZSkge1xuICBjb25zdCBib2R5ID0gbm9kZS50b0pTT04oKVxuICBpZiAoZG9jICYmIGRvYy50YXNrQ2VudGVyICYmIHR5cGVvZiBkb2MudGFza0NlbnRlci5zZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZG9jLnRhc2tDZW50ZXIuc2VuZCgnZG9tJywgeyBhY3Rpb246ICdjcmVhdGVCb2R5JyB9LCBbYm9keV0pXG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgdXAgYm9keSBub2RlLlxuICogQHBhcmFtIHtvYmplY3R9IGRvY3VtZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Qm9keSAoZG9jLCBlbCkge1xuICBlbC5yb2xlID0gJ2JvZHknXG4gIGVsLmRlcHRoID0gMVxuICBkZWxldGUgZG9jLm5vZGVNYXBbZWwubm9kZUlkXVxuICBlbC5yZWYgPSAnX3Jvb3QnXG4gIGRvYy5ub2RlTWFwLl9yb290ID0gZWxcbiAgZG9jLmJvZHkgPSBlbFxufVxuXG4vKipcbiAqIEVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgbm9kZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGlsZCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50IG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQYXJlbnQgKG5vZGUsIHBhcmVudCkge1xuICBub2RlLnBhcmVudE5vZGUgPSBwYXJlbnRcbiAgaWYgKHBhcmVudC5kb2NJZCkge1xuICAgIG5vZGUuZG9jSWQgPSBwYXJlbnQuZG9jSWRcbiAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudFxuICAgIG5vZGUub3duZXJEb2N1bWVudC5ub2RlTWFwW25vZGUubm9kZUlkXSA9IG5vZGVcbiAgICBub2RlLmRlcHRoID0gcGFyZW50LmRlcHRoICsgMVxuICB9XG4gIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgbGlua1BhcmVudChjaGlsZCwgbm9kZSlcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyBlbGVtZW50LlxuICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRFbGVtZW50IChub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aW91c0VsZW1lbnQgKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBJbnNlcnQgYSBub2RlIGludG8gbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCBub2RlXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0XG4gKiBAcGFyYW0ge251bWJlcn0gbmV3SW5kZXhcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhbmdlU2libGluZ1xuICogQHJldHVybiB7bnVtYmVyfSBuZXdJbmRleFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0SW5kZXggKHRhcmdldCwgbGlzdCwgbmV3SW5kZXgsIGNoYW5nZVNpYmxpbmcpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKG5ld0luZGV4IDwgMCkge1xuICAgIG5ld0luZGV4ID0gMFxuICB9XG4gIGNvbnN0IGJlZm9yZSA9IGxpc3RbbmV3SW5kZXggLSAxXVxuICBjb25zdCBhZnRlciA9IGxpc3RbbmV3SW5kZXhdXG4gIGxpc3Quc3BsaWNlKG5ld0luZGV4LCAwLCB0YXJnZXQpXG4gIGlmIChjaGFuZ2VTaWJsaW5nKSB7XG4gICAgYmVmb3JlICYmIChiZWZvcmUubmV4dFNpYmxpbmcgPSB0YXJnZXQpXG4gICAgdGFyZ2V0LnByZXZpb3VzU2libGluZyA9IGJlZm9yZVxuICAgIHRhcmdldC5uZXh0U2libGluZyA9IGFmdGVyXG4gICAgYWZ0ZXIgJiYgKGFmdGVyLnByZXZpb3VzU2libGluZyA9IHRhcmdldClcbiAgfVxuICByZXR1cm4gbmV3SW5kZXhcbn1cblxuLyoqXG4gKiBNb3ZlIHRoZSBub2RlIHRvIGEgbmV3IGluZGV4IGluIGxpc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IG5vZGVcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleFxuICogQHBhcmFtIHtib29sZWFufSBjaGFuZ2VTaWJsaW5nXG4gKiBAcmV0dXJuIHtudW1iZXJ9IG5ld0luZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlSW5kZXggKHRhcmdldCwgbGlzdCwgbmV3SW5kZXgsIGNoYW5nZVNpYmxpbmcpIHtcbiAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YodGFyZ2V0KVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKGNoYW5nZVNpYmxpbmcpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBsaXN0W2luZGV4IC0gMV1cbiAgICBjb25zdCBhZnRlciA9IGxpc3RbaW5kZXggKyAxXVxuICAgIGJlZm9yZSAmJiAoYmVmb3JlLm5leHRTaWJsaW5nID0gYWZ0ZXIpXG4gICAgYWZ0ZXIgJiYgKGFmdGVyLnByZXZpb3VzU2libGluZyA9IGJlZm9yZSlcbiAgfVxuICBsaXN0LnNwbGljZShpbmRleCwgMSlcbiAgbGV0IG5ld0luZGV4QWZ0ZXIgPSBuZXdJbmRleFxuICBpZiAoaW5kZXggPD0gbmV3SW5kZXgpIHtcbiAgICBuZXdJbmRleEFmdGVyID0gbmV3SW5kZXggLSAxXG4gIH1cbiAgY29uc3QgYmVmb3JlTmV3ID0gbGlzdFtuZXdJbmRleEFmdGVyIC0gMV1cbiAgY29uc3QgYWZ0ZXJOZXcgPSBsaXN0W25ld0luZGV4QWZ0ZXJdXG4gIGxpc3Quc3BsaWNlKG5ld0luZGV4QWZ0ZXIsIDAsIHRhcmdldClcbiAgaWYgKGNoYW5nZVNpYmxpbmcpIHtcbiAgICBiZWZvcmVOZXcgJiYgKGJlZm9yZU5ldy5uZXh0U2libGluZyA9IHRhcmdldClcbiAgICB0YXJnZXQucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlTmV3XG4gICAgdGFyZ2V0Lm5leHRTaWJsaW5nID0gYWZ0ZXJOZXdcbiAgICBhZnRlck5ldyAmJiAoYWZ0ZXJOZXcucHJldmlvdXNTaWJsaW5nID0gdGFyZ2V0KVxuICB9XG4gIGlmIChpbmRleCA9PT0gbmV3SW5kZXhBZnRlcikge1xuICAgIHJldHVybiAtMVxuICB9XG4gIHJldHVybiBuZXdJbmRleFxufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgbm9kZSBmcm9tIGxpc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IG5vZGVcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhbmdlU2libGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW5kZXggKHRhcmdldCwgbGlzdCwgY2hhbmdlU2libGluZykge1xuICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZih0YXJnZXQpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoY2hhbmdlU2libGluZykge1xuICAgIGNvbnN0IGJlZm9yZSA9IGxpc3RbaW5kZXggLSAxXVxuICAgIGNvbnN0IGFmdGVyID0gbGlzdFtpbmRleCArIDFdXG4gICAgYmVmb3JlICYmIChiZWZvcmUubmV4dFNpYmxpbmcgPSBhZnRlcilcbiAgICBhZnRlciAmJiAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlKVxuICB9XG4gIGxpc3Quc3BsaWNlKGluZGV4LCAxKVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXREb2MgfSBmcm9tICcuL29wZXJhdGlvbidcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9kZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLm5vZGVJZCA9IHVuaXF1ZUlkKClcbiAgICB0aGlzLnJlZiA9IHRoaXMubm9kZUlkXG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wdXJlQ2hpbGRyZW4gPSBbXVxuICAgIHRoaXMucGFyZW50Tm9kZSA9IG51bGxcbiAgICB0aGlzLm5leHRTaWJsaW5nID0gbnVsbFxuICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICogRGVzdHJveSBjdXJyZW50IG5vZGUsIGFuZCByZW1vdmUgaXRzZWxmIGZvcm0gbm9kZU1hcC5cbiAgKi9cbiAgZGVzdHJveSAoKSB7XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jKHRoaXMuZG9jSWQpXG4gICAgaWYgKGRvYykge1xuICAgICAgZGVsZXRlIHRoaXMuZG9jSWRcbiAgICAgIGRlbGV0ZSBkb2Mubm9kZU1hcFt0aGlzLm5vZGVJZF1cbiAgICB9XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGNoaWxkLmRlc3Ryb3koKVxuICAgIH0pXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0VGFza0NlbnRlciB9IGZyb20gJy4vb3BlcmF0aW9uJ1xuXG5sZXQgRWxlbWVudFxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudCAoRWwpIHtcbiAgRWxlbWVudCA9IEVsXG59XG5cbi8qKlxuICogQSBtYXAgd2hpY2ggc3RvcmVzIGFsbCB0eXBlIG9mIGVsZW1lbnRzLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuY29uc3QgcmVnaXN0ZXJlZEVsZW1lbnRzID0ge31cblxuLyoqXG4gKiBSZWdpc3RlciBhbiBleHRlbmRlZCBlbGVtZW50IHR5cGUgd2l0aCBjb21wb25lbnQgbWV0aG9kcy5cbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZSAgICBjb21wb25lbnQgdHlwZVxuICogQHBhcmFtICB7YXJyYXl9ICBtZXRob2RzIGEgbGlzdCBvZiBtZXRob2QgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRWxlbWVudCAodHlwZSwgbWV0aG9kcykge1xuICAvLyBTa2lwIHdoZW4gbm8gc3BlY2lhbCBjb21wb25lbnQgbWV0aG9kcy5cbiAgaWYgKCFtZXRob2RzIHx8ICFtZXRob2RzLmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSW5pdCBjb25zdHJ1Y3Rvci5cbiAgY2xhc3MgV2VleEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHt9XG5cbiAgLy8gQWRkIG1ldGhvZHMgdG8gcHJvdG90eXBlLlxuICBtZXRob2RzLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgV2VleEVsZW1lbnQucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICBpZiAodGFza0NlbnRlcikge1xuICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKCdjb21wb25lbnQnLCB7XG4gICAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgICBjb21wb25lbnQ6IHR5cGUsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lXG4gICAgICAgIH0sIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIC8vIEFkZCB0byBlbGVtZW50IHR5cGUgbWFwLlxuICByZWdpc3RlcmVkRWxlbWVudHNbdHlwZV0gPSBXZWV4RWxlbWVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckVsZW1lbnQgKHR5cGUpIHtcbiAgZGVsZXRlIHJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQgKHR5cGUpIHtcbiAgcmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWV4RWxlbWVudCAodHlwZSkge1xuICByZXR1cm4gISFyZWdpc3RlcmVkRWxlbWVudHNbdHlwZV1cbn1cblxuLyoqXG4gKiBDbGVhciBhbGwgZWxlbWVudCB0eXBlcy4gT25seSBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV2VleEVsZW1lbnRzICgpIHtcbiAgZm9yIChjb25zdCB0eXBlIGluIHJlZ2lzdGVyZWRFbGVtZW50cykge1xuICAgIHVucmVnaXN0ZXJFbGVtZW50KHR5cGUpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTm9kZSBmcm9tICcuL05vZGUnXG5pbXBvcnQge1xuICBnZXREb2MsXG4gIGdldFRhc2tDZW50ZXIsXG4gIGxpbmtQYXJlbnQsXG4gIG5leHRFbGVtZW50LFxuICBwcmV2aW91c0VsZW1lbnQsXG4gIGluc2VydEluZGV4LFxuICBtb3ZlSW5kZXgsXG4gIHJlbW92ZUluZGV4XG59IGZyb20gJy4vb3BlcmF0aW9uJ1xuaW1wb3J0IHsgdW5pcXVlSWQsIGlzRW1wdHkgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGdldFdlZXhFbGVtZW50LCBzZXRFbGVtZW50IH0gZnJvbSAnLi9XZWV4RWxlbWVudCdcblxuY29uc3QgREVGQVVMVF9UQUdfTkFNRSA9ICdkaXYnXG5jb25zdCBCVUJCTEVfRVZFTlRTID0gW1xuICAnY2xpY2snLCAnbG9uZ3ByZXNzJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJyxcbiAgJ3BhbnN0YXJ0JywgJ3Bhbm1vdmUnLCAncGFuZW5kJywgJ2hvcml6b250YWxwYW4nLCAndmVydGljYWxwYW4nLCAnc3dpcGUnXG5dXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTm9kZSAoZG9jSWQsIG5vZGUpIHtcbiAgY29uc3QgZG9jID0gZ2V0RG9jKGRvY0lkKVxuICBkb2Mubm9kZU1hcFtub2RlLm5vZGVJZF0gPSBub2RlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHR5cGUgPSBERUZBVUxUX1RBR19OQU1FLCBwcm9wcywgaXNFeHRlbmRlZCkge1xuICAgIHN1cGVyKClcblxuICAgIGNvbnN0IFdlZXhFbGVtZW50ID0gZ2V0V2VleEVsZW1lbnQodHlwZSlcbiAgICBpZiAoV2VleEVsZW1lbnQgJiYgIWlzRXh0ZW5kZWQpIHtcbiAgICAgIHJldHVybiBuZXcgV2VleEVsZW1lbnQodHlwZSwgcHJvcHMsIHRydWUpXG4gICAgfVxuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCB7fVxuICAgIHRoaXMubm9kZVR5cGUgPSAxXG4gICAgdGhpcy5ub2RlSWQgPSB1bmlxdWVJZCgpXG4gICAgdGhpcy5yZWYgPSB0aGlzLm5vZGVJZFxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmF0dHIgPSBwcm9wcy5hdHRyIHx8IHt9XG4gICAgdGhpcy5zdHlsZSA9IHByb3BzLnN0eWxlIHx8IHt9XG4gICAgdGhpcy5jbGFzc1N0eWxlID0gcHJvcHMuY2xhc3NTdHlsZSB8fCB7fVxuICAgIHRoaXMuZXZlbnQgPSB7fVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuICAgIHRoaXMucHVyZUNoaWxkcmVuID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgYSBjaGlsZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFwcGVuZENoaWxkIChub2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUgIT09IHRoaXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgaW5zZXJ0SW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4sIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIC0xXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KG5vZGUsIHRoaXMucHVyZUNoaWxkcmVuLCB0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYmVmb3JlIHNwZWNpZmllZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgaW5zZXJ0QmVmb3JlIChub2RlLCBiZWZvcmUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlICYmIG5vZGUucGFyZW50Tm9kZSAhPT0gdGhpcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChub2RlID09PSBiZWZvcmUgfHwgKG5vZGUubmV4dFNpYmxpbmcgJiYgbm9kZS5uZXh0U2libGluZyA9PT0gYmVmb3JlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKSwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgcHVyZUJlZm9yZSA9IG5leHRFbGVtZW50KGJlZm9yZSlcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdhZGRFbGVtZW50JyB9LFxuICAgICAgICAgICAgW3RoaXMucmVmLCBub2RlLnRvSlNPTigpLCBpbmRleF1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtb3ZlSW5kZXgobm9kZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5jaGlsZHJlbi5pbmRleE9mKGJlZm9yZSksIHRydWUpXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBwdXJlQmVmb3JlID0gbmV4dEVsZW1lbnQoYmVmb3JlKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjb25zdCBpbmRleCA9IG1vdmVJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYWZ0ZXIgc3BlY2lmaWVkIG5vZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhZnRlclxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGluc2VydEFmdGVyIChub2RlLCBhZnRlcikge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9PSB0aGlzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IGFmdGVyIHx8IChub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnByZXZpb3VzU2libGluZyA9PT0gYWZ0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIGxpbmtQYXJlbnQobm9kZSwgdGhpcylcbiAgICAgIGluc2VydEluZGV4KG5vZGUsIHRoaXMuY2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4uaW5kZXhPZihhZnRlcikgKyAxLCB0cnVlKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KGFmdGVyKSkgKyAxXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXIpICsgMSwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4sXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQoYWZ0ZXIpKSArIDFcbiAgICAgICAgKVxuICAgICAgICBjb25zdCB0YXNrQ2VudGVyID0gZ2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKVxuICAgICAgICBpZiAodGFza0NlbnRlciAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdtb3ZlRWxlbWVudCcgfSxcbiAgICAgICAgICAgIFtub2RlLnJlZiwgdGhpcy5yZWYsIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBub2RlLCBhbmQgZGVjaWRlIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGRlc3Ryb3llZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcmVzZXJ2ZWRcbiAgICovXG4gIHJlbW92ZUNoaWxkIChub2RlLCBwcmVzZXJ2ZWQpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICByZW1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0cnVlKVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcmVtb3ZlSW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4pXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ3JlbW92ZUVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbbm9kZS5yZWZdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcHJlc2VydmVkKSB7XG4gICAgICBub2RlLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2hpbGQgbm9kZXMuXG4gICAqL1xuICBjbGVhciAoKSB7XG4gICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICB0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdyZW1vdmVFbGVtZW50JyB9LFxuICAgICAgICAgIFtub2RlLnJlZl1cbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgbm9kZS5kZXN0cm95KClcbiAgICB9KVxuICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMFxuICAgIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gYXR0cmlidXRlLCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0QXR0ciAoa2V5LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgaWYgKHRoaXMuYXR0cltrZXldID09PSB2YWx1ZSAmJiBzaWxlbnQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5hdHRyW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlQXR0cnMnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgcmVzdWx0XVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYmF0Y2hlZCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYmF0Y2hlZEF0dHJzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lsZW50XG4gICAqL1xuICBzZXRBdHRycyAoYmF0Y2hlZEF0dHJzLCBzaWxlbnQpIHtcbiAgICBpZiAoaXNFbXB0eShiYXRjaGVkQXR0cnMpKSByZXR1cm5cbiAgICBjb25zdCBtdXRhdGlvbnMgPSB7fVxuICAgIGZvciAoY29uc3Qga2V5IGluIGJhdGNoZWRBdHRycykge1xuICAgICAgaWYgKHRoaXMuYXR0cltrZXldICE9PSBiYXRjaGVkQXR0cnNba2V5XSkge1xuICAgICAgICB0aGlzLmF0dHJba2V5XSA9IGJhdGNoZWRBdHRyc1trZXldXG4gICAgICAgIG11dGF0aW9uc1trZXldID0gYmF0Y2hlZEF0dHJzW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5KG11dGF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICBpZiAoIXNpbGVudCAmJiB0YXNrQ2VudGVyKSB7XG4gICAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAnZG9tJyxcbiAgICAgICAgICB7IGFjdGlvbjogJ3VwZGF0ZUF0dHJzJyB9LFxuICAgICAgICAgIFt0aGlzLnJlZiwgbXV0YXRpb25zXVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHN0eWxlIHByb3BlcnR5LCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0U3R5bGUgKGtleSwgdmFsdWUsIHNpbGVudCkge1xuICAgIGlmICh0aGlzLnN0eWxlW2tleV0gPT09IHZhbHVlICYmIHNpbGVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnN0eWxlW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgcmVzdWx0XVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYmF0Y2hlZCBzdHlsZSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYmF0Y2hlZFN0eWxlc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0U3R5bGVzIChiYXRjaGVkU3R5bGVzLCBzaWxlbnQpIHtcbiAgICBpZiAoaXNFbXB0eShiYXRjaGVkU3R5bGVzKSkgcmV0dXJuXG4gICAgY29uc3QgbXV0YXRpb25zID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBiYXRjaGVkU3R5bGVzKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZVtrZXldICE9PSBiYXRjaGVkU3R5bGVzW2tleV0pIHtcbiAgICAgICAgdGhpcy5zdHlsZVtrZXldID0gYmF0Y2hlZFN0eWxlc1trZXldXG4gICAgICAgIG11dGF0aW9uc1trZXldID0gYmF0Y2hlZFN0eWxlc1trZXldXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNFbXB0eShtdXRhdGlvbnMpKSB7XG4gICAgICBjb25zdCB0YXNrQ2VudGVyID0gZ2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKVxuICAgICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICd1cGRhdGVTdHlsZScgfSxcbiAgICAgICAgICBbdGhpcy5yZWYsIG11dGF0aW9uc11cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3R5bGUgcHJvcGVydGllcyBmcm9tIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NTdHlsZVxuICAgKi9cbiAgc2V0Q2xhc3NTdHlsZSAoY2xhc3NTdHlsZSkge1xuICAgIC8vIHJlc2V0IHByZXZpb3VzIGNsYXNzIHN0eWxlIHRvIGVtcHR5IHN0cmluZ1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2xhc3NTdHlsZSkge1xuICAgICAgdGhpcy5jbGFzc1N0eWxlW2tleV0gPSAnJ1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jbGFzc1N0eWxlLCBjbGFzc1N0eWxlKVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgdGhpcy50b1N0eWxlKCldXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBldmVudCBoYW5kbGVyXG4gICAqL1xuICBhZGRFdmVudCAodHlwZSwgaGFuZGxlciwgcGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmV2ZW50KSB7XG4gICAgICB0aGlzLmV2ZW50ID0ge31cbiAgICB9XG4gICAgaWYgKCF0aGlzLmV2ZW50W3R5cGVdKSB7XG4gICAgICB0aGlzLmV2ZW50W3R5cGVdID0geyBoYW5kbGVyLCBwYXJhbXMgfVxuICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAnZG9tJyxcbiAgICAgICAgICB7IGFjdGlvbjogJ2FkZEV2ZW50JyB9LFxuICAgICAgICAgIFt0aGlzLnJlZiwgdHlwZV1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgaGFuZGxlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IHR5cGVcbiAgICovXG4gIHJlbW92ZUV2ZW50ICh0eXBlKSB7XG4gICAgaWYgKHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudFt0eXBlXSkge1xuICAgICAgZGVsZXRlIHRoaXMuZXZlbnRbdHlwZV1cbiAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICBpZiAodGFza0NlbnRlcikge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdyZW1vdmVFdmVudCcgfSxcbiAgICAgICAgICBbdGhpcy5yZWYsIHR5cGVdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZSBhbiBldmVudCBtYW51YWxseS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgdHlwZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNCdWJibGUgd2hldGhlciBvciBub3QgZXZlbnQgYnViYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHt9IGFueXRoaW5nIHJldHVybmVkIGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAgICovXG4gIGZpcmVFdmVudCAodHlwZSwgZXZlbnQsIGlzQnViYmxlLCBvcHRpb25zKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGxcbiAgICBsZXQgaXNTdG9wUHJvcGFnYXRpb24gPSBmYWxzZVxuICAgIGNvbnN0IGV2ZW50RGVzYyA9IHRoaXMuZXZlbnRbdHlwZV1cbiAgICBpZiAoZXZlbnREZXNjICYmIGV2ZW50KSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gZXZlbnREZXNjLmhhbmRsZXJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhcmFtcykge1xuICAgICAgICByZXN1bHQgPSBoYW5kbGVyLmNhbGwodGhpcywgLi4ub3B0aW9ucy5wYXJhbXMsIGV2ZW50KVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIuY2FsbCh0aGlzLCBldmVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzU3RvcFByb3BhZ2F0aW9uXG4gICAgICAmJiBpc0J1YmJsZVxuICAgICAgJiYgKEJVQkJMRV9FVkVOVFMuaW5kZXhPZih0eXBlKSAhPT0gLTEpXG4gICAgICAmJiB0aGlzLnBhcmVudE5vZGVcbiAgICAgICYmIHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQpIHtcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzLnBhcmVudE5vZGVcbiAgICAgIHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQodHlwZSwgZXZlbnQsIGlzQnViYmxlKSAvLyBubyBvcHRpb25zXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgc3R5bGVzIG9mIGN1cnJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybiB7b2JqZWN0fSBzdHlsZVxuICAgKi9cbiAgdG9TdHlsZSAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2xhc3NTdHlsZSwgdGhpcy5zdHlsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZWxlbWVudCB0byBKU09OIGxpa2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGVsZW1lbnRcbiAgICovXG4gIHRvSlNPTiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgcmVmOiB0aGlzLnJlZi50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgYXR0cjogdGhpcy5hdHRyLFxuICAgICAgc3R5bGU6IHRoaXMudG9TdHlsZSgpXG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gW11cbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gdGhpcy5ldmVudCkge1xuICAgICAgY29uc3QgeyBwYXJhbXMgfSA9IHRoaXMuZXZlbnRbdHlwZV1cbiAgICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgIGV2ZW50LnB1c2godHlwZSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBldmVudC5wdXNoKHsgdHlwZSwgcGFyYW1zIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5ldmVudCA9IGV2ZW50XG4gICAgfVxuICAgIGlmICh0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvSlNPTigpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBIVE1MIGVsZW1lbnQgdGFnIHN0cmluZy5cbiAgICogQHJldHVybiB7c3Rpcm5nfSBodG1sXG4gICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8JyArIHRoaXMudHlwZSArXG4gICAgJyBhdHRyPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpICtcbiAgICAnIHN0eWxlPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkgKyAnPicgK1xuICAgIHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvU3RyaW5nKCkpLmpvaW4oJycpICtcbiAgICAnPC8nICsgdGhpcy50eXBlICsgJz4nXG4gIH1cbn1cblxuc2V0RWxlbWVudChFbGVtZW50KVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBDYWxsYmFja01hbmFnZXIgZnJvbSAnLi9DYWxsYmFja01hbmFnZXInXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuLi92ZG9tL0VsZW1lbnQnXG5pbXBvcnQgeyB0eXBvZiB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgbm9ybWFsaXplUHJpbWl0aXZlIH0gZnJvbSAnLi9ub3JtYWxpemUnXG5cbmxldCBmYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9XG5cbi8vIFRoZSBBUEkgb2YgVGFza0NlbnRlciB3b3VsZCBiZSByZS1kZXNpZ24uXG5leHBvcnQgY2xhc3MgVGFza0NlbnRlciB7XG4gIGNvbnN0cnVjdG9yIChpZCwgc2VuZFRhc2tzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbnN0YW5jZUlkJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBTdHJpbmcoaWQpXG4gICAgfSlcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhbGxiYWNrTWFuYWdlcicsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbmV3IENhbGxiYWNrTWFuYWdlcihpZClcbiAgICB9KVxuICAgIGZhbGxiYWNrID0gc2VuZFRhc2tzIHx8IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICBjYWxsYmFjayAoY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY29uc3VtZShjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSlcbiAgfVxuXG4gIHJlZ2lzdGVySG9vayAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5yZWdpc3Rlckhvb2soLi4uYXJncylcbiAgfVxuXG4gIHRyaWdnZXJIb29rICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLnRyaWdnZXJIb29rKC4uLmFyZ3MpXG4gIH1cblxuICB1cGRhdGVEYXRhIChjb21wb25lbnRJZCwgbmV3RGF0YSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLnNlbmQoJ21vZHVsZScsIHtcbiAgICAgIG1vZHVsZTogJ2RvbScsXG4gICAgICBtZXRob2Q6ICd1cGRhdGVDb21wb25lbnREYXRhJ1xuICAgIH0sIFtjb21wb25lbnRJZCwgbmV3RGF0YSwgY2FsbGJhY2tdKVxuICB9XG5cbiAgZGVzdHJveUNhbGxiYWNrICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIHZhbHVlLiBTcGVjaWFsbHksIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGVuIGdlbmVyYXRlIGEgZnVuY3Rpb24gaWRcbiAgICogYW5kIHNhdmUgaXQgdG8gYENhbGxiYWNrTWFuYWdlcmAsIGF0IGxhc3QgcmV0dXJuIHRoZSBmdW5jdGlvbiBpZC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgdlxuICAgKiBAcmV0dXJuIHtwcmltaXRpdmV9XG4gICAqL1xuICBub3JtYWxpemUgKHYpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwb2YodilcbiAgICBpZiAodiAmJiB2IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYucmVmXG4gICAgfVxuICAgIGlmICh2ICYmIHYuX2lzVnVlICYmIHYuJGVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYuJGVsLnJlZlxuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZCh2KS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVQcmltaXRpdmUodilcbiAgfVxuXG4gIHNlbmQgKHR5cGUsIHBhcmFtcywgYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBjb21wb25lbnQsIHJlZiwgbW9kdWxlLCBtZXRob2QgfSA9IHBhcmFtc1xuXG4gICAgYXJncyA9IGFyZ3MubWFwKGFyZyA9PiB0aGlzLm5vcm1hbGl6ZShhcmcpKVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdkb20nOlxuICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCByZWYsIG1ldGhvZCwgYXJncywgT2JqZWN0LmFzc2lnbih7IGNvbXBvbmVudCB9LCBvcHRpb25zKSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncywgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBjYWxsRE9NIChhY3Rpb24sIGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgfVxuXG4gIGNhbGxDb21wb25lbnQgKHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKVxuICB9XG5cbiAgY2FsbE1vZHVsZSAobW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCwgbW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKCkge1xuICBjb25zdCBET01fTUVUSE9EUyA9IHtcbiAgICBjcmVhdGVGaW5pc2g6IGdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLFxuICAgIHVwZGF0ZUZpbmlzaDogZ2xvYmFsLmNhbGxVcGRhdGVGaW5pc2gsXG4gICAgcmVmcmVzaEZpbmlzaDogZ2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLFxuXG4gICAgY3JlYXRlQm9keTogZ2xvYmFsLmNhbGxDcmVhdGVCb2R5LFxuXG4gICAgYWRkRWxlbWVudDogZ2xvYmFsLmNhbGxBZGRFbGVtZW50LFxuICAgIHJlbW92ZUVsZW1lbnQ6IGdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxcbiAgICBtb3ZlRWxlbWVudDogZ2xvYmFsLmNhbGxNb3ZlRWxlbWVudCxcbiAgICB1cGRhdGVBdHRyczogZ2xvYmFsLmNhbGxVcGRhdGVBdHRycyxcbiAgICB1cGRhdGVTdHlsZTogZ2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxcblxuICAgIGFkZEV2ZW50OiBnbG9iYWwuY2FsbEFkZEV2ZW50LFxuICAgIHJlbW92ZUV2ZW50OiBnbG9iYWwuY2FsbFJlbW92ZUV2ZW50XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBUYXNrQ2VudGVyLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBET01fTUVUSE9EUykge1xuICAgIGNvbnN0IG1ldGhvZCA9IERPTV9NRVRIT0RTW25hbWVdXG4gICAgcHJvdG9bbmFtZV0gPSBtZXRob2QgP1xuICAgICAgKGlkLCBhcmdzKSA9PiBtZXRob2QoaWQsIC4uLmFyZ3MpIDpcbiAgICAgIChpZCwgYXJncykgPT4gZmFsbGJhY2soaWQsIFt7IG1vZHVsZTogJ2RvbScsIG1ldGhvZDogbmFtZSwgYXJncyB9XSwgJy0xJylcbiAgfVxuXG4gIHByb3RvLmNvbXBvbmVudEhhbmRsZXIgPSBnbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudCB8fFxuICAgICgoaWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSA9PlxuICAgICAgZmFsbGJhY2soaWQsIFt7IGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsIHJlZiwgbWV0aG9kLCBhcmdzIH1dKSlcblxuICBwcm90by5tb2R1bGVIYW5kbGVyID0gZ2xvYmFsLmNhbGxOYXRpdmVNb2R1bGUgfHxcbiAgICAoKGlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncykgPT5cbiAgICAgIGZhbGxiYWNrKGlkLCBbeyBtb2R1bGUsIG1ldGhvZCwgYXJncyB9XSkpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0RG9jIH0gZnJvbSAnLi4vdmRvbS9vcGVyYXRpb24nXG5cbmZ1bmN0aW9uIGZpcmVFdmVudCAoZG9jdW1lbnQsIG5vZGVJZCwgdHlwZSwgZXZlbnQsIGRvbUNoYW5nZXMsIHBhcmFtcykge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmdldFJlZihub2RlSWQpXG4gIGlmIChlbCkge1xuICAgIHJldHVybiBkb2N1bWVudC5maXJlRXZlbnQoZWwsIHR5cGUsIGV2ZW50LCBkb21DaGFuZ2VzLCBwYXJhbXMpXG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIiR7bm9kZUlkfVwiYClcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2sgKGRvY3VtZW50LCBjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSkge1xuICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFjayhjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSlcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50SG9vayAoZG9jdW1lbnQsIGNvbXBvbmVudElkLCB0eXBlLCBob29rLCBvcHRpb25zKSB7XG4gIGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LnRhc2tDZW50ZXIpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBDYW4ndCBmaW5kIFwiZG9jdW1lbnRcIiBvciBcInRhc2tDZW50ZXJcIi5gKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgbGV0IHJlc3VsdCA9IG51bGxcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBkb2N1bWVudC50YXNrQ2VudGVyLnRyaWdnZXJIb29rKGNvbXBvbmVudElkLCB0eXBlLCBob29rLCBvcHRpb25zKVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlIFwiJHt0eXBlfUAke2hvb2t9XCIgaG9vayBvbiAke2NvbXBvbmVudElkfS5gKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVUYXNrcyAoaWQsIHRhc2tzKSB7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jKGlkKVxuICBpZiAoIWRvY3VtZW50KSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlY2VpdmVUYXNrcywgYFxuICAgICAgKyBgaW5zdGFuY2UgKCR7aWR9KSBpcyBub3QgYXZhaWxhYmxlLmApXG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgcmV0dXJuIHRhc2tzLm1hcCh0YXNrID0+IHtcbiAgICAgIHN3aXRjaCAodGFzay5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnY2FsbGJhY2snOiByZXR1cm4gY2FsbGJhY2soZG9jdW1lbnQsIC4uLnRhc2suYXJncylcbiAgICAgICAgY2FzZSAnZmlyZUV2ZW50U3luYyc6XG4gICAgICAgIGNhc2UgJ2ZpcmVFdmVudCc6IHJldHVybiBmaXJlRXZlbnQoZG9jdW1lbnQsIC4uLnRhc2suYXJncylcbiAgICAgICAgY2FzZSAnY29tcG9uZW50SG9vayc6IHJldHVybiBjb21wb25lbnRIb29rKGRvY3VtZW50LCAuLi50YXNrLmFyZ3MpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IHdlZXhNb2R1bGVzID0ge31cblxuLyoqXG4gKiBSZWdpc3RlciBuYXRpdmUgbW9kdWxlcyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuZXdNb2R1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMgKG5ld01vZHVsZXMpIHtcbiAgZm9yIChjb25zdCBuYW1lIGluIG5ld01vZHVsZXMpIHtcbiAgICBpZiAoIXdlZXhNb2R1bGVzW25hbWVdKSB7XG4gICAgICB3ZWV4TW9kdWxlc1tuYW1lXSA9IHt9XG4gICAgfVxuICAgIG5ld01vZHVsZXNbbmFtZV0uZm9yRWFjaChtZXRob2QgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdlZXhNb2R1bGVzW25hbWVdW21ldGhvZF0gPSB0cnVlXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgd2VleE1vZHVsZXNbbmFtZV1bbWV0aG9kLm5hbWVdID0gbWV0aG9kLmFyZ3NcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgbW9kdWxlIG9yIHRoZSBtZXRob2QgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2R1bGUgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBuYW1lIChvcHRpb25hbClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZSAobmFtZSwgbWV0aG9kKSB7XG4gIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAhISh3ZWV4TW9kdWxlc1tuYW1lXSAmJiB3ZWV4TW9kdWxlc1tuYW1lXVttZXRob2RdKVxuICB9XG4gIHJldHVybiAhIXdlZXhNb2R1bGVzW25hbWVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVEZXNjcmlwdGlvbiAobmFtZSkge1xuICByZXR1cm4gd2VleE1vZHVsZXNbbmFtZV1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyByZWdpc3RlckVsZW1lbnQgfSBmcm9tICcuLi92ZG9tL1dlZXhFbGVtZW50J1xuXG5jb25zdCB3ZWV4Q29tcG9uZW50cyA9IHt9XG5cbi8qKlxuICogUmVnaXN0ZXIgbmF0aXZlIGNvbXBvbmVudHMgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge2FycmF5fSBuZXdDb21wb25lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudHMgKG5ld0NvbXBvbmVudHMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q29tcG9uZW50cykpIHtcbiAgICBuZXdDb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdlZXhDb21wb25lbnRzW2NvbXBvbmVudF0gPSB0cnVlXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY29tcG9uZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdlZXhDb21wb25lbnRzW2NvbXBvbmVudC50eXBlXSA9IGNvbXBvbmVudFxuICAgICAgICByZWdpc3RlckVsZW1lbnQoY29tcG9uZW50LnR5cGUsIGNvbXBvbmVudC5tZXRob2RzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb21wb25lbnQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdpc3RlcmVkQ29tcG9uZW50IChuYW1lKSB7XG4gIHJldHVybiAhIXdlZXhDb21wb25lbnRzW25hbWVdXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gSlMgU2VydmljZXNcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VzID0gW11cblxuLyoqXG4gKiBSZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZS5cbiAqIEEgSmF2YVNjcmlwdCBzZXJ2aWNlIG9wdGlvbnMgY291bGQgaGF2ZSBhIHNldCBvZiBsaWZlY3ljbGUgbWV0aG9kc1xuICogZm9yIGVhY2ggV2VleCBpbnN0YW5jZS4gRm9yIGV4YW1wbGU6IGNyZWF0ZSwgcmVmcmVzaCwgZGVzdHJveS5cbiAqIEZvciB0aGUgSlMgZnJhbWV3b3JrIG1haW50YWluZXIgaWYgeW91IHdhbnQgdG8gc3VwcGx5IHNvbWUgZmVhdHVyZXNcbiAqIHdoaWNoIG5lZWQgdG8gd29yayB3ZWxsIGluIGRpZmZlcmVudCBXZWV4IGluc3RhbmNlcywgZXZlbiBpbiBkaWZmZXJlbnRcbiAqIGZyYW1ld29ya3Mgc2VwYXJhdGVseS4gWW91IGNhbiBtYWtlIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHRvIGluaXRcbiAqIGl0cyB2YXJpYWJsZXMgb3IgY2xhc3NlcyBmb3IgZWFjaCBXZWV4IGluc3RhbmNlIHdoZW4gaXQncyBjcmVhdGVkXG4gKiBhbmQgcmVjeWNsZSB0aGVtIHdoZW4gaXQncyBkZXN0cm95ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb3VsZCBoYXZlIHsgY3JlYXRlLCByZWZyZXNoLCBkZXN0cm95IH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBtZXRob2RzLiBJbiBjcmVhdGUgbWV0aG9kIGl0IHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuIG9iamVjdCBvZiB3aGF0IHZhcmlhYmxlcyBvciBjbGFzc2VzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBpbmplY3RlZCBpbnRvIHRoZSBXZWV4IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIgKG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKGhhcyhuYW1lKSkge1xuICAgIGNvbnNvbGUud2FybihgU2VydmljZSBcIiR7bmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhYClcbiAgfVxuICBlbHNlIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucylcbiAgICBzZXJ2aWNlcy5wdXNoKHsgbmFtZSwgb3B0aW9ucyB9KVxuICB9XG59XG5cbi8qKlxuICogVW5yZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZSBieSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlciAobmFtZSkge1xuICBzZXJ2aWNlcy5zb21lKChzZXJ2aWNlLCBpbmRleCkgPT4ge1xuICAgIGlmIChzZXJ2aWNlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHNlcnZpY2VzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHdpdGggYSBjZXJ0YWluIG5hbWUgZXhpc3RlZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXMgKG5hbWUpIHtcbiAgcmV0dXJuIGluZGV4T2YobmFtZSkgPj0gMFxufVxuXG4vKipcbiAqIEZpbmQgdGhlIGluZGV4IG9mIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIGJ5IG5hbWVcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBpbmRleE9mIChuYW1lKSB7XG4gIHJldHVybiBzZXJ2aWNlcy5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLm5hbWUpLmluZGV4T2YobmFtZSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRUYXNrQ2VudGVyIH0gZnJvbSAnLi4vdmRvbS9vcGVyYXRpb24nXG5pbXBvcnQgeyBpc1JlZ2lzdGVyZWRNb2R1bGUgfSBmcm9tICcuLi9hcGkvbW9kdWxlJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhY2sgKGlkLCB0eXBlLCB2YWx1ZSkge1xuICBjb25zdCB0YXNrQ2VudGVyID0gZ2V0VGFza0NlbnRlcihpZClcbiAgaWYgKCF0YXNrQ2VudGVyIHx8IHR5cGVvZiB0YXNrQ2VudGVyLnNlbmQgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gY3JlYXRlIHRyYWNrZXIhYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIXR5cGUgfHwgIXZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIHRyYWNrIHR5cGUgKCR7dHlwZX0pIG9yIHZhbHVlICgke3ZhbHVlfSlgKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGxhYmVsID0gYGpzZm0uJHt0eXBlfS4ke3ZhbHVlfWBcbiAgdHJ5IHtcbiAgICBpZiAoaXNSZWdpc3RlcmVkTW9kdWxlKCd1c2VyVHJhY2snLCAnYWRkUGVyZlBvaW50JykpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgICBtZXNzYWdlW2xhYmVsXSA9ICc0J1xuICAgICAgdGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7XG4gICAgICAgIG1vZHVsZTogJ3VzZXJUcmFjaycsXG4gICAgICAgIG1ldGhvZDogJ2FkZFBlcmZQb2ludCdcbiAgICAgIH0sIFttZXNzYWdlXSlcbiAgICB9XG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byB0cmFjZSBcIiR7bGFiZWx9XCIhYClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IgKC4uLm1lc3NhZ2VzKSB7XG4gIGlmICh0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIGAsIC4uLm1lc3NhZ2VzKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFeGNlcHRpb24gKGVycikge1xuICBpZiAodHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIudG9TdHJpbmcoKSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSdcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5ub2RlVHlwZSA9IDhcbiAgICB0aGlzLm5vZGVJZCA9IHVuaXF1ZUlkKClcbiAgICB0aGlzLnJlZiA9IHRoaXMubm9kZUlkXG4gICAgdGhpcy50eXBlID0gJ2NvbW1lbnQnXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wdXJlQ2hpbGRyZW4gPSBbXVxuICB9XG5cbiAgLyoqXG4gICogQ29udmVydCB0byBIVE1MIGNvbW1lbnQgc3RyaW5nLlxuICAqIEByZXR1cm4ge3N0aXJuZ30gaHRtbFxuICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8IS0tICcgKyB0aGlzLnZhbHVlICsgJyAtLT4nXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiogQ3JlYXRlIHRoZSBhY3Rpb24gb2JqZWN0LlxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuKiBAcGFyYW0ge2FycmF5fSBhcmd1bWVudHNcbiogQHJldHVybiB7b2JqZWN0fSBhY3Rpb25cbiovXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24gKG5hbWUsIGFyZ3MgPSBbXSkge1xuICByZXR1cm4geyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6IG5hbWUsIGFyZ3M6IGFyZ3MgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0ZW5lciB7XG4gIGNvbnN0cnVjdG9yIChpZCwgaGFuZGxlcikge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMuYmF0Y2hlZCA9IGZhbHNlXG4gICAgdGhpcy51cGRhdGVzID0gW11cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFuZGxlcicsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGhhbmRsZXJcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGNyZWF0ZUZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyXG4gICAgcmV0dXJuIGhhbmRsZXIoW2NyZWF0ZUFjdGlvbignY3JlYXRlRmluaXNoJyldLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUZpbmlzaFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICB1cGRhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3VwZGF0ZUZpbmlzaCcpXSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZWZyZXNoRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlZnJlc2hGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3JlZnJlc2hGaW5pc2gnKV0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlQm9keVwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBjcmVhdGVCb2R5IChlbGVtZW50KSB7XG4gICAgY29uc3QgYm9keSA9IGVsZW1lbnQudG9KU09OKClcbiAgICBjb25zdCBjaGlsZHJlbiA9IGJvZHkuY2hpbGRyZW5cbiAgICBkZWxldGUgYm9keS5jaGlsZHJlblxuICAgIGNvbnN0IGFjdGlvbnMgPSBbY3JlYXRlQWN0aW9uKCdjcmVhdGVCb2R5JywgW2JvZHldKV1cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaC5hcHBseShhY3Rpb25zLCBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW2JvZHkucmVmLCBjaGlsZCwgLTFdKVxuICAgICAgfSkpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcImFkZEVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgYWRkRWxlbWVudCAoZWxlbWVudCwgcmVmLCBpbmRleCkge1xuICAgIGlmICghKGluZGV4ID49IDApKSB7XG4gICAgICBpbmRleCA9IC0xXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW3JlZiwgZWxlbWVudC50b0pTT04oKSwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInJlbW92ZUVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICByZW1vdmVFbGVtZW50IChyZWYpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gcmVmLm1hcCgocikgPT4gY3JlYXRlQWN0aW9uKCdyZW1vdmVFbGVtZW50JywgW3JdKSlcbiAgICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3JlbW92ZUVsZW1lbnQnLCBbcmVmXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJtb3ZlRWxlbWVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHRhcmdldCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtzdGlybmd9IHBhcmVudCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgbW92ZUVsZW1lbnQgKHRhcmdldFJlZiwgcGFyZW50UmVmLCBpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdtb3ZlRWxlbWVudCcsIFt0YXJnZXRSZWYsIHBhcmVudFJlZiwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUF0dHJzXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSBrZXlcbiAgICogQHBhcmFtIHtzdGlybmd9IHZhbHVlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgc2V0QXR0ciAocmVmLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3VwZGF0ZUF0dHJzJywgW3JlZiwgcmVzdWx0XSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJ1cGRhdGVTdHlsZVwiIHNpZ25hbCwgdXBkYXRlIGEgc29sZSBzdHlsZS5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0aXJuZ30ga2V5XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlIChyZWYsIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigndXBkYXRlU3R5bGUnLCBbcmVmLCByZXN1bHRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZVN0eWxlXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlcyAocmVmLCBzdHlsZSkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCd1cGRhdGVTdHlsZScsIFtyZWYsIHN0eWxlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJhZGRFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFkZEV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbignYWRkRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZW1vdmVFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlbW92ZUV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigncmVtb3ZlRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge29iamVjdCB8IGFycmF5fSBhY3Rpb25zXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge30gYW55dGhpbmcgcmV0dXJuZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIGhhbmRsZXIgKGFjdGlvbnMsIGNiKSB7XG4gICAgcmV0dXJuIGNiICYmIGNiKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWN0aW9ucyBpbnRvIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYXJyYXl9IGFjdGlvbnNcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBhZGRBY3Rpb25zIChhY3Rpb25zKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHRoaXMudXBkYXRlc1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkge1xuICAgICAgYWN0aW9ucyA9IFthY3Rpb25zXVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJhdGNoZWQpIHtcbiAgICAgIHVwZGF0ZXMucHVzaC5hcHBseSh1cGRhdGVzLCBhY3Rpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKGFjdGlvbnMpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBUYXNrIGhhbmRsZXIgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBqYXZhc2NyaXB0IGFuZCBuYXRpdmUuXG4gKi9cblxuY29uc3QgaGFuZGxlck1hcCA9IHtcbiAgY3JlYXRlQm9keTogJ2NhbGxDcmVhdGVCb2R5JyxcbiAgYWRkRWxlbWVudDogJ2NhbGxBZGRFbGVtZW50JyxcbiAgcmVtb3ZlRWxlbWVudDogJ2NhbGxSZW1vdmVFbGVtZW50JyxcbiAgbW92ZUVsZW1lbnQ6ICdjYWxsTW92ZUVsZW1lbnQnLFxuICB1cGRhdGVBdHRyczogJ2NhbGxVcGRhdGVBdHRycycsXG4gIHVwZGF0ZVN0eWxlOiAnY2FsbFVwZGF0ZVN0eWxlJyxcbiAgYWRkRXZlbnQ6ICdjYWxsQWRkRXZlbnQnLFxuICByZW1vdmVFdmVudDogJ2NhbGxSZW1vdmVFdmVudCdcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB0YXNrIGhhbmRsZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSB0YXNrSGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlciAoaWQsIGhhbmRsZXIpIHtcbiAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyIHx8IGdsb2JhbC5jYWxsTmF0aXZlXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmYXVsdEhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyJylcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB0YXNrSGFuZGxlciAodGFza3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgICB0YXNrcyA9IFt0YXNrc11cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkaXNwYXRjaFRhc2soaWQsIHRhc2tzW2ldLCBkZWZhdWx0SGFuZGxlcilcbiAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGF2YWlsYWJsZSBoYW5kbGVyIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0F2YWlsYWJsZUhhbmRsZXIgKG1vZHVsZSwgbWV0aG9kKSB7XG4gIHJldHVybiBtb2R1bGUgPT09ICdkb20nXG4gICAgJiYgaGFuZGxlck1hcFttZXRob2RdXG4gICAgJiYgdHlwZW9mIGdsb2JhbFtoYW5kbGVyTWFwW21ldGhvZF1dID09PSAnZnVuY3Rpb24nXG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIHRhc2sgdG8gdGhlIHNwZWNpZmllZCBoYW5kbGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gdGFza1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVmYXVsdEhhbmRsZXJcbiAqIEByZXR1cm4ge251bWJlcn0gc2lnbmFsIHJldHVybmVkIGZyb20gbmF0aXZlXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoVGFzayAoaWQsIHRhc2ssIGRlZmF1bHRIYW5kbGVyKSB7XG4gIGNvbnN0IHsgbW9kdWxlLCBtZXRob2QsIGFyZ3MgfSA9IHRhc2tcblxuICBpZiAoaGFzQXZhaWxhYmxlSGFuZGxlcihtb2R1bGUsIG1ldGhvZCkpIHtcbiAgICByZXR1cm4gZ2xvYmFsW2hhbmRsZXJNYXBbbWV0aG9kXV0oaWQsIC4uLmFyZ3MsICctMScpXG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoaWQsIFt0YXNrXSwgJy0xJylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgQ29tbWVudCBmcm9tICcuL0NvbW1lbnQnXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL0VsZW1lbnQnXG5pbXBvcnQgTGlzdGVuZXIgZnJvbSAnLi4vYnJpZGdlL0xpc3RlbmVyJ1xuaW1wb3J0IHsgVGFza0NlbnRlciB9IGZyb20gJy4uL2JyaWRnZS9UYXNrQ2VudGVyJ1xuaW1wb3J0IHsgY3JlYXRlSGFuZGxlciB9IGZyb20gJy4uL2JyaWRnZS9IYW5kbGVyJ1xuaW1wb3J0IHsgYWRkRG9jLCByZW1vdmVEb2MsIGFwcGVuZEJvZHksIHNldEJvZHkgfSBmcm9tICcuL29wZXJhdGlvbidcblxuLyoqXG4gKiBVcGRhdGUgYWxsIGNoYW5nZXMgZm9yIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZXNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlRWxlbWVudCAoZWwsIGNoYW5nZXMpIHtcbiAgY29uc3QgYXR0cnMgPSBjaGFuZ2VzLmF0dHJzIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBhdHRycykge1xuICAgIGVsLnNldEF0dHIobmFtZSwgYXR0cnNbbmFtZV0sIHRydWUpXG4gIH1cbiAgY29uc3Qgc3R5bGUgPSBjaGFuZ2VzLnN0eWxlIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZSkge1xuICAgIGVsLnNldFN0eWxlKG5hbWUsIHN0eWxlW25hbWVdLCB0cnVlKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY3VtZW50IHtcbiAgY29uc3RydWN0b3IgKGlkLCB1cmwsIGhhbmRsZXIpIHtcbiAgICBpZCA9IGlkID8gaWQudG9TdHJpbmcoKSA6ICcnXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5VUkwgPSB1cmxcblxuICAgIGFkZERvYyhpZCwgdGhpcylcbiAgICB0aGlzLm5vZGVNYXAgPSB7fVxuICAgIGNvbnN0IEwgPSBEb2N1bWVudC5MaXN0ZW5lciB8fCBMaXN0ZW5lclxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgTChpZCwgaGFuZGxlciB8fCBjcmVhdGVIYW5kbGVyKGlkLCBEb2N1bWVudC5oYW5kbGVyKSkgLy8gZGVwcmVjYXRlZFxuICAgIHRoaXMudGFza0NlbnRlciA9IG5ldyBUYXNrQ2VudGVyKGlkLCBoYW5kbGVyID8gKGlkLCAuLi5hcmdzKSA9PiBoYW5kbGVyKC4uLmFyZ3MpIDogRG9jdW1lbnQuaGFuZGxlcilcbiAgICB0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpXG4gIH1cblxuICAvKipcbiAgKiBHZXQgdGhlIG5vZGUgZnJvbSBub2RlTWFwLlxuICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgaWRcbiAgKiBAcmV0dXJuIHtvYmplY3R9IG5vZGVcbiAgKi9cbiAgZ2V0UmVmIChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlTWFwW3JlZl1cbiAgfVxuXG4gIC8qKlxuICAqIFR1cm4gb24gYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBvcGVuICgpIHtcbiAgICB0aGlzLmxpc3RlbmVyLmJhdGNoZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICogVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBjbG9zZSAoKSB7XG4gICAgdGhpcy5saXN0ZW5lci5iYXRjaGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIHRoZSBkb2N1bWVudCBlbGVtZW50LlxuICAqIEByZXR1cm4ge29iamVjdH0gZG9jdW1lbnRFbGVtZW50XG4gICovXG4gIGNyZWF0ZURvY3VtZW50RWxlbWVudCAoKSB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCgnZG9jdW1lbnQnKVxuICAgICAgZWwuZG9jSWQgPSB0aGlzLmlkXG4gICAgICBlbC5vd25lckRvY3VtZW50ID0gdGhpc1xuICAgICAgZWwucm9sZSA9ICdkb2N1bWVudEVsZW1lbnQnXG4gICAgICBlbC5kZXB0aCA9IDBcbiAgICAgIGVsLnJlZiA9ICdfZG9jdW1lbnRFbGVtZW50J1xuICAgICAgdGhpcy5ub2RlTWFwLl9kb2N1bWVudEVsZW1lbnQgPSBlbFxuICAgICAgdGhpcy5kb2N1bWVudEVsZW1lbnQgPSBlbFxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdhcHBlbmRDaGlsZCcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChub2RlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdpbnNlcnRCZWZvcmUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobm9kZSwgYmVmb3JlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlLCBiZWZvcmUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50XG4gIH1cblxuICAvKipcbiAgKiBDcmVhdGUgdGhlIGJvZHkgZWxlbWVudC5cbiAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAqIEBwYXJhbSB7b2JqY3R9IHByb3BzXG4gICogQHJldHVybiB7b2JqZWN0fSBib2R5IGVsZW1lbnRcbiAgKi9cbiAgY3JlYXRlQm9keSAodHlwZSwgcHJvcHMpIHtcbiAgICBpZiAoIXRoaXMuYm9keSkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCh0eXBlLCBwcm9wcylcbiAgICAgIHNldEJvZHkodGhpcywgZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYm9keVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIGFuIGVsZW1lbnQuXG4gICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAgKiBAcGFyYW0ge29iamN0fSBwcm9wc1xuICAqIEByZXR1cm4ge29iamVjdH0gZWxlbWVudFxuICAqL1xuICBjcmVhdGVFbGVtZW50ICh0YWdOYW1lLCBwcm9wcykge1xuICAgIHJldHVybiBuZXcgRWxlbWVudCh0YWdOYW1lLCBwcm9wcylcbiAgfVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhbiBjb21tZW50LlxuICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICogQHJldHVybiB7b2JqZWN0fSBjb21tZW50XG4gICovXG4gIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgICByZXR1cm4gbmV3IENvbW1lbnQodGV4dClcbiAgfVxuXG4gIC8qKlxuICAqIEZpcmUgYW4gZXZlbnQgb24gc3BlY2lmaWVkIGVsZW1lbnQgbWFudWFsbHkuXG4gICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBvYmplY3RcbiAgKiBAcGFyYW0ge29iamVjdH0gZG9tIGNoYW5nZXNcbiAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAqIEByZXR1cm4ge30gYW55dGhpbmcgcmV0dXJuZWQgYnkgaGFuZGxlciBmdW5jdGlvblxuICAqL1xuICBmaXJlRXZlbnQgKGVsLCB0eXBlLCBldmVudCwgZG9tQ2hhbmdlcywgb3B0aW9ucykge1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBldmVudCA9IGV2ZW50IHx8IHt9XG4gICAgZXZlbnQudHlwZSA9IGV2ZW50LnR5cGUgfHwgdHlwZVxuICAgIGV2ZW50LnRhcmdldCA9IGVsXG4gICAgZXZlbnQuY3VycmVudFRhcmdldCA9IGVsXG4gICAgZXZlbnQudGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgIGlmIChkb21DaGFuZ2VzKSB7XG4gICAgICB1cGRhdGVFbGVtZW50KGVsLCBkb21DaGFuZ2VzKVxuICAgIH1cbiAgICBjb25zdCBpc0J1YmJsZSA9IHRoaXMuZ2V0UmVmKCdfcm9vdCcpLmF0dHJbJ2J1YmJsZSddID09PSAndHJ1ZSdcbiAgICByZXR1cm4gZWwuZmlyZUV2ZW50KHR5cGUsIGV2ZW50LCBpc0J1YmJsZSwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAqIERlc3Ryb3kgY3VycmVudCBkb2N1bWVudCwgYW5kIHJlbW92ZSBpdHNlbGYgZm9ybSBkb2NNYXAuXG4gICovXG4gIGRlc3Ryb3kgKCkge1xuICAgIHRoaXMudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKVxuICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyXG4gICAgZGVsZXRlIHRoaXMubm9kZU1hcFxuICAgIGRlbGV0ZSB0aGlzLnRhc2tDZW50ZXJcbiAgICByZW1vdmVEb2ModGhpcy5pZClcbiAgfVxufVxuXG4vLyBkZWZhdWx0IHRhc2sgaGFuZGxlclxuRG9jdW1lbnQuaGFuZGxlciA9IG51bGxcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgRG9jdW1lbnQgZnJvbSAnLi4vdmRvbS9Eb2N1bWVudCdcbmltcG9ydCB7IGlzUmVnaXN0ZXJlZE1vZHVsZSwgZ2V0TW9kdWxlRGVzY3JpcHRpb24gfSBmcm9tICcuL21vZHVsZSdcbmltcG9ydCB7IGlzUmVnaXN0ZXJlZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50J1xuaW1wb3J0IHsgZ2V0VGFza0NlbnRlciB9IGZyb20gJy4uL3Zkb20vb3BlcmF0aW9uJ1xuXG5jb25zdCBtb2R1bGVQcm94aWVzID0ge31cblxuZnVuY3Rpb24gc2V0SWQgKHdlZXgsIGlkKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3ZWV4LCAnW1tDdXJyZW50SW5zdGFuY2VJZF1dJywgeyB2YWx1ZTogaWQgfSlcbn1cblxuZnVuY3Rpb24gZ2V0SWQgKHdlZXgpIHtcbiAgcmV0dXJuIHdlZXhbJ1tbQ3VycmVudEluc3RhbmNlSWRdXSddXG59XG5cbmZ1bmN0aW9uIG1vZHVsZUdldHRlciAoaWQsIG1vZHVsZSwgbWV0aG9kKSB7XG4gIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKGlkKVxuICBpZiAoIXRhc2tDZW50ZXIgfHwgdHlwZW9mIHRhc2tDZW50ZXIuc2VuZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7aWR9KS5gKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuICguLi5hcmdzKSA9PiB0YXNrQ2VudGVyLnNlbmQoJ21vZHVsZScsIHsgbW9kdWxlLCBtZXRob2QgfSwgYXJncylcbn1cblxuZnVuY3Rpb24gbW9kdWxlU2V0dGVyIChpZCwgbW9kdWxlLCBtZXRob2QsIGZuKSB7XG4gIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKGlkKVxuICBpZiAoIXRhc2tDZW50ZXIgfHwgdHlwZW9mIHRhc2tDZW50ZXIuc2VuZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7aWR9KS5gKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdICR7bW9kdWxlfS4ke21ldGhvZH0gbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLmApXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gZm4gPT4gdGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7IG1vZHVsZSwgbWV0aG9kIH0sIFtmbl0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlZXhJbnN0YW5jZSB7XG4gIGNvbnN0cnVjdG9yIChpZCwgY29uZmlnKSB7XG4gICAgc2V0SWQodGhpcywgU3RyaW5nKGlkKSlcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIHRoaXMuZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoaWQsIHRoaXMuY29uZmlnLmJ1bmRsZVVybClcbiAgICB0aGlzLnJlcXVpcmVNb2R1bGUgPSB0aGlzLnJlcXVpcmVNb2R1bGUuYmluZCh0aGlzKVxuICAgIHRoaXMuaXNSZWdpc3RlcmVkTW9kdWxlID0gaXNSZWdpc3RlcmVkTW9kdWxlXG4gICAgdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQgPSBpc1JlZ2lzdGVyZWRDb21wb25lbnRcbiAgfVxuXG4gIHJlcXVpcmVNb2R1bGUgKG1vZHVsZU5hbWUpIHtcbiAgICBjb25zdCBpZCA9IGdldElkKHRoaXMpXG4gICAgaWYgKCEoaWQgJiYgdGhpcy5kb2N1bWVudCAmJiB0aGlzLmRvY3VtZW50LnRhc2tDZW50ZXIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVxdWlyZU1vZHVsZShcIiR7bW9kdWxlTmFtZX1cIiksIGBcbiAgICAgICAgKyBgaW5zdGFuY2UgKCR7aWR9KSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHdhcm4gZm9yIHVua25vd24gbW9kdWxlXG4gICAgaWYgKCFpc1JlZ2lzdGVyZWRNb2R1bGUobW9kdWxlTmFtZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gdXNpbmcgdW5yZWdpc3RlcmVkIHdlZXggbW9kdWxlIFwiJHttb2R1bGVOYW1lfVwiYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBuZXcgbW9kdWxlIHByb3h5XG4gICAgY29uc3QgcHJveHlOYW1lID0gYCR7bW9kdWxlTmFtZX0jJHtpZH1gXG4gICAgaWYgKCFtb2R1bGVQcm94aWVzW3Byb3h5TmFtZV0pIHtcbiAgICAgIC8vIGNyZWF0ZSByZWdpc3RlcmVkIG1vZHVsZSBhcGlzXG4gICAgICBjb25zdCBtb2R1bGVEZWZpbmUgPSBnZXRNb2R1bGVEZXNjcmlwdGlvbihtb2R1bGVOYW1lKVxuICAgICAgY29uc3QgbW9kdWxlQXBpcyA9IHt9XG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gbW9kdWxlRGVmaW5lKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGVBcGlzLCBtZXRob2ROYW1lLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiBtb2R1bGVHZXR0ZXIoaWQsIG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUpLFxuICAgICAgICAgIHNldDogZm4gPT4gbW9kdWxlU2V0dGVyKGlkLCBtb2R1bGVOYW1lLCBtZXRob2ROYW1lLCBmbilcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIG1vZHVsZSBQcm94eVxuICAgICAgaWYgKHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2R1bGVQcm94aWVzW3Byb3h5TmFtZV0gPSBuZXcgUHJveHkobW9kdWxlQXBpcywge1xuICAgICAgICAgIGdldCAodGFyZ2V0LCBtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kTmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSB1c2luZyB1bnJlZ2lzdGVyZWQgbWV0aG9kIFwiJHttb2R1bGVOYW1lfS4ke21ldGhvZE5hbWV9XCJgKVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUdldHRlcihpZCwgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbW9kdWxlUHJveGllc1twcm94eU5hbWVdID0gbW9kdWxlQXBpc1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVQcm94aWVzW3Byb3h5TmFtZV1cbiAgfVxuXG4gIHN1cHBvcnRzIChjb25kaXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXMgPSBjb25kaXRpb24ubWF0Y2goL15AKFxcdyspXFwvKFxcdyspKFxcLihcXHcrKSk/JC9pKVxuICAgIGlmIChyZXMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSByZXNbMV1cbiAgICAgIGNvbnN0IG5hbWUgPSByZXNbMl1cbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlc1s0XVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vZHVsZSc6IHJldHVybiBpc1JlZ2lzdGVyZWRNb2R1bGUobmFtZSwgbWV0aG9kKVxuICAgICAgICBjYXNlICdjb21wb25lbnQnOiByZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KG5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIHJlZ2lzdGVyU3R5bGVTaGVldCAoc3R5bGVzKSB7XG4gIC8vICAgaWYgKHRoaXMuZG9jdW1lbnQpIHtcbiAgLy8gICAgIHRoaXMuZG9jdW1lbnQucmVnaXN0ZXJTdHlsZVNoZWV0KHN0eWxlcylcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpbml0IGFzIGluaXRUYXNrSGFuZGxlciB9IGZyb20gJy4uL2JyaWRnZS9UYXNrQ2VudGVyJ1xuaW1wb3J0IHsgcmVjZWl2ZVRhc2tzIH0gZnJvbSAnLi4vYnJpZGdlL3JlY2VpdmVyJ1xuaW1wb3J0IHsgcmVnaXN0ZXJNb2R1bGVzIH0gZnJvbSAnLi9tb2R1bGUnXG5pbXBvcnQgeyByZWdpc3RlckNvbXBvbmVudHMgfSBmcm9tICcuL2NvbXBvbmVudCdcbmltcG9ydCB7IHNlcnZpY2VzLCByZWdpc3RlciwgdW5yZWdpc3RlciB9IGZyb20gJy4vc2VydmljZSdcbmltcG9ydCB7IHRyYWNrIH0gZnJvbSAnLi4vYnJpZGdlL2RlYnVnJ1xuaW1wb3J0IFdlZXhJbnN0YW5jZSBmcm9tICcuL1dlZXhJbnN0YW5jZSdcbmltcG9ydCB7IGdldERvYyB9IGZyb20gJy4uL3Zkb20vb3BlcmF0aW9uJ1xuXG5sZXQgZnJhbWV3b3Jrc1xubGV0IHJ1bnRpbWVDb25maWdcblxuY29uc3QgdmVyc2lvblJlZ0V4cCA9IC9eXFxzKlxcL1xcLyAqKFxce1tefV0qXFx9KSAqXFxyP1xcbi9cblxuLyoqXG4gKiBEZXRlY3QgYSBKUyBCdW5kbGUgY29kZSBhbmQgbWFrZSBzdXJlIHdoaWNoIGZyYW1ld29yayBpdCdzIGJhc2VkIHRvLiBFYWNoIEpTXG4gKiBCdW5kbGUgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGl0IHN0YXJ0cyB3aXRoIGEgbGluZSBvZiBKU09OIGNvbW1lbnQgYW5kIGlzXG4gKiBtb3JlIHRoYXQgb25lIGxpbmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvZGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0QnVuZGxlVHlwZSAoY29kZSkge1xuICBjb25zdCByZXN1bHQgPSB2ZXJzaW9uUmVnRXhwLmV4ZWMoY29kZSlcbiAgaWYgKHJlc3VsdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXN1bHRbMV0pXG4gICAgICByZXR1cm4gaW5mby5mcmFtZXdvcmtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gIH1cblxuICAvLyBkZWZhdWx0IGJ1bmRsZSB0eXBlXG4gIHJldHVybiAnV2VleCdcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2VydmljZXMgKGlkLCBlbnYsIGNvbmZpZykge1xuICAvLyBJbml0IEphdmFTY3JpcHQgc2VydmljZXMgZm9yIHRoaXMgaW5zdGFuY2UuXG4gIGNvbnN0IHNlcnZpY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHNlcnZpY2VNYXAuc2VydmljZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VydmljZXMuZm9yRWFjaCgoeyBuYW1lLCBvcHRpb25zIH0pID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtKUyBSdW50aW1lXSBjcmVhdGUgc2VydmljZSAke25hbWV9LmApXG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZSA9IG9wdGlvbnMuY3JlYXRlXG4gICAgaWYgKGNyZWF0ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlKGlkLCBlbnYsIGNvbmZpZylcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VydmljZU1hcC5zZXJ2aWNlLCByZXN1bHQpXG4gICAgICBPYmplY3QuYXNzaWduKHNlcnZpY2VNYXAsIHJlc3VsdC5pbnN0YW5jZSlcbiAgICB9XG4gIH0pXG4gIGRlbGV0ZSBzZXJ2aWNlTWFwLnNlcnZpY2UuaW5zdGFuY2VcbiAgT2JqZWN0LmZyZWV6ZShzZXJ2aWNlTWFwLnNlcnZpY2UpXG4gIHJldHVybiBzZXJ2aWNlTWFwXG59XG5cbmNvbnN0IGluc3RhbmNlVHlwZU1hcCA9IHt9XG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtUeXBlIChpZCkge1xuICByZXR1cm4gaW5zdGFuY2VUeXBlTWFwW2lkXVxufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUNvbnRleHQgKGlkLCBvcHRpb25zID0ge30sIGRhdGEpIHtcbiAgY29uc3Qgd2VleCA9IG5ldyBXZWV4SW5zdGFuY2UoaWQsIG9wdGlvbnMpXG4gIE9iamVjdC5mcmVlemUod2VleClcblxuICBjb25zdCBidW5kbGVUeXBlID0gb3B0aW9ucy5idW5kbGVUeXBlIHx8ICdWdWUnXG4gIGluc3RhbmNlVHlwZU1hcFtpZF0gPSBidW5kbGVUeXBlXG4gIGNvbnN0IGZyYW1ld29yayA9IHJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrc1tidW5kbGVUeXBlXVxuICBpZiAoIWZyYW1ld29yaykge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgXCIke2J1bmRsZVR5cGV9XCIuYClcbiAgfVxuICB0cmFjayhpZCwgJ2J1bmRsZVR5cGUnLCBidW5kbGVUeXBlKVxuXG4gIC8vIHByZXBhcmUganMgc2VydmljZVxuICBjb25zdCBzZXJ2aWNlcyA9IGNyZWF0ZVNlcnZpY2VzKGlkLCB7IHdlZXgsIGJ1bmRsZVR5cGUgfSwgcnVudGltZUNvbmZpZylcbiAgT2JqZWN0LmZyZWV6ZShzZXJ2aWNlcylcblxuICAvLyBwcmVwYXJlIHJ1bnRpbWUgY29udGV4dFxuICBjb25zdCBydW50aW1lQ29udGV4dCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgT2JqZWN0LmFzc2lnbihydW50aW1lQ29udGV4dCwgc2VydmljZXMsIHtcbiAgICB3ZWV4LFxuICAgIHNlcnZpY2VzIC8vIFRlbXBvcmFyeSBjb21wYXRpYmxlIHdpdGggc29tZSBsZWdhY3kgQVBJcyBpbiBSYXhcbiAgfSlcbiAgT2JqZWN0LmZyZWV6ZShydW50aW1lQ29udGV4dClcblxuICAvLyBwcmVwYXJlIGluc3RhbmNlIGNvbnRleHRcbiAgY29uc3QgaW5zdGFuY2VDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShydW50aW1lQ29udGV4dClcbiAgaWYgKHR5cGVvZiBmcmFtZXdvcmsuY3JlYXRlSW5zdGFuY2VDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZUNvbnRleHQsIGZyYW1ld29yay5jcmVhdGVJbnN0YW5jZUNvbnRleHQoaWQsIHJ1bnRpbWVDb250ZXh0LCBkYXRhKSlcbiAgfVxuICBPYmplY3QuZnJlZXplKGluc3RhbmNlQ29udGV4dClcbiAgcmV0dXJuIGluc3RhbmNlQ29udGV4dFxufVxuXG4vKipcbiAqIENoZWNrIHdoaWNoIGZyYW1ld29yayBhIGNlcnRhaW4gSlMgQnVuZGxlIGNvZGUgYmFzZWQgdG8uIEFuZCBjcmVhdGUgaW5zdGFuY2VcbiAqIGJ5IHRoaXMgZnJhbWV3b3JrLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UgKGlkLCBjb2RlLCBjb25maWcsIGRhdGEpIHtcbiAgaWYgKGluc3RhbmNlVHlwZU1hcFtpZF0pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBUaGUgaW5zdGFuY2UgaWQgXCIke2lkfVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCFgKVxuICB9XG5cbiAgLy8gSW5pdCBpbnN0YW5jZSBpbmZvLlxuICBjb25zdCBidW5kbGVUeXBlID0gZ2V0QnVuZGxlVHlwZShjb2RlKVxuICBpbnN0YW5jZVR5cGVNYXBbaWRdID0gYnVuZGxlVHlwZVxuXG4gIC8vIEluaXQgaW5zdGFuY2UgY29uZmlnLlxuICBjb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZyB8fCB7fSkpXG4gIGNvbmZpZy5lbnYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdsb2JhbC5XWEVudmlyb25tZW50IHx8IHt9KSlcbiAgY29uZmlnLmJ1bmRsZVR5cGUgPSBidW5kbGVUeXBlXG5cbiAgY29uc3QgZnJhbWV3b3JrID0gcnVudGltZUNvbmZpZy5mcmFtZXdvcmtzW2J1bmRsZVR5cGVdXG4gIGlmICghZnJhbWV3b3JrKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSBcIiR7YnVuZGxlVHlwZX1cIi5gKVxuICB9XG4gIGlmIChidW5kbGVUeXBlID09PSAnV2VleCcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBDT01QQVRJQklMSVRZIFdBUk5JTkc6IGBcbiAgICAgICsgYFdlZXggRFNMIDEuMCAoLndlKSBmcmFtZXdvcmsgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEgYFxuICAgICAgKyBgSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgV2VleFNESywgYFxuICAgICAgKyBgeW91ciBwYWdlIHdvdWxkIGJlIGNyYXNoIGlmIHlvdSBzdGlsbCB1c2luZyB0aGUgXCIud2VcIiBmcmFtZXdvcmsuIGBcbiAgICAgICsgYFBsZWFzZSB1cGdyYWRlIGl0IHRvIFZ1ZS5qcyBvciBSYXguYClcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlQ29udGV4dCA9IGNyZWF0ZUluc3RhbmNlQ29udGV4dChpZCwgY29uZmlnLCBkYXRhKVxuICBpZiAodHlwZW9mIGZyYW1ld29yay5jcmVhdGVJbnN0YW5jZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRlbXBvcmFyeSBjb21wYXRpYmxlIHdpdGggc29tZSBsZWdhY3kgQVBJcyBpbiBSYXgsXG4gICAgLy8gc29tZSBSYXggcGFnZSBpcyB1c2luZyB0aGUgbGVnYWN5IFwiLndlXCIgZnJhbWV3b3JrLlxuICAgIGlmIChidW5kbGVUeXBlID09PSAnUmF4JyB8fCBidW5kbGVUeXBlID09PSAnV2VleCcpIHtcbiAgICAgIGNvbnN0IHJheEluc3RhbmNlQ29udGV4dCA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgIGZyYW1ld29yazogYnVuZGxlVHlwZVxuICAgICAgfSwgaW5zdGFuY2VDb250ZXh0KVxuICAgICAgcmV0dXJuIGZyYW1ld29yay5jcmVhdGVJbnN0YW5jZShpZCwgY29kZSwgY29uZmlnLCBkYXRhLCByYXhJbnN0YW5jZUNvbnRleHQpXG4gICAgfVxuICAgIHJldHVybiBmcmFtZXdvcmsuY3JlYXRlSW5zdGFuY2UoaWQsIGNvZGUsIGNvbmZpZywgZGF0YSwgaW5zdGFuY2VDb250ZXh0KVxuICB9XG4gIC8vIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIENhbid0IGZpbmQgYXZhaWxhYmxlIFwiY3JlYXRlSW5zdGFuY2VcIiBtZXRob2QgaW4gJHtidW5kbGVUeXBlfSFgKVxuICBydW5JbkNvbnRleHQoY29kZSwgaW5zdGFuY2VDb250ZXh0KVxufVxuXG4vKipcbiAqIFJ1biBqcyBjb2RlIGluIGEgc3BlY2lmaWMgY29udGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBydW5JbkNvbnRleHQgKGNvZGUsIGNvbnRleHQpIHtcbiAgY29uc3Qga2V5cyA9IFtdXG4gIGNvbnN0IGFyZ3MgPSBbXVxuICBmb3IgKGNvbnN0IGtleSBpbiBjb250ZXh0KSB7XG4gICAga2V5cy5wdXNoKGtleSlcbiAgICBhcmdzLnB1c2goY29udGV4dFtrZXldKVxuICB9XG5cbiAgY29uc3QgYnVuZGxlID0gYFxuICAgIChmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgICAke2NvZGV9XG4gICAgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlcbiAgYFxuXG4gIHJldHVybiAobmV3IEZ1bmN0aW9uKC4uLmtleXMsIGJ1bmRsZSkpKC4uLmFyZ3MpXG59XG5cbi8qKlxuICogR2V0IHRoZSBKU09OIG9iamVjdCBvZiB0aGUgcm9vdCBlbGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdCAoaW5zdGFuY2VJZCkge1xuICBjb25zdCBkb2N1bWVudCA9IGdldERvYyhpbnN0YW5jZUlkKVxuICB0cnkge1xuICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS50b0pTT04oKVxuICAgIH1cbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBnZXQgdGhlIHZpcnR1YWwgZG9tIHRyZWUuYClcbiAgICByZXR1cm5cbiAgfVxufVxuXG5jb25zdCBtZXRob2RzID0ge1xuICBjcmVhdGVJbnN0YW5jZSxcbiAgY3JlYXRlSW5zdGFuY2VDb250ZXh0LFxuICBnZXRSb290LFxuICBnZXREb2N1bWVudDogZ2V0RG9jLFxuICByZWdpc3RlclNlcnZpY2U6IHJlZ2lzdGVyLFxuICB1bnJlZ2lzdGVyU2VydmljZTogdW5yZWdpc3RlcixcbiAgY2FsbEpTIChpZCwgdGFza3MpIHtcbiAgICBjb25zdCBmcmFtZXdvcmsgPSBmcmFtZXdvcmtzW2dldEZyYW1ld29ya1R5cGUoaWQpXVxuICAgIGlmIChmcmFtZXdvcmsgJiYgdHlwZW9mIGZyYW1ld29yay5yZWNlaXZlVGFza3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBmcmFtZXdvcmsucmVjZWl2ZVRhc2tzKGlkLCB0YXNrcylcbiAgICB9XG4gICAgcmV0dXJuIHJlY2VpdmVUYXNrcyhpZCwgdGFza3MpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBtZXRob2RzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuSW5zdGFuY2UgKG1ldGhvZE5hbWUpIHtcbiAgbWV0aG9kc1ttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgaWQgPSBhcmdzWzBdXG4gICAgY29uc3QgdHlwZSA9IGdldEZyYW1ld29ya1R5cGUoaWQpXG4gICAgaWYgKHR5cGUgJiYgZnJhbWV3b3Jrc1t0eXBlXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZnJhbWV3b3Jrc1t0eXBlXVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgY29uc3QgaW5mbyA9IHsgZnJhbWV3b3JrOiB0eXBlIH1cblxuICAgICAgLy8gTGlmZWN5Y2xlIG1ldGhvZHNcbiAgICAgIGlmIChtZXRob2ROYW1lID09PSAncmVmcmVzaEluc3RhbmNlJykge1xuICAgICAgICBzZXJ2aWNlcy5mb3JFYWNoKHNlcnZpY2UgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlZnJlc2ggPSBzZXJ2aWNlLm9wdGlvbnMucmVmcmVzaFxuICAgICAgICAgIGlmIChyZWZyZXNoKSB7XG4gICAgICAgICAgICByZWZyZXNoKGlkLCB7IGluZm8sIHJ1bnRpbWU6IHJ1bnRpbWVDb25maWcgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnZGVzdHJveUluc3RhbmNlJykge1xuICAgICAgICBzZXJ2aWNlcy5mb3JFYWNoKHNlcnZpY2UgPT4ge1xuICAgICAgICAgIGNvbnN0IGRlc3Ryb3kgPSBzZXJ2aWNlLm9wdGlvbnMuZGVzdHJveVxuICAgICAgICAgIGlmIChkZXN0cm95KSB7XG4gICAgICAgICAgICBkZXN0cm95KGlkLCB7IGluZm8sIHJ1bnRpbWU6IHJ1bnRpbWVDb25maWcgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGRlbGV0ZSBpbnN0YW5jZVR5cGVNYXBbaWRdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgW0pTIEZyYW1ld29ya10gVXNpbmcgaW52YWxpZCBpbnN0YW5jZSBpZCBgXG4gICAgICArIGBcIiR7aWR9XCIgd2hlbiBjYWxsaW5nICR7bWV0aG9kTmFtZX0uYClcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIG1ldGhvZHMgd2hpY2ggaW5pdCBlYWNoIGZyYW1ld29ya3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gc2hhcmVkTWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGFkYXB0TWV0aG9kIChtZXRob2ROYW1lLCBzaGFyZWRNZXRob2QpIHtcbiAgbWV0aG9kc1ttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBzaGFyZWRNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHNoYXJlZE1ldGhvZCguLi5hcmdzKVxuICAgIH1cblxuICAgIC8vIFRPRE86IGRlcHJlY2F0ZWRcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcnVudGltZUNvbmZpZy5mcmFtZXdvcmtzKSB7XG4gICAgICBjb25zdCBmcmFtZXdvcmsgPSBydW50aW1lQ29uZmlnLmZyYW1ld29ya3NbbmFtZV1cbiAgICAgIGlmIChmcmFtZXdvcmsgJiYgZnJhbWV3b3JrW21ldGhvZE5hbWVdKSB7XG4gICAgICAgIGZyYW1ld29ya1ttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0IChjb25maWcpIHtcbiAgcnVudGltZUNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICBmcmFtZXdvcmtzID0gcnVudGltZUNvbmZpZy5mcmFtZXdvcmtzIHx8IHt9XG4gIGluaXRUYXNrSGFuZGxlcigpXG5cbiAgLy8gSW5pdCBlYWNoIGZyYW1ld29yayBieSBgaW5pdGAgbWV0aG9kIGFuZCBgY29uZmlnYCB3aGljaCBjb250YWlucyB0aHJlZVxuICAvLyB2aXJ0dWFsLURPTSBDbGFzczogYERvY3VtZW50YCwgYEVsZW1lbnRgICYgYENvbW1lbnRgLCBhbmQgYSBKUyBicmlkZ2UgbWV0aG9kOlxuICAvLyBgc2VuZFRhc2tzKC4uLmFyZ3MpYC5cbiAgZm9yIChjb25zdCBuYW1lIGluIGZyYW1ld29ya3MpIHtcbiAgICBjb25zdCBmcmFtZXdvcmsgPSBmcmFtZXdvcmtzW25hbWVdXG4gICAgaWYgKHR5cGVvZiBmcmFtZXdvcmsuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZnJhbWV3b3JrLmluaXQoY29uZmlnKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgYWRhcHRNZXRob2QoJ3JlZ2lzdGVyQ29tcG9uZW50cycsIHJlZ2lzdGVyQ29tcG9uZW50cylcbiAgYWRhcHRNZXRob2QoJ3JlZ2lzdGVyTW9kdWxlcycsIHJlZ2lzdGVyTW9kdWxlcylcbiAgYWRhcHRNZXRob2QoJ3JlZ2lzdGVyTWV0aG9kcycpXG5cbiAgOyBbJ2Rlc3Ryb3lJbnN0YW5jZScsICdyZWZyZXNoSW5zdGFuY2UnXS5mb3JFYWNoKGdlbkluc3RhbmNlKVxuXG4gIHJldHVybiBtZXRob2RzXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJ1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9FbGVtZW50J1xuaW1wb3J0IENvbW1lbnQgZnJvbSAnLi9Db21tZW50J1xuaW1wb3J0IERvY3VtZW50IGZyb20gJy4vRG9jdW1lbnQnXG5cbmV4cG9ydCB7XG4gIHJlZ2lzdGVyRWxlbWVudCxcbiAgdW5yZWdpc3RlckVsZW1lbnQsXG4gIGlzV2VleEVsZW1lbnQsXG4gIGNsZWFyV2VleEVsZW1lbnRzXG59IGZyb20gJy4vV2VleEVsZW1lbnQnXG5cbmV4cG9ydCB7XG4gIERvY3VtZW50LFxuICBOb2RlLFxuICBFbGVtZW50LFxuICBDb21tZW50XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRG9jdW1lbnQsIEVsZW1lbnQsIENvbW1lbnQgfSBmcm9tICcuLi92ZG9tJ1xuaW1wb3J0IExpc3RlbmVyIGZyb20gJy4uL2JyaWRnZS9MaXN0ZW5lcidcbmltcG9ydCB7IFRhc2tDZW50ZXIgfSBmcm9tICcuLi9icmlkZ2UvVGFza0NlbnRlcidcblxuY29uc3QgY29uZmlnID0ge1xuICBEb2N1bWVudCwgRWxlbWVudCwgQ29tbWVudCwgTGlzdGVuZXIsXG4gIFRhc2tDZW50ZXIsXG4gIHNlbmRUYXNrcyAoLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2FsbE5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxOYXRpdmUoLi4uYXJncylcbiAgICB9XG4gICAgcmV0dXJuIChnbG9iYWwuY2FsbE5hdGl2ZSB8fCAoKCkgPT4ge30pKSguLi5hcmdzKVxuICB9XG59XG5cbkRvY3VtZW50LmhhbmRsZXIgPSBjb25maWcuc2VuZFRhc2tzXG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUmVnaXN0ZXIgZnJhbWV3b3JrKHMpIGluIEpTIHJ1bnRpbWUuIFdlZXggc3VwcGx5IHR3byBsYXllcnMgZm9yIDNyZC1wYXJ0eVxuICogZnJhbWV3b3JrKHMpOiBvbmUgaXMgdGhlIGluc3RhbmNlIG1hbmFnZW1lbnQgbGF5ZXIsIGFub3RoZXIgaXMgdGhlXG4gKiB2aXJ0dWFsLURPTSBsYXllci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi4vc2hhcmVkJ1xuXG5pbXBvcnQgaW5pdCBmcm9tICcuL2FwaS9pbml0J1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2FwaS9jb25maWcnXG5pbXBvcnQgeyByZWdpc3RlciwgdW5yZWdpc3RlciwgaGFzIH0gZnJvbSAnLi9hcGkvc2VydmljZSdcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSAoKSB7XG4gIHNoYXJlZC5mcmVlemVQcm90b3R5cGUoKVxuXG4gIC8vIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpXG4gIC8vIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50LnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIucHJvdG90eXBlKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5zZXROYXRpdmVDb25zb2xlLFxuICByZXNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5yZXNldE5hdGl2ZUNvbnNvbGUsXG4gIHNldE5hdGl2ZVRpbWVyOiBzaGFyZWQuc2V0TmF0aXZlVGltZXIsXG4gIHJlc2V0TmF0aXZlVGltZXI6IHNoYXJlZC5yZXNldE5hdGl2ZVRpbWVyLFxuICBzZXJ2aWNlOiB7IHJlZ2lzdGVyLCB1bnJlZ2lzdGVyLCBoYXMgfSxcbiAgZnJlZXplUHJvdG90eXBlLFxuICBpbml0LFxuICBjb25maWdcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIE1vY2sgTWVzc2FnZUV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gZGljdCB7IGRhdGEsIG9yaWdpbiwgc291cmNlLCBwb3J0cyB9XG4gKlxuICogVGhpcyB0eXBlIGhhcyBiZWVuIHNpbXBsaWZpZWQuXG4gKiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI21lc3NhZ2VldmVudFxuICogaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1lc3NhZ2VFdmVudCAodHlwZSwgZGljdCA9IHt9KSB7XG4gIHRoaXMudHlwZSA9IHR5cGUgfHwgJ21lc3NhZ2UnXG5cbiAgdGhpcy5kYXRhID0gZGljdC5kYXRhIHx8IG51bGxcbiAgdGhpcy5vcmlnaW4gPSBkaWN0Lm9yaWdpbiB8fCAnJ1xuICB0aGlzLnNvdXJjZSA9IGRpY3Quc291cmNlIHx8IG51bGxcbiAgdGhpcy5wb3J0cyA9IGRpY3QucG9ydHMgfHwgW11cblxuICAvLyBpbmhlcml0IHByb3BlcnRpZXNcbiAgdGhpcy50YXJnZXQgPSBudWxsXG4gIHRoaXMudGltZVN0YW1wID0gRGF0ZS5ub3coKVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVGhlIHBvbHlmaWxsIG9mIEJyb2FkY2FzdENoYW5uZWwgQVBJLlxuICogVGhpcyBhcGkgY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSBpbnRlci1pbnN0YW5jZSBjb21tdW5pY2F0aW9ucy5cbiAqXG4gKiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI2Jyb2FkY2FzdGluZy10by1vdGhlci1icm93c2luZy1jb250ZXh0c1xuICovXG5cbmltcG9ydCB7IE1lc3NhZ2VFdmVudCB9IGZyb20gJy4vbWVzc2FnZS1ldmVudCdcblxuY29uc3QgY2hhbm5lbHMgPSB7fVxuY29uc3QgaW5zdGFuY2VzID0ge31cblxuLyoqXG4gKiBBbiBlbXB0eSBjb25zdHJ1Y3RvciBmb3IgQnJvYWRjYXN0Q2hhbm5lbCBwb2x5ZmlsbC5cbiAqIFRoZSByZWFsIGNvbnN0cnVjdG9yIHdpbGwgYmUgZGVmaW5lZCB3aGVuIGEgV2VleCBpbnN0YW5jZSBjcmVhdGVkIGJlY2F1c2VcbiAqIHdlIG5lZWQgdG8gdHJhY2sgdGhlIGNoYW5uZWwgYnkgV2VleCBpbnN0YW5jZSBpZC5cbiAqL1xuZnVuY3Rpb24gQnJvYWRjYXN0Q2hhbm5lbCAoKSB7fVxuXG4vKipcbiAqIFNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIG90aGVyIEJyb2FkY2FzdENoYW5uZWwgb2JqZWN0cyBzZXQgdXAgZm9yIHRoaXMgY2hhbm5lbC5cbiAqIEBwYXJhbSB7YW55fSBtZXNzYWdlXG4gKi9cbkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnJvYWRjYXN0Q2hhbm5lbCBcIiR7dGhpcy5uYW1lfVwiIGlzIGNsb3NlZC5gKVxuICB9XG5cbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBjaGFubmVsc1t0aGlzLm5hbWVdXG4gIGlmIChzdWJzY3JpYmVycyAmJiBzdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBtZW1iZXIgPSBzdWJzY3JpYmVyc1tpXVxuXG4gICAgICBpZiAobWVtYmVyLl9jbG9zZWQgfHwgbWVtYmVyID09PSB0aGlzKSBjb250aW51ZVxuXG4gICAgICBpZiAodHlwZW9mIG1lbWJlci5vbm1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbWVtYmVyLm9ubWVzc2FnZShuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywgeyBkYXRhOiBtZXNzYWdlIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsb3NlcyB0aGUgQnJvYWRjYXN0Q2hhbm5lbCBvYmplY3QsIG9wZW5pbmcgaXQgdXAgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICovXG5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdGhpcy5fY2xvc2VkID0gdHJ1ZVxuXG4gIC8vIHJlbW92ZSBpdHNlbGYgZnJvbSBjaGFubmVscy5cbiAgaWYgKGNoYW5uZWxzW3RoaXMubmFtZV0pIHtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IGNoYW5uZWxzW3RoaXMubmFtZV0uZmlsdGVyKHggPT4geCAhPT0gdGhpcylcbiAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICBjaGFubmVsc1t0aGlzLm5hbWVdID0gc3Vic2NyaWJlcnNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZWxldGUgY2hhbm5lbHNbdGhpcy5uYW1lXVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZTogKGlkLCBlbnYsIGNvbmZpZykgPT4ge1xuICAgIGluc3RhbmNlc1tpZF0gPSBbXVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLkJyb2FkY2FzdENoYW5uZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlT2JqZWN0ID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIGEgbmV3IEJyb2FkY2FzdENoYW5uZWwgb2JqZWN0IHZpYSB3aGljaCBtZXNzYWdlcyBmb3IgdGhlIGdpdmVuXG4gICAgICAgKiBjaGFubmVsIG5hbWUgY2FuIGJlIHNlbnQgYW5kIHJlY2VpdmVkLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAqL1xuICAgICAgQnJvYWRjYXN0Q2hhbm5lbDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgLy8gdGhlIG5hbWUgcHJvcGVydHkgaXMgcmVhZG9ubHlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICduYW1lJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IFN0cmluZyhuYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25tZXNzYWdlID0gbnVsbFxuXG4gICAgICAgIGlmICghY2hhbm5lbHNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgIGNoYW5uZWxzW3RoaXMubmFtZV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIGNoYW5uZWxzW3RoaXMubmFtZV0ucHVzaCh0aGlzKVxuICAgICAgICBpbnN0YW5jZXNbaWRdLnB1c2godGhpcylcbiAgICAgIH1cbiAgICB9XG4gICAgc2VydmljZU9iamVjdC5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZSA9IEJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlOiBzZXJ2aWNlT2JqZWN0XG4gICAgfVxuICB9LFxuICBkZXN0cm95OiAoaWQsIGVudikgPT4ge1xuICAgIGluc3RhbmNlc1tpZF0uZm9yRWFjaChjaGFubmVsID0+IGNoYW5uZWwuY2xvc2UoKSlcbiAgICBkZWxldGUgaW5zdGFuY2VzW2lkXVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBCcm9hZGNhc3RDaGFubmVsIGZyb20gJy4vYnJvYWRjYXN0LWNoYW5uZWwvaW5kZXgnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgQnJvYWRjYXN0Q2hhbm5lbFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHN1YnZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nXG5pbXBvcnQgcnVudGltZSBmcm9tICcuLi8uLi9ydW50aW1lJ1xuaW1wb3J0IHNlcnZpY2VzIGZyb20gJy4uLy4uL3NlcnZpY2VzL2luZGV4J1xuXG4vKipcbiAqIFNldHVwIGZyYW1ld29ya3Mgd2l0aCBydW50aW1lLlxuICogWW91IGNhbiBwYWNrYWdlIG1vcmUgZnJhbWV3b3JrcyBieVxuICogIHBhc3NpbmcgdGhlbSBhcyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChmcmFtZXdvcmtzKSB7XG4gIGNvbnN0IHsgaW5pdCwgY29uZmlnIH0gPSBydW50aW1lXG4gIGNvbmZpZy5mcmFtZXdvcmtzID0gZnJhbWV3b3Jrc1xuICBjb25zdCB7IG5hdGl2ZSwgdHJhbnNmb3JtZXIgfSA9IHN1YnZlcnNpb25cblxuICBmb3IgKGNvbnN0IHNlcnZpY2VOYW1lIGluIHNlcnZpY2VzKSB7XG4gICAgcnVudGltZS5zZXJ2aWNlLnJlZ2lzdGVyKHNlcnZpY2VOYW1lLCBzZXJ2aWNlc1tzZXJ2aWNlTmFtZV0pXG4gIH1cblxuICBydW50aW1lLmZyZWV6ZVByb3RvdHlwZSgpXG4gIHJ1bnRpbWUuc2V0TmF0aXZlQ29uc29sZSgpXG5cbiAgLy8gcmVnaXN0ZXIgZnJhbWV3b3JrIG1ldGEgaW5mb1xuICBnbG9iYWwuZnJhbWV3b3JrVmVyc2lvbiA9IG5hdGl2ZVxuICBnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uID0gdHJhbnNmb3JtZXJcblxuICAvLyBpbml0IGZyYW1ld29ya3NcbiAgY29uc3QgZ2xvYmFsTWV0aG9kcyA9IGluaXQoY29uZmlnKVxuXG4gIC8vIHNldCBnbG9iYWwgbWV0aG9kc1xuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gZ2xvYmFsTWV0aG9kcykge1xuICAgIGdsb2JhbFttZXRob2ROYW1lXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCByZXQgPSBnbG9iYWxNZXRob2RzW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihyZXQudG9TdHJpbmcoKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgY29uZmlnID0ge31cblxuY29uc3QgaW5zdGFuY2VNYXAgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAoY2ZnKSB7XG4gIGNvbmZpZy5Eb2N1bWVudCA9IGNmZy5Eb2N1bWVudFxuICBjb25maWcuRWxlbWVudCA9IGNmZy5FbGVtZW50XG4gIGNvbmZpZy5Db21tZW50ID0gY2ZnLkNvbW1lbnRcbiAgY29uZmlnLnNlbmRUYXNrcyA9IGNmZy5zZW5kVGFza3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlIChpZCwgY29kZSwgb3B0aW9ucyA9IHt9LCBkYXRhID0ge30sIHNlcnZpY2VPYmplY3RzID0ge30pIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBuZXcgY29uZmlnLkRvY3VtZW50KGlkLCBvcHRpb25zLmJ1bmRsZVVybClcbiAgY29uc3QgY2FsbGJhY2tzID0ge31cbiAgY29uc3QgaW5zdGFuY2UgPSB7IGlkLCBkYXRhLCBkb2N1bWVudCwgY2FsbGJhY2tzIH1cblxuICBsZXQgbGFzdENhbGxiYWNrSWQgPSAwXG4gIGRvY3VtZW50LmFkZENhbGxiYWNrID0gZnVuYyA9PiB7XG4gICAgbGFzdENhbGxiYWNrSWQrK1xuICAgIGNhbGxiYWNrc1tsYXN0Q2FsbGJhY2tJZF0gPSBmdW5jXG4gICAgcmV0dXJuIGxhc3RDYWxsYmFja0lkXG4gIH1cbiAgZG9jdW1lbnQuaGFuZGxlQ2FsbGJhY2sgPSAoZnVuY0lkLCBkYXRhLCBpZkxhc3QpID0+IHtcbiAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgaWYgKGlmTGFzdCkge1xuICAgICAgZGVsZXRlIGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjayhkYXRhKVxuICB9XG4gIGluc3RhbmNlTWFwW2lkXSA9IGluc3RhbmNlXG5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIERvY3VtZW50OiBjb25maWcuRG9jdW1lbnQsXG4gICAgRWxlbWVudDogY29uZmlnLkVsZW1lbnQsXG4gICAgQ29tbWVudDogY29uZmlnLkNvbW1lbnQsXG4gICAgc2VuZFRhc2tzOiB0YXNrcyA9PiBjb25maWcuc2VuZFRhc2tzKGlkLCB0YXNrcywgLTEpLFxuICAgIG9wdGlvbnMsXG4gICAgZG9jdW1lbnRcbiAgfSwgc2VydmljZU9iamVjdHMpXG5cbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goY29kZSlcblxuICBjb25zdCByZXN1bHQgPSBuZXcgRnVuY3Rpb24oLi4uZ2xvYmFsS2V5cylcbiAgcmVzdWx0KC4uLmdsb2JhbFZhbHVlcylcblxuICBjb25maWcuc2VuZFRhc2tzKGlkLCBbeyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6ICdjcmVhdGVGaW5pc2gnLCBhcmdzOiBbXSB9XSwgLTEpXG5cbiAgcmV0dXJuIGluc3RhbmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIHJldHVybiBpbnN0YW5jZU1hcFtpZF0uZG9jdW1lbnQuYm9keS50b0pTT04oKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVRhc2tzIChpZCwgdGFza3MpIHtcbiAgY29uc3QganNIYW5kbGVycyA9IHtcbiAgICBmaXJlRXZlbnQ6IChpZCwgcmVmLCB0eXBlLCBkYXRhLCBkb21DaGFuZ2VzKSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0UmVmKHJlZilcbiAgICAgIHJldHVybiBkb2N1bWVudC5maXJlRXZlbnQoZWwsIHR5cGUsIGRhdGEsIGRvbUNoYW5nZXMpXG4gICAgfSxcblxuICAgIGNhbGxiYWNrOiAoaWQsIGZ1bmNJZCwgZGF0YSwgaWZMYXN0KSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIHJldHVybiBkb2N1bWVudC5oYW5kbGVDYWxsYmFjayhmdW5jSWQsIGRhdGEsIGlmTGFzdClcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF0gfHwge31cbiAgaWYgKGRvY3VtZW50ICYmIEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdXG4gICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGpzSGFuZGxlcnNbdGFzay5tZXRob2RdXG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRhc2suYXJnc11cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLnVuc2hpZnQoaWQpXG4gICAgICAgIHJlc3VsdHMucHVzaChoYW5kbGVyKC4uLmFyZ3MpKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdlZXhGYWN0b3J5IChleHBvcnRzLCBkb2N1bWVudCkge1xuXG4vKiAgKi9cblxudmFyIGVtcHR5T2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmdcbmZ1bmN0aW9uIGlzVW5kZWYgKHYpIHtcbiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzRGVmICh2KSB7XG4gIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc1RydWUgKHYpIHtcbiAgcmV0dXJuIHYgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNGYWxzZSAodikge1xuICByZXR1cm4gdiA9PT0gZmFsc2Vcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWx1ZSBpcyBwcmltaXRpdmVcbiAqL1xuZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUgZS5nLiBbb2JqZWN0IE9iamVjdF1cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICovXG5mdW5jdGlvbiB0b1N0cmluZyAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbFxuICAgID8gJydcbiAgICA6IHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMilcbiAgICAgIDogU3RyaW5nKHZhbClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgYXR0cmlidXRlIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuICovXG52YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7XG5cbi8qKlxuICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheVxuICovXG5mdW5jdGlvbiByZW1vdmUgKGFyciwgaXRlbSkge1xuICBpZiAoYXJyLmxlbmd0aCkge1xuICAgIHZhciBpbmRleCA9IGFyci5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjYWNoZWQgKGZuKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikge1xuICAgIHZhciBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKVxuICB9KVxufVxuXG4vKipcbiAqIENhbWVsaXplIGEgaHlwaGVuLWRlbGltaXRlZCBzdHJpbmcuXG4gKi9cbnZhciBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xudmFyIGNhbWVsaXplID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pXG59KTtcblxuLyoqXG4gKiBDYXBpdGFsaXplIGEgc3RyaW5nLlxuICovXG52YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSlcbn0pO1xuXG4vKipcbiAqIEh5cGhlbmF0ZSBhIGNhbWVsQ2FzZSBzdHJpbmcuXG4gKi9cbnZhciBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG52YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnLSQxJykudG9Mb3dlckNhc2UoKVxufSk7XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICovXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbiAgLy8gcmVjb3JkIG9yaWdpbmFsIGZuIGxlbmd0aFxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbi8qKlxuICogQ29udmVydCBhbiBBcnJheS1saWtlIG9iamVjdCB0byBhIHJlYWwgQXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgdmFyIGkgPSBsaXN0Lmxlbmd0aCAtIHN0YXJ0O1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgcmV0W2ldID0gbGlzdFtpICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXRcbn1cblxuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZCAodG8sIF9mcm9tKSB7XG4gIGZvciAodmFyIGtleSBpbiBfZnJvbSkge1xuICAgIHRvW2tleV0gPSBfZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHRvT2JqZWN0IChhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0pIHtcbiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyoqXG4gKiBQZXJmb3JtIG5vIG9wZXJhdGlvbi5cbiAqIFN0dWJiaW5nIGFyZ3MgdG8gbWFrZSBGbG93IGhhcHB5IHdpdGhvdXQgbGVhdmluZyB1c2VsZXNzIHRyYW5zcGlsZWQgY29kZVxuICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKipcbiAqIFJldHVybiBzYW1lIHZhbHVlXG4gKi9cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy5cbiAqL1xuXG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsXG4gKiBpZiB0aGV5IGFyZSBwbGFpbiBvYmplY3RzLCBkbyB0aGV5IGhhdmUgdGhlIHNhbWUgc2hhcGU/XG4gKi9cbmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHsgcmV0dXJuIHRydWUgfVxuICB2YXIgaXNPYmplY3RBID0gaXNPYmplY3QoYSk7XG4gIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTtcbiAgaWYgKGlzT2JqZWN0QSAmJiBpc09iamVjdEIpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICAgIHZhciBpc0FycmF5QiA9IEFycmF5LmlzQXJyYXkoYik7XG4gICAgICBpZiAoaXNBcnJheUEgJiYgaXNBcnJheUIpIHtcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoZSwgYltpXSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5Qikge1xuICAgICAgICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoYVtrZXldLCBiW2tleV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9IGVsc2UgaWYgKCFpc09iamVjdEEgJiYgIWlzT2JqZWN0Qikge1xuICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBTU1JfQVRUUiA9ICdkYXRhLXNlcnZlci1yZW5kZXJlZCc7XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnXG5dO1xuXG4vKiAgKi9cblxudmFyIGNvbmZpZyA9ICh7XG4gIC8qKlxuICAgKiBPcHRpb24gbWVyZ2Ugc3RyYXRlZ2llcyAodXNlZCBpbiBjb3JlL3V0aWwvb3B0aW9ucylcbiAgICovXG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcHJlc3Mgd2FybmluZ3MuXG4gICAqL1xuICBzaWxlbnQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290P1xuICAgKi9cbiAgcHJvZHVjdGlvblRpcDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHNcbiAgICovXG4gIGRldnRvb2xzOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmXG4gICAqL1xuICBwZXJmb3JtYW5jZTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEVycm9yIGhhbmRsZXIgZm9yIHdhdGNoZXIgZXJyb3JzXG4gICAqL1xuICBlcnJvckhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIFdhcm4gaGFuZGxlciBmb3Igd2F0Y2hlciB3YXJuc1xuICAgKi9cbiAgd2FybkhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50c1xuICAgKi9cbiAgaWdub3JlZEVsZW1lbnRzOiBbXSxcblxuICAvKipcbiAgICogQ3VzdG9tIHVzZXIga2V5IGFsaWFzZXMgZm9yIHYtb25cbiAgICovXG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBrZXlDb2RlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgcmVzZXJ2ZWQgc28gdGhhdCBpdCBjYW5ub3QgYmUgcmVnaXN0ZXJlZCBhcyBhXG4gICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRUYWc6IG5vLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgc28gdGhhdCBpdCBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbXBvbmVudFxuICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgaXNSZXNlcnZlZEF0dHI6IG5vLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHRhZyBpcyBhbiB1bmtub3duIGVsZW1lbnQuXG4gICAqIFBsYXRmb3JtLWRlcGVuZGVudC5cbiAgICovXG4gIGlzVW5rbm93bkVsZW1lbnQ6IG5vLFxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBvZiBhbiBlbGVtZW50XG4gICAqL1xuICBnZXRUYWdOYW1lc3BhY2U6IG5vb3AsXG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSByZWFsIHRhZyBuYW1lIGZvciB0aGUgc3BlY2lmaWMgcGxhdGZvcm0uXG4gICAqL1xuICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlXG4gICAqIFBsYXRmb3JtLWRlcGVuZGVudC5cbiAgICovXG4gIG11c3RVc2VQcm9wOiBubyxcblxuICAvKipcbiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnNcbiAgICovXG4gIF9saWZlY3ljbGVIb29rczogTElGRUNZQ0xFX0hPT0tTXG59KTtcblxuLyogICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfXG4gKi9cbmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTtcbiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1RlxufVxuXG4vKipcbiAqIERlZmluZSBhIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgdmFsdWU6IHZhbCxcbiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHNpbXBsZSBwYXRoLlxuICovXG52YXIgYmFpbFJFID0gL1teXFx3LiRdLztcbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICBpZiAoYmFpbFJFLnRlc3QocGF0aCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFvYmopIHsgcmV0dXJuIH1cbiAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxufVxuXG4vKiAgKi9cblxuXG4vLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz9cbnZhciBoYXNQcm90byA9ICdfX3Byb3RvX18nIGluIHt9O1xuXG4vLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nXG52YXIgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaW5XZWV4ID0gdHlwZW9mIFdYRW52aXJvbm1lbnQgIT09ICd1bmRlZmluZWQnICYmICEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybTtcbnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xudmFyIFVBID0gaW5Ccm93c2VyICYmIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG52YXIgaXNJRSA9IFVBICYmIC9tc2llfHRyaWRlbnQvLnRlc3QoVUEpO1xudmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7XG52YXIgaXNFZGdlID0gVUEgJiYgVUEuaW5kZXhPZignZWRnZS8nKSA+IDA7XG52YXIgaXNBbmRyb2lkID0gKFVBICYmIFVBLmluZGV4T2YoJ2FuZHJvaWQnKSA+IDApIHx8ICh3ZWV4UGxhdGZvcm0gPT09ICdhbmRyb2lkJyk7XG52YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpO1xudmFyIGlzQ2hyb21lID0gVUEgJiYgL2Nocm9tZVxcL1xcZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7XG5cbi8vIEZpcmVmb3ggaGFzIGEgXCJ3YXRjaFwiIGZ1bmN0aW9uIG9uIE9iamVjdC5wcm90b3R5cGUuLi5cbnZhciBuYXRpdmVXYXRjaCA9ICh7fSkud2F0Y2g7XG5cblxuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgXG4gICAgICB9XG4gICAgfSkpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjg1XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QtcGFzc2l2ZScsIG51bGwsIG9wdHMpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmVcbi8vIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgY2FuIHNldCBWVUVfRU5WXG52YXIgX2lzU2VydmVyO1xudmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkge1xuICBpZiAoX2lzU2VydmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWluQnJvd3NlciAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZGV0ZWN0IHByZXNlbmNlIG9mIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgYW5kIGF2b2lkXG4gICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzXG4gICAgICBfaXNTZXJ2ZXIgPSBnbG9iYWxbJ3Byb2Nlc3MnXS5lbnYuVlVFX0VOViA9PT0gJ3NlcnZlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pc1NlcnZlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2lzU2VydmVyXG59O1xuXG4vLyBkZXRlY3QgZGV2dG9vbHNcbnZhciBkZXZ0b29scyA9IGluQnJvd3NlciAmJiB3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGlzTmF0aXZlIChDdG9yKSB7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoQ3Rvci50b1N0cmluZygpKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJlxuICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUmVmbGVjdC5vd25LZXlzKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8gLy8gJGZsb3ctZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU2V0KSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldDtcbn0gZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2V0ICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWVcbiAgICB9O1xuICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChrZXkpIHtcbiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlO1xuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNldDtcbiAgfSgpKTtcbn1cblxuLyogICovXG5cbnZhciB3YXJuID0gbm9vcDtcbnZhciB0aXAgPSBub29wO1xudmFyIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSAobm9vcCk7IC8vIHdvcmsgYXJvdW5kIGZsb3cgY2hlY2tcbnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG4gIHZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGNsYXNzaWZ5UkUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pXG4gICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9O1xuXG4gIHdhcm4gPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJztcblxuICAgIGlmIChjb25maWcud2FybkhhbmRsZXIpIHtcbiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbVnVlIHdhcm5dOiBcIiArIG1zZyArIHRyYWNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHRpcCA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW1Z1ZSB0aXBdOiBcIiArIG1zZyArIChcbiAgICAgICAgdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnXG4gICAgICApKTtcbiAgICB9XG4gIH07XG5cbiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHtcbiAgICBpZiAodm0uJHJvb3QgPT09IHZtKSB7XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm0gfHwge307XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0pIHtcbiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBsYXN0ID0gdHJlZVt0cmVlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0LmNvbnN0cnVjdG9yID09PSB2bS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7XG4gICAgICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkge1xuICAgICAgICAgICAgdHJlZVt0cmVlLmxlbmd0aCAtIDFdID0gW2xhc3QsIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZV07XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlLnB1c2godm0pO1xuICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1xcblxcbmZvdW5kIGluXFxuXFxuJyArIHRyZWVcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodm0sIGkpIHsgcmV0dXJuIChcIlwiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSlcbiAgICAgICAgICAgID8gKChmb3JtYXRDb21wb25lbnROYW1lKHZtWzBdKSkgKyBcIi4uLiAoXCIgKyAodm1bMV0pICsgXCIgcmVjdXJzaXZlIGNhbGxzKVwiKVxuICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KVxuICAgICAgICAuam9pbignXFxuJylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChcIlxcblxcbihmb3VuZCBpbiBcIiArIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIilcIilcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG5cbnZhciB1aWQkMSA9IDA7XG5cbi8qKlxuICogQSBkZXAgaXMgYW4gb2JzZXJ2YWJsZSB0aGF0IGNhbiBoYXZlIG11bHRpcGxlXG4gKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LlxuICovXG52YXIgRGVwID0gZnVuY3Rpb24gRGVwICgpIHtcbiAgdGhpcy5pZCA9IHVpZCQxKys7XG4gIHRoaXMuc3VicyA9IFtdO1xufTtcblxuRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1Yikge1xuICB0aGlzLnN1YnMucHVzaChzdWIpO1xufTtcblxuRGVwLnByb3RvdHlwZS5yZW1vdmVTdWIgPSBmdW5jdGlvbiByZW1vdmVTdWIgKHN1Yikge1xuICByZW1vdmUodGhpcy5zdWJzLCBzdWIpO1xufTtcblxuRGVwLnByb3RvdHlwZS5kZXBlbmQgPSBmdW5jdGlvbiBkZXBlbmQgKCkge1xuICBpZiAoRGVwLnRhcmdldCkge1xuICAgIERlcC50YXJnZXQuYWRkRGVwKHRoaXMpO1xuICB9XG59O1xuXG5EZXAucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeSAoKSB7XG4gIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0XG4gIHZhciBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyB0aGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyB0aGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG9ubHkgb25lXG4vLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS5cbkRlcC50YXJnZXQgPSBudWxsO1xudmFyIHRhcmdldFN0YWNrID0gW107XG5cbmZ1bmN0aW9uIHB1c2hUYXJnZXQgKF90YXJnZXQpIHtcbiAgaWYgKERlcC50YXJnZXQpIHsgdGFyZ2V0U3RhY2sucHVzaChEZXAudGFyZ2V0KTsgfVxuICBEZXAudGFyZ2V0ID0gX3RhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgRGVwLnRhcmdldCA9IHRhcmdldFN0YWNrLnBvcCgpO1xufVxuXG4vKiAgKi9cblxudmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICB0ZXh0LFxuICBlbG0sXG4gIGNvbnRleHQsXG4gIGNvbXBvbmVudE9wdGlvbnMsXG4gIGFzeW5jRmFjdG9yeVxuKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHRoaXMudGV4dCA9IHRleHQ7XG4gIHRoaXMuZWxtID0gZWxtO1xuICB0aGlzLm5zID0gdW5kZWZpbmVkO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLmZuQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5TY29wZUlkID0gdW5kZWZpbmVkO1xuICB0aGlzLmtleSA9IGRhdGEgJiYgZGF0YS5rZXk7XG4gIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7XG4gIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICB0aGlzLnJhdyA9IGZhbHNlO1xuICB0aGlzLmlzU3RhdGljID0gZmFsc2U7XG4gIHRoaXMuaXNSb290SW5zZXJ0ID0gdHJ1ZTtcbiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTtcbiAgdGhpcy5pc0Nsb25lZCA9IGZhbHNlO1xuICB0aGlzLmlzT25jZSA9IGZhbHNlO1xuICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTtcbiAgdGhpcy5hc3luY01ldGEgPSB1bmRlZmluZWQ7XG4gIHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyID0gZmFsc2U7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBjaGlsZDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vLyBERVBSRUNBVEVEOiBhbGlhcyBmb3IgY29tcG9uZW50SW5zdGFuY2UgZm9yIGJhY2t3YXJkcyBjb21wYXQuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2Vcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWTm9kZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIGlmICggdGV4dCA9PT0gdm9pZCAwICkgdGV4dCA9ICcnO1xuXG4gIHZhciBub2RlID0gbmV3IFZOb2RlKCk7XG4gIG5vZGUudGV4dCA9IHRleHQ7XG4gIG5vZGUuaXNDb21tZW50ID0gdHJ1ZTtcbiAgcmV0dXJuIG5vZGVcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7XG4gIHJldHVybiBuZXcgVk5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgU3RyaW5nKHZhbCkpXG59XG5cbi8vIG9wdGltaXplZCBzaGFsbG93IGNsb25lXG4vLyB1c2VkIGZvciBzdGF0aWMgbm9kZXMgYW5kIHNsb3Qgbm9kZXMgYmVjYXVzZSB0aGV5IG1heSBiZSByZXVzZWQgYWNyb3NzXG4vLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHlcbi8vIG9uIHRoZWlyIGVsbSByZWZlcmVuY2UuXG5mdW5jdGlvbiBjbG9uZVZOb2RlICh2bm9kZSwgZGVlcCkge1xuICB2YXIgY29tcG9uZW50T3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIHZhciBjbG9uZWQgPSBuZXcgVk5vZGUoXG4gICAgdm5vZGUudGFnLFxuICAgIHZub2RlLmRhdGEsXG4gICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgdm5vZGUudGV4dCxcbiAgICB2bm9kZS5lbG0sXG4gICAgdm5vZGUuY29udGV4dCxcbiAgICBjb21wb25lbnRPcHRpb25zLFxuICAgIHZub2RlLmFzeW5jRmFjdG9yeVxuICApO1xuICBjbG9uZWQubnMgPSB2bm9kZS5ucztcbiAgY2xvbmVkLmlzU3RhdGljID0gdm5vZGUuaXNTdGF0aWM7XG4gIGNsb25lZC5rZXkgPSB2bm9kZS5rZXk7XG4gIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7XG4gIGNsb25lZC5mbkNvbnRleHQgPSB2bm9kZS5mbkNvbnRleHQ7XG4gIGNsb25lZC5mbk9wdGlvbnMgPSB2bm9kZS5mbk9wdGlvbnM7XG4gIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7XG4gIGNsb25lZC5pc0Nsb25lZCA9IHRydWU7XG4gIGlmIChkZWVwKSB7XG4gICAgaWYgKHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZWQuY2hpbGRyZW4gPSBjbG9uZVZOb2Rlcyh2bm9kZS5jaGlsZHJlbiwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRPcHRpb25zICYmIGNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW4pIHtcbiAgICAgIGNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW4gPSBjbG9uZVZOb2Rlcyhjb21wb25lbnRPcHRpb25zLmNoaWxkcmVuLCB0cnVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsb25lZFxufVxuXG5mdW5jdGlvbiBjbG9uZVZOb2RlcyAodm5vZGVzLCBkZWVwKSB7XG4gIHZhciBsZW4gPSB2bm9kZXMubGVuZ3RoO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXNbaV0gPSBjbG9uZVZOb2RlKHZub2Rlc1tpXSwgZGVlcCk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1tcbiAgJ3B1c2gnLFxuICAncG9wJyxcbiAgJ3NoaWZ0JyxcbiAgJ3Vuc2hpZnQnLFxuICAnc3BsaWNlJyxcbiAgJ3NvcnQnLFxuICAncmV2ZXJzZSdcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZFxuICB2YXIgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF07XG4gIGRlZihhcnJheU1ldGhvZHMsIG1ldGhvZCwgZnVuY3Rpb24gbXV0YXRvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHZhciBvYiA9IHRoaXMuX19vYl9fO1xuICAgIHZhciBpbnNlcnRlZDtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncHVzaCc6XG4gICAgICBjYXNlICd1bnNoaWZ0JzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc3BsaWNlJzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpO1xuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfVxuICAgIC8vIG5vdGlmeSBjaGFuZ2VcbiAgICBvYi5kZXAubm90aWZ5KCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KTtcbn0pO1xuXG4vKiAgKi9cblxudmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgd2hlbiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCwgdGhlIG5ldyB2YWx1ZSBpc1xuICogYWxzbyBjb252ZXJ0ZWQgdG8gYmVjb21lIHJlYWN0aXZlLiBIb3dldmVyIHdoZW4gcGFzc2luZyBkb3duIHByb3BzLFxuICogd2UgZG9uJ3Qgd2FudCB0byBmb3JjZSBjb252ZXJzaW9uIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBhIG5lc3RlZCB2YWx1ZVxuICogdW5kZXIgYSBmcm96ZW4gZGF0YSBzdHJ1Y3R1cmUuIENvbnZlcnRpbmcgaXQgd291bGQgZGVmZWF0IHRoZSBvcHRpbWl6YXRpb24uXG4gKi9cbnZhciBvYnNlcnZlclN0YXRlID0ge1xuICBzaG91bGRDb252ZXJ0OiB0cnVlXG59O1xuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKi9cbnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkge1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICB0aGlzLnZtQ291bnQgPSAwO1xuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90b1xuICAgICAgPyBwcm90b0F1Z21lbnRcbiAgICAgIDogY29weUF1Z21lbnQ7XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpO1xuICAgIHRoaXMub2JzZXJ2ZUFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndhbGsodmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhbGsgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0sIG9ialtrZXlzW2ldXSk7XG4gIH1cbn07XG5cbi8qKlxuICogT2JzZXJ2ZSBhIGxpc3Qgb2YgQXJyYXkgaXRlbXMuXG4gKi9cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgb2JzZXJ2ZShpdGVtc1tpXSk7XG4gIH1cbn07XG5cbi8vIGhlbHBlcnNcblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gY29weUF1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gY3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlIGZvciBhIHZhbHVlLFxuICogcmV0dXJucyB0aGUgbmV3IG9ic2VydmVyIGlmIHN1Y2Nlc3NmdWxseSBvYnNlcnZlZCxcbiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLlxuICovXG5mdW5jdGlvbiBvYnNlcnZlICh2YWx1ZSwgYXNSb290RGF0YSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9iO1xuICBpZiAoaGFzT3duKHZhbHVlLCAnX19vYl9fJykgJiYgdmFsdWUuX19vYl9fIGluc3RhbmNlb2YgT2JzZXJ2ZXIpIHtcbiAgICBvYiA9IHZhbHVlLl9fb2JfXztcbiAgfSBlbHNlIGlmIChcbiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWVcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG5cbiAgdmFyIGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKHZhbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIGRlcC5kZXBlbmQoKTtcbiAgICAgICAgaWYgKGNoaWxkT2IpIHtcbiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjdXN0b21TZXR0ZXIpIHtcbiAgICAgICAgY3VzdG9tU2V0dGVyKCk7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IG5ld1ZhbDtcbiAgICAgIH1cbiAgICAgIGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKG5ld1ZhbCk7XG4gICAgICBkZXAubm90aWZ5KCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QuIEFkZHMgdGhlIG5ldyBwcm9wZXJ0eSBhbmRcbiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3RcbiAqIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHtcbiAgICB0YXJnZXQubGVuZ3RoID0gTWF0aC5tYXgodGFyZ2V0Lmxlbmd0aCwga2V5KTtcbiAgICB0YXJnZXQuc3BsaWNlKGtleSwgMSwgdmFsKTtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgaWYgKGtleSBpbiB0YXJnZXQgJiYgIShrZXkgaW4gT2JqZWN0LnByb3RvdHlwZSkpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fO1xuICBpZiAodGFyZ2V0Ll9pc1Z1ZSB8fCAob2IgJiYgb2Iudm1Db3VudCkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnQXZvaWQgYWRkaW5nIHJlYWN0aXZlIHByb3BlcnRpZXMgdG8gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnYXQgcnVudGltZSAtIGRlY2xhcmUgaXQgdXBmcm9udCBpbiB0aGUgZGF0YSBvcHRpb24uJ1xuICAgICk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmICghb2IpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgZGVmaW5lUmVhY3RpdmUob2IudmFsdWUsIGtleSwgdmFsKTtcbiAgb2IuZGVwLm5vdGlmeSgpO1xuICByZXR1cm4gdmFsXG59XG5cbi8qKlxuICogRGVsZXRlIGEgcHJvcGVydHkgYW5kIHRyaWdnZXIgY2hhbmdlIGlmIG5lY2Vzc2FyeS5cbiAqL1xuZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHtcbiAgICB0YXJnZXQuc3BsaWNlKGtleSwgMSk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fO1xuICBpZiAodGFyZ2V0Ll9pc1Z1ZSB8fCAob2IgJiYgb2Iudm1Db3VudCkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnQXZvaWQgZGVsZXRpbmcgcHJvcGVydGllcyBvbiBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICtcbiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJ1xuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVsZXRlIHRhcmdldFtrZXldO1xuICBpZiAoIW9iKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgb2IuZGVwLm5vdGlmeSgpO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlXG4gKiB3ZSBjYW5ub3QgaW50ZXJjZXB0IGFycmF5IGVsZW1lbnQgYWNjZXNzIGxpa2UgcHJvcGVydHkgZ2V0dGVycy5cbiAqL1xuZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7XG4gIGZvciAodmFyIGUgPSAodm9pZCAwKSwgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBlID0gdmFsdWVbaV07XG4gICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGRlcGVuZEFycmF5KGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBPcHRpb24gb3ZlcndyaXRpbmcgc3RyYXRlZ2llcyBhcmUgZnVuY3Rpb25zIHRoYXQgaGFuZGxlXG4gKiBob3cgdG8gbWVyZ2UgYSBwYXJlbnQgb3B0aW9uIHZhbHVlIGFuZCBhIGNoaWxkIG9wdGlvblxuICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuXG4gKi9cbnZhciBzdHJhdHMgPSBjb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuXG4vKipcbiAqIE9wdGlvbnMgd2l0aCByZXN0cmljdGlvbnNcbiAqL1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7XG4gICAgaWYgKCF2bSkge1xuICAgICAgd2FybihcbiAgICAgICAgXCJvcHRpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGluc3RhbmNlIFwiICtcbiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKVxuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IHJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gZGF0YSBvYmplY3RzIHRvZ2V0aGVyLlxuICovXG5mdW5jdGlvbiBtZXJnZURhdGEgKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkgeyByZXR1cm4gdG8gfVxuICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcm9tKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICB0b1ZhbCA9IHRvW2tleV07XG4gICAgZnJvbVZhbCA9IGZyb21ba2V5XTtcbiAgICBpZiAoIWhhc093bih0bywga2V5KSkge1xuICAgICAgc2V0KHRvLCBrZXksIGZyb21WYWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiYgaXNQbGFpbk9iamVjdChmcm9tVmFsKSkge1xuICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogRGF0YVxuICovXG5mdW5jdGlvbiBtZXJnZURhdGFPckZuIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm1cbikge1xuICBpZiAoIXZtKSB7XG4gICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnNcbiAgICBpZiAoIWNoaWxkVmFsKSB7XG4gICAgICByZXR1cm4gcGFyZW50VmFsXG4gICAgfVxuICAgIGlmICghcGFyZW50VmFsKSB7XG4gICAgICByZXR1cm4gY2hpbGRWYWxcbiAgICB9XG4gICAgLy8gd2hlbiBwYXJlbnRWYWwgJiBjaGlsZFZhbCBhcmUgYm90aCBwcmVzZW50LFxuICAgIC8vIHdlIG5lZWQgdG8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0b1xuICAgIC8vIGNoZWNrIGlmIHBhcmVudFZhbCBpcyBhIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZVxuICAgIC8vIGl0IGhhcyB0byBiZSBhIGZ1bmN0aW9uIHRvIHBhc3MgcHJldmlvdXMgbWVyZ2VzLlxuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkge1xuICAgICAgcmV0dXJuIG1lcmdlRGF0YShcbiAgICAgICAgdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nID8gY2hpbGRWYWwuY2FsbCh0aGlzLCB0aGlzKSA6IGNoaWxkVmFsLFxuICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWxcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZEluc3RhbmNlRGF0YUZuICgpIHtcbiAgICAgIC8vIGluc3RhbmNlIG1lcmdlXG4gICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gY2hpbGRWYWwuY2FsbCh2bSwgdm0pXG4gICAgICAgIDogY2hpbGRWYWw7XG4gICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gcGFyZW50VmFsLmNhbGwodm0sIHZtKVxuICAgICAgICA6IHBhcmVudFZhbDtcbiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlRGF0YShpbnN0YW5jZURhdGEsIGRlZmF1bHREYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bVxuKSB7XG4gIGlmICghdm0pIHtcbiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgICdUaGUgXCJkYXRhXCIgb3B0aW9uIHNob3VsZCBiZSBhIGZ1bmN0aW9uICcgK1xuICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICtcbiAgICAgICAgJ2RlZmluaXRpb25zLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcGFyZW50VmFsXG4gICAgfVxuICAgIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwpXG4gIH1cblxuICByZXR1cm4gbWVyZ2VEYXRhT3JGbihwYXJlbnRWYWwsIGNoaWxkVmFsLCB2bSlcbn07XG5cbi8qKlxuICogSG9va3MgYW5kIHByb3BzIGFyZSBtZXJnZWQgYXMgYXJyYXlzLlxuICovXG5mdW5jdGlvbiBtZXJnZUhvb2sgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsXG4pIHtcbiAgcmV0dXJuIGNoaWxkVmFsXG4gICAgPyBwYXJlbnRWYWxcbiAgICAgID8gcGFyZW50VmFsLmNvbmNhdChjaGlsZFZhbClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZFZhbClcbiAgICAgICAgPyBjaGlsZFZhbFxuICAgICAgICA6IFtjaGlsZFZhbF1cbiAgICA6IHBhcmVudFZhbFxufVxuXG5MSUZFQ1lDTEVfSE9PS1MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7XG59KTtcblxuLyoqXG4gKiBBc3NldHNcbiAqXG4gKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvXG4gKiBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIGNvbnN0cnVjdG9yIG9wdGlvbnMsIGluc3RhbmNlXG4gKiBvcHRpb25zIGFuZCBwYXJlbnQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBc3NldHMgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpO1xuICBpZiAoY2hpbGRWYWwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICAgIHJldHVybiBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbn1cblxuQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0cztcbn0pO1xuXG4vKipcbiAqIFdhdGNoZXJzLlxuICpcbiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmVcbiAqIGFub3RoZXIsIHNvIHdlIG1lcmdlIHRoZW0gYXMgYXJyYXlzLlxuICovXG5zdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLlxuICBpZiAocGFyZW50VmFsID09PSBuYXRpdmVXYXRjaCkgeyBwYXJlbnRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKGNoaWxkVmFsID09PSBuYXRpdmVXYXRjaCkgeyBjaGlsZFZhbCA9IHVuZGVmaW5lZDsgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFjaGlsZFZhbCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCkgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHtcbiAgICB2YXIgcGFyZW50ID0gcmV0W2tleSQxXTtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZFZhbFtrZXkkMV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleSQxXSA9IHBhcmVudFxuICAgICAgPyBwYXJlbnQuY29uY2F0KGNoaWxkKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogW2NoaWxkXTtcbiAgfVxuICByZXR1cm4gcmV0XG59O1xuXG4vKipcbiAqIE90aGVyIG9iamVjdCBoYXNoZXMuXG4gKi9cbnN0cmF0cy5wcm9wcyA9XG5zdHJhdHMubWV0aG9kcyA9XG5zdHJhdHMuaW5qZWN0ID1cbnN0cmF0cy5jb21wdXRlZCA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIGlmIChjaGlsZFZhbCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7XG4gIH1cbiAgaWYgKCFwYXJlbnRWYWwpIHsgcmV0dXJuIGNoaWxkVmFsIH1cbiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGlmIChjaGlsZFZhbCkgeyBleHRlbmQocmV0LCBjaGlsZFZhbCk7IH1cbiAgcmV0dXJuIHJldFxufTtcbnN0cmF0cy5wcm92aWRlID0gbWVyZ2VEYXRhT3JGbjtcblxuLyoqXG4gKiBEZWZhdWx0IHN0cmF0ZWd5LlxuICovXG52YXIgZGVmYXVsdFN0cmF0ID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgcmV0dXJuIGNoaWxkVmFsID09PSB1bmRlZmluZWRcbiAgICA/IHBhcmVudFZhbFxuICAgIDogY2hpbGRWYWxcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgY29tcG9uZW50IG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50cyAob3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lIChuYW1lKSB7XG4gIGlmICghL15bYS16QS1aXVtcXHctXSokLy50ZXN0KG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGNvbXBvbmVudCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiLiBDb21wb25lbnQgbmFtZXMgJyArXG4gICAgICAnY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlIGh5cGhlbiwgJyArXG4gICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgJ2lkOiAnICsgbmFtZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGVcbiAqIE9iamVjdC1iYXNlZCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICAgIHZhbGlkYXRlUHJvcE9iamVjdChuYW1lLCB2YWwsIHZtKTtcbiAgICAgIH1cbiAgICAgIHJlc1tuYW1lXSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IHZhbFxuICAgICAgICA6IHsgdHlwZTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcInByb3BzXFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKHByb3BzKSkgKyBcIi5cIixcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICBvcHRpb25zLnByb3BzID0gcmVzO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHdoZXRoZXIgYSBwcm9wIG9iamVjdCBrZXlzIGFyZSB2YWxpZC5cbiAqL1xudmFyIHByb3BPcHRpb25zUkUgPSAvXih0eXBlfGRlZmF1bHR8cmVxdWlyZWR8dmFsaWRhdG9yKSQvO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BPYmplY3QgKFxuICBwcm9wTmFtZSxcbiAgcHJvcCxcbiAgdm1cbikge1xuICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuICAgIGlmICghcHJvcE9wdGlvbnNSRS50ZXN0KGtleSkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkludmFsaWQga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiBpbiB2YWxpZGF0aW9uIHJ1bGVzIG9iamVjdCBmb3IgcHJvcCBcXFwiXCIgKyBwcm9wTmFtZSArIFwiXFxcIi5cIiksXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0IChvcHRpb25zLCB2bSkge1xuICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7XG4gIGlmICghaW5qZWN0KSB7IHJldHVybiB9XG4gIHZhciBub3JtYWxpemVkID0gb3B0aW9ucy5pbmplY3QgPSB7fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBub3JtYWxpemVkW2luamVjdFtpXV0gPSB7IGZyb206IGluamVjdFtpXSB9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGluamVjdCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gaW5qZWN0KSB7XG4gICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07XG4gICAgICBub3JtYWxpemVkW2tleV0gPSBpc1BsYWluT2JqZWN0KHZhbClcbiAgICAgICAgPyBleHRlbmQoeyBmcm9tOiBrZXkgfSwgdmFsKVxuICAgICAgICA6IHsgZnJvbTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcImluamVjdFxcXCI6IGV4cGVjdGVkIGFuIEFycmF5IG9yIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZShpbmplY3QpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHJhdyBmdW5jdGlvbiBkaXJlY3RpdmVzIGludG8gb2JqZWN0IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGlyZWN0aXZlcyAob3B0aW9ucykge1xuICB2YXIgZGlycyA9IG9wdGlvbnMuZGlyZWN0aXZlcztcbiAgaWYgKGRpcnMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGlycykge1xuICAgICAgdmFyIGRlZiA9IGRpcnNba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRpcnNba2V5XSA9IHsgYmluZDogZGVmLCB1cGRhdGU6IGRlZiB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlIChuYW1lLCB2YWx1ZSwgdm0pIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiOiBleHBlY3RlZCBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUodmFsdWUpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLlxuICogQ29yZSB1dGlsaXR5IHVzZWQgaW4gYm90aCBpbnN0YW50aWF0aW9uIGFuZCBpbmhlcml0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zIChcbiAgcGFyZW50LFxuICBjaGlsZCxcbiAgdm1cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNoZWNrQ29tcG9uZW50cyhjaGlsZCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hpbGQgPSBjaGlsZC5vcHRpb25zO1xuICB9XG5cbiAgbm9ybWFsaXplUHJvcHMoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7XG4gIG5vcm1hbGl6ZURpcmVjdGl2ZXMoY2hpbGQpO1xuICB2YXIgZXh0ZW5kc0Zyb20gPSBjaGlsZC5leHRlbmRzO1xuICBpZiAoZXh0ZW5kc0Zyb20pIHtcbiAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBleHRlbmRzRnJvbSwgdm0pO1xuICB9XG4gIGlmIChjaGlsZC5taXhpbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkLm1peGlucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLm1peGluc1tpXSwgdm0pO1xuICAgIH1cbiAgfVxuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBwYXJlbnQpIHtcbiAgICBtZXJnZUZpZWxkKGtleSk7XG4gIH1cbiAgZm9yIChrZXkgaW4gY2hpbGQpIHtcbiAgICBpZiAoIWhhc093bihwYXJlbnQsIGtleSkpIHtcbiAgICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7XG4gICAgdmFyIHN0cmF0ID0gc3RyYXRzW2tleV0gfHwgZGVmYXVsdFN0cmF0O1xuICAgIG9wdGlvbnNba2V5XSA9IHN0cmF0KHBhcmVudFtrZXldLCBjaGlsZFtrZXldLCB2bSwga2V5KTtcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXNzZXQuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3NcbiAqIHRvIGFzc2V0cyBkZWZpbmVkIGluIGl0cyBhbmNlc3RvciBjaGFpbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0IChcbiAgb3B0aW9ucyxcbiAgdHlwZSxcbiAgaWQsXG4gIHdhcm5NaXNzaW5nXG4pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGFzc2V0cyA9IG9wdGlvbnNbdHlwZV07XG4gIC8vIGNoZWNrIGxvY2FsIHJlZ2lzdHJhdGlvbiB2YXJpYXRpb25zIGZpcnN0XG4gIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfVxuICB2YXIgY2FtZWxpemVkSWQgPSBjYW1lbGl6ZShpZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBjYW1lbGl6ZWRJZCkpIHsgcmV0dXJuIGFzc2V0c1tjYW1lbGl6ZWRJZF0gfVxuICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBQYXNjYWxDYXNlSWQpKSB7IHJldHVybiBhc3NldHNbUGFzY2FsQ2FzZUlkXSB9XG4gIC8vIGZhbGxiYWNrIHRvIHByb3RvdHlwZSBjaGFpblxuICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgd2FybihcbiAgICAgICdGYWlsZWQgdG8gcmVzb2x2ZSAnICsgdHlwZS5zbGljZSgwLCAtMSkgKyAnOiAnICsgaWQsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AgKFxuICBrZXksXG4gIHByb3BPcHRpb25zLFxuICBwcm9wc0RhdGEsXG4gIHZtXG4pIHtcbiAgdmFyIHByb3AgPSBwcm9wT3B0aW9uc1trZXldO1xuICB2YXIgYWJzZW50ID0gIWhhc093bihwcm9wc0RhdGEsIGtleSk7XG4gIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldO1xuICAvLyBoYW5kbGUgYm9vbGVhbiBwcm9wc1xuICBpZiAoaXNUeXBlKEJvb2xlYW4sIHByb3AudHlwZSkpIHtcbiAgICBpZiAoYWJzZW50ICYmICFoYXNPd24ocHJvcCwgJ2RlZmF1bHQnKSkge1xuICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFpc1R5cGUoU3RyaW5nLCBwcm9wLnR5cGUpICYmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSkge1xuICAgICAgdmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICAvLyBjaGVjayBkZWZhdWx0IHZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpO1xuICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgZnJlc2ggY29weSxcbiAgICAvLyBtYWtlIHN1cmUgdG8gb2JzZXJ2ZSBpdC5cbiAgICB2YXIgcHJldlNob3VsZENvbnZlcnQgPSBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQ7XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgICBvYnNlcnZlKHZhbHVlKTtcbiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSBwcmV2U2hvdWxkQ29udmVydDtcbiAgfVxuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIC8vIHNraXAgdmFsaWRhdGlvbiBmb3Igd2VleCByZWN5Y2xlLWxpc3QgY2hpbGQgY29tcG9uZW50IHByb3BzXG4gICAgISh0cnVlICYmIGlzT2JqZWN0KHZhbHVlKSAmJiAoJ0BiaW5kaW5nJyBpbiB2YWx1ZSkpXG4gICkge1xuICAgIGFzc2VydFByb3AocHJvcCwga2V5LCB2YWx1ZSwgdm0sIGFic2VudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgcHJvcC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcERlZmF1bHRWYWx1ZSAodm0sIHByb3AsIGtleSkge1xuICAvLyBubyBkZWZhdWx0LCByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDtcbiAgLy8gd2FybiBhZ2FpbnN0IG5vbi1mYWN0b3J5IGRlZmF1bHRzIGZvciBPYmplY3QgJiBBcnJheVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgXCInICsga2V5ICsgJ1wiOiAnICtcbiAgICAgICdQcm9wcyB3aXRoIHR5cGUgT2JqZWN0L0FycmF5IG11c3QgdXNlIGEgZmFjdG9yeSBmdW5jdGlvbiAnICtcbiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyB0aGUgcmF3IHByb3AgdmFsdWUgd2FzIGFsc28gdW5kZWZpbmVkIGZyb20gcHJldmlvdXMgcmVuZGVyLFxuICAvLyByZXR1cm4gcHJldmlvdXMgZGVmYXVsdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3YXRjaGVyIHRyaWdnZXJcbiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJlxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YVtrZXldID09PSB1bmRlZmluZWQgJiZcbiAgICB2bS5fcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB2bS5fcHJvcHNba2V5XVxuICB9XG4gIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzXG4gIC8vIGEgdmFsdWUgaXMgRnVuY3Rpb24gaWYgaXRzIHByb3RvdHlwZSBpcyBmdW5jdGlvbiBldmVuIGFjcm9zcyBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgcmV0dXJuIHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZ2V0VHlwZShwcm9wLnR5cGUpICE9PSAnRnVuY3Rpb24nXG4gICAgPyBkZWYuY2FsbCh2bSlcbiAgICA6IGRlZlxufVxuXG4vKipcbiAqIEFzc2VydCB3aGV0aGVyIGEgcHJvcCBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UHJvcCAoXG4gIHByb3AsXG4gIG5hbWUsXG4gIHZhbHVlLFxuICB2bSxcbiAgYWJzZW50XG4pIHtcbiAgaWYgKHByb3AucmVxdWlyZWQgJiYgYWJzZW50KSB7XG4gICAgd2FybihcbiAgICAgICdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICFwcm9wLnJlcXVpcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7XG4gIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gIGlmICh0eXBlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlID0gW3R5cGVdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7XG4gICAgICB2YXIgYXNzZXJ0ZWRUeXBlID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZVtpXSk7XG4gICAgICBleHBlY3RlZFR5cGVzLnB1c2goYXNzZXJ0ZWRUeXBlLmV4cGVjdGVkVHlwZSB8fCAnJyk7XG4gICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDtcbiAgICB9XG4gIH1cbiAgaWYgKCF2YWxpZCkge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXFxcIlwiICsgbmFtZSArIFwiXFxcIi5cIiArXG4gICAgICBcIiBFeHBlY3RlZCBcIiArIChleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcsICcpKSArXG4gICAgICBcIiwgZ290IFwiICsgKHRvUmF3VHlwZSh2YWx1ZSkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHZhbGlkYXRvciA9IHByb3AudmFsaWRhdG9yO1xuICBpZiAodmFsaWRhdG9yKSB7XG4gICAgaWYgKCF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87XG5cbmZ1bmN0aW9uIGFzc2VydFR5cGUgKHZhbHVlLCB0eXBlKSB7XG4gIHZhciB2YWxpZDtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChzaW1wbGVDaGVja1JFLnRlc3QoZXhwZWN0ZWRUeXBlKSkge1xuICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIHZhbGlkID0gdCA9PT0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gZm9yIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHNcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0Jykge1xuICAgIHZhbGlkID0gaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnQXJyYXknKSB7XG4gICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZVxuICB9XG59XG5cbi8qKlxuICogVXNlIGZ1bmN0aW9uIHN0cmluZyBuYW1lIHRvIGNoZWNrIGJ1aWx0LWluIHR5cGVzLFxuICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nXG4gKiBhY3Jvc3MgZGlmZmVyZW50IHZtcyAvIGlmcmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7XG4gIHZhciBtYXRjaCA9IGZuICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqZnVuY3Rpb24gKFxcdyspLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJydcbn1cblxuZnVuY3Rpb24gaXNUeXBlICh0eXBlLCBmbikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZm4pKSB7XG4gICAgcmV0dXJuIGdldFR5cGUoZm4pID09PSBnZXRUeXBlKHR5cGUpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGdldFR5cGUoZm5baV0pID09PSBnZXRUeXBlKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIGlmICh2bSkge1xuICAgIHZhciBjdXIgPSB2bTtcbiAgICB3aGlsZSAoKGN1ciA9IGN1ci4kcGFyZW50KSkge1xuICAgICAgdmFyIGhvb2tzID0gY3VyLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7XG4gICAgICBpZiAoaG9va3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZSkgeyByZXR1cm4gfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ0Vycm9yKGUsIG51bGwsICdjb25maWcuZXJyb3JIYW5kbGVyJyk7XG4gICAgfVxuICB9XG4gIGxvZ0Vycm9yKGVyciwgdm0sIGluZm8pO1xufVxuXG5mdW5jdGlvbiBsb2dFcnJvciAoZXJyLCB2bSwgaW5mbykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oKFwiRXJyb3IgaW4gXCIgKyBpbmZvICsgXCI6IFxcXCJcIiArIChlcnIudG9TdHJpbmcoKSkgKyBcIlxcXCJcIiksIHZtKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vKiAgKi9cbi8qIGdsb2JhbHMgTWVzc2FnZUNoYW5uZWwgKi9cblxudmFyIGNhbGxiYWNrcyA9IFtdO1xudmFyIHBlbmRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hDYWxsYmFja3MgKCkge1xuICBwZW5kaW5nID0gZmFsc2U7XG4gIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gIGNhbGxiYWNrcy5sZW5ndGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvcGllc1tpXSgpO1xuICB9XG59XG5cbi8vIEhlcmUgd2UgaGF2ZSBhc3luYyBkZWZlcnJpbmcgd3JhcHBlcnMgdXNpbmcgYm90aCBtaWNybyBhbmQgbWFjcm8gdGFza3MuXG4vLyBJbiA8IDIuNCB3ZSB1c2VkIG1pY3JvIHRhc2tzIGV2ZXJ5d2hlcmUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzY2VuYXJpb3Mgd2hlcmVcbi8vIG1pY3JvIHRhc2tzIGhhdmUgdG9vIGhpZ2ggYSBwcmlvcml0eSBhbmQgZmlyZXMgaW4gYmV0d2VlbiBzdXBwb3NlZGx5XG4vLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZVxuLy8gZXZlbnQgKCM2NTY2KS4gSG93ZXZlciwgdXNpbmcgbWFjcm8gdGFza3MgZXZlcnl3aGVyZSBhbHNvIGhhcyBzdWJ0bGUgcHJvYmxlbXNcbi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS5cbi8vIEhlcmUgd2UgdXNlIG1pY3JvIHRhc2sgYnkgZGVmYXVsdCwgYnV0IGV4cG9zZSBhIHdheSB0byBmb3JjZSBtYWNybyB0YXNrIHdoZW5cbi8vIG5lZWRlZCAoZS5nLiBpbiBldmVudCBoYW5kbGVycyBhdHRhY2hlZCBieSB2LW9uKS5cbnZhciBtaWNyb1RpbWVyRnVuYztcbnZhciBtYWNyb1RpbWVyRnVuYztcbnZhciB1c2VNYWNyb1Rhc2sgPSBmYWxzZTtcblxuLy8gRGV0ZXJtaW5lIChtYWNybykgVGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi5cbi8vIFRlY2huaWNhbGx5IHNldEltbWVkaWF0ZSBzaG91bGQgYmUgdGhlIGlkZWFsIGNob2ljZSwgYnV0IGl0J3Mgb25seSBhdmFpbGFibGVcbi8vIGluIElFLiBUaGUgb25seSBwb2x5ZmlsbCB0aGF0IGNvbnNpc3RlbnRseSBxdWV1ZXMgdGhlIGNhbGxiYWNrIGFmdGVyIGFsbCBET01cbi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKHNldEltbWVkaWF0ZSkpIHtcbiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZsdXNoQ2FsbGJhY2tzKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoXG4gIGlzTmF0aXZlKE1lc3NhZ2VDaGFubmVsKSB8fFxuICAvLyBQaGFudG9tSlNcbiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nXG4pKSB7XG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmbHVzaENhbGxiYWNrcztcbiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZSgxKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQoZmx1c2hDYWxsYmFja3MsIDApO1xuICB9O1xufVxuXG4vLyBEZXRlcm1pbmUgTWljcm9UYXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQsICRmbG93LWRpc2FibGUtbGluZSAqL1xuaWYgKHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm9taXNlKSkge1xuICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBtaWNyb1RpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwLnRoZW4oZmx1c2hDYWxsYmFja3MpO1xuICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dFxuICAgIC8vIGl0IGNhbiBnZXQgc3R1Y2sgaW4gYSB3ZWlyZCBzdGF0ZSB3aGVyZSBjYWxsYmFja3MgYXJlIHB1c2hlZCBpbnRvIHRoZVxuICAgIC8vIG1pY3JvdGFzayBxdWV1ZSBidXQgdGhlIHF1ZXVlIGlzbid0IGJlaW5nIGZsdXNoZWQsIHVudGlsIHRoZSBicm93c2VyXG4gICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuXG4gICAgLy8gXCJmb3JjZVwiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuXG4gICAgaWYgKGlzSU9TKSB7IHNldFRpbWVvdXQobm9vcCk7IH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIGZhbGxiYWNrIHRvIG1hY3JvXG4gIG1pY3JvVGltZXJGdW5jID0gbWFjcm9UaW1lckZ1bmM7XG59XG5cbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSxcbiAqIHRoZSBjaGFuZ2VzIGFyZSBxdWV1ZWQgdXNpbmcgYSBUYXNrIGluc3RlYWQgb2YgYSBNaWNyb1Rhc2suXG4gKi9cblxuXG5mdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkge1xuICB2YXIgX3Jlc29sdmU7XG4gIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNiLmNhbGwoY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZSwgY3R4LCAnbmV4dFRpY2snKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZShjdHgpO1xuICAgIH1cbiAgfSk7XG4gIGlmICghcGVuZGluZykge1xuICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgIGlmICh1c2VNYWNyb1Rhc2spIHtcbiAgICAgIG1hY3JvVGltZXJGdW5jKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pY3JvVGltZXJGdW5jKCk7XG4gICAgfVxuICB9XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBpZiAoIWNiICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pXG4gIH1cbn1cblxuLyogICovXG5cbi8qIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aCBQcm94eSAqL1xuXG52YXIgaW5pdFByb3h5O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgYWxsb3dlZEdsb2JhbHMgPSBtYWtlTWFwKFxuICAgICdJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLCcgK1xuICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICtcbiAgICAnTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLCcgK1xuICAgICdyZXF1aXJlJyAvLyBmb3IgV2VicGFjay9Ccm93c2VyaWZ5XG4gICk7XG5cbiAgdmFyIHdhcm5Ob25QcmVzZW50ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgd2FybihcbiAgICAgIFwiUHJvcGVydHkgb3IgbWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UgYnV0IFwiICtcbiAgICAgICdyZWZlcmVuY2VkIGR1cmluZyByZW5kZXIuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcHJvcGVydHkgaXMgcmVhY3RpdmUsICcgK1xuICAgICAgJ2VpdGhlciBpbiB0aGUgZGF0YSBvcHRpb24sIG9yIGZvciBjbGFzcy1iYXNlZCBjb21wb25lbnRzLCBieSAnICtcbiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICtcbiAgICAgICdTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL3JlYWN0aXZpdHkuaHRtbCNEZWNsYXJpbmctUmVhY3RpdmUtUHJvcGVydGllcy4nLFxuICAgICAgdGFyZ2V0XG4gICAgKTtcbiAgfTtcblxuICB2YXIgaGFzUHJveHkgPVxuICAgIHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBQcm94eS50b1N0cmluZygpLm1hdGNoKC9uYXRpdmUgY29kZS8pO1xuXG4gIGlmIChoYXNQcm94eSkge1xuICAgIHZhciBpc0J1aWx0SW5Nb2RpZmllciA9IG1ha2VNYXAoJ3N0b3AscHJldmVudCxzZWxmLGN0cmwsc2hpZnQsYWx0LG1ldGEsZXhhY3QnKTtcbiAgICBjb25maWcua2V5Q29kZXMgPSBuZXcgUHJveHkoY29uZmlnLmtleUNvZGVzLCB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0J1aWx0SW5Nb2RpZmllcihrZXkpKSB7XG4gICAgICAgICAgd2FybigoXCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC5cIiArIGtleSkpO1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhhc0hhbmRsZXIgPSB7XG4gICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7XG4gICAgICB2YXIgaGFzID0ga2V5IGluIHRhcmdldDtcbiAgICAgIHZhciBpc0FsbG93ZWQgPSBhbGxvd2VkR2xvYmFscyhrZXkpIHx8IGtleS5jaGFyQXQoMCkgPT09ICdfJztcbiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkXG4gICAgfVxuICB9O1xuXG4gIHZhciBnZXRIYW5kbGVyID0ge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICh0YXJnZXQsIGtleSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgc2Vlbk9iamVjdHMgPSBuZXcgX1NldCgpO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2UgKHZhbCkge1xuICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7XG4gIHNlZW5PYmplY3RzLmNsZWFyKCk7XG59XG5cbmZ1bmN0aW9uIF90cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIHZhciBpLCBrZXlzO1xuICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuICBpZiAoKCFpc0EgJiYgIWlzT2JqZWN0KHZhbCkpIHx8IE9iamVjdC5pc0Zyb3plbih2YWwpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG52YXIgbWFyaztcbnZhciBtZWFzdXJlO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcGVyZiA9IGluQnJvd3NlciAmJiB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoXG4gICAgcGVyZiAmJlxuICAgIHBlcmYubWFyayAmJlxuICAgIHBlcmYubWVhc3VyZSAmJlxuICAgIHBlcmYuY2xlYXJNYXJrcyAmJlxuICAgIHBlcmYuY2xlYXJNZWFzdXJlc1xuICApIHtcbiAgICBtYXJrID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gcGVyZi5tYXJrKHRhZyk7IH07XG4gICAgbWVhc3VyZSA9IGZ1bmN0aW9uIChuYW1lLCBzdGFydFRhZywgZW5kVGFnKSB7XG4gICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7XG4gICAgfTtcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIG5vcm1hbGl6ZUV2ZW50ID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJztcbiAgbmFtZSA9IHBhc3NpdmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIG9uY2UkJDEgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJ34nOyAvLyBQcmVmaXhlZCBsYXN0LCBjaGVja2VkIGZpcnN0XG4gIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7XG4gIHZhciBjYXB0dXJlID0gbmFtZS5jaGFyQXQoMCkgPT09ICchJztcbiAgbmFtZSA9IGNhcHR1cmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIG9uY2U6IG9uY2UkJDEsXG4gICAgY2FwdHVyZTogY2FwdHVyZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGbkludm9rZXIgKGZucykge1xuICBmdW5jdGlvbiBpbnZva2VyICgpIHtcbiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm5zKSkge1xuICAgICAgdmFyIGNsb25lZCA9IGZucy5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2xvbmVkW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyQxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmV0dXJuIGhhbmRsZXIgcmV0dXJuIHZhbHVlIGZvciBzaW5nbGUgaGFuZGxlcnNcbiAgICAgIHJldHVybiBmbnMuYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxuICBpbnZva2VyLmZucyA9IGZucztcbiAgcmV0dXJuIGludm9rZXJcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzIChcbiAgb24sXG4gIG9sZE9uLFxuICBhZGQsXG4gIHJlbW92ZSQkMSxcbiAgdm1cbikge1xuICB2YXIgbmFtZSwgZGVmLCBjdXIsIG9sZCwgZXZlbnQ7XG4gIGZvciAobmFtZSBpbiBvbikge1xuICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdO1xuICAgIG9sZCA9IG9sZE9uW25hbWVdO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRydWUgJiYgaXNQbGFpbk9iamVjdChkZWYpKSB7XG4gICAgICBjdXIgPSBkZWYuaGFuZGxlcjtcbiAgICAgIGV2ZW50LnBhcmFtcyA9IGRlZi5wYXJhbXM7XG4gICAgfVxuICAgIGlmIChpc1VuZGVmKGN1cikpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFxcXCJcIiArIChldmVudC5uYW1lKSArIFwiXFxcIjogZ290IFwiICsgU3RyaW5nKGN1ciksXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNVbmRlZihvbGQpKSB7XG4gICAgICBpZiAoaXNVbmRlZihjdXIuZm5zKSkge1xuICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpO1xuICAgICAgfVxuICAgICAgYWRkKGV2ZW50Lm5hbWUsIGN1ciwgZXZlbnQub25jZSwgZXZlbnQuY2FwdHVyZSwgZXZlbnQucGFzc2l2ZSwgZXZlbnQucGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7XG4gICAgICBvbGQuZm5zID0gY3VyO1xuICAgICAgb25bbmFtZV0gPSBvbGQ7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkge1xuICAgICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICAgIHJlbW92ZSQkMShldmVudC5uYW1lLCBvbGRPbltuYW1lXSwgZXZlbnQuY2FwdHVyZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7XG4gIGlmIChkZWYgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIGRlZiA9IGRlZi5kYXRhLmhvb2sgfHwgKGRlZi5kYXRhLmhvb2sgPSB7fSk7XG4gIH1cbiAgdmFyIGludm9rZXI7XG4gIHZhciBvbGRIb29rID0gZGVmW2hvb2tLZXldO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWRIb29rICgpIHtcbiAgICBob29rLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZVxuICAgIC8vIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrXG4gICAgcmVtb3ZlKGludm9rZXIuZm5zLCB3cmFwcGVkSG9vayk7XG4gIH1cblxuICBpZiAoaXNVbmRlZihvbGRIb29rKSkge1xuICAgIC8vIG5vIGV4aXN0aW5nIGhvb2tcbiAgICBpbnZva2VyID0gY3JlYXRlRm5JbnZva2VyKFt3cmFwcGVkSG9va10pO1xuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpc0RlZihvbGRIb29rLmZucykgJiYgaXNUcnVlKG9sZEhvb2subWVyZ2VkKSkge1xuICAgICAgLy8gYWxyZWFkeSBhIG1lcmdlZCBpbnZva2VyXG4gICAgICBpbnZva2VyID0gb2xkSG9vaztcbiAgICAgIGludm9rZXIuZm5zLnB1c2god3JhcHBlZEhvb2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rXG4gICAgICBpbnZva2VyID0gY3JlYXRlRm5JbnZva2VyKFtvbGRIb29rLCB3cmFwcGVkSG9va10pO1xuICAgIH1cbiAgfVxuXG4gIGludm9rZXIubWVyZ2VkID0gdHJ1ZTtcbiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEgKFxuICBkYXRhLFxuICBDdG9yLFxuICB0YWdcbikge1xuICAvLyB3ZSBhcmUgb25seSBleHRyYWN0aW5nIHJhdyB2YWx1ZXMgaGVyZS5cbiAgLy8gdmFsaWRhdGlvbiBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIGhhbmRsZWQgaW4gdGhlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCBpdHNlbGYuXG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5wcm9wcztcbiAgaWYgKGlzVW5kZWYocHJvcE9wdGlvbnMpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzO1xuICB2YXIgcHJvcHMgPSBkYXRhLnByb3BzO1xuICBpZiAoaXNEZWYoYXR0cnMpIHx8IGlzRGVmKHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykge1xuICAgICAgdmFyIGFsdEtleSA9IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIGtleUluTG93ZXJDYXNlID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmXG4gICAgICAgICAgYXR0cnMgJiYgaGFzT3duKGF0dHJzLCBrZXlJbkxvd2VyQ2FzZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGlwKFxuICAgICAgICAgICAgXCJQcm9wIFxcXCJcIiArIGtleUluTG93ZXJDYXNlICsgXCJcXFwiIGlzIHBhc3NlZCB0byBjb21wb25lbnQgXCIgK1xuICAgICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodGFnIHx8IEN0b3IpKSArIFwiLCBidXQgdGhlIGRlY2xhcmVkIHByb3AgbmFtZSBpc1wiICtcbiAgICAgICAgICAgIFwiIFxcXCJcIiArIGtleSArIFwiXFxcIi4gXCIgK1xuICAgICAgICAgICAgXCJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBjYW1lbENhc2VkIFwiICtcbiAgICAgICAgICAgIFwicHJvcHMgbmVlZCB0byB1c2UgdGhlaXIga2ViYWItY2FzZSBlcXVpdmFsZW50cyB3aGVuIHVzaW5nIGluLURPTSBcIiArXG4gICAgICAgICAgICBcInRlbXBsYXRlcy4gWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXFxcIlwiICsgYWx0S2V5ICsgXCJcXFwiIGluc3RlYWQgb2YgXFxcIlwiICsga2V5ICsgXCJcXFwiLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hlY2tQcm9wKHJlcywgcHJvcHMsIGtleSwgYWx0S2V5LCB0cnVlKSB8fFxuICAgICAgY2hlY2tQcm9wKHJlcywgYXR0cnMsIGtleSwgYWx0S2V5LCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wIChcbiAgcmVzLFxuICBoYXNoLFxuICBrZXksXG4gIGFsdEtleSxcbiAgcHJlc2VydmVcbikge1xuICBpZiAoaXNEZWYoaGFzaCkpIHtcbiAgICBpZiAoaGFzT3duKGhhc2gsIGtleSkpIHtcbiAgICAgIHJlc1trZXldID0gaGFzaFtrZXldO1xuICAgICAgaWYgKCFwcmVzZXJ2ZSkge1xuICAgICAgICBkZWxldGUgaGFzaFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKGhhc093bihoYXNoLCBhbHRLZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hbYWx0S2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hbYWx0S2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiAgKi9cblxuLy8gVGhlIHRlbXBsYXRlIGNvbXBpbGVyIGF0dGVtcHRzIHRvIG1pbmltaXplIHRoZSBuZWVkIGZvciBub3JtYWxpemF0aW9uIGJ5XG4vLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLlxuLy9cbi8vIEZvciBwbGFpbiBIVE1MIG1hcmt1cCwgbm9ybWFsaXphdGlvbiBjYW4gYmUgY29tcGxldGVseSBza2lwcGVkIGJlY2F1c2UgdGhlXG4vLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlXG4vLyB0d28gY2FzZXMgd2hlcmUgZXh0cmEgbm9ybWFsaXphdGlvbiBpcyBuZWVkZWQ6XG5cbi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnRcbi8vIG1heSByZXR1cm4gYW4gQXJyYXkgaW5zdGVhZCBvZiBhIHNpbmdsZSByb290LiBJbiB0aGlzIGNhc2UsIGp1c3QgYSBzaW1wbGVcbi8vIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkIC0gaWYgYW55IGNoaWxkIGlzIGFuIEFycmF5LCB3ZSBmbGF0dGVuIHRoZSB3aG9sZVxuLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwXG4vLyBiZWNhdXNlIGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhbHJlYWR5IG5vcm1hbGl6ZSB0aGVpciBvd24gY2hpbGRyZW4uXG5mdW5jdGlvbiBzaW1wbGVOb3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuW2ldKSkge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGNoaWxkcmVuKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5cbn1cblxuLy8gMi4gV2hlbiB0aGUgY2hpbGRyZW4gY29udGFpbnMgY29uc3RydWN0cyB0aGF0IGFsd2F5cyBnZW5lcmF0ZWQgbmVzdGVkIEFycmF5cyxcbi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlclxuLy8gd2l0aCBoYW5kLXdyaXR0ZW4gcmVuZGVyIGZ1bmN0aW9ucyAvIEpTWC4gSW4gc3VjaCBjYXNlcyBhIGZ1bGwgbm9ybWFsaXphdGlvblxuLy8gaXMgbmVlZGVkIHRvIGNhdGVyIHRvIGFsbCBwb3NzaWJsZSB0eXBlcyBvZiBjaGlsZHJlbiB2YWx1ZXMuXG5mdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIGlzUHJpbWl0aXZlKGNoaWxkcmVuKVxuICAgID8gW2NyZWF0ZVRleHRWTm9kZShjaGlsZHJlbildXG4gICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKVxuICAgICAgPyBub3JtYWxpemVBcnJheUNoaWxkcmVuKGNoaWxkcmVuKVxuICAgICAgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZSAobm9kZSkge1xuICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICB2YXIgaSwgYywgbGFzdEluZGV4LCBsYXN0O1xuICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVW5kZWYoYykgfHwgdHlwZW9mIGMgPT09ICdib29sZWFuJykgeyBjb250aW51ZSB9XG4gICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7XG4gICAgbGFzdCA9IHJlc1tsYXN0SW5kZXhdO1xuICAgIC8vICBuZXN0ZWRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkge1xuICAgICAgaWYgKGMubGVuZ3RoID4gMCkge1xuICAgICAgICBjID0gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjLCAoKG5lc3RlZEluZGV4IHx8ICcnKSArIFwiX1wiICsgaSkpO1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyAoY1swXSkudGV4dCk7XG4gICAgICAgICAgYy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgYyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkge1xuICAgICAgaWYgKGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlXG4gICAgICAgIC8vIGVzc2VudGlhbGx5IG1lcmdlZCB3aGVuIHJlbmRlcmVkIHRvIEhUTUwgc3RyaW5nc1xuICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyBjKTtcbiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHtcbiAgICAgICAgLy8gY29udmVydCBwcmltaXRpdmUgdG8gdm5vZGVcbiAgICAgICAgcmVzLnB1c2goY3JlYXRlVGV4dFZOb2RlKGMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzVGV4dE5vZGUoYykgJiYgaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIGMudGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKVxuICAgICAgICBpZiAoaXNUcnVlKGNoaWxkcmVuLl9pc1ZMaXN0KSAmJlxuICAgICAgICAgIGlzRGVmKGMudGFnKSAmJlxuICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmXG4gICAgICAgICAgaXNEZWYobmVzdGVkSW5kZXgpKSB7XG4gICAgICAgICAgYy5rZXkgPSBcIl9fdmxpc3RcIiArIG5lc3RlZEluZGV4ICsgXCJfXCIgKyBpICsgXCJfX1wiO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yLFxuICBjb250ZXh0XG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKGlzRGVmKGZhY3RvcnkuY29udGV4dHMpKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb250ZXh0cyA9IGZhY3RvcnkuY29udGV4dHMgPSBbY29udGV4dF07XG4gICAgdmFyIHN5bmMgPSB0cnVlO1xuXG4gICAgdmFyIGZvcmNlUmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29udGV4dHNbaV0uJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgcmVzID0gZmFjdG9yeShyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgaWYgKGlzT2JqZWN0KHJlcykpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNEZWYocmVzLmNvbXBvbmVudCkgJiYgdHlwZW9mIHJlcy5jb21wb25lbnQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXMuY29tcG9uZW50LnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgICAgICBpZiAoaXNEZWYocmVzLmVycm9yKSkge1xuICAgICAgICAgIGZhY3RvcnkuZXJyb3JDb21wID0gZW5zdXJlQ3RvcihyZXMuZXJyb3IsIGJhc2VDdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0RlZihyZXMubG9hZGluZykpIHtcbiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpO1xuICAgICAgICAgIGlmIChyZXMuZGVsYXkgPT09IDApIHtcbiAgICAgICAgICAgIGZhY3RvcnkubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSAmJiBpc1VuZGVmKGZhY3RvcnkuZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3JjZVJlbmRlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocmVzLnRpbWVvdXQpKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgPyAoXCJ0aW1lb3V0IChcIiArIChyZXMudGltZW91dCkgKyBcIm1zKVwiKVxuICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgcmVzLnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3luYyA9IGZhbHNlO1xuICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHlcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nXG4gICAgICA/IGZhY3RvcnkubG9hZGluZ0NvbXBcbiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZFxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuaXNDb21tZW50ICYmIG5vZGUuYXN5bmNGYWN0b3J5XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGlzRGVmKGMpICYmIChpc0RlZihjLmNvbXBvbmVudE9wdGlvbnMpIHx8IGlzQXN5bmNQbGFjZWhvbGRlcihjKSkpIHtcbiAgICAgICAgcmV0dXJuIGNcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXZlbnRzICh2bSkge1xuICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdm0uX2hhc0hvb2tFdmVudCA9IGZhbHNlO1xuICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHNcbiAgdmFyIGxpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIGlmIChsaXN0ZW5lcnMpIHtcbiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7XG4gIH1cbn1cblxudmFyIHRhcmdldDtcblxuZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHtcbiAgaWYgKG9uY2UpIHtcbiAgICB0YXJnZXQuJG9uY2UoZXZlbnQsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDEgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9mZihldmVudCwgZm4pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKFxuICB2bSxcbiAgbGlzdGVuZXJzLFxuICBvbGRMaXN0ZW5lcnNcbikge1xuICB0YXJnZXQgPSB2bTtcbiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7XG4gIHRhcmdldCA9IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXZlbnRzTWl4aW4gKFZ1ZSkge1xuICB2YXIgaG9va1JFID0gL15ob29rOi87XG4gIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7XG4gICAgICAvLyBvcHRpbWl6ZSBob29rOmV2ZW50IGNvc3QgYnkgdXNpbmcgYSBib29sZWFuIGZsYWcgbWFya2VkIGF0IHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaW5zdGVhZCBvZiBhIGhhc2ggbG9va3VwXG4gICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7XG4gICAgICAgIHZtLl9oYXNIb29rRXZlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvbmNlID0gZnVuY3Rpb24gKGV2ZW50LCBmbikge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgZnVuY3Rpb24gb24gKCkge1xuICAgICAgdm0uJG9mZihldmVudCwgb24pO1xuICAgICAgZm4uYXBwbHkodm0sIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIG9uLmZuID0gZm47XG4gICAgdm0uJG9uKGV2ZW50LCBvbik7XG4gICAgcmV0dXJuIHZtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBldmVudC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICAvLyBzcGVjaWZpYyBldmVudFxuICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWNicykge1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIGlmICghZm4pIHtcbiAgICAgIHZtLl9ldmVudHNbZXZlbnRdID0gbnVsbDtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoZm4pIHtcbiAgICAgIC8vIHNwZWNpZmljIGhhbmRsZXJcbiAgICAgIHZhciBjYjtcbiAgICAgIHZhciBpJDEgPSBjYnMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGkkMS0tKSB7XG4gICAgICAgIGNiID0gY2JzW2kkMV07XG4gICAgICAgIGlmIChjYiA9PT0gZm4gfHwgY2IuZm4gPT09IGZuKSB7XG4gICAgICAgICAgY2JzLnNwbGljZShpJDEsIDEpO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7XG4gICAgICAgIHRpcChcbiAgICAgICAgICBcIkV2ZW50IFxcXCJcIiArIGxvd2VyQ2FzZUV2ZW50ICsgXCJcXFwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiLiBcIiArXG4gICAgICAgICAgXCJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSBcIiArXG4gICAgICAgICAgXCJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gXCIgK1xuICAgICAgICAgIFwiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXFxcIlwiICsgKGh5cGhlbmF0ZShldmVudCkpICsgXCJcXFwiIGluc3RlYWQgb2YgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNicyA9IHZtLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmIChjYnMpIHtcbiAgICAgIGNicyA9IGNicy5sZW5ndGggPiAxID8gdG9BcnJheShjYnMpIDogY2JzO1xuICAgICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cywgMSk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYnNbaV0uYXBwbHkodm0sIGFyZ3MpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImV2ZW50IGhhbmRsZXIgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcbn1cblxuLyogICovXG5cblxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZXNvbHZpbmcgcmF3IGNoaWxkcmVuIFZOb2RlcyBpbnRvIGEgc2xvdCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoXG4gIGNoaWxkcmVuLFxuICBjb250ZXh0XG4pIHtcbiAgdmFyIHNsb3RzID0ge307XG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gc2xvdHNcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIHZhciBkYXRhID0gY2hpbGQuZGF0YTtcbiAgICAvLyByZW1vdmUgc2xvdCBhdHRyaWJ1dGUgaWYgdGhlIG5vZGUgaXMgcmVzb2x2ZWQgYXMgYSBWdWUgc2xvdCBub2RlXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHtcbiAgICAgIGRlbGV0ZSBkYXRhLmF0dHJzLnNsb3Q7XG4gICAgfVxuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZm5Db250ZXh0ID09PSBjb250ZXh0KSAmJlxuICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbFxuICAgICkge1xuICAgICAgdmFyIG5hbWUgPSBkYXRhLnNsb3Q7XG4gICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpO1xuICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICBzbG90LnB1c2guYXBwbHkoc2xvdCwgY2hpbGQuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2xvdC5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzXG4pIHtcbiAgcmVzID0gcmVzIHx8IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZuc1tpXSkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1tmbnNbaV0ua2V5XSA9IGZuc1tpXS5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgfVxuICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7XG4gICAgdmFyIHByZXZWbm9kZSA9IHZtLl92bm9kZTtcbiAgICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSB2bTtcbiAgICB2bS5fdm5vZGUgPSB2bm9kZTtcbiAgICAvLyBWdWUucHJvdG90eXBlLl9fcGF0Y2hfXyBpcyBpbmplY3RlZCBpbiBlbnRyeSBwb2ludHNcbiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC5cbiAgICBpZiAoIXByZXZWbm9kZSkge1xuICAgICAgLy8gaW5pdGlhbCByZW5kZXJcbiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhcbiAgICAgICAgdm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtXG4gICAgICApO1xuICAgICAgLy8gbm8gbmVlZCBmb3IgdGhlIHJlZiBub2RlcyBhZnRlciBpbml0aWFsIHBhdGNoXG4gICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKVxuICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSA9IHZtLiRvcHRpb25zLl9yZWZFbG0gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGVzXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18ocHJldlZub2RlLCB2bm9kZSk7XG4gICAgfVxuICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlO1xuICAgIC8vIHVwZGF0ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmIChwcmV2RWwpIHtcbiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHZtLiRlbCkge1xuICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTtcbiAgICB9XG4gICAgLy8gaWYgcGFyZW50IGlzIGFuIEhPQywgdXBkYXRlIGl0cyAkZWwgYXMgd2VsbFxuICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7XG4gICAgICB2bS4kcGFyZW50LiRlbCA9IHZtLiRlbDtcbiAgICB9XG4gICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZVxuICAgIC8vIHVwZGF0ZWQgaW4gYSBwYXJlbnQncyB1cGRhdGVkIGhvb2suXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRkZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVEZXN0cm95Jyk7XG4gICAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50XG4gICAgdmFyIHBhcmVudCA9IHZtLiRwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCAmJiAhcGFyZW50Ll9pc0JlaW5nRGVzdHJveWVkICYmICF2bS4kb3B0aW9ucy5hYnN0cmFjdCkge1xuICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTtcbiAgICB9XG4gICAgLy8gdGVhcmRvd24gd2F0Y2hlcnNcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2bS5fd2F0Y2hlcnNbaV0udGVhcmRvd24oKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSBmcm9tIGRhdGEgb2JcbiAgICAvLyBmcm96ZW4gb2JqZWN0IG1heSBub3QgaGF2ZSBvYnNlcnZlci5cbiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7XG4gICAgICB2bS5fZGF0YS5fX29iX18udm1Db3VudC0tO1xuICAgIH1cbiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi5cbiAgICB2bS5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIGludm9rZSBkZXN0cm95IGhvb2tzIG9uIGN1cnJlbnQgcmVuZGVyZWQgdHJlZVxuICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpO1xuICAgIC8vIGZpcmUgZGVzdHJveWVkIGhvb2tcbiAgICBjYWxsSG9vayh2bSwgJ2Rlc3Ryb3llZCcpO1xuICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuXG4gICAgdm0uJG9mZigpO1xuICAgIC8vIHJlbW92ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KVxuICAgIGlmICh2bS4kdm5vZGUpIHtcbiAgICAgIHZtLiR2bm9kZS5wYXJlbnQgPSBudWxsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gbW91bnRDb21wb25lbnQgKFxuICB2bSxcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIHZtLiRlbCA9IGVsO1xuICBpZiAoIXZtLiRvcHRpb25zLnJlbmRlcikge1xuICAgIHZtLiRvcHRpb25zLnJlbmRlciA9IGNyZWF0ZUVtcHR5Vk5vZGU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHxcbiAgICAgICAgdm0uJG9wdGlvbnMuZWwgfHwgZWwpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArXG4gICAgICAgICAgJ2NvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBwcmUtY29tcGlsZSB0aGUgdGVtcGxhdGVzIGludG8gJyArXG4gICAgICAgICAgJ3JlbmRlciBmdW5jdGlvbnMsIG9yIHVzZSB0aGUgY29tcGlsZXItaW5jbHVkZWQgYnVpbGQuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIG1vdW50IGNvbXBvbmVudDogdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uIG5vdCBkZWZpbmVkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2FsbEhvb2sodm0sICdiZWZvcmVNb3VudCcpO1xuXG4gIHZhciB1cGRhdGVDb21wb25lbnQ7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykge1xuICAgIHVwZGF0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuYW1lID0gdm0uX25hbWU7XG4gICAgICB2YXIgaWQgPSB2bS5fdWlkO1xuICAgICAgdmFyIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArIGlkO1xuICAgICAgdmFyIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgaWQ7XG5cbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoXCJ2dWUgXCIgKyBuYW1lICsgXCIgcmVuZGVyXCIpLCBzdGFydFRhZywgZW5kVGFnKTtcblxuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoXCJ2dWUgXCIgKyBuYW1lICsgXCIgcGF0Y2hcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdm0uX3VwZGF0ZSh2bS5fcmVuZGVyKCksIGh5ZHJhdGluZyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIHdlIHNldCB0aGlzIHRvIHZtLl93YXRjaGVyIGluc2lkZSB0aGUgd2F0Y2hlcidzIGNvbnN0cnVjdG9yXG4gIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCdzIG1vdW50ZWQgaG9vayksIHdoaWNoIHJlbGllcyBvbiB2bS5fd2F0Y2hlciBiZWluZyBhbHJlYWR5IGRlZmluZWRcbiAgbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCwgbnVsbCwgdHJ1ZSAvKiBpc1JlbmRlcldhdGNoZXIgKi8pO1xuICBoeWRyYXRpbmcgPSBmYWxzZTtcblxuICAvLyBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlLCBjYWxsIG1vdW50ZWQgb24gc2VsZlxuICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9va1xuICBpZiAodm0uJHZub2RlID09IG51bGwpIHtcbiAgICB2bS5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTtcbiAgfVxuICByZXR1cm4gdm1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2hpbGRDb21wb25lbnQgKFxuICB2bSxcbiAgcHJvcHNEYXRhLFxuICBsaXN0ZW5lcnMsXG4gIHBhcmVudFZub2RlLFxuICByZW5kZXJDaGlsZHJlblxuKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGRldGVybWluZSB3aGV0aGVyIGNvbXBvbmVudCBoYXMgc2xvdCBjaGlsZHJlblxuICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlblxuICB2YXIgaGFzQ2hpbGRyZW4gPSAhIShcbiAgICByZW5kZXJDaGlsZHJlbiB8fCAgICAgICAgICAgICAgIC8vIGhhcyBuZXcgc3RhdGljIHNsb3RzXG4gICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90c1xuICAgIHBhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgLy8gaGFzIG5ldyBzY29wZWQgc2xvdHNcbiAgICB2bS4kc2NvcGVkU2xvdHMgIT09IGVtcHR5T2JqZWN0IC8vIGhhcyBvbGQgc2NvcGVkIHNsb3RzXG4gICk7XG5cbiAgdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG4gIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyXG5cbiAgaWYgKHZtLl92bm9kZSkgeyAvLyB1cGRhdGUgY2hpbGQgdHJlZSdzIHBhcmVudFxuICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTtcbiAgfVxuICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gPSByZW5kZXJDaGlsZHJlbjtcblxuICAvLyB1cGRhdGUgJGF0dHJzIGFuZCAkbGlzdGVuZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IChwYXJlbnRWbm9kZS5kYXRhICYmIHBhcmVudFZub2RlLmRhdGEuYXR0cnMpIHx8IGVtcHR5T2JqZWN0O1xuICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0O1xuXG4gIC8vIHVwZGF0ZSBwcm9wc1xuICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gZmFsc2U7XG4gICAgdmFyIHByb3BzID0gdm0uX3Byb3BzO1xuICAgIHZhciBwcm9wS2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBwcm9wc1trZXldID0gdmFsaWRhdGVQcm9wKGtleSwgdm0uJG9wdGlvbnMucHJvcHMsIHByb3BzRGF0YSwgdm0pO1xuICAgIH1cbiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlO1xuICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGFcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgPSBwcm9wc0RhdGE7XG4gIH1cblxuICAvLyB1cGRhdGUgbGlzdGVuZXJzXG4gIGlmIChsaXN0ZW5lcnMpIHtcbiAgICB2YXIgb2xkTGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgICB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzLCBvbGRMaXN0ZW5lcnMpO1xuICB9XG4gIC8vIHJlc29sdmUgc2xvdHMgKyBmb3JjZSB1cGRhdGUgaWYgaGFzIGNoaWxkcmVuXG4gIGlmIChoYXNDaGlsZHJlbikge1xuICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7XG4gICAgdm0uJGZvcmNlVXBkYXRlKCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5JbmFjdGl2ZVRyZWUgKHZtKSB7XG4gIHdoaWxlICh2bSAmJiAodm0gPSB2bS4kcGFyZW50KSkge1xuICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBlbHNlIGlmICh2bS5fZGlyZWN0SW5hY3RpdmUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodm0uX2luYWN0aXZlIHx8IHZtLl9pbmFjdGl2ZSA9PT0gbnVsbCkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSB0cnVlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG4gIGlmICghdm0uX2luYWN0aXZlKSB7XG4gICAgdm0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnZGVhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHtcbiAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gIGlmIChoYW5kbGVycykge1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChob29rICsgXCIgaG9va1wiKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2bS5faGFzSG9va0V2ZW50KSB7XG4gICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spO1xuICB9XG59XG5cbi8qICAqL1xuXG5cbnZhciBNQVhfVVBEQVRFX0NPVU5UID0gMTAwO1xuXG52YXIgcXVldWUgPSBbXTtcbnZhciBhY3RpdmF0ZWRDaGlsZHJlbiA9IFtdO1xudmFyIGhhcyA9IHt9O1xudmFyIGNpcmN1bGFyID0ge307XG52YXIgd2FpdGluZyA9IGZhbHNlO1xudmFyIGZsdXNoaW5nID0gZmFsc2U7XG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTY2hlZHVsZXJTdGF0ZSAoKSB7XG4gIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgaGFzID0ge307XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2lyY3VsYXIgPSB7fTtcbiAgfVxuICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBGbHVzaCBib3RoIHF1ZXVlcyBhbmQgcnVuIHRoZSB3YXRjaGVycy5cbiAqL1xuZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7XG4gIGZsdXNoaW5nID0gdHJ1ZTtcbiAgdmFyIHdhdGNoZXIsIGlkO1xuXG4gIC8vIFNvcnQgcXVldWUgYmVmb3JlIGZsdXNoLlxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdDpcbiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5c1xuICAvLyAgICBjcmVhdGVkIGJlZm9yZSB0aGUgY2hpbGQpXG4gIC8vIDIuIEEgY29tcG9uZW50J3MgdXNlciB3YXRjaGVycyBhcmUgcnVuIGJlZm9yZSBpdHMgcmVuZGVyIHdhdGNoZXIgKGJlY2F1c2VcbiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKVxuICAvLyAzLiBJZiBhIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgZHVyaW5nIGEgcGFyZW50IGNvbXBvbmVudCdzIHdhdGNoZXIgcnVuLFxuICAvLyAgICBpdHMgd2F0Y2hlcnMgY2FuIGJlIHNraXBwZWQuXG4gIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTtcblxuICAvLyBkbyBub3QgY2FjaGUgbGVuZ3RoIGJlY2F1c2UgbW9yZSB3YXRjaGVycyBtaWdodCBiZSBwdXNoZWRcbiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHdhdGNoZXIgPSBxdWV1ZVtpbmRleF07XG4gICAgaWQgPSB3YXRjaGVyLmlkO1xuICAgIGhhc1tpZF0gPSBudWxsO1xuICAgIHdhdGNoZXIucnVuKCk7XG4gICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGhhc1tpZF0gIT0gbnVsbCkge1xuICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7XG4gICAgICBpZiAoY2lyY3VsYXJbaWRdID4gTUFYX1VQREFURV9DT1VOVCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArIChcbiAgICAgICAgICAgIHdhdGNoZXIudXNlclxuICAgICAgICAgICAgICA/IChcImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpXG4gICAgICAgICAgICAgIDogXCJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIHdhdGNoZXIudm1cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBrZWVwIGNvcGllcyBvZiBwb3N0IHF1ZXVlcyBiZWZvcmUgcmVzZXR0aW5nIHN0YXRlXG4gIHZhciBhY3RpdmF0ZWRRdWV1ZSA9IGFjdGl2YXRlZENoaWxkcmVuLnNsaWNlKCk7XG4gIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpO1xuXG4gIHJlc2V0U2NoZWR1bGVyU3RhdGUoKTtcblxuICAvLyBjYWxsIGNvbXBvbmVudCB1cGRhdGVkIGFuZCBhY3RpdmF0ZWQgaG9va3NcbiAgY2FsbEFjdGl2YXRlZEhvb2tzKGFjdGl2YXRlZFF1ZXVlKTtcbiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpO1xuXG4gIC8vIGRldnRvb2wgaG9va1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGRldnRvb2xzICYmIGNvbmZpZy5kZXZ0b29scykge1xuICAgIGRldnRvb2xzLmVtaXQoJ2ZsdXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHtcbiAgdmFyIGkgPSBxdWV1ZS5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldO1xuICAgIHZhciB2bSA9IHdhdGNoZXIudm07XG4gICAgaWYgKHZtLl93YXRjaGVyID09PSB3YXRjaGVyICYmIHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC5cbiAqIFRoZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgZW50aXJlIHRyZWUgaGFzIGJlZW4gcGF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7XG4gIC8vIHNldHRpbmcgX2luYWN0aXZlIHRvIGZhbHNlIGhlcmUgc28gdGhhdCBhIHJlbmRlciBmdW5jdGlvbiBjYW5cbiAgLy8gcmVseSBvbiBjaGVja2luZyB3aGV0aGVyIGl0J3MgaW4gYW4gaW5hY3RpdmUgdHJlZSAoZS5nLiByb3V0ZXItdmlldylcbiAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gIGFjdGl2YXRlZENoaWxkcmVuLnB1c2godm0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQWN0aXZhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQocXVldWVbaV0sIHRydWUgLyogdHJ1ZSAqLyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLlxuICogSm9icyB3aXRoIGR1cGxpY2F0ZSBJRHMgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBpdCdzXG4gKiBwdXNoZWQgd2hlbiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVXYXRjaGVyICh3YXRjaGVyKSB7XG4gIHZhciBpZCA9IHdhdGNoZXIuaWQ7XG4gIGlmIChoYXNbaWRdID09IG51bGwpIHtcbiAgICBoYXNbaWRdID0gdHJ1ZTtcbiAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBhbHJlYWR5IGZsdXNoaW5nLCBzcGxpY2UgdGhlIHdhdGNoZXIgYmFzZWQgb24gaXRzIGlkXG4gICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LlxuICAgICAgdmFyIGkgPSBxdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkgPiBpbmRleCAmJiBxdWV1ZVtpXS5pZCA+IHdhdGNoZXIuaWQpIHtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB3YXRjaGVyKTtcbiAgICB9XG4gICAgLy8gcXVldWUgdGhlIGZsdXNoXG4gICAgaWYgKCF3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gdHJ1ZTtcbiAgICAgIG5leHRUaWNrKGZsdXNoU2NoZWR1bGVyUXVldWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHVpZCQyID0gMDtcblxuLyoqXG4gKiBBIHdhdGNoZXIgcGFyc2VzIGFuIGV4cHJlc3Npb24sIGNvbGxlY3RzIGRlcGVuZGVuY2llcyxcbiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlICR3YXRjaCgpIGFwaSBhbmQgZGlyZWN0aXZlcy5cbiAqL1xudmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGNiLFxuICBvcHRpb25zLFxuICBpc1JlbmRlcldhdGNoZXJcbikge1xuICB0aGlzLnZtID0gdm07XG4gIGlmIChpc1JlbmRlcldhdGNoZXIpIHtcbiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7XG4gIH1cbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQyOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB3YXRjaGluZyBwYXRoOiBcXFwiXCIgKyBleHBPckZuICsgXCJcXFwiIFwiICtcbiAgICAgICAgJ1dhdGNoZXIgb25seSBhY2NlcHRzIHNpbXBsZSBkb3QtZGVsaW1pdGVkIHBhdGhzLiAnICtcbiAgICAgICAgJ0ZvciBmdWxsIGNvbnRyb2wsIHVzZSBhIGZ1bmN0aW9uIGluc3RlYWQuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHRoaXMudmFsdWUgPSB0aGlzLmxhenlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogdGhpcy5nZXQoKTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgdGhlIGdldHRlciwgYW5kIHJlLWNvbGxlY3QgZGVwZW5kZW5jaWVzLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciB2bSA9IHRoaXMudm07XG4gIHRyeSB7XG4gICAgdmFsdWUgPSB0aGlzLmdldHRlci5jYWxsKHZtLCB2bSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKFwiZ2V0dGVyIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmdcbiAgICBpZiAodGhpcy5kZWVwKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHRoaXMuY2xlYW51cERlcHMoKTtcbiAgfVxuICByZXR1cm4gdmFsdWVcbn07XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gYWRkRGVwIChkZXApIHtcbiAgdmFyIGlkID0gZGVwLmlkO1xuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpO1xuICAgIHRoaXMubmV3RGVwcy5wdXNoKGRlcCk7XG4gICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7XG4gICAgICBkZXAuYWRkU3ViKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhbiB1cCBmb3IgZGVwZW5kZW5jeSBjb2xsZWN0aW9uLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcyQxLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7XG4gICAgICBkZXAucmVtb3ZlU3ViKHRoaXMkMSk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzJDEuZGVwc1tpXS5kZXBlbmQoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbiB0ZWFyZG93biAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMkMS5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzJDEpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG59O1xuXG4vKiAgKi9cblxudmFyIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IG5vb3AsXG4gIHNldDogbm9vcFxufTtcblxuZnVuY3Rpb24gcHJveHkgKHRhcmdldCwgc291cmNlS2V5LCBrZXkpIHtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpc1tzb3VyY2VLZXldW2tleV1cbiAgfTtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICB0aGlzW3NvdXJjZUtleV1ba2V5XSA9IHZhbDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7XG4gIHZtLl93YXRjaGVycyA9IFtdO1xuICB2bS5faW5saW5lQ29tcHV0ZWQgPSBudWxsO1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zO1xuICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9XG4gIGlmIChvcHRzLm1ldGhvZHMpIHsgaW5pdE1ldGhvZHModm0sIG9wdHMubWV0aG9kcyk7IH1cbiAgaWYgKG9wdHMuZGF0YSkge1xuICAgIGluaXREYXRhKHZtKTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZlKHZtLl9kYXRhID0ge30sIHRydWUgLyogYXNSb290RGF0YSAqLyk7XG4gIH1cbiAgaWYgKG9wdHMuY29tcHV0ZWQpIHsgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKTsgfVxuICBpZiAob3B0cy53YXRjaCAmJiBvcHRzLndhdGNoICE9PSBuYXRpdmVXYXRjaCkge1xuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzICh2bSwgcHJvcHNPcHRpb25zKSB7XG4gIHZhciBwcm9wc0RhdGEgPSB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgfHwge307XG4gIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9O1xuICAvLyBjYWNoZSBwcm9wIGtleXMgc28gdGhhdCBmdXR1cmUgcHJvcHMgdXBkYXRlcyBjYW4gaXRlcmF0ZSB1c2luZyBBcnJheVxuICAvLyBpbnN0ZWFkIG9mIGR5bmFtaWMgb2JqZWN0IGtleSBlbnVtZXJhdGlvbi5cbiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTtcbiAgdmFyIGlzUm9vdCA9ICF2bS4kcGFyZW50O1xuICAvLyByb290IGluc3RhbmNlIHByb3BzIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gaXNSb290O1xuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChpc1Jlc2VydmVkQXR0cmlidXRlKGh5cGhlbmF0ZWRLZXkpIHx8XG4gICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsgaHlwaGVuYXRlZEtleSArIFwiXFxcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWZpbmVSZWFjdGl2ZShwcm9wcywga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlIFwiICtcbiAgICAgICAgICAgIFwib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgXCIgK1xuICAgICAgICAgICAgXCJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIixcbiAgICAgICAgICAgIHZtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmluZVJlYWN0aXZlKHByb3BzLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZVxuICAgIC8vIGR1cmluZyBWdWUuZXh0ZW5kKCkuIFdlIG9ubHkgbmVlZCB0byBwcm94eSBwcm9wcyBkZWZpbmVkIGF0XG4gICAgLy8gaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIHByb3h5KHZtLCBcIl9wcm9wc1wiLCBrZXkpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHNPcHRpb25zKSBsb29wKCBrZXkgKTtcbiAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7XG4gIHZhciBkYXRhID0gdm0uJG9wdGlvbnMuZGF0YTtcbiAgZGF0YSA9IHZtLl9kYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbidcbiAgICA/IGdldERhdGEoZGF0YSwgdm0pXG4gICAgOiBkYXRhIHx8IHt9O1xuICBpZiAoIWlzUGxhaW5PYmplY3QoZGF0YSkpIHtcbiAgICBkYXRhID0ge307XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxcbicgK1xuICAgICAgJ2h0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL2NvbXBvbmVudHMuaHRtbCNkYXRhLU11c3QtQmUtYS1GdW5jdGlvbicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZVxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICB2YXIgcHJvcHMgPSB2bS4kb3B0aW9ucy5wcm9wcztcbiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiTWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LlwiKSxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiVGhlIGRhdGEgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVjbGFyZWQgYXMgYSBwcm9wLiBcIiArXG4gICAgICAgIFwiVXNlIHByb3AgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLlwiLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICAgIHByb3h5KHZtLCBcIl9kYXRhXCIsIGtleSk7XG4gICAgfVxuICB9XG4gIC8vIG9ic2VydmUgZGF0YVxuICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7XG59XG5cbmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJkYXRhKClcIik7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxudmFyIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnMgPSB7IGxhenk6IHRydWUgfTtcblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkICh2bSwgY29tcHV0ZWQpIHtcbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gY29tcHV0ZWQgcHJvcGVydGllcyBhcmUganVzdCBnZXR0ZXJzIGR1cmluZyBTU1JcbiAgdmFyIGlzU1NSID0gaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICB2YXIgdXNlckRlZiA9IGNvbXB1dGVkW2tleV07XG4gICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGdldHRlciA9PSBudWxsKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJHZXR0ZXIgaXMgbWlzc2luZyBmb3IgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiLlwiKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1NTUikge1xuICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICAgIHdhdGNoZXJzW2tleV0gPSBuZXcgV2F0Y2hlcihcbiAgICAgICAgdm0sXG4gICAgICAgIGdldHRlciB8fCBub29wLFxuICAgICAgICBub29wLFxuICAgICAgICBjb21wdXRlZFdhdGNoZXJPcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkIChcbiAgdGFyZ2V0LFxuICBrZXksXG4gIHVzZXJEZWZcbikge1xuICB2YXIgc2hvdWxkQ2FjaGUgPSAhaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcbiAgaWYgKHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlXG4gICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgIDogdXNlckRlZjtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogdXNlckRlZi5nZXRcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXRcbiAgICAgID8gdXNlckRlZi5zZXRcbiAgICAgIDogbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChtZXRob2RzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiTWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBoYXMgYW4gdW5kZWZpbmVkIHZhbHVlIGluIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi4gXCIgK1xuICAgICAgICAgIFwiRGlkIHlvdSByZWZlcmVuY2UgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseT9cIixcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIk1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICgoa2V5IGluIHZtKSAmJiBpc1Jlc2VydmVkKGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIk1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgVnVlIGluc3RhbmNlIG1ldGhvZC4gXCIgK1xuICAgICAgICAgIFwiQXZvaWQgZGVmaW5pbmcgY29tcG9uZW50IG1ldGhvZHMgdGhhdCBzdGFydCB3aXRoIF8gb3IgJC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2bVtrZXldID0gbWV0aG9kc1trZXldID09IG51bGwgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGtleU9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGtleU9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKG5ld0RhdGEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdBdm9pZCByZXBsYWNpbmcgaW5zdGFuY2Ugcm9vdCAkZGF0YS4gJyArXG4gICAgICAgICdVc2UgbmVzdGVkIGRhdGEgcHJvcGVydGllcyBpbnN0ZWFkLicsXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfTtcbiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFwiJHByb3BzIGlzIHJlYWRvbmx5LlwiLCB0aGlzKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcHJvcHMnLCBwcm9wc0RlZik7XG5cbiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0O1xuICBWdWUucHJvdG90eXBlLiRkZWxldGUgPSBkZWw7XG5cbiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoXG4gICAgZXhwT3JGbixcbiAgICBjYixcbiAgICBvcHRpb25zXG4gICkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV2F0Y2hlcih2bSwgZXhwT3JGbiwgY2IsIG9wdGlvbnMpXG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudXNlciA9IHRydWU7XG4gICAgdmFyIHdhdGNoZXIgPSBuZXcgV2F0Y2hlcih2bSwgZXhwT3JGbiwgY2IsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkge1xuICAgICAgY2IuY2FsbCh2bSwgd2F0Y2hlci52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkge1xuICAgICAgd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRQcm92aWRlICh2bSkge1xuICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7XG4gIGlmIChwcm92aWRlKSB7XG4gICAgdm0uX3Byb3ZpZGVkID0gdHlwZW9mIHByb3ZpZGUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKVxuICAgICAgOiBwcm92aWRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRJbmplY3Rpb25zICh2bSkge1xuICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IGZhbHNlO1xuICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUodm0sIGtleSwgcmVzdWx0W2tleV0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhbiBpbmplY3RlZCB2YWx1ZSBkaXJlY3RseSBzaW5jZSB0aGUgY2hhbmdlcyB3aWxsIGJlIFwiICtcbiAgICAgICAgICAgIFwib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHByb3ZpZGVkIGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcImluamVjdGlvbiBiZWluZyBtdXRhdGVkOiBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIixcbiAgICAgICAgICAgIHZtXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZpbmVSZWFjdGl2ZSh2bSwga2V5LCByZXN1bHRba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0IChpbmplY3QsIHZtKSB7XG4gIGlmIChpbmplY3QpIHtcbiAgICAvLyBpbmplY3QgaXMgOmFueSBiZWNhdXNlIGZsb3cgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBmaWd1cmUgb3V0IGNhY2hlZFxuICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlXG4gICAgICB9KVxuICAgICAgOiBPYmplY3Qua2V5cyhpbmplY3QpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTtcbiAgICAgIHZhciBzb3VyY2UgPSB2bTtcbiAgICAgIHdoaWxlIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgcHJvdmlkZUtleSBpbiBzb3VyY2UuX3Byb3ZpZGVkKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2UuX3Byb3ZpZGVkW3Byb3ZpZGVLZXldO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc291cmNlID0gc291cmNlLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIGluamVjdFtrZXldKSB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVEZWZhdWx0ID0gaW5qZWN0W2tleV0uZGVmYXVsdDtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBwcm92aWRlRGVmYXVsdC5jYWxsKHZtKVxuICAgICAgICAgICAgOiBwcm92aWRlRGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLlxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0IChcbiAgdmFsLFxuICByZW5kZXJcbikge1xuICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkodmFsLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxbaV0sIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtrZXldLCBrZXksIGkpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNEZWYocmV0KSkge1xuICAgIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgPHNsb3Q+XG4gKi9cbmZ1bmN0aW9uIHJlbmRlclNsb3QgKFxuICBuYW1lLFxuICBmYWxsYmFjayxcbiAgcHJvcHMsXG4gIGJpbmRPYmplY3Rcbikge1xuICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07XG4gIHZhciBub2RlcztcbiAgaWYgKHNjb3BlZFNsb3RGbikgeyAvLyBzY29wZWQgc2xvdFxuICAgIHByb3BzID0gcHJvcHMgfHwge307XG4gICAgaWYgKGJpbmRPYmplY3QpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdzbG90IHYtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0JyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7XG4gICAgfVxuICAgIG5vZGVzID0gc2NvcGVkU2xvdEZuKHByb3BzKSB8fCBmYWxsYmFjaztcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xvdE5vZGVzID0gdGhpcy4kc2xvdHNbbmFtZV07XG4gICAgLy8gd2FybiBkdXBsaWNhdGUgc2xvdCB1c2FnZVxuICAgIGlmIChzbG90Tm9kZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHNsb3ROb2Rlcy5fcmVuZGVyZWQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIkR1cGxpY2F0ZSBwcmVzZW5jZSBvZiBzbG90IFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgZm91bmQgaW4gdGhlIHNhbWUgcmVuZGVyIHRyZWUgXCIgK1xuICAgICAgICAgIFwiLSB0aGlzIHdpbGwgbGlrZWx5IGNhdXNlIHJlbmRlciBlcnJvcnMuXCIsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2xvdE5vZGVzLl9yZW5kZXJlZCA9IHRydWU7XG4gICAgfVxuICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7XG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy4kY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnLCB7IHNsb3Q6IHRhcmdldCB9LCBub2RlcylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZXNcbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIGZpbHRlcnNcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZpbHRlciAoaWQpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldCh0aGlzLiRvcHRpb25zLCAnZmlsdGVycycsIGlkLCB0cnVlKSB8fCBpZGVudGl0eVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuXG4gKiBleHBvc2VkIGFzIFZ1ZS5wcm90b3R5cGUuX2tcbiAqIHBhc3NpbmcgaW4gZXZlbnRLZXlOYW1lIGFzIGxhc3QgYXJndW1lbnQgc2VwYXJhdGVseSBmb3IgYmFja3dhcmRzIGNvbXBhdFxuICovXG5mdW5jdGlvbiBjaGVja0tleUNvZGVzIChcbiAgZXZlbnRLZXlDb2RlLFxuICBrZXksXG4gIGJ1aWx0SW5BbGlhcyxcbiAgZXZlbnRLZXlOYW1lXG4pIHtcbiAgdmFyIGtleUNvZGVzID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbkFsaWFzO1xuICBpZiAoa2V5Q29kZXMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlDb2RlcykpIHtcbiAgICAgIHJldHVybiBrZXlDb2Rlcy5pbmRleE9mKGV2ZW50S2V5Q29kZSkgPT09IC0xXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBrZXlDb2RlcyAhPT0gZXZlbnRLZXlDb2RlXG4gICAgfVxuICB9IGVsc2UgaWYgKGV2ZW50S2V5TmFtZSkge1xuICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIG1lcmdpbmcgdi1iaW5kPVwib2JqZWN0XCIgaW50byBhIFZOb2RlJ3MgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYmluZE9iamVjdFByb3BzIChcbiAgZGF0YSxcbiAgdGFnLFxuICB2YWx1ZSxcbiAgYXNQcm9wLFxuICBpc1N5bmNcbikge1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1iaW5kIHdpdGhvdXQgYXJndW1lbnQgZXhwZWN0cyBhbiBPYmplY3Qgb3IgQXJyYXkgdmFsdWUnLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgaGFzaDtcbiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdjbGFzcycgfHxcbiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHxcbiAgICAgICAgICBpc1Jlc2VydmVkQXR0cmlidXRlKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaGFzaCA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSBkYXRhLmF0dHJzICYmIGRhdGEuYXR0cnMudHlwZTtcbiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSlcbiAgICAgICAgICAgID8gZGF0YS5kb21Qcm9wcyB8fCAoZGF0YS5kb21Qcm9wcyA9IHt9KVxuICAgICAgICAgICAgOiBkYXRhLmF0dHJzIHx8IChkYXRhLmF0dHJzID0ge30pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUgYnkgZG9pbmcgYSBzaGFsbG93IGNsb25lLlxuICBpZiAodHJlZSAmJiAhaXNJbkZvcikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRyZWUpXG4gICAgICA/IGNsb25lVk5vZGVzKHRyZWUpXG4gICAgICA6IGNsb25lVk5vZGUodHJlZSlcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogVGhpcyBydW50aW1lIGhlbHBlciBjcmVhdGVzIGFuIGlubGluZSBjb21wdXRlZCBwcm9wZXJ0eSBmb3IgY29tcG9uZW50XG4gKiBwcm9wcyB0aGF0IGNvbnRhaW4gb2JqZWN0IG9yIGFycmF5IGxpdGVyYWxzLiBUaGUgY2FjaGluZyBlbnN1cmVzIHRoZSBzYW1lXG4gKiBvYmplY3QvYXJyYXkgaXMgcmV0dXJuZWQgdW5sZXNzIHRoZSB2YWx1ZSBoYXMgaW5kZWVkIGNoYW5nZWQsIHRodXMgYXZvaWRpbmdcbiAqIHRoZSBjaGlsZCBjb21wb25lbnQgdG8gYWx3YXlzIHJlLXJlbmRlciB3aGVuIGNvbXBhcmluZyBwcm9wcyB2YWx1ZXMuXG4gKlxuICogSW5zdGFsbGVkIHRvIHRoZSBpbnN0YW5jZSBhcyBfYSwgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBpbiBwYXJzZXIgdGhhdFxuICogdHJhbnNmb3JtcyB0aGUgZm9sbG93aW5nXG4gKiAgIDxmb28gOmJhcj1cInsgYTogMSB9XCIvPlxuICogdG86XG4gKiAgIDxmb28gOmJhcj1cIl9hKDAsIGZ1bmN0aW9uKCl7cmV0dXJuIHsgYTogMSB9fSlcIlxuICovXG5mdW5jdGlvbiBjcmVhdGVJbmxpbmVDb21wdXRlZCAoaWQsIGdldHRlcikge1xuICB2YXIgdm0gPSB0aGlzO1xuICB2YXIgd2F0Y2hlcnMgPSB2bS5faW5saW5lQ29tcHV0ZWQgfHwgKHZtLl9pbmxpbmVDb21wdXRlZCA9IHt9KTtcbiAgdmFyIGNhY2hlZCQkMSA9IHdhdGNoZXJzW2lkXTtcbiAgaWYgKGNhY2hlZCQkMSkge1xuICAgIHJldHVybiBjYWNoZWQkJDEudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB3YXRjaGVyc1tpZF0gPSBuZXcgV2F0Y2hlcih2bSwgZ2V0dGVyLCBub29wLCB7IHN5bmM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHdhdGNoZXJzW2lkXS52YWx1ZVxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7XG4gIHRhcmdldC5fbyA9IG1hcmtPbmNlO1xuICB0YXJnZXQuX24gPSB0b051bWJlcjtcbiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7XG4gIHRhcmdldC5fbCA9IHJlbmRlckxpc3Q7XG4gIHRhcmdldC5fdCA9IHJlbmRlclNsb3Q7XG4gIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7XG4gIHRhcmdldC5faSA9IGxvb3NlSW5kZXhPZjtcbiAgdGFyZ2V0Ll9tID0gcmVuZGVyU3RhdGljO1xuICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyO1xuICB0YXJnZXQuX2sgPSBjaGVja0tleUNvZGVzO1xuICB0YXJnZXQuX2IgPSBiaW5kT2JqZWN0UHJvcHM7XG4gIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTtcbiAgdGFyZ2V0Ll9lID0gY3JlYXRlRW1wdHlWTm9kZTtcbiAgdGFyZ2V0Ll91ID0gcmVzb2x2ZVNjb3BlZFNsb3RzO1xuICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzO1xuICB0YXJnZXQuX2EgPSBjcmVhdGVJbmxpbmVDb21wdXRlZDtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0IChcbiAgZGF0YSxcbiAgcHJvcHMsXG4gIGNoaWxkcmVuLFxuICBwYXJlbnQsXG4gIEN0b3Jcbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7XG4gIHRoaXMuaW5qZWN0aW9ucyA9IHJlc29sdmVJbmplY3Qob3B0aW9ucy5pbmplY3QsIHBhcmVudCk7XG4gIHRoaXMuc2xvdHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlU2xvdHMoY2hpbGRyZW4sIHBhcmVudCk7IH07XG5cbiAgLy8gZW5zdXJlIHRoZSBjcmVhdGVFbGVtZW50IGZ1bmN0aW9uIGluIGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrXG4gIHZhciBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gIHZhciBpc0NvbXBpbGVkID0gaXNUcnVlKG9wdGlvbnMuX2NvbXBpbGVkKTtcbiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7XG5cbiAgLy8gc3VwcG9ydCBmb3IgY29tcGlsZWQgZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoaXNDb21waWxlZCkge1xuICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKVxuICAgIHRoaXMuJG9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIHByZS1yZXNvbHZlIHNsb3RzIGZvciByZW5kZXJTbG90KClcbiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTtcbiAgICB0aGlzLiRzY29wZWRTbG90cyA9IGRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7XG4gIH1cblxuICBpZiAob3B0aW9ucy5fc2NvcGVJZCkge1xuICAgIHRoaXMuX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkge1xuICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTtcbiAgICAgIGlmICh2bm9kZSkge1xuICAgICAgICB2bm9kZS5mblNjb3BlSWQgPSBvcHRpb25zLl9zY29wZUlkO1xuICAgICAgICB2bm9kZS5mbkNvbnRleHQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm5vZGVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsgfTtcbiAgfVxufVxuXG5pbnN0YWxsUmVuZGVySGVscGVycyhGdW5jdGlvbmFsUmVuZGVyQ29udGV4dC5wcm90b3R5cGUpO1xuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50IChcbiAgQ3RvcixcbiAgcHJvcHNEYXRhLFxuICBkYXRhLFxuICBjb250ZXh0Vm0sXG4gIGNoaWxkcmVuXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIgcHJvcE9wdGlvbnMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoaXNEZWYocHJvcE9wdGlvbnMpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7XG4gICAgICBwcm9wc1trZXldID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcE9wdGlvbnMsIHByb3BzRGF0YSB8fCBlbXB0eU9iamVjdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0RlZihkYXRhLmF0dHJzKSkgeyBtZXJnZVByb3BzKHByb3BzLCBkYXRhLmF0dHJzKTsgfVxuICAgIGlmIChpc0RlZihkYXRhLnByb3BzKSkgeyBtZXJnZVByb3BzKHByb3BzLCBkYXRhLnByb3BzKTsgfVxuICB9XG5cbiAgdmFyIHJlbmRlckNvbnRleHQgPSBuZXcgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQoXG4gICAgZGF0YSxcbiAgICBwcm9wcyxcbiAgICBjaGlsZHJlbixcbiAgICBjb250ZXh0Vm0sXG4gICAgQ3RvclxuICApO1xuXG4gIHZhciB2bm9kZSA9IG9wdGlvbnMucmVuZGVyLmNhbGwobnVsbCwgcmVuZGVyQ29udGV4dC5fYywgcmVuZGVyQ29udGV4dCk7XG5cbiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICB2bm9kZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07XG4gICAgdm5vZGUuZm5PcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoZGF0YS5zbG90KSB7XG4gICAgICAodm5vZGUuZGF0YSB8fCAodm5vZGUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdm5vZGVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuXG52YXIgUkVDWUNMRV9MSVNUX01BUktFUiA9ICdAaW5SZWN5Y2xlTGlzdCc7XG5cbi8vIFJlZ2lzdGVyIHRoZSBjb21wb25lbnQgaG9vayB0byB3ZWV4IG5hdGl2ZSByZW5kZXIgZW5naW5lLlxuLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC5cbmZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50SG9vayAoXG4gIGNvbXBvbmVudElkLFxuICB0eXBlLCAvLyBob29rIHR5cGUsIGNvdWxkIGJlIFwibGlmZWN5Y2xlXCIgb3IgXCJpbnN0YW5jZVwiXG4gIGhvb2ssIC8vIGhvb2sgbmFtZVxuICBmblxuKSB7XG4gIGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LnRhc2tDZW50ZXIpIHtcbiAgICB3YXJuKFwiQ2FuJ3QgZmluZCBhdmFpbGFibGUgXFxcImRvY3VtZW50XFxcIiBvciBcXFwidGFza0NlbnRlclxcXCIuXCIpO1xuICAgIHJldHVyblxuICB9XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQudGFza0NlbnRlci5yZWdpc3Rlckhvb2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5yZWdpc3Rlckhvb2soY29tcG9uZW50SWQsIHR5cGUsIGhvb2ssIGZuKVxuICB9XG4gIHdhcm4oKFwiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCBob29rIFxcXCJcIiArIHR5cGUgKyBcIkBcIiArIGhvb2sgKyBcIiNcIiArIGNvbXBvbmVudElkICsgXCJcXFwiLlwiKSk7XG59XG5cbi8vIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb21wb25lbnQgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS5cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudERhdGEgKFxuICBjb21wb25lbnRJZCxcbiAgbmV3RGF0YSxcbiAgY2FsbGJhY2tcbikge1xuICBpZiAoIWRvY3VtZW50IHx8ICFkb2N1bWVudC50YXNrQ2VudGVyKSB7XG4gICAgd2FybihcIkNhbid0IGZpbmQgYXZhaWxhYmxlIFxcXCJkb2N1bWVudFxcXCIgb3IgXFxcInRhc2tDZW50ZXJcXFwiLlwiKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodHlwZW9mIGRvY3VtZW50LnRhc2tDZW50ZXIudXBkYXRlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBkb2N1bWVudC50YXNrQ2VudGVyLnVwZGF0ZURhdGEoY29tcG9uZW50SWQsIG5ld0RhdGEsIGNhbGxiYWNrKVxuICB9XG4gIHdhcm4oKFwiRmFpbGVkIHRvIHVwZGF0ZSBjb21wb25lbnQgZGF0YSAoXCIgKyBjb21wb25lbnRJZCArIFwiKS5cIikpO1xufVxuXG4vKiAgKi9cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0hhbmtzMTAxMDAvd2VleC1uYXRpdmUtZGlyZWN0aXZlL3RyZWUvbWFzdGVyL2NvbXBvbmVudFxuXG52YXIgdWlkJDMgPSAwO1xuXG4vLyBvdmVycmlkZSBWdWUucHJvdG90eXBlLl9pbml0XG5mdW5jdGlvbiBpbml0VmlydHVhbENvbXBvbmVudCAob3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICB2YXIgdm0gPSB0aGlzO1xuICB2YXIgY29tcG9uZW50SWQgPSBvcHRpb25zLmNvbXBvbmVudElkO1xuXG4gIC8vIHZpcnR1YWwgY29tcG9uZW50IHVpZFxuICB2bS5fdWlkID0gXCJ2aXJ0dWFsLWNvbXBvbmVudC1cIiArICh1aWQkMysrKTtcblxuICAvLyBhIGZsYWcgdG8gYXZvaWQgdGhpcyBiZWluZyBvYnNlcnZlZFxuICB2bS5faXNWdWUgPSB0cnVlO1xuICAvLyBtZXJnZSBvcHRpb25zXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2lzQ29tcG9uZW50KSB7XG4gICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlXG4gICAgLy8gaW50ZXJuYWwgY29tcG9uZW50IG9wdGlvbnMgbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuXG4gICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICB2bS4kb3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaW5pdFByb3h5KHZtKTtcbiAgfSBlbHNlIHtcbiAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgfVxuXG4gIHZtLl9zZWxmID0gdm07XG4gIGluaXRMaWZlY3ljbGUodm0pO1xuICBpbml0RXZlbnRzKHZtKTtcbiAgaW5pdFJlbmRlcih2bSk7XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gIGluaXRJbmplY3Rpb25zKHZtKTsgLy8gcmVzb2x2ZSBpbmplY3Rpb25zIGJlZm9yZSBkYXRhL3Byb3BzXG4gIGluaXRTdGF0ZSh2bSk7XG4gIGluaXRQcm92aWRlKHZtKTsgLy8gcmVzb2x2ZSBwcm92aWRlIGFmdGVyIGRhdGEvcHJvcHNcbiAgY2FsbEhvb2sodm0sICdjcmVhdGVkJyk7XG5cbiAgLy8gc2VuZCBpbml0aWFsIGRhdGEgdG8gbmF0aXZlXG4gIHZhciBkYXRhID0gdm0uJG9wdGlvbnMuZGF0YTtcbiAgdmFyIHBhcmFtcyA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nXG4gICAgPyBnZXREYXRhKGRhdGEsIHZtKVxuICAgIDogZGF0YSB8fCB7fTtcbiAgaWYgKGlzUGxhaW5PYmplY3QocGFyYW1zKSkge1xuICAgIHVwZGF0ZUNvbXBvbmVudERhdGEoY29tcG9uZW50SWQsIHBhcmFtcyk7XG4gIH1cblxuICByZWdpc3RlckNvbXBvbmVudEhvb2soY29tcG9uZW50SWQsICdsaWZlY3ljbGUnLCAnYXR0YWNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICAgIHZhciB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2bS5fdXBkYXRlKHZtLl92bm9kZSwgZmFsc2UpO1xuICAgIH07XG4gICAgbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCwgbnVsbCwgdHJ1ZSk7XG5cbiAgICB2bS5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTtcbiAgfSk7XG5cbiAgcmVnaXN0ZXJDb21wb25lbnRIb29rKGNvbXBvbmVudElkLCAnbGlmZWN5Y2xlJywgJ2RldGFjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICB2bS4kZGVzdHJveSgpO1xuICB9KTtcbn1cblxuLy8gb3ZlcnJpZGUgVnVlLnByb3RvdHlwZS5fdXBkYXRlXG5mdW5jdGlvbiB1cGRhdGVWaXJ0dWFsQ29tcG9uZW50ICh2bm9kZSkge1xuICB2YXIgdm0gPSB0aGlzO1xuICB2YXIgY29tcG9uZW50SWQgPSB2bS4kb3B0aW9ucy5jb21wb25lbnRJZDtcbiAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZVVwZGF0ZScpO1xuICB9XG4gIHZtLl92bm9kZSA9IHZub2RlO1xuICBpZiAodm0uX2lzTW91bnRlZCAmJiBjb21wb25lbnRJZCkge1xuICAgIC8vIFRPRE86IGRhdGEgc2hvdWxkIGJlIGZpbHRlcmVkIGFuZCB3aXRob3V0IGJpbmRpbmdzXG4gICAgdmFyIGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB2bS5fZGF0YSk7XG4gICAgdXBkYXRlQ29tcG9uZW50RGF0YShjb21wb25lbnRJZCwgZGF0YSwgZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbEhvb2sodm0sICd1cGRhdGVkJyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gbGlzdGVuaW5nIG9uIG5hdGl2ZSBjYWxsYmFja1xuZnVuY3Rpb24gcmVzb2x2ZVZpcnR1YWxDb21wb25lbnQgKHZub2RlKSB7XG4gIHZhciBCYXNlQ3RvciA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcjtcbiAgdmFyIFZpcnR1YWxDb21wb25lbnQgPSBCYXNlQ3Rvci5leHRlbmQoe30pO1xuICB2YXIgY2lkID0gVmlydHVhbENvbXBvbmVudC5jaWQ7XG4gIFZpcnR1YWxDb21wb25lbnQucHJvdG90eXBlLl9pbml0ID0gaW5pdFZpcnR1YWxDb21wb25lbnQ7XG4gIFZpcnR1YWxDb21wb25lbnQucHJvdG90eXBlLl91cGRhdGUgPSB1cGRhdGVWaXJ0dWFsQ29tcG9uZW50O1xuXG4gIHZub2RlLmNvbXBvbmVudE9wdGlvbnMuQ3RvciA9IEJhc2VDdG9yLmV4dGVuZCh7XG4gICAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUgKCkge1xuICAgICAgLy8gY29uc3Qgdm06IENvbXBvbmVudCA9IHRoaXNcblxuICAgICAgLy8gVE9ETzogbGlzdGVuIG9uIGFsbCBldmVudHMgYW5kIGRpc3BhdGNoIHRoZW0gdG8gdGhlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIHZpcnR1YWwgY29tcG9uZW50cyBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudElkLlxuICAgICAgLy8gdm0uX3ZpcnR1YWxDb21wb25lbnRzID0ge31cbiAgICAgIHZhciBjcmVhdGVWaXJ0dWFsQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudElkLCBwcm9wc0RhdGEpIHtcbiAgICAgICAgLy8gY3JlYXRlIHZpcnR1YWwgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbnN0IHN1YlZtID1cbiAgICAgICAgbmV3IFZpcnR1YWxDb21wb25lbnQoe1xuICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZCxcbiAgICAgICAgICBwcm9wc0RhdGE6IHByb3BzRGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgKHZtLl92aXJ0dWFsQ29tcG9uZW50cykge1xuICAgICAgICAvLyAgIHZtLl92aXJ0dWFsQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSBzdWJWbVxuICAgICAgICAvLyB9XG4gICAgICB9O1xuXG4gICAgICByZWdpc3RlckNvbXBvbmVudEhvb2soY2lkLCAnbGlmZWN5Y2xlJywgJ2NyZWF0ZScsIGNyZWF0ZVZpcnR1YWxDb21wb25lbnQpO1xuICAgIH0sXG4gICAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSAoKSB7XG4gICAgICBkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHM7XG4gICAgfVxuICB9KTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzUmVjeWNsYWJsZUNvbXBvbmVudCAodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLmRhdGEuYXR0cnNcbiAgICA/IChSRUNZQ0xFX0xJU1RfTUFSS0VSIGluIHZub2RlLmRhdGEuYXR0cnMpXG4gICAgOiBmYWxzZVxufVxuXG5mdW5jdGlvbiByZW5kZXJSZWN5Y2xhYmxlQ29tcG9uZW50VGVtcGxhdGUgKHZub2RlKSB7XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBkZWxldGUgdm5vZGUuZGF0YS5hdHRyc1tSRUNZQ0xFX0xJU1RfTUFSS0VSXTtcbiAgcmVzb2x2ZVZpcnR1YWxDb21wb25lbnQodm5vZGUpO1xuICB2YXIgdm0gPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKHZub2RlKTtcbiAgdmFyIHJlbmRlciA9ICh2bS4kb3B0aW9ucylbJ0ByZW5kZXInXTtcbiAgaWYgKHJlbmRlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVuZGVyLmNhbGwodm0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYW5kbGVFcnJvcihlcnIsIHZtLCBcIkByZW5kZXJcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdhcm4oXG4gICAgICBcIkByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQgb24gY29tcG9uZW50IHVzZWQgaW4gPHJlY3ljbGUtbGlzdD4uIFwiICtcbiAgICAgIFwiTWFrZSBzdXJlIHRvIGRlY2xhcmUgYHJlY3ljbGFibGU9XFxcInRydWVcXFwiYCBvbiB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGUuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyogICovXG5cbi8vIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0IChcbiAgICB2bm9kZSxcbiAgICBoeWRyYXRpbmcsXG4gICAgcGFyZW50RWxtLFxuICAgIHJlZkVsbVxuICApIHtcbiAgICBpZiAoIXZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgYWN0aXZlSW5zdGFuY2UsXG4gICAgICAgIHBhcmVudEVsbSxcbiAgICAgICAgcmVmRWxtXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9IGVsc2UgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfVxuICB9LFxuXG4gIHByZXBhdGNoOiBmdW5jdGlvbiBwcmVwYXRjaCAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gb2xkVm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgdXBkYXRlQ2hpbGRDb21wb25lbnQoXG4gICAgICBjaGlsZCxcbiAgICAgIG9wdGlvbnMucHJvcHNEYXRhLCAvLyB1cGRhdGVkIHByb3BzXG4gICAgICBvcHRpb25zLmxpc3RlbmVycywgLy8gdXBkYXRlZCBsaXN0ZW5lcnNcbiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlXG4gICAgICBvcHRpb25zLmNoaWxkcmVuIC8vIG5ldyBjaGlsZHJlblxuICAgICk7XG4gIH0sXG5cbiAgaW5zZXJ0OiBmdW5jdGlvbiBpbnNlcnQgKHZub2RlKSB7XG4gICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0O1xuICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIGlmICghY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCkge1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7XG4gICAgICBjYWxsSG9vayhjb21wb25lbnRJbnN0YW5jZSwgJ21vdW50ZWQnKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7XG4gICAgICBpZiAoY29udGV4dC5faXNNb3VudGVkKSB7XG4gICAgICAgIC8vIHZ1ZS1yb3V0ZXIjMTIxMlxuICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5XG4gICAgICAgIC8vIGNoYW5nZSwgc28gZGlyZWN0bHkgd2Fsa2luZyB0aGUgdHJlZSBoZXJlIG1heSBjYWxsIGFjdGl2YXRlZCBob29rc1xuICAgICAgICAvLyBvbiBpbmNvcnJlY3QgY2hpbGRyZW4uIEluc3RlYWQgd2UgcHVzaCB0aGVtIGludG8gYSBxdWV1ZSB3aGljaCB3aWxsXG4gICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC5cbiAgICAgICAgcXVldWVBY3RpdmF0ZWRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95ICh2bm9kZSkge1xuICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIGlmICghY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkKSB7XG4gICAgICBpZiAoIXZub2RlLmRhdGEua2VlcEFsaXZlKSB7XG4gICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBob29rc1RvTWVyZ2UgPSBPYmplY3Qua2V5cyhjb21wb25lbnRWTm9kZUhvb2tzKTtcblxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50IChcbiAgQ3RvcixcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIGlmIChpc1VuZGVmKEN0b3IpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlO1xuXG4gIC8vIHBsYWluIG9wdGlvbnMgb2JqZWN0OiB0dXJuIGl0IGludG8gYSBjb25zdHJ1Y3RvclxuICBpZiAoaXNPYmplY3QoQ3RvcikpIHtcbiAgICBDdG9yID0gYmFzZUN0b3IuZXh0ZW5kKEN0b3IpO1xuICB9XG5cbiAgLy8gaWYgYXQgdGhpcyBzdGFnZSBpdCdzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIGFuIGFzeW5jIGNvbXBvbmVudCBmYWN0b3J5LFxuICAvLyByZWplY3QuXG4gIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuKChcIkludmFsaWQgQ29tcG9uZW50IGRlZmluaXRpb246IFwiICsgKFN0cmluZyhDdG9yKSkpLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBhc3luYyBjb21wb25lbnRcbiAgdmFyIGFzeW5jRmFjdG9yeTtcbiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7XG4gICAgYXN5bmNGYWN0b3J5ID0gQ3RvcjtcbiAgICBDdG9yID0gcmVzb2x2ZUFzeW5jQ29tcG9uZW50KGFzeW5jRmFjdG9yeSwgYmFzZUN0b3IsIGNvbnRleHQpO1xuICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJldHVybiBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIGFzeW5jIGNvbXBvbmVudCwgd2hpY2ggaXMgcmVuZGVyZWRcbiAgICAgIC8vIGFzIGEgY29tbWVudCBub2RlIGJ1dCBwcmVzZXJ2ZXMgYWxsIHRoZSByYXcgaW5mb3JtYXRpb24gZm9yIHRoZSBub2RlLlxuICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLlxuICAgICAgcmV0dXJuIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIoXG4gICAgICAgIGFzeW5jRmFjdG9yeSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHRhZ1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGRhdGEgPSBkYXRhIHx8IHt9O1xuXG4gIC8vIHJlc29sdmUgY29uc3RydWN0b3Igb3B0aW9ucyBpbiBjYXNlIGdsb2JhbCBtaXhpbnMgYXJlIGFwcGxpZWQgYWZ0ZXJcbiAgLy8gY29tcG9uZW50IGNvbnN0cnVjdG9yIGNyZWF0aW9uXG4gIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7XG5cbiAgLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGRhdGEgaW50byBwcm9wcyAmIGV2ZW50c1xuICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHtcbiAgICB0cmFuc2Zvcm1Nb2RlbChDdG9yLm9wdGlvbnMsIGRhdGEpO1xuICB9XG5cbiAgLy8gZXh0cmFjdCBwcm9wc1xuICB2YXIgcHJvcHNEYXRhID0gZXh0cmFjdFByb3BzRnJvbVZOb2RlRGF0YShkYXRhLCBDdG9yLCB0YWcpO1xuXG4gIC8vIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4gIGlmIChpc1RydWUoQ3Rvci5vcHRpb25zLmZ1bmN0aW9uYWwpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbilcbiAgfVxuXG4gIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzXG4gIC8vIGNoaWxkIGNvbXBvbmVudCBsaXN0ZW5lcnMgaW5zdGVhZCBvZiBET00gbGlzdGVuZXJzXG4gIHZhciBsaXN0ZW5lcnMgPSBkYXRhLm9uO1xuICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllclxuICAvLyBzbyBpdCBnZXRzIHByb2Nlc3NlZCBkdXJpbmcgcGFyZW50IGNvbXBvbmVudCBwYXRjaC5cbiAgZGF0YS5vbiA9IGRhdGEubmF0aXZlT247XG5cbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuYWJzdHJhY3QpKSB7XG4gICAgLy8gYWJzdHJhY3QgY29tcG9uZW50cyBkbyBub3Qga2VlcCBhbnl0aGluZ1xuICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90XG5cbiAgICAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7XG4gICAgZGF0YSA9IHt9O1xuICAgIGlmIChzbG90KSB7XG4gICAgICBkYXRhLnNsb3QgPSBzbG90O1xuICAgIH1cbiAgfVxuXG4gIC8vIG1lcmdlIGNvbXBvbmVudCBtYW5hZ2VtZW50IGhvb2tzIG9udG8gdGhlIHBsYWNlaG9sZGVyIG5vZGVcbiAgbWVyZ2VIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIC8vIFdlZXggc3BlY2lmaWM6IGludm9rZSByZWN5Y2xlLWxpc3Qgb3B0aW1pemVkIEByZW5kZXIgZnVuY3Rpb24gZm9yXG4gIC8vIGV4dHJhY3RpbmcgY2VsbC1zbG90IHRlbXBsYXRlLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHJ1ZSAmJiBpc1JlY3ljbGFibGVDb21wb25lbnQodm5vZGUpKSB7XG4gICAgcmV0dXJuIHJlbmRlclJlY3ljbGFibGVDb21wb25lbnRUZW1wbGF0ZSh2bm9kZSlcbiAgfVxuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZVxuICBwYXJlbnRFbG0sXG4gIHJlZkVsbVxuKSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIF9pc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBfcGFyZW50Vm5vZGU6IHZub2RlLFxuICAgIF9wYXJlbnRFbG06IHBhcmVudEVsbSB8fCBudWxsLFxuICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsXG4gIH07XG4gIC8vIGNoZWNrIGlubGluZS10ZW1wbGF0ZSByZW5kZXIgZnVuY3Rpb25zXG4gIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7XG4gIGlmIChpc0RlZihpbmxpbmVUZW1wbGF0ZSkpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IGlubGluZVRlbXBsYXRlLnJlbmRlcjtcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZucztcbiAgfVxuICByZXR1cm4gbmV3IHZub2RlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBtZXJnZUhvb2tzIChkYXRhKSB7XG4gIGlmICghZGF0YS5ob29rKSB7XG4gICAgZGF0YS5ob29rID0ge307XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBmcm9tUGFyZW50ID0gZGF0YS5ob29rW2tleV07XG4gICAgdmFyIG91cnMgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgZGF0YS5ob29rW2tleV0gPSBmcm9tUGFyZW50ID8gbWVyZ2VIb29rJDEob3VycywgZnJvbVBhcmVudCkgOiBvdXJzO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChvbmUsIHR3bykge1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICBvbmUoYSwgYiwgYywgZCk7XG4gICAgdHdvKGEsIGIsIGMsIGQpO1xuICB9XG59XG5cbi8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBpbmZvICh2YWx1ZSBhbmQgY2FsbGJhY2spIGludG9cbi8vIHByb3AgYW5kIGV2ZW50IGhhbmRsZXIgcmVzcGVjdGl2ZWx5LlxuZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHtcbiAgdmFyIHByb3AgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLnByb3ApIHx8ICd2YWx1ZSc7XG4gIHZhciBldmVudCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwuZXZlbnQpIHx8ICdpbnB1dCc7KGRhdGEucHJvcHMgfHwgKGRhdGEucHJvcHMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgaWYgKGlzRGVmKG9uW2V2ZW50XSkpIHtcbiAgICBvbltldmVudF0gPSBbZGF0YS5tb2RlbC5jYWxsYmFja10uY29uY2F0KG9uW2V2ZW50XSk7XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gZGF0YS5tb2RlbC5jYWxsYmFjaztcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIFNJTVBMRV9OT1JNQUxJWkUgPSAxO1xudmFyIEFMV0FZU19OT1JNQUxJWkUgPSAyO1xuXG4vLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBwcm92aWRpbmcgYSBtb3JlIGZsZXhpYmxlIGludGVyZmFjZVxuLy8gd2l0aG91dCBnZXR0aW5nIHllbGxlZCBhdCBieSBmbG93XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50IChcbiAgY29udGV4dCxcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgbm9ybWFsaXphdGlvblR5cGUsXG4gIGFsd2F5c05vcm1hbGl6ZVxuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IGlzUHJpbWl0aXZlKGRhdGEpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjtcbiAgICBjaGlsZHJlbiA9IGRhdGE7XG4gICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaXNUcnVlKGFsd2F5c05vcm1hbGl6ZSkpIHtcbiAgICBub3JtYWxpemF0aW9uVHlwZSA9IEFMV0FZU19OT1JNQUxJWkU7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVFbGVtZW50KGNvbnRleHQsIHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlKVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlXG4pIHtcbiAgaWYgKGlzRGVmKGRhdGEpICYmIGlzRGVmKChkYXRhKS5fX29iX18pKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgXCJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiBcIiArIChKU09OLnN0cmluZ2lmeShkYXRhKSkgKyBcIlxcblwiICtcbiAgICAgICdBbHdheXMgY3JlYXRlIGZyZXNoIHZub2RlIGRhdGEgb2JqZWN0cyBpbiBlYWNoIHJlbmRlciEnLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG4gIC8vIG9iamVjdCBzeW50YXggaW4gdi1iaW5kXG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmlzKSkge1xuICAgIHRhZyA9IGRhdGEuaXM7XG4gIH1cbiAgaWYgKCF0YWcpIHtcbiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlXG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpXG4gICkge1xuICAgIGlmICghdHJ1ZSB8fCAhKCdAYmluZGluZycgaW4gZGF0YS5rZXkpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlKSkge1xuICAgIGlmIChucykgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChpc1VuZGVmKGNoaWxkLm5zKSB8fCBpc1RydWUoZm9yY2UpKSkge1xuICAgICAgICBhcHBseU5TKGNoaWxkLCBucywgZm9yY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck1peGluIChWdWUpIHtcbiAgLy8gaW5zdGFsbCBydW50aW1lIGNvbnZlbmllbmNlIGhlbHBlcnNcbiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7XG5cbiAgVnVlLnByb3RvdHlwZS4kbmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHJlZiA9IHZtLiRvcHRpb25zO1xuICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyO1xuICAgIHZhciBfcGFyZW50Vm5vZGUgPSByZWYuX3BhcmVudFZub2RlO1xuXG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIC8vIGlmIHRoZSBwYXJlbnQgZGlkbid0IHVwZGF0ZSwgdGhlIHNsb3Qgbm9kZXMgd2lsbCBiZSB0aGUgb25lcyBmcm9tXG4gICAgICAvLyBsYXN0IHJlbmRlci4gVGhleSBuZWVkIHRvIGJlIGNsb25lZCB0byBlbnN1cmUgXCJmcmVzaG5lc3NcIiBmb3IgdGhpcyByZW5kZXIuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdm0uJHNsb3RzKSB7XG4gICAgICAgIHZhciBzbG90ID0gdm0uJHNsb3RzW2tleV07XG4gICAgICAgIC8vIF9yZW5kZXJlZCBpcyBhIGZsYWcgYWRkZWQgYnkgcmVuZGVyU2xvdCwgYnV0IG1heSBub3QgYmUgcHJlc2VudFxuICAgICAgICAvLyBpZiB0aGUgc2xvdCBpcyBwYXNzZWQgZnJvbSBtYW51YWxseSB3cml0dGVuIHJlbmRlciBmdW5jdGlvbnNcbiAgICAgICAgaWYgKHNsb3QuX3JlbmRlcmVkIHx8IChzbG90WzBdICYmIHNsb3RbMF0uZWxtKSkge1xuICAgICAgICAgIHZtLiRzbG90c1trZXldID0gY2xvbmVWTm9kZXMoc2xvdCwgdHJ1ZSAvKiBkZWVwICovKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZtLiRzY29wZWRTbG90cyA9IChfcGFyZW50Vm5vZGUgJiYgX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMpIHx8IGVtcHR5T2JqZWN0O1xuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJyZW5kZXJcIik7XG4gICAgICAvLyByZXR1cm4gZXJyb3IgcmVuZGVyIHJlc3VsdCxcbiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHZtLiRvcHRpb25zLnJlbmRlckVycm9yKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJyZW5kZXJFcnJvclwiKTtcbiAgICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJldHVybiBlbXB0eSB2bm9kZSBpbiBjYXNlIHRoZSByZW5kZXIgZnVuY3Rpb24gZXJyb3JlZCBvdXRcbiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgQXJyYXkuaXNBcnJheSh2bm9kZSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnTXVsdGlwbGUgcm9vdCBub2RlcyByZXR1cm5lZCBmcm9tIHJlbmRlciBmdW5jdGlvbi4gUmVuZGVyIGZ1bmN0aW9uICcgK1xuICAgICAgICAgICdzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHJvb3Qgbm9kZS4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTtcbiAgICB9XG4gICAgLy8gc2V0IHBhcmVudFxuICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTtcbiAgICByZXR1cm4gdm5vZGVcbiAgfTtcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG5mdW5jdGlvbiBpbml0TWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vIGEgdWlkXG4gICAgdm0uX3VpZCA9IHVpZCsrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHNcbiAgICBpbml0U3RhdGUodm0pO1xuICAgIGluaXRQcm92aWRlKHZtKTsgLy8gcmVzb2x2ZSBwcm92aWRlIGFmdGVyIGRhdGEvcHJvcHNcbiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7XG4gICAgICB2bS5fbmFtZSA9IGZvcm1hdENvbXBvbmVudE5hbWUodm0sIGZhbHNlKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIHZhciBwYXJlbnRWbm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuICBvcHRzLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlO1xuICBvcHRzLl9wYXJlbnRFbG0gPSBvcHRpb25zLl9wYXJlbnRFbG07XG4gIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTtcblxuICB2YXIgdm5vZGVDb21wb25lbnRPcHRpb25zID0gcGFyZW50Vm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhO1xuICBvcHRzLl9wYXJlbnRMaXN0ZW5lcnMgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMubGlzdGVuZXJzO1xuICBvcHRzLl9yZW5kZXJDaGlsZHJlbiA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5jaGlsZHJlbjtcbiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZztcblxuICBpZiAob3B0aW9ucy5yZW5kZXIpIHtcbiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyO1xuICAgIG9wdHMuc3RhdGljUmVuZGVyRm5zID0gb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnM7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyAoQ3Rvcikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgaWYgKEN0b3Iuc3VwZXIpIHtcbiAgICB2YXIgc3VwZXJPcHRpb25zID0gcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyhDdG9yLnN1cGVyKTtcbiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7XG4gICAgaWYgKHN1cGVyT3B0aW9ucyAhPT0gY2FjaGVkU3VwZXJPcHRpb25zKSB7XG4gICAgICAvLyBzdXBlciBvcHRpb24gY2hhbmdlZCxcbiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy5cbiAgICAgIEN0b3Iuc3VwZXJPcHRpb25zID0gc3VwZXJPcHRpb25zO1xuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBsYXRlLW1vZGlmaWVkL2F0dGFjaGVkIG9wdGlvbnMgKCM0OTc2KVxuICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7XG4gICAgICAvLyB1cGRhdGUgYmFzZSBleHRlbmQgb3B0aW9uc1xuICAgICAgaWYgKG1vZGlmaWVkT3B0aW9ucykge1xuICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhzdXBlck9wdGlvbnMsIEN0b3IuZXh0ZW5kT3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIG9wdGlvbnMuY29tcG9uZW50c1tvcHRpb25zLm5hbWVdID0gQ3RvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1vZGlmaWVkT3B0aW9ucyAoQ3Rvcikge1xuICB2YXIgbW9kaWZpZWQ7XG4gIHZhciBsYXRlc3QgPSBDdG9yLm9wdGlvbnM7XG4gIHZhciBleHRlbmRlZCA9IEN0b3IuZXh0ZW5kT3B0aW9ucztcbiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9ucztcbiAgZm9yICh2YXIga2V5IGluIGxhdGVzdCkge1xuICAgIGlmIChsYXRlc3Rba2V5XSAhPT0gc2VhbGVkW2tleV0pIHtcbiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfVxuICAgICAgbW9kaWZpZWRba2V5XSA9IGRlZHVwZShsYXRlc3Rba2V5XSwgZXh0ZW5kZWRba2V5XSwgc2VhbGVkW2tleV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWRcbn1cblxuZnVuY3Rpb24gZGVkdXBlIChsYXRlc3QsIGV4dGVuZGVkLCBzZWFsZWQpIHtcbiAgLy8gY29tcGFyZSBsYXRlc3QgYW5kIHNlYWxlZCB0byBlbnN1cmUgbGlmZWN5Y2xlIGhvb2tzIHdvbid0IGJlIGR1cGxpY2F0ZWRcbiAgLy8gYmV0d2VlbiBtZXJnZXNcbiAgaWYgKEFycmF5LmlzQXJyYXkobGF0ZXN0KSkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTtcbiAgICBleHRlbmRlZCA9IEFycmF5LmlzQXJyYXkoZXh0ZW5kZWQpID8gZXh0ZW5kZWQgOiBbZXh0ZW5kZWRdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF0ZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9uc1xuICAgICAgaWYgKGV4dGVuZGVkLmluZGV4T2YobGF0ZXN0W2ldKSA+PSAwIHx8IHNlYWxlZC5pbmRleE9mKGxhdGVzdFtpXSkgPCAwKSB7XG4gICAgICAgIHJlcy5wdXNoKGxhdGVzdFtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGF0ZXN0XG4gIH1cbn1cblxuZnVuY3Rpb24gVnVlJDIgKG9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAhKHRoaXMgaW5zdGFuY2VvZiBWdWUkMilcbiAgKSB7XG4gICAgd2FybignVnVlIGlzIGEgY29uc3RydWN0b3IgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZCcpO1xuICB9XG4gIHRoaXMuX2luaXQob3B0aW9ucyk7XG59XG5cbmluaXRNaXhpbihWdWUkMik7XG5zdGF0ZU1peGluKFZ1ZSQyKTtcbmV2ZW50c01peGluKFZ1ZSQyKTtcbmxpZmVjeWNsZU1peGluKFZ1ZSQyKTtcbnJlbmRlck1peGluKFZ1ZSQyKTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRVc2UgKFZ1ZSkge1xuICBWdWUudXNlID0gZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpO1xuICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmluZGV4T2YocGx1Z2luKSA+IC0xKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5pbnN0YWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBsdWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICByZXR1cm4gdGhpc1xuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdE1peGluJDEgKFZ1ZSkge1xuICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBtaXhpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFeHRlbmQgKFZ1ZSkge1xuICAvKipcbiAgICogRWFjaCBpbnN0YW5jZSBjb25zdHJ1Y3RvciwgaW5jbHVkaW5nIFZ1ZSwgaGFzIGEgdW5pcXVlXG4gICAqIGNpZC4gVGhpcyBlbmFibGVzIHVzIHRvIGNyZWF0ZSB3cmFwcGVkIFwiY2hpbGRcbiAgICogY29uc3RydWN0b3JzXCIgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UgYW5kIGNhY2hlIHRoZW0uXG4gICAqL1xuICBWdWUuY2lkID0gMDtcbiAgdmFyIGNpZCA9IDE7XG5cbiAgLyoqXG4gICAqIENsYXNzIGluaGVyaXRhbmNlXG4gICAqL1xuICBWdWUuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuZE9wdGlvbnMpIHtcbiAgICBleHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgU3VwZXIgPSB0aGlzO1xuICAgIHZhciBTdXBlcklkID0gU3VwZXIuY2lkO1xuICAgIHZhciBjYWNoZWRDdG9ycyA9IGV4dGVuZE9wdGlvbnMuX0N0b3IgfHwgKGV4dGVuZE9wdGlvbnMuX0N0b3IgPSB7fSk7XG4gICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ3RvcnNbU3VwZXJJZF1cbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGV4dGVuZE9wdGlvbnMubmFtZSB8fCBTdXBlci5vcHRpb25zLm5hbWU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBTdWIgPSBmdW5jdGlvbiBWdWVDb21wb25lbnQgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2luaXQob3B0aW9ucyk7XG4gICAgfTtcbiAgICBTdWIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdXBlci5wcm90b3R5cGUpO1xuICAgIFN1Yi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdWI7XG4gICAgU3ViLmNpZCA9IGNpZCsrO1xuICAgIFN1Yi5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFxuICAgICAgU3VwZXIub3B0aW9ucyxcbiAgICAgIGV4dGVuZE9wdGlvbnNcbiAgICApO1xuICAgIFN1Ylsnc3VwZXInXSA9IFN1cGVyO1xuXG4gICAgLy8gRm9yIHByb3BzIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzLCB3ZSBkZWZpbmUgdGhlIHByb3h5IGdldHRlcnMgb25cbiAgICAvLyB0aGUgVnVlIGluc3RhbmNlcyBhdCBleHRlbnNpb24gdGltZSwgb24gdGhlIGV4dGVuZGVkIHByb3RvdHlwZS4gVGhpc1xuICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC5cbiAgICBpZiAoU3ViLm9wdGlvbnMucHJvcHMpIHtcbiAgICAgIGluaXRQcm9wcyQxKFN1Yik7XG4gICAgfVxuICAgIGlmIChTdWIub3B0aW9ucy5jb21wdXRlZCkge1xuICAgICAgaW5pdENvbXB1dGVkJDEoU3ViKTtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyBmdXJ0aGVyIGV4dGVuc2lvbi9taXhpbi9wbHVnaW4gdXNhZ2VcbiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kO1xuICAgIFN1Yi5taXhpbiA9IFN1cGVyLm1peGluO1xuICAgIFN1Yi51c2UgPSBTdXBlci51c2U7XG5cbiAgICAvLyBjcmVhdGUgYXNzZXQgcmVnaXN0ZXJzLCBzbyBleHRlbmRlZCBjbGFzc2VzXG4gICAgLy8gY2FuIGhhdmUgdGhlaXIgcHJpdmF0ZSBhc3NldHMgdG9vLlxuICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIFN1Ylt0eXBlXSA9IFN1cGVyW3R5cGVdO1xuICAgIH0pO1xuICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXBcbiAgICBpZiAobmFtZSkge1xuICAgICAgU3ViLm9wdGlvbnMuY29tcG9uZW50c1tuYW1lXSA9IFN1YjtcbiAgICB9XG5cbiAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBvcHRpb25zIGF0IGV4dGVuc2lvbiB0aW1lLlxuICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlXG4gICAgLy8gYmVlbiB1cGRhdGVkLlxuICAgIFN1Yi5zdXBlck9wdGlvbnMgPSBTdXBlci5vcHRpb25zO1xuICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucztcbiAgICBTdWIuc2VhbGVkT3B0aW9ucyA9IGV4dGVuZCh7fSwgU3ViLm9wdGlvbnMpO1xuXG4gICAgLy8gY2FjaGUgY29uc3RydWN0b3JcbiAgICBjYWNoZWRDdG9yc1tTdXBlcklkXSA9IFN1YjtcbiAgICByZXR1cm4gU3ViXG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7XG4gIHZhciBwcm9wcyA9IENvbXAub3B0aW9ucy5wcm9wcztcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgcHJveHkoQ29tcC5wcm90b3R5cGUsIFwiX3Byb3BzXCIsIGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHtcbiAgdmFyIGNvbXB1dGVkID0gQ29tcC5vcHRpb25zLmNvbXB1dGVkO1xuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhc3NldCByZWdpc3RyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWVbdHlwZV0gPSBmdW5jdGlvbiAoXG4gICAgICBpZCxcbiAgICAgIGRlZmluaXRpb25cbiAgICApIHtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGUgPT09ICdjb21wb25lbnQnKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbXBvbmVudCcgJiYgaXNQbGFpbk9iamVjdChkZWZpbml0aW9uKSkge1xuICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDtcbiAgICAgICAgICBkZWZpbml0aW9uID0gdGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChkZWZpbml0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkZWZpbml0aW9uID0geyBiaW5kOiBkZWZpbml0aW9uLCB1cGRhdGU6IGRlZmluaXRpb24gfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgKG9wdHMuQ3Rvci5vcHRpb25zLm5hbWUgfHwgb3B0cy50YWcpXG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTFcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zcGxpdCgnLCcpLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChuYW1lKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlIChrZWVwQWxpdmVJbnN0YW5jZSwgZmlsdGVyKSB7XG4gIHZhciBjYWNoZSA9IGtlZXBBbGl2ZUluc3RhbmNlLmNhY2hlO1xuICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7XG4gIHZhciBfdm5vZGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5fdm5vZGU7XG4gIGZvciAodmFyIGtleSBpbiBjYWNoZSkge1xuICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkTm9kZSkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNhY2hlZE5vZGUuY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7XG4gICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5LCBrZXlzLCBfdm5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkgKFxuICBjYWNoZSxcbiAga2V5LFxuICBrZXlzLFxuICBjdXJyZW50XG4pIHtcbiAgdmFyIGNhY2hlZCQkMSA9IGNhY2hlW2tleV07XG4gIGlmIChjYWNoZWQkJDEgJiYgKCFjdXJyZW50IHx8IGNhY2hlZCQkMS50YWcgIT09IGN1cnJlbnQudGFnKSkge1xuICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICB9XG4gIGNhY2hlW2tleV0gPSBudWxsO1xuICByZW1vdmUoa2V5cywga2V5KTtcbn1cblxudmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldO1xuXG52YXIgS2VlcEFsaXZlID0ge1xuICBuYW1lOiAna2VlcC1hbGl2ZScsXG4gIGFic3RyYWN0OiB0cnVlLFxuXG4gIHByb3BzOiB7XG4gICAgaW5jbHVkZTogcGF0dGVyblR5cGVzLFxuICAgIGV4Y2x1ZGU6IHBhdHRlcm5UeXBlcyxcbiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmtleXMgPSBbXTtcbiAgfSxcblxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcyQxLmNhY2hlKSB7XG4gICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbmNsdWRlOiBmdW5jdGlvbiBpbmNsdWRlICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcywgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSxcbiAgICBleGNsdWRlOiBmdW5jdGlvbiBleGNsdWRlICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcywgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pO1xuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoKSB7XG4gICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoc2xvdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgIHZhciBpbmNsdWRlID0gcmVmLmluY2x1ZGU7XG4gICAgICB2YXIgZXhjbHVkZSA9IHJlZi5leGNsdWRlO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBub3QgaW5jbHVkZWRcbiAgICAgICAgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSkgfHxcbiAgICAgICAgLy8gZXhjbHVkZWRcbiAgICAgICAgKGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVmJDEgPSB0aGlzO1xuICAgICAgdmFyIGNhY2hlID0gcmVmJDEuY2FjaGU7XG4gICAgICB2YXIga2V5cyA9IHJlZiQxLmtleXM7XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGxcbiAgICAgICAgLy8gc2FtZSBjb25zdHJ1Y3RvciBtYXkgZ2V0IHJlZ2lzdGVyZWQgYXMgZGlmZmVyZW50IGxvY2FsIGNvbXBvbmVudHNcbiAgICAgICAgLy8gc28gY2lkIGFsb25lIGlzIG5vdCBlbm91Z2ggKCMzMjY5KVxuICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoXCI6OlwiICsgKGNvbXBvbmVudE9wdGlvbnMudGFnKSkgOiAnJylcbiAgICAgICAgOiB2bm9kZS5rZXk7XG4gICAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IGNhY2hlW2tleV0uY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3RcbiAgICAgICAgcmVtb3ZlKGtleXMsIGtleSk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiBrZXlzLmxlbmd0aCA+IHBhcnNlSW50KHRoaXMubWF4KSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5c1swXSwga2V5cywgdGhpcy5fdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlIHx8IChzbG90ICYmIHNsb3RbMF0pXG4gIH1cbn07XG5cbnZhciBidWlsdEluQ29tcG9uZW50cyA9IHtcbiAgS2VlcEFsaXZlOiBLZWVwQWxpdmVcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0R2xvYmFsQVBJIChWdWUpIHtcbiAgLy8gY29uZmlnXG4gIHZhciBjb25maWdEZWYgPSB7fTtcbiAgY29uZmlnRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbmZpZzsgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25maWdEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0RvIG5vdCByZXBsYWNlIHRoZSBWdWUuY29uZmlnIG9iamVjdCwgc2V0IGluZGl2aWR1YWwgZmllbGRzIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdjb25maWcnLCBjb25maWdEZWYpO1xuXG4gIC8vIGV4cG9zZWQgdXRpbCBtZXRob2RzLlxuICAvLyBOT1RFOiB0aGVzZSBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHVibGljIEFQSSAtIGF2b2lkIHJlbHlpbmcgb25cbiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay5cbiAgVnVlLnV0aWwgPSB7XG4gICAgd2Fybjogd2FybixcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBtZXJnZU9wdGlvbnM6IG1lcmdlT3B0aW9ucyxcbiAgICBkZWZpbmVSZWFjdGl2ZTogZGVmaW5lUmVhY3RpdmVcbiAgfTtcblxuICBWdWUuc2V0ID0gc2V0O1xuICBWdWUuZGVsZXRlID0gZGVsO1xuICBWdWUubmV4dFRpY2sgPSBuZXh0VGljaztcblxuICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWUub3B0aW9uc1t0eXBlICsgJ3MnXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH0pO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgXCJiYXNlXCIgY29uc3RydWN0b3IgdG8gZXh0ZW5kIGFsbCBwbGFpbi1vYmplY3RcbiAgLy8gY29tcG9uZW50cyB3aXRoIGluIFdlZXgncyBtdWx0aS1pbnN0YW5jZSBzY2VuYXJpb3MuXG4gIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlO1xuXG4gIGV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBidWlsdEluQ29tcG9uZW50cyk7XG5cbiAgaW5pdFVzZShWdWUpO1xuICBpbml0TWl4aW4kMShWdWUpO1xuICBpbml0RXh0ZW5kKFZ1ZSk7XG4gIGluaXRBc3NldFJlZ2lzdGVycyhWdWUpO1xufVxuXG5pbml0R2xvYmFsQVBJKFZ1ZSQyKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSQyLnByb3RvdHlwZSwgJyRpc1NlcnZlcicsIHtcbiAgZ2V0OiBpc1NlcnZlclJlbmRlcmluZ1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUkMi5wcm90b3R5cGUsICckc3NyQ29udGV4dCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHRcbiAgfVxufSk7XG5cblZ1ZSQyLnZlcnNpb24gPSAnMi41LjExJztcblxudmFyIGxhdGVzdE5vZGVJZCA9IDE7XG5cbmZ1bmN0aW9uIFRleHROb2RlICh0ZXh0KSB7XG4gIHRoaXMuaW5zdGFuY2VJZCA9ICcnO1xuICB0aGlzLm5vZGVJZCA9IGxhdGVzdE5vZGVJZCsrO1xuICB0aGlzLnBhcmVudE5vZGUgPSBudWxsO1xuICB0aGlzLm5vZGVUeXBlID0gMztcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbn1cblxuLyogZ2xvYmFscyBkb2N1bWVudCAqL1xuLy8gZG9jdW1lbnQgaXMgaW5qZWN0ZWQgYnkgd2VleCBmYWN0b3J5IHdyYXBwZXJcblxudmFyIG5hbWVzcGFjZU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50JDEgKHRhZ05hbWUpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TIChuYW1lc3BhY2UsIHRhZ05hbWUpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZXNwYWNlICsgJzonICsgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0ZXh0KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tZW50ICh0ZXh0KSB7XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KHRleHQpXG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZSAobm9kZSwgdGFyZ2V0LCBiZWZvcmUpIHtcbiAgaWYgKHRhcmdldC5ub2RlVHlwZSA9PT0gMykge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgbm9kZS5zZXRBdHRyKCd2YWx1ZScsIHRhcmdldC50ZXh0KTtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRleHQgPSBjcmVhdGVFbGVtZW50JDEoJ3RleHQnKTtcbiAgICAgIHRleHQuc2V0QXR0cigndmFsdWUnLCB0YXJnZXQudGV4dCk7XG4gICAgICBub2RlLmluc2VydEJlZm9yZSh0ZXh0LCBiZWZvcmUpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBub2RlLmluc2VydEJlZm9yZSh0YXJnZXQsIGJlZm9yZSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkIChub2RlLCBjaGlsZCkge1xuICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHtcbiAgICBub2RlLnNldEF0dHIoJ3ZhbHVlJywgJycpO1xuICAgIHJldHVyblxuICB9XG4gIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBub2RlLnNldEF0dHIoJ3ZhbHVlJywgY2hpbGQudGV4dCk7XG4gICAgICBjaGlsZC5wYXJlbnROb2RlID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRleHQgPSBjcmVhdGVFbGVtZW50JDEoJ3RleHQnKTtcbiAgICAgIHRleHQuc2V0QXR0cigndmFsdWUnLCBjaGlsZC50ZXh0KTtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIHBhcmVudE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZVxufVxuXG5mdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkge1xuICByZXR1cm4gbm9kZS5uZXh0U2libGluZ1xufVxuXG5mdW5jdGlvbiB0YWdOYW1lIChub2RlKSB7XG4gIHJldHVybiBub2RlLnR5cGVcbn1cblxuZnVuY3Rpb24gc2V0VGV4dENvbnRlbnQgKG5vZGUsIHRleHQpIHtcbiAgbm9kZS5wYXJlbnROb2RlLnNldEF0dHIoJ3ZhbHVlJywgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZSAobm9kZSwga2V5LCB2YWwpIHtcbiAgbm9kZS5zZXRBdHRyKGtleSwgdmFsKTtcbn1cblxuXG52YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoe1xuXHRuYW1lc3BhY2VNYXA6IG5hbWVzcGFjZU1hcCxcblx0Y3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLFxuXHRjcmVhdGVFbGVtZW50TlM6IGNyZWF0ZUVsZW1lbnROUyxcblx0Y3JlYXRlVGV4dE5vZGU6IGNyZWF0ZVRleHROb2RlLFxuXHRjcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LFxuXHRpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcblx0cmVtb3ZlQ2hpbGQ6IHJlbW92ZUNoaWxkLFxuXHRhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsXG5cdHBhcmVudE5vZGU6IHBhcmVudE5vZGUsXG5cdG5leHRTaWJsaW5nOiBuZXh0U2libGluZyxcblx0dGFnTmFtZTogdGFnTmFtZSxcblx0c2V0VGV4dENvbnRlbnQ6IHNldFRleHRDb250ZW50LFxuXHRzZXRBdHRyaWJ1dGU6IHNldEF0dHJpYnV0ZVxufSk7XG5cbi8qICAqL1xuXG52YXIgcmVmID0ge1xuICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSAoXywgdm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSk7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7XG4gICAgICByZWdpc3RlclJlZihvbGRWbm9kZSwgdHJ1ZSk7XG4gICAgICByZWdpc3RlclJlZih2bm9kZSk7XG4gICAgfVxuICB9LFxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95ICh2bm9kZSkge1xuICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJSZWYgKHZub2RlLCBpc1JlbW92YWwpIHtcbiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmO1xuICBpZiAoIWtleSkgeyByZXR1cm4gfVxuXG4gIHZhciB2bSA9IHZub2RlLmNvbnRleHQ7XG4gIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07XG4gIHZhciByZWZzID0gdm0uJHJlZnM7XG4gIGlmIChpc1JlbW92YWwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7XG4gICAgICByZW1vdmUocmVmc1trZXldLCByZWYpO1xuICAgIH0gZWxzZSBpZiAocmVmc1trZXldID09PSByZWYpIHtcbiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7XG4gICAgICAgIHJlZnNba2V5XSA9IFtyZWZdO1xuICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkge1xuICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmVmc1trZXldLnB1c2gocmVmKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmc1trZXldID0gcmVmO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuXG5cbnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKFxuICAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsJyArXG4gICdhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sJyArXG4gICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICtcbiAgJ2EsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSwnICtcbiAgJ3Msc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLCcgK1xuICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArXG4gICdjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0ciwnICtcbiAgJ2J1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sJyArXG4gICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgK1xuICAnZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LCcgK1xuICAnY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCdcbik7XG5cbi8vIHRoaXMgbWFwIGlzIGludGVudGlvbmFsbHkgc2VsZWN0aXZlLCBvbmx5IGNvdmVyaW5nIFNWRyBlbGVtZW50cyB0aGF0IG1heVxuLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy5cbnZhciBpc1NWRyA9IG1ha2VNYXAoXG4gICdzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsJyArXG4gICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICtcbiAgJ3BvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXcnLFxuICB0cnVlXG4pO1xuXG5cblxuXG5cblxuXG5cblxudmFyIGlzVGV4dElucHV0VHlwZSA9IG1ha2VNYXAoJ3RleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsJyk7XG5cbi8qKlxuICogVmlydHVhbCBET00gcGF0Y2hpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIFNuYWJiZG9tIGJ5XG4gKiBTaW1vbiBGcmlpcyBWaW5kdW0gKEBwYWxkZXBpbmQpXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxkZXBpbmQvc25hYmJkb20vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKVxuICpcbiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgYmVjYXVzZSB0aGlzIGZpbGUgaXMgcGVyZi1jcml0aWNhbCBhbmQgdGhlIGNvc3RcbiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LlxuICovXG5cbnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7XG5cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ2FjdGl2YXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveSddO1xuXG5mdW5jdGlvbiBzYW1lVm5vZGUgKGEsIGIpIHtcbiAgcmV0dXJuIChcbiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKFxuICAgICAgKFxuICAgICAgICBhLnRhZyA9PT0gYi50YWcgJiZcbiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmXG4gICAgICAgIGlzRGVmKGEuZGF0YSkgPT09IGlzRGVmKGIuZGF0YSkgJiZcbiAgICAgICAgc2FtZUlucHV0VHlwZShhLCBiKVxuICAgICAgKSB8fCAoXG4gICAgICAgIGlzVHJ1ZShhLmlzQXN5bmNQbGFjZWhvbGRlcikgJiZcbiAgICAgICAgYS5hc3luY0ZhY3RvcnkgPT09IGIuYXN5bmNGYWN0b3J5ICYmXG4gICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUIgfHwgaXNUZXh0SW5wdXRUeXBlKHR5cGVBKSAmJiBpc1RleHRJbnB1dFR5cGUodHlwZUIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVRvT2xkSWR4IChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkge1xuICB2YXIgaSwga2V5O1xuICB2YXIgbWFwID0ge307XG4gIGZvciAoaSA9IGJlZ2luSWR4OyBpIDw9IGVuZElkeDsgKytpKSB7XG4gICAga2V5ID0gY2hpbGRyZW5baV0ua2V5O1xuICAgIGlmIChpc0RlZihrZXkpKSB7IG1hcFtrZXldID0gaTsgfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkge1xuICB2YXIgaSwgajtcbiAgdmFyIGNicyA9IHt9O1xuXG4gIHZhciBtb2R1bGVzID0gYmFja2VuZC5tb2R1bGVzO1xuICB2YXIgbm9kZU9wcyA9IGJhY2tlbmQubm9kZU9wcztcblxuICBmb3IgKGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChpc0RlZihtb2R1bGVzW2pdW2hvb2tzW2ldXSkpIHtcbiAgICAgICAgY2JzW2hvb2tzW2ldXS5wdXNoKG1vZHVsZXNbal1baG9va3NbaV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbXB0eU5vZGVBdCAoZWxtKSB7XG4gICAgcmV0dXJuIG5ldyBWTm9kZShub2RlT3BzLnRhZ05hbWUoZWxtKS50b0xvd2VyQ2FzZSgpLCB7fSwgW10sIHVuZGVmaW5lZCwgZWxtKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUm1DYiAoY2hpbGRFbG0sIGxpc3RlbmVycykge1xuICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7XG4gICAgICBpZiAoLS1yZW1vdmUubGlzdGVuZXJzID09PSAwKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoY2hpbGRFbG0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZW1vdmUubGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICAgIHJldHVybiByZW1vdmVcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGVPcHMucGFyZW50Tm9kZShlbCk7XG4gICAgLy8gZWxlbWVudCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBkdWUgdG8gdi1odG1sIC8gdi10ZXh0XG4gICAgaWYgKGlzRGVmKHBhcmVudCkpIHtcbiAgICAgIG5vZGVPcHMucmVtb3ZlQ2hpbGQocGFyZW50LCBlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNVbmtub3duRWxlbWVudCQkMSAodm5vZGUsIGluVlByZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhaW5WUHJlICYmXG4gICAgICAhdm5vZGUubnMgJiZcbiAgICAgICEoXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuc29tZShmdW5jdGlvbiAoaWdub3JlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSlcbiAgICAgICAgICAgID8gaWdub3JlLnRlc3Qodm5vZGUudGFnKVxuICAgICAgICAgICAgOiBpZ25vcmUgPT09IHZub2RlLnRhZ1xuICAgICAgICB9KVxuICAgICAgKSAmJlxuICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodm5vZGUudGFnKVxuICAgIClcbiAgfVxuXG4gIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7XG4gIGZ1bmN0aW9uIGNyZWF0ZUVsbSAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0sIG5lc3RlZCkge1xuICAgIHZub2RlLmlzUm9vdEluc2VydCA9ICFuZXN0ZWQ7IC8vIGZvciB0cmFuc2l0aW9uIGVudGVyIGNoZWNrXG4gICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIGlmIChpc0RlZih0YWcpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5rbm93bkVsZW1lbnQkJDEodm5vZGUsIGNyZWF0aW5nRWxtSW5WUHJlKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArXG4gICAgICAgICAgICAncmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgJyArXG4gICAgICAgICAgICAnbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlIFwibmFtZVwiIG9wdGlvbi4nLFxuICAgICAgICAgICAgdm5vZGUuY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZub2RlLmVsbSA9IHZub2RlLm5zXG4gICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZylcbiAgICAgICAgOiBub2RlT3BzLmNyZWF0ZUVsZW1lbnQodGFnLCB2bm9kZSk7XG4gICAgICBzZXRTY29wZSh2bm9kZSk7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAge1xuICAgICAgICAvLyBpbiBXZWV4LCB0aGUgZGVmYXVsdCBpbnNlcnRpb24gb3JkZXIgaXMgcGFyZW50LWZpcnN0LlxuICAgICAgICAvLyBMaXN0IGl0ZW1zIGNhbiBiZSBvcHRpbWl6ZWQgdG8gdXNlIGNoaWxkcmVuLWZpcnN0IGluc2VydGlvblxuICAgICAgICAvLyB3aXRoIGFwcGVuZD1cInRyZWVcIi5cbiAgICAgICAgdmFyIGFwcGVuZEFzVHJlZSA9IGlzRGVmKGRhdGEpICYmIGlzVHJ1ZShkYXRhLmFwcGVuZEFzVHJlZSk7XG4gICAgICAgIGlmICghYXBwZW5kQXNUcmVlKSB7XG4gICAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgaWYgKGFwcGVuZEFzVHJlZSkge1xuICAgICAgICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkYXRhICYmIGRhdGEucHJlKSB7XG4gICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSkge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGkpKSB7XG4gICAgICB2YXIgaXNSZWFjdGl2YXRlZCA9IGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpLmtlZXBBbGl2ZTtcbiAgICAgIGlmIChpc0RlZihpID0gaS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkge1xuICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgIH1cbiAgICAgIC8vIGFmdGVyIGNhbGxpbmcgdGhlIGluaXQgaG9vaywgaWYgdGhlIHZub2RlIGlzIGEgY2hpbGQgY29tcG9uZW50XG4gICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGRcbiAgICAgIC8vIGNvbXBvbmVudCBhbHNvIGhhcyBzZXQgdGhlIHBsYWNlaG9sZGVyIHZub2RlJ3MgZWxtLlxuICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIGNhbiBqdXN0IHJldHVybiB0aGUgZWxlbWVudCBhbmQgYmUgZG9uZS5cbiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHtcbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgaWYgKGlzVHJ1ZShpc1JlYWN0aXZhdGVkKSkge1xuICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdENvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGlmIChpc0RlZih2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpKSB7XG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7XG4gICAgICB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQgPSBudWxsO1xuICAgIH1cbiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7XG4gICAgaWYgKGlzUGF0Y2hhYmxlKHZub2RlKSkge1xuICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICBzZXRTY29wZSh2bm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVtcHR5IGNvbXBvbmVudCByb290LlxuICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KVxuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgICAgLy8gbWFrZSBzdXJlIHRvIGludm9rZSB0aGUgaW5zZXJ0IGhvb2tcbiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFjdGl2YXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkge1xuICAgIHZhciBpO1xuICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb25cbiAgICAvLyBkb2VzIG5vdCB0cmlnZ2VyIGJlY2F1c2UgdGhlIGlubmVyIG5vZGUncyBjcmVhdGVkIGhvb2tzIGFyZSBub3QgY2FsbGVkXG4gICAgLy8gYWdhaW4uIEl0J3Mgbm90IGlkZWFsIHRvIGludm9sdmUgbW9kdWxlLXNwZWNpZmljIGxvZ2ljIGluIGhlcmUgYnV0XG4gICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC5cbiAgICB2YXIgaW5uZXJOb2RlID0gdm5vZGU7XG4gICAgd2hpbGUgKGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZSkge1xuICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtcbiAgICAgIGlmIChpc0RlZihpID0gaW5uZXJOb2RlLmRhdGEpICYmIGlzRGVmKGkgPSBpLnRyYW5zaXRpb24pKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMuYWN0aXZhdGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKGlubmVyTm9kZSk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LFxuICAgIC8vIGEgcmVhY3RpdmF0ZWQga2VlcC1hbGl2ZSBjb21wb25lbnQgZG9lc24ndCBpbnNlcnQgaXRzZWxmXG4gICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0IChwYXJlbnQsIGVsbSwgcmVmJCQxKSB7XG4gICAgaWYgKGlzRGVmKHBhcmVudCkpIHtcbiAgICAgIGlmIChpc0RlZihyZWYkJDEpKSB7XG4gICAgICAgIGlmIChyZWYkJDEucGFyZW50Tm9kZSA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkcmVuICh2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2bm9kZS50ZXh0KSkge1xuICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZCh2bm9kZS5lbG0sIG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGF0Y2hhYmxlICh2bm9kZSkge1xuICAgIHdoaWxlICh2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkge1xuICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgfVxuICAgIHJldHVybiBpc0RlZih2bm9kZS50YWcpXG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VDcmVhdGVIb29rcyAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZVxuICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgaWYgKGlzRGVmKGkuY3JlYXRlKSkgeyBpLmNyZWF0ZShlbXB0eU5vZGUsIHZub2RlKTsgfVxuICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH1cbiAgICB9XG4gIH1cblxuICAvLyBzZXQgc2NvcGUgaWQgYXR0cmlidXRlIGZvciBzY29wZWQgQ1NTLlxuICAvLyB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGEgc3BlY2lhbCBjYXNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZFxuICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuXG4gIGZ1bmN0aW9uIHNldFNjb3BlICh2bm9kZSkge1xuICAgIHZhciBpO1xuICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkge1xuICAgICAgbm9kZU9wcy5zZXRBdHRyaWJ1dGUodm5vZGUuZWxtLCBpLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlO1xuICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICAgIGlmIChpc0RlZihpID0gYW5jZXN0b3IuY29udGV4dCkgJiYgaXNEZWYoaSA9IGkuJG9wdGlvbnMuX3Njb3BlSWQpKSB7XG4gICAgICAgICAgbm9kZU9wcy5zZXRBdHRyaWJ1dGUodm5vZGUuZWxtLCBpLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGZvciBzbG90IGNvbnRlbnQgdGhleSBzaG91bGQgYWxzbyBnZXQgdGhlIHNjb3BlSWQgZnJvbSB0aGUgaG9zdCBpbnN0YW5jZS5cbiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJlxuICAgICAgaSAhPT0gdm5vZGUuY29udGV4dCAmJlxuICAgICAgaSAhPT0gdm5vZGUuZm5Db250ZXh0ICYmXG4gICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZClcbiAgICApIHtcbiAgICAgIG5vZGVPcHMuc2V0QXR0cmlidXRlKHZub2RlLmVsbSwgaSwgJycpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgY3JlYXRlRWxtKHZub2Rlc1tzdGFydElkeF0sIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rICh2bm9kZSkge1xuICAgIHZhciBpLCBqO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7IGNicy5kZXN0cm95W2ldKHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGludm9rZURlc3Ryb3lIb29rKHZub2RlLmNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWbm9kZXMgKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKGNoLnRhZykpIHtcbiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhjaCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIFRleHQgbm9kZVxuICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkge1xuICAgIGlmIChpc0RlZihybSkgfHwgaXNEZWYodm5vZGUuZGF0YSkpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTtcbiAgICAgIGlmIChpc0RlZihybSkpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlY3Vyc2l2ZWx5IHBhc3NlZCBkb3duIHJtIGNhbGxiYWNrXG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnRcbiAgICAgICAgcm0ubGlzdGVuZXJzICs9IGxpc3RlbmVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nXG4gICAgICAgIHJtID0gY3JlYXRlUm1DYih2bm9kZS5lbG0sIGxpc3RlbmVycyk7XG4gICAgICB9XG4gICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7XG4gICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHtcbiAgICAgICAgaSh2bm9kZSwgcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlTm9kZSh2bm9kZS5lbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDtcbiAgICB2YXIgbmV3U3RhcnRJZHggPSAwO1xuICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07XG4gICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTtcbiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdO1xuICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07XG4gICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgdm5vZGVUb01vdmUsIHJlZkVsbTtcblxuICAgIC8vIHJlbW92ZU9ubHkgaXMgYSBzcGVjaWFsIGZsYWcgdXNlZCBvbmx5IGJ5IDx0cmFuc2l0aW9uLWdyb3VwPlxuICAgIC8vIHRvIGVuc3VyZSByZW1vdmVkIGVsZW1lbnRzIHN0YXkgaW4gY29ycmVjdCByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9uc1xuICAgIHZhciBjYW5Nb3ZlID0gIXJlbW92ZU9ubHk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKG5ld0NoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2xkU3RhcnRJZHggPD0gb2xkRW5kSWR4ICYmIG5ld1N0YXJ0SWR4IDw9IG5ld0VuZElkeCkge1xuICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBoYXMgYmVlbiBtb3ZlZCBsZWZ0XG4gICAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkRW5kVm5vZGUpKSB7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdFbmRWbm9kZSkpIHtcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodFxuICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0sIG5vZGVPcHMubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgbGVmdFxuICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkRW5kVm5vZGUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNVbmRlZihvbGRLZXlUb0lkeCkpIHsgb2xkS2V5VG9JZHggPSBjcmVhdGVLZXlUb09sZElkeChvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7IH1cbiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSlcbiAgICAgICAgICA/IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XVxuICAgICAgICAgIDogZmluZElkeEluT2xkKG5ld1N0YXJ0Vm5vZGUsIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07XG4gICAgICAgICAgaWYgKHNhbWVWbm9kZSh2bm9kZVRvTW92ZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGNoVm5vZGUodm5vZGVUb01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgdm5vZGVUb01vdmUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgcmVmRWxtID0gaXNVbmRlZihuZXdDaFtuZXdFbmRJZHggKyAxXSkgPyBudWxsIDogbmV3Q2hbbmV3RW5kSWR4ICsgMV0uZWxtO1xuICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikge1xuICAgIHZhciBzZWVuS2V5cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldO1xuICAgICAgdmFyIGtleSA9IHZub2RlLmtleTtcbiAgICAgIGlmIChpc0RlZihrZXkpKSB7XG4gICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIChcIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnXCIgKyBrZXkgKyBcIicuIFRoaXMgbWF5IGNhdXNlIGFuIHVwZGF0ZSBlcnJvci5cIiksXG4gICAgICAgICAgICB2bm9kZS5jb250ZXh0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWVuS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRJZHhJbk9sZCAobm9kZSwgb2xkQ2gsIHN0YXJ0LCBlbmQpIHtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdmFyIGMgPSBvbGRDaFtpXTtcbiAgICAgIGlmIChpc0RlZihjKSAmJiBzYW1lVm5vZGUobm9kZSwgYykpIHsgcmV0dXJuIGkgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdGNoVm5vZGUgKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbTtcblxuICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgaHlkcmF0ZShvbGRWbm9kZS5lbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy5cbiAgICAvLyBub3RlIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIC1cbiAgICAvLyBpZiB0aGUgbmV3IG5vZGUgaXMgbm90IGNsb25lZCBpdCBtZWFucyB0aGUgcmVuZGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW5cbiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLlxuICAgIGlmIChpc1RydWUodm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICBpc1RydWUob2xkVm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJlxuICAgICAgKGlzVHJ1ZSh2bm9kZS5pc0Nsb25lZCkgfHwgaXNUcnVlKHZub2RlLmlzT25jZSkpXG4gICAgKSB7XG4gICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGk7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHtcbiAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY2ggPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnVwZGF0ZS5sZW5ndGg7ICsraSkgeyBjYnMudXBkYXRlW2ldKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS51cGRhdGUpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfVxuICAgICAgfSBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7IG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7IH1cbiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICByZW1vdmVWbm9kZXMoZWxtLCBvbGRDaCwgMCwgb2xkQ2gubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7XG4gICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgdm5vZGUudGV4dCk7XG4gICAgfVxuICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnBvc3RwYXRjaCkpIHsgaShvbGRWbm9kZSwgdm5vZGUpOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlSW5zZXJ0SG9vayAodm5vZGUsIHF1ZXVlLCBpbml0aWFsKSB7XG4gICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlXG4gICAgLy8gZWxlbWVudCBpcyByZWFsbHkgaW5zZXJ0ZWRcbiAgICBpZiAoaXNUcnVlKGluaXRpYWwpICYmIGlzRGVmKHZub2RlLnBhcmVudCkpIHtcbiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaHlkcmF0aW9uQmFpbGVkID0gZmFsc2U7XG4gIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5XG4gIC8vIGFyZSBhbHJlYWR5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQgb3IgaGFzIG5vIG5lZWQgZm9yIGluaXRpYWxpemF0aW9uXG4gIC8vIE5vdGU6IHN0eWxlIGlzIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgcmVsaWVzIG9uIGluaXRpYWwgY2xvbmUgZm9yIGZ1dHVyZVxuICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS5cbiAgdmFyIGlzUmVuZGVyZWRNb2R1bGUgPSBtYWtlTWFwKCdhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXknKTtcblxuICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLlxuICBmdW5jdGlvbiBoeWRyYXRlIChlbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIGluVlByZSkge1xuICAgIHZhciBpO1xuICAgIHZhciB0YWcgPSB2bm9kZS50YWc7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHZhciBjaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7XG4gICAgdm5vZGUuZWxtID0gZWxtO1xuXG4gICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHtcbiAgICAgIHZub2RlLmlzQXN5bmNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBhc3NlcnQgbm9kZSBtYXRjaFxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIWFzc2VydE5vZGVNYXRjaChlbG0sIHZub2RlLCBpblZQcmUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgICAgIC8vIGNoaWxkIGNvbXBvbmVudC4gaXQgc2hvdWxkIGhhdmUgaHlkcmF0ZWQgaXRzIG93biB0cmVlLlxuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYodGFnKSkge1xuICAgICAgaWYgKGlzRGVmKGNoaWxkcmVuKSkge1xuICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKCFlbG0uaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgY3JlYXRlQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHYtaHRtbCBhbmQgZG9tUHJvcHM6IGlubmVySFRNTFxuICAgICAgICAgIGlmIChpc0RlZihpID0gZGF0YSkgJiYgaXNEZWYoaSA9IGkuZG9tUHJvcHMpICYmIGlzRGVmKGkgPSBpLmlubmVySFRNTCkpIHtcbiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7XG4gICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICFoeWRyYXRpb25CYWlsZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BhcmVudDogJywgZWxtKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignY2xpZW50IGlubmVySFRNTDogJywgZWxtLmlubmVySFRNTCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHNcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbk1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBjaGlsZE5vZGUgPSBlbG0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUgfHwgIWh5ZHJhdGUoY2hpbGROb2RlLCBjaGlsZHJlbltpJDFdLCBpbnNlcnRlZFZub2RlUXVldWUsIGluVlByZSkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBjaGlsZE5vZGUgaXMgbm90IG51bGwsIGl0IG1lYW5zIHRoZSBhY3R1YWwgY2hpbGROb2RlcyBsaXN0IGlzXG4gICAgICAgICAgICAvLyBsb25nZXIgdGhhbiB0aGUgdmlydHVhbCBjaGlsZHJlbiBsaXN0LlxuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkJhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgdmFyIGZ1bGxJbnZva2UgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBpZiAoIWlzUmVuZGVyZWRNb2R1bGUoa2V5KSkge1xuICAgICAgICAgICAgZnVsbEludm9rZSA9IHRydWU7XG4gICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVsbEludm9rZSAmJiBkYXRhWydjbGFzcyddKSB7XG4gICAgICAgICAgLy8gZW5zdXJlIGNvbGxlY3RpbmcgZGVwcyBmb3IgZGVlcCBjbGFzcyBiaW5kaW5ncyBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHtcbiAgICAgIGVsbS5kYXRhID0gdm5vZGUudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkge1xuICAgIGlmIChpc0RlZih2bm9kZS50YWcpKSB7XG4gICAgICByZXR1cm4gdm5vZGUudGFnLmluZGV4T2YoJ3Z1ZS1jb21wb25lbnQnKSA9PT0gMCB8fCAoXG4gICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmXG4gICAgICAgIHZub2RlLnRhZy50b0xvd2VyQ2FzZSgpID09PSAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gKHZub2RlLmlzQ29tbWVudCA/IDggOiAzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwYXRjaCAob2xkVm5vZGUsIHZub2RlLCBoeWRyYXRpbmcsIHJlbW92ZU9ubHksIHBhcmVudEVsbSwgcmVmRWxtKSB7XG4gICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkVm5vZGUpKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGlzSW5pdGlhbFBhdGNoID0gZmFsc2U7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGlzVW5kZWYob2xkVm5vZGUpKSB7XG4gICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50XG4gICAgICBpc0luaXRpYWxQYXRjaCA9IHRydWU7XG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaXNSZWFsRWxlbWVudCA9IGlzRGVmKG9sZFZub2RlLm5vZGVUeXBlKTtcbiAgICAgIGlmICghaXNSZWFsRWxlbWVudCAmJiBzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGVcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkge1xuICAgICAgICAgIC8vIG1vdW50aW5nIHRvIGEgcmVhbCBlbGVtZW50XG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCBhbmQgaWYgd2UgY2FuIHBlcmZvcm1cbiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLlxuICAgICAgICAgIGlmIChvbGRWbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBvbGRWbm9kZS5oYXNBdHRyaWJ1dGUoU1NSX0FUVFIpKSB7XG4gICAgICAgICAgICBvbGRWbm9kZS5yZW1vdmVBdHRyaWJ1dGUoU1NSX0FUVFIpO1xuICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzVHJ1ZShoeWRyYXRpbmcpKSB7XG4gICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHtcbiAgICAgICAgICAgICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG9sZFZub2RlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgK1xuICAgICAgICAgICAgICAgICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IGluY29ycmVjdCAnICtcbiAgICAgICAgICAgICAgICAnSFRNTCBtYXJrdXAsIGZvciBleGFtcGxlIG5lc3RpbmcgYmxvY2stbGV2ZWwgZWxlbWVudHMgaW5zaWRlICcgK1xuICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArXG4gICAgICAgICAgICAgICAgJ2Z1bGwgY2xpZW50LXNpZGUgcmVuZGVyLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZWl0aGVyIG5vdCBzZXJ2ZXItcmVuZGVyZWQsIG9yIGh5ZHJhdGlvbiBmYWlsZWQuXG4gICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXRcbiAgICAgICAgICBvbGRWbm9kZSA9IGVtcHR5Tm9kZUF0KG9sZFZub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlcGxhY2luZyBleGlzdGluZyBlbGVtZW50XG4gICAgICAgIHZhciBvbGRFbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbm9kZVxuICAgICAgICBjcmVhdGVFbG0oXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhXG4gICAgICAgICAgLy8gbGVhdmluZyB0cmFuc2l0aW9uLiBPbmx5IGhhcHBlbnMgd2hlbiBjb21iaW5pbmcgdHJhbnNpdGlvbiArXG4gICAgICAgICAgLy8ga2VlcC1hbGl2ZSArIEhPQ3MuICgjNDU5MClcbiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsXG4gICAgICAgICAgbm9kZU9wcy5uZXh0U2libGluZyhvbGRFbG0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHBhcmVudCBwbGFjZWhvbGRlciBub2RlIGVsZW1lbnQsIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGlmIChpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50O1xuICAgICAgICAgIHZhciBwYXRjaGFibGUgPSBpc1BhdGNoYWJsZSh2bm9kZSk7XG4gICAgICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKGFuY2VzdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTtcbiAgICAgICAgICAgIGlmIChwYXRjaGFibGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSQxKSB7XG4gICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vICM2NTEzXG4gICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuXG4gICAgICAgICAgICAgIC8vIGUuZy4gZm9yIGRpcmVjdGl2ZXMgdGhhdCB1c2VzIHRoZSBcImluc2VydGVkXCIgaG9vay5cbiAgICAgICAgICAgICAgdmFyIGluc2VydCA9IGFuY2VzdG9yLmRhdGEuaG9vay5pbnNlcnQ7XG4gICAgICAgICAgICAgIGlmIChpbnNlcnQubWVyZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSQyID0gMTsgaSQyIDwgaW5zZXJ0LmZucy5sZW5ndGg7IGkkMisrKSB7XG4gICAgICAgICAgICAgICAgICBpbnNlcnQuZm5zW2kkMl0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGVcbiAgICAgICAgaWYgKGlzRGVmKHBhcmVudEVsbSQxKSkge1xuICAgICAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0kMSwgW29sZFZub2RlXSwgMCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkge1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpO1xuICAgIHJldHVybiB2bm9kZS5lbG1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIGRpcmVjdGl2ZXMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlRGlyZWN0aXZlcyxcbiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICBkZXN0cm95OiBmdW5jdGlvbiB1bmJpbmREaXJlY3RpdmVzICh2bm9kZSkge1xuICAgIHVwZGF0ZURpcmVjdGl2ZXModm5vZGUsIGVtcHR5Tm9kZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZURpcmVjdGl2ZXMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzIHx8IHZub2RlLmRhdGEuZGlyZWN0aXZlcykge1xuICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGlzQ3JlYXRlID0gb2xkVm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7XG4gIHZhciBvbGREaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcywgb2xkVm5vZGUuY29udGV4dCk7XG4gIHZhciBuZXdEaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKHZub2RlLmRhdGEuZGlyZWN0aXZlcywgdm5vZGUuY29udGV4dCk7XG5cbiAgdmFyIGRpcnNXaXRoSW5zZXJ0ID0gW107XG4gIHZhciBkaXJzV2l0aFBvc3RwYXRjaCA9IFtdO1xuXG4gIHZhciBrZXksIG9sZERpciwgZGlyO1xuICBmb3IgKGtleSBpbiBuZXdEaXJzKSB7XG4gICAgb2xkRGlyID0gb2xkRGlyc1trZXldO1xuICAgIGRpciA9IG5ld0RpcnNba2V5XTtcbiAgICBpZiAoIW9sZERpcikge1xuICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZFxuICAgICAgY2FsbEhvb2skMShkaXIsICdiaW5kJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIGlmIChkaXIuZGVmICYmIGRpci5kZWYuaW5zZXJ0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZVxuICAgICAgZGlyLm9sZFZhbHVlID0gb2xkRGlyLnZhbHVlO1xuICAgICAgY2FsbEhvb2skMShkaXIsICd1cGRhdGUnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7XG4gICAgICAgIGRpcnNXaXRoUG9zdHBhdGNoLnB1c2goZGlyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7XG4gICAgdmFyIGNhbGxJbnNlcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoSW5zZXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNDcmVhdGUpIHtcbiAgICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAnaW5zZXJ0JywgY2FsbEluc2VydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxJbnNlcnQoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoKSB7XG4gICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdwb3N0cGF0Y2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhQb3N0cGF0Y2hbaV0sICdjb21wb25lbnRVcGRhdGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghaXNDcmVhdGUpIHtcbiAgICBmb3IgKGtleSBpbiBvbGREaXJzKSB7XG4gICAgICBpZiAoIW5ld0RpcnNba2V5XSkge1xuICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kXG4gICAgICAgIGNhbGxIb29rJDEob2xkRGlyc1trZXldLCAndW5iaW5kJywgb2xkVm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZW1wdHlNb2RpZmllcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKFxuICBkaXJzLFxuICB2bVxuKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAoIWRpcnMpIHtcbiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgdmFyIGksIGRpcjtcbiAgZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICBkaXIgPSBkaXJzW2ldO1xuICAgIGlmICghZGlyLm1vZGlmaWVycykge1xuICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICBkaXIubW9kaWZpZXJzID0gZW1wdHlNb2RpZmllcnM7XG4gICAgfVxuICAgIHJlc1tnZXRSYXdEaXJOYW1lKGRpcildID0gZGlyO1xuICAgIGRpci5kZWYgPSByZXNvbHZlQXNzZXQodm0uJG9wdGlvbnMsICdkaXJlY3RpdmVzJywgZGlyLm5hbWUsIHRydWUpO1xuICB9XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGdldFJhd0Rpck5hbWUgKGRpcikge1xuICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyBcIi5cIiArIChPYmplY3Qua2V5cyhkaXIubW9kaWZpZXJzIHx8IHt9KS5qb2luKCcuJykpKVxufVxuXG5mdW5jdGlvbiBjYWxsSG9vayQxIChkaXIsIGhvb2ssIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KSB7XG4gIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTtcbiAgaWYgKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm5vZGUuY29udGV4dCwgKFwiZGlyZWN0aXZlIFwiICsgKGRpci5uYW1lKSArIFwiIFwiICsgaG9vayArIFwiIGhvb2tcIikpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgYmFzZU1vZHVsZXMgPSBbXG4gIHJlZixcbiAgZGlyZWN0aXZlc1xuXTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKCFvbGRWbm9kZS5kYXRhLmF0dHJzICYmICF2bm9kZS5kYXRhLmF0dHJzKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGtleSwgY3VyLCBvbGQ7XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBvbGRBdHRycyA9IG9sZFZub2RlLmRhdGEuYXR0cnMgfHwge307XG4gIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307XG4gIC8vIGNsb25lIG9ic2VydmVkIG9iamVjdHMsIGFzIHRoZSB1c2VyIHByb2JhYmx5IHdhbnRzIHRvIG11dGF0ZSBpdFxuICBpZiAoYXR0cnMuX19vYl9fKSB7XG4gICAgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzID0gZXh0ZW5kKHt9LCBhdHRycyk7XG4gIH1cblxuICB2YXIgc3VwcG9ydEJhdGNoVXBkYXRlID0gdHlwZW9mIGVsbS5zZXRBdHRycyA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIGJhdGNoZWRBdHRycyA9IHt9O1xuICBmb3IgKGtleSBpbiBhdHRycykge1xuICAgIGN1ciA9IGF0dHJzW2tleV07XG4gICAgb2xkID0gb2xkQXR0cnNba2V5XTtcbiAgICBpZiAob2xkICE9PSBjdXIpIHtcbiAgICAgIHN1cHBvcnRCYXRjaFVwZGF0ZVxuICAgICAgICA/IChiYXRjaGVkQXR0cnNba2V5XSA9IGN1cilcbiAgICAgICAgOiBlbG0uc2V0QXR0cihrZXksIGN1cik7XG4gICAgfVxuICB9XG4gIGZvciAoa2V5IGluIG9sZEF0dHJzKSB7XG4gICAgaWYgKGF0dHJzW2tleV0gPT0gbnVsbCkge1xuICAgICAgc3VwcG9ydEJhdGNoVXBkYXRlXG4gICAgICAgID8gKGJhdGNoZWRBdHRyc1trZXldID0gdW5kZWZpbmVkKVxuICAgICAgICA6IGVsbS5zZXRBdHRyKGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0QmF0Y2hVcGRhdGUpIHtcbiAgICBlbG0uc2V0QXR0cnMoYmF0Y2hlZEF0dHJzKTtcbiAgfVxufVxuXG52YXIgYXR0cnMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlQXR0cnMsXG4gIHVwZGF0ZTogdXBkYXRlQXR0cnNcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiB1cGRhdGVDbGFzcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcbiAgdmFyIGN0eCA9IHZub2RlLmNvbnRleHQ7XG5cbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgb2xkRGF0YSA9IG9sZFZub2RlLmRhdGE7XG4gIGlmICghZGF0YS5zdGF0aWNDbGFzcyAmJlxuICAgICFkYXRhLmNsYXNzICYmXG4gICAgKCFvbGREYXRhIHx8ICghb2xkRGF0YS5zdGF0aWNDbGFzcyAmJiAhb2xkRGF0YS5jbGFzcykpXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIG9sZENsYXNzTGlzdCA9IFtdO1xuICAvLyB1bmxpa2Ugd2ViLCB3ZWV4IHZub2RlIHN0YXRpY0NsYXNzIGlzIGFuIEFycmF5XG4gIHZhciBvbGRTdGF0aWNDbGFzcyA9IG9sZERhdGEuc3RhdGljQ2xhc3M7XG4gIGlmIChvbGRTdGF0aWNDbGFzcykge1xuICAgIG9sZENsYXNzTGlzdC5wdXNoLmFwcGx5KG9sZENsYXNzTGlzdCwgb2xkU3RhdGljQ2xhc3MpO1xuICB9XG4gIGlmIChvbGREYXRhLmNsYXNzKSB7XG4gICAgb2xkQ2xhc3NMaXN0LnB1c2guYXBwbHkob2xkQ2xhc3NMaXN0LCBvbGREYXRhLmNsYXNzKTtcbiAgfVxuXG4gIHZhciBjbGFzc0xpc3QgPSBbXTtcbiAgLy8gdW5saWtlIHdlYiwgd2VleCB2bm9kZSBzdGF0aWNDbGFzcyBpcyBhbiBBcnJheVxuICB2YXIgc3RhdGljQ2xhc3MgPSBkYXRhLnN0YXRpY0NsYXNzO1xuICBpZiAoc3RhdGljQ2xhc3MpIHtcbiAgICBjbGFzc0xpc3QucHVzaC5hcHBseShjbGFzc0xpc3QsIHN0YXRpY0NsYXNzKTtcbiAgfVxuICBpZiAoZGF0YS5jbGFzcykge1xuICAgIGNsYXNzTGlzdC5wdXNoLmFwcGx5KGNsYXNzTGlzdCwgZGF0YS5jbGFzcyk7XG4gIH1cblxuICB2YXIgc3R5bGUgPSBnZXRTdHlsZShvbGRDbGFzc0xpc3QsIGNsYXNzTGlzdCwgY3R4KTtcbiAgaWYgKHR5cGVvZiBlbC5zZXRTdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBlbC5zZXRTdHlsZXMoc3R5bGUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBzdHlsZSkge1xuICAgICAgZWwuc2V0U3R5bGUoa2V5LCBzdHlsZVtrZXldKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3R5bGUgKG9sZENsYXNzTGlzdCwgY2xhc3NMaXN0LCBjdHgpIHtcbiAgLy8gc3R5bGUgaXMgYSB3ZWV4LW9ubHkgaW5qZWN0ZWQgb2JqZWN0XG4gIC8vIGNvbXBpbGVkIGZyb20gPHN0eWxlPiB0YWdzIGluIHdlZXggZmlsZXNcbiAgdmFyIHN0eWxlc2hlZXQgPSBjdHguJG9wdGlvbnMuc3R5bGUgfHwge307XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgY2xhc3NMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdHlsZXNoZWV0W25hbWVdO1xuICAgIGV4dGVuZChyZXN1bHQsIHN0eWxlKTtcbiAgfSk7XG4gIG9sZENsYXNzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzaGVldFtuYW1lXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBrbGFzcyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVDbGFzcyxcbiAgdXBkYXRlOiB1cGRhdGVDbGFzc1xufTtcblxuLyogICovXG5cbnZhciB0YXJnZXQkMTtcblxuZnVuY3Rpb24gYWRkJDEgKFxuICBldmVudCxcbiAgaGFuZGxlcixcbiAgb25jZSxcbiAgY2FwdHVyZSxcbiAgcGFzc2l2ZSxcbiAgcGFyYW1zXG4pIHtcbiAgaWYgKGNhcHR1cmUpIHtcbiAgICBjb25zb2xlLmxvZygnV2VleCBkbyBub3Qgc3VwcG9ydCBldmVudCBpbiBidWJibGUgcGhhc2UuJyk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKG9uY2UpIHtcbiAgICB2YXIgb2xkSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgdmFyIF90YXJnZXQgPSB0YXJnZXQkMTsgLy8gc2F2ZSBjdXJyZW50IHRhcmdldCBlbGVtZW50IGluIGNsb3N1cmVcbiAgICBoYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICB2YXIgcmVzID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IG9sZEhhbmRsZXIoZXYpXG4gICAgICAgIDogb2xkSGFuZGxlci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHJlcyAhPT0gbnVsbCkge1xuICAgICAgICByZW1vdmUkMihldmVudCwgbnVsbCwgbnVsbCwgX3RhcmdldCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICB0YXJnZXQkMS5hZGRFdmVudChldmVudCwgaGFuZGxlciwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBldmVudCxcbiAgaGFuZGxlcixcbiAgY2FwdHVyZSxcbiAgX3RhcmdldFxuKSB7XG4gIChfdGFyZ2V0IHx8IHRhcmdldCQxKS5yZW1vdmVFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTUxpc3RlbmVycyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmICghb2xkVm5vZGUuZGF0YS5vbiAmJiAhdm5vZGUuZGF0YS5vbikge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvbiA9IHZub2RlLmRhdGEub24gfHwge307XG4gIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307XG4gIHRhcmdldCQxID0gdm5vZGUuZWxtO1xuICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpO1xuICB0YXJnZXQkMSA9IHVuZGVmaW5lZDtcbn1cblxudmFyIGV2ZW50cyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVET01MaXN0ZW5lcnMsXG4gIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzXG59O1xuXG4vKiAgKi9cblxudmFyIG5vcm1hbGl6ZSA9IGNhY2hlZChjYW1lbGl6ZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKCF2bm9kZS5kYXRhLnN0YXRpY1N0eWxlKSB7XG4gICAgdXBkYXRlU3R5bGUob2xkVm5vZGUsIHZub2RlKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgc3RhdGljU3R5bGUgPSB2bm9kZS5kYXRhLnN0YXRpY1N0eWxlO1xuICB2YXIgc3VwcG9ydEJhdGNoVXBkYXRlID0gdHlwZW9mIGVsbS5zZXRTdHlsZXMgPT09ICdmdW5jdGlvbic7XG4gIHZhciBiYXRjaGVkU3R5bGVzID0ge307XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljU3R5bGUpIHtcbiAgICBpZiAoc3RhdGljU3R5bGVbbmFtZV0pIHtcbiAgICAgIHN1cHBvcnRCYXRjaFVwZGF0ZVxuICAgICAgICA/IChiYXRjaGVkU3R5bGVzW25vcm1hbGl6ZShuYW1lKV0gPSBzdGF0aWNTdHlsZVtuYW1lXSlcbiAgICAgICAgOiBlbG0uc2V0U3R5bGUobm9ybWFsaXplKG5hbWUpLCBzdGF0aWNTdHlsZVtuYW1lXSk7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0QmF0Y2hVcGRhdGUpIHtcbiAgICBlbG0uc2V0U3R5bGVzKGJhdGNoZWRTdHlsZXMpO1xuICB9XG4gIHVwZGF0ZVN0eWxlKG9sZFZub2RlLCB2bm9kZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKCFvbGRWbm9kZS5kYXRhLnN0eWxlICYmICF2bm9kZS5kYXRhLnN0eWxlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGN1ciwgbmFtZTtcbiAgdmFyIGVsbSA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZFN0eWxlID0gb2xkVm5vZGUuZGF0YS5zdHlsZSB8fCB7fTtcbiAgdmFyIHN0eWxlID0gdm5vZGUuZGF0YS5zdHlsZSB8fCB7fTtcblxuICB2YXIgbmVlZENsb25lID0gc3R5bGUuX19vYl9fO1xuXG4gIC8vIGhhbmRsZSBhcnJheSBzeW50YXhcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSB7XG4gICAgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlID0gdG9PYmplY3QkMShzdHlsZSk7XG4gIH1cblxuICAvLyBjbG9uZSB0aGUgc3R5bGUgZm9yIGZ1dHVyZSB1cGRhdGVzLFxuICAvLyBpbiBjYXNlIHRoZSB1c2VyIG11dGF0ZXMgdGhlIHN0eWxlIG9iamVjdCBpbi1wbGFjZS5cbiAgaWYgKG5lZWRDbG9uZSkge1xuICAgIHN0eWxlID0gdm5vZGUuZGF0YS5zdHlsZSA9IGV4dGVuZCh7fSwgc3R5bGUpO1xuICB9XG5cbiAgdmFyIHN1cHBvcnRCYXRjaFVwZGF0ZSA9IHR5cGVvZiBlbG0uc2V0U3R5bGVzID09PSAnZnVuY3Rpb24nO1xuICB2YXIgYmF0Y2hlZFN0eWxlcyA9IHt9O1xuICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlW25hbWVdKSB7XG4gICAgICBzdXBwb3J0QmF0Y2hVcGRhdGVcbiAgICAgICAgPyAoYmF0Y2hlZFN0eWxlc1tub3JtYWxpemUobmFtZSldID0gJycpXG4gICAgICAgIDogZWxtLnNldFN0eWxlKG5vcm1hbGl6ZShuYW1lKSwgJycpO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gc3R5bGUpIHtcbiAgICBjdXIgPSBzdHlsZVtuYW1lXTtcbiAgICBzdXBwb3J0QmF0Y2hVcGRhdGVcbiAgICAgID8gKGJhdGNoZWRTdHlsZXNbbm9ybWFsaXplKG5hbWUpXSA9IGN1cilcbiAgICAgIDogZWxtLnNldFN0eWxlKG5vcm1hbGl6ZShuYW1lKSwgY3VyKTtcbiAgfVxuICBpZiAoc3VwcG9ydEJhdGNoVXBkYXRlKSB7XG4gICAgZWxtLnNldFN0eWxlcyhiYXRjaGVkU3R5bGVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b09iamVjdCQxIChhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0pIHtcbiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxudmFyIHN0eWxlID0ge1xuICBjcmVhdGU6IGNyZWF0ZVN0eWxlLFxuICB1cGRhdGU6IHVwZGF0ZVN0eWxlXG59O1xuXG4vKiAgKi9cblxuLyoqXG4gKiBBZGQgY2xhc3Mgd2l0aCBjb21wYXRpYmlsaXR5IGZvciBTVkcgc2luY2UgY2xhc3NMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgb25cbiAqIFNWRyBlbGVtZW50cyBpbiBJRVxuICovXG5cblxuLyoqXG4gKiBSZW1vdmUgY2xhc3Mgd2l0aCBjb21wYXRpYmlsaXR5IGZvciBTVkcgc2luY2UgY2xhc3NMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgb25cbiAqIFNWRyBlbGVtZW50cyBpbiBJRVxuICovXG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvbiAoZGVmKSB7XG4gIGlmICghZGVmKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGlmIChkZWYuY3NzICE9PSBmYWxzZSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7XG4gICAgfVxuICAgIGV4dGVuZChyZXMsIGRlZik7XG4gICAgcmV0dXJuIHJlc1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZilcbiAgfVxufVxuXG52YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnRlckNsYXNzOiAobmFtZSArIFwiLWVudGVyXCIpLFxuICAgIGVudGVyVG9DbGFzczogKG5hbWUgKyBcIi1lbnRlci10b1wiKSxcbiAgICBlbnRlckFjdGl2ZUNsYXNzOiAobmFtZSArIFwiLWVudGVyLWFjdGl2ZVwiKSxcbiAgICBsZWF2ZUNsYXNzOiAobmFtZSArIFwiLWxlYXZlXCIpLFxuICAgIGxlYXZlVG9DbGFzczogKG5hbWUgKyBcIi1sZWF2ZS10b1wiKSxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzOiAobmFtZSArIFwiLWxlYXZlLWFjdGl2ZVwiKVxuICB9XG59KTtcblxudmFyIGhhc1RyYW5zaXRpb24gPSBpbkJyb3dzZXIgJiYgIWlzSUU5O1xuLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eS9ldmVudCBzbmlmZmluZ1xuXG5cblxuXG5pZiAoaGFzVHJhbnNpdGlvbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHdpbmRvdy5vbnRyYW5zaXRpb25lbmQgPT09IHVuZGVmaW5lZCAmJlxuICAgIHdpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBcbiAgfVxuICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiZcbiAgICB3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBcbiAgfVxufVxuXG4vLyBiaW5kaW5nIHRvIHdpbmRvdyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBob3QgcmVsb2FkIHdvcmsgaW4gSUUgaW4gc3RyaWN0IG1vZGVcbnZhciByYWYgPSBpbkJyb3dzZXJcbiAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KVxuICAgIDogc2V0VGltZW91dFxuICA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfTtcblxudmFyIHRyYW5zaXRpb24gPSB7XG4gIGNyZWF0ZTogZW50ZXIsXG4gIGFjdGl2YXRlOiBlbnRlcixcbiAgcmVtb3ZlOiBsZWF2ZVxufTtcblxuZnVuY3Rpb24gZW50ZXIgKF8sIHZub2RlKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vd1xuICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICBlbC5fbGVhdmVDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9sZWF2ZUNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChlbC5fZW50ZXJDYikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGVudGVyQ2xhc3MgPSBkYXRhLmVudGVyQ2xhc3M7XG4gIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzcztcbiAgdmFyIGVudGVyQWN0aXZlQ2xhc3MgPSBkYXRhLmVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBhcHBlYXJDbGFzcyA9IGRhdGEuYXBwZWFyQ2xhc3M7XG4gIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzO1xuICB2YXIgYXBwZWFyQWN0aXZlQ2xhc3MgPSBkYXRhLmFwcGVhckFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlRW50ZXIgPSBkYXRhLmJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlciA9IGRhdGEuYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkID0gZGF0YS5lbnRlckNhbmNlbGxlZDtcbiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyO1xuICB2YXIgYXBwZWFyID0gZGF0YS5hcHBlYXI7XG4gIHZhciBhZnRlckFwcGVhciA9IGRhdGEuYWZ0ZXJBcHBlYXI7XG4gIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDtcblxuICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlO1xuICB2YXIgdHJhbnNpdGlvbk5vZGUgPSBhY3RpdmVJbnN0YW5jZS4kdm5vZGU7XG4gIHdoaWxlICh0cmFuc2l0aW9uTm9kZSAmJiB0cmFuc2l0aW9uTm9kZS5wYXJlbnQpIHtcbiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDtcbiAgICBjb250ZXh0ID0gdHJhbnNpdGlvbk5vZGUuY29udGV4dDtcbiAgfVxuXG4gIHZhciBpc0FwcGVhciA9ICFjb250ZXh0Ll9pc01vdW50ZWQgfHwgIXZub2RlLmlzUm9vdEluc2VydDtcblxuICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3RhcnRDbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyQ2xhc3MgOiBlbnRlckNsYXNzO1xuICB2YXIgdG9DbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcztcbiAgdmFyIGFjdGl2ZUNsYXNzID0gaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVFbnRlckhvb2sgPSBpc0FwcGVhciA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpIDogYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhciA/ICh0eXBlb2YgYXBwZWFyID09PSAnZnVuY3Rpb24nID8gYXBwZWFyIDogZW50ZXIpIDogZW50ZXI7XG4gIHZhciBhZnRlckVudGVySG9vayA9IGlzQXBwZWFyID8gKGFmdGVyQXBwZWFyIHx8IGFmdGVyRW50ZXIpIDogYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkSG9vayA9IGlzQXBwZWFyID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkgOiBlbnRlckNhbmNlbGxlZDtcblxuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9XG4gICAgZW50ZXJIb29rICYmXG4gICAgLy8gZW50ZXJIb29rIG1heSBiZSBhIGJvdW5kIG1ldGhvZCB3aGljaCBleHBvc2VzXG4gICAgLy8gdGhlIGxlbmd0aCBvZiBvcmlnaW5hbCBmbiBhcyBfbGVuZ3RoXG4gICAgKGVudGVySG9vay5fbGVuZ3RoIHx8IGVudGVySG9vay5sZW5ndGgpID4gMTtcblxuICB2YXIgc3R5bGVzaGVldCA9IHZub2RlLmNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gIHZhciBzdGFydFN0YXRlID0gc3R5bGVzaGVldFtzdGFydENsYXNzXTtcbiAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0aWVzID0gKHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVthY3RpdmVDbGFzc10pIHx8IHt9O1xuICB2YXIgZW5kU3RhdGUgPSBnZXRFbnRlclRhcmdldFN0YXRlKGVsLCBzdHlsZXNoZWV0LCBzdGFydENsYXNzLCB0b0NsYXNzLCBhY3RpdmVDbGFzcywgdm5vZGUuY29udGV4dCk7XG4gIHZhciBuZWVkQW5pbWF0aW9uID0gT2JqZWN0LmtleXMoZW5kU3RhdGUpLmxlbmd0aCA+IDA7XG5cbiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBlbnRlckNhbmNlbGxlZEhvb2sgJiYgZW50ZXJDYW5jZWxsZWRIb29rKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJFbnRlckhvb2sgJiYgYWZ0ZXJFbnRlckhvb2soZWwpO1xuICAgIH1cbiAgICBlbC5fZW50ZXJDYiA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmF0aXZlIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQsIGJ1dCBjdXJyZW50bHlcbiAgLy8gdGhlcmUncyBubyBBUEkgdG8gZG8gdGhhdC4gU28gd2UgaGF2ZSB0byB3YWl0IFwib25lIGZyYW1lXCIgLSBub3QgZW50aXJlbHlcbiAgLy8gc3VyZSBpZiB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW5vdWdoIChlLmcuIG9uIHNsb3cgZGV2aWNlcz8pXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIHZhciBwZW5kaW5nTm9kZSA9IHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmcgJiYgcGFyZW50Ll9wZW5kaW5nW3Zub2RlLmtleV07XG4gICAgaWYgKHBlbmRpbmdOb2RlICYmXG4gICAgICBwZW5kaW5nTm9kZS5jb250ZXh0ID09PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJlxuICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiXG4gICAgKSB7XG4gICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTtcbiAgICB9XG4gICAgZW50ZXJIb29rICYmIGVudGVySG9vayhlbCwgY2IpO1xuXG4gICAgaWYgKG5lZWRBbmltYXRpb24pIHtcbiAgICAgIHZhciBhbmltYXRpb24gPSB2bm9kZS5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIHtcbiAgICAgICAgc3R5bGVzOiBlbmRTdGF0ZSxcbiAgICAgICAgZHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLmR1cmF0aW9uIHx8IDAsXG4gICAgICAgIGRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydGllcy5kZWxheSB8fCAwLFxuICAgICAgICB0aW1pbmdGdW5jdGlvbjogdHJhbnNpdGlvblByb3BlcnRpZXMudGltaW5nRnVuY3Rpb24gfHwgJ2xpbmVhcidcbiAgICAgIH0sIHVzZXJXYW50c0NvbnRyb2wgPyBub29wIDogY2IpO1xuICAgIH0gZWxzZSBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9LCAxNik7XG5cbiAgLy8gc3RhcnQgZW50ZXIgdHJhbnNpdGlvblxuICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTtcblxuICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgIGlmICh0eXBlb2YgZWwuc2V0U3R5bGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlbC5zZXRTdHlsZXMoc3RhcnRTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzdGFydFN0YXRlKSB7XG4gICAgICAgIGVsLnNldFN0eWxlKGtleSwgc3RhcnRTdGF0ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW5lZWRBbmltYXRpb24gJiYgIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICBjYigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxlYXZlICh2bm9kZSwgcm0pIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuXG4gIC8vIGNhbGwgZW50ZXIgY2FsbGJhY2sgbm93XG4gIGlmIChlbC5fZW50ZXJDYikge1xuICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgZWwuX2VudGVyQ2IoKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gcmVzb2x2ZVRyYW5zaXRpb24odm5vZGUuZGF0YS50cmFuc2l0aW9uKTtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIHJtKClcbiAgfVxuXG4gIGlmIChlbC5fbGVhdmVDYikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7XG4gIHZhciBsZWF2ZVRvQ2xhc3MgPSBkYXRhLmxlYXZlVG9DbGFzcztcbiAgdmFyIGxlYXZlQWN0aXZlQ2xhc3MgPSBkYXRhLmxlYXZlQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7XG4gIHZhciBsZWF2ZSA9IGRhdGEubGVhdmU7XG4gIHZhciBhZnRlckxlYXZlID0gZGF0YS5hZnRlckxlYXZlO1xuICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkO1xuICB2YXIgZGVsYXlMZWF2ZSA9IGRhdGEuZGVsYXlMZWF2ZTtcblxuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9XG4gICAgbGVhdmUgJiZcbiAgICAvLyBsZWF2ZSBob29rIG1heSBiZSBhIGJvdW5kIG1ldGhvZCB3aGljaCBleHBvc2VzXG4gICAgLy8gdGhlIGxlbmd0aCBvZiBvcmlnaW5hbCBmbiBhcyBfbGVuZ3RoXG4gICAgKGxlYXZlLl9sZW5ndGggfHwgbGVhdmUubGVuZ3RoKSA+IDE7XG5cbiAgdmFyIHN0eWxlc2hlZXQgPSB2bm9kZS5jb250ZXh0LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICB2YXIgc3RhcnRTdGF0ZSA9IHN0eWxlc2hlZXRbbGVhdmVDbGFzc107XG4gIHZhciBlbmRTdGF0ZSA9IHN0eWxlc2hlZXRbbGVhdmVUb0NsYXNzXSB8fCBzdHlsZXNoZWV0W2xlYXZlQWN0aXZlQ2xhc3NdO1xuICB2YXIgdHJhbnNpdGlvblByb3BlcnRpZXMgPSAoc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXSAmJiBzdHlsZXNoZWV0WydAVFJBTlNJVElPTiddW2xlYXZlQWN0aXZlQ2xhc3NdKSB8fCB7fTtcblxuICB2YXIgY2IgPSBlbC5fbGVhdmVDYiA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUuX3BlbmRpbmcpIHtcbiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIGxlYXZlQ2FuY2VsbGVkICYmIGxlYXZlQ2FuY2VsbGVkKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm0oKTtcbiAgICAgIGFmdGVyTGVhdmUgJiYgYWZ0ZXJMZWF2ZShlbCk7XG4gICAgfVxuICAgIGVsLl9sZWF2ZUNiID0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICBkZWxheUxlYXZlKHBlcmZvcm1MZWF2ZSk7XG4gIH0gZWxzZSB7XG4gICAgcGVyZm9ybUxlYXZlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwZXJmb3JtTGVhdmUgKCkge1xuICAgIHZhciBhbmltYXRpb24gPSB2bm9kZS5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgLy8gdGhlIGRlbGF5ZWQgbGVhdmUgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZFxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyByZWNvcmQgbGVhdmluZyBlbGVtZW50XG4gICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHtcbiAgICAgIChlbC5wYXJlbnROb2RlLl9wZW5kaW5nIHx8IChlbC5wYXJlbnROb2RlLl9wZW5kaW5nID0ge30pKVt2bm9kZS5rZXldID0gdm5vZGU7XG4gICAgfVxuICAgIGJlZm9yZUxlYXZlICYmIGJlZm9yZUxlYXZlKGVsKTtcblxuICAgIGlmIChzdGFydFN0YXRlKSB7XG4gICAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIHtcbiAgICAgICAgc3R5bGVzOiBzdGFydFN0YXRlXG4gICAgICB9LCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCB7XG4gICAgICAgIHN0eWxlczogZW5kU3RhdGUsXG4gICAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uUHJvcGVydGllcy5kdXJhdGlvbiB8fCAwLFxuICAgICAgICBkZWxheTogdHJhbnNpdGlvblByb3BlcnRpZXMuZGVsYXkgfHwgMCxcbiAgICAgICAgdGltaW5nRnVuY3Rpb246IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uIHx8ICdsaW5lYXInXG4gICAgICB9LCB1c2VyV2FudHNDb250cm9sID8gbm9vcCA6IGNiKTtcbiAgICB9XG5cbiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpO1xuICAgIGlmICghZW5kU3RhdGUgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9XG59XG5cbi8vIGRldGVybWluZSB0aGUgdGFyZ2V0IGFuaW1hdGlvbiBzdHlsZSBmb3IgYW4gZW50ZXJpbmcgdHJhbnNpdGlvbi5cbmZ1bmN0aW9uIGdldEVudGVyVGFyZ2V0U3RhdGUgKGVsLCBzdHlsZXNoZWV0LCBzdGFydENsYXNzLCBlbmRDbGFzcywgYWN0aXZlQ2xhc3MsIHZtKSB7XG4gIHZhciB0YXJnZXRTdGF0ZSA9IHt9O1xuICB2YXIgc3RhcnRTdGF0ZSA9IHN0eWxlc2hlZXRbc3RhcnRDbGFzc107XG4gIHZhciBlbmRTdGF0ZSA9IHN0eWxlc2hlZXRbZW5kQ2xhc3NdO1xuICB2YXIgYWN0aXZlU3RhdGUgPSBzdHlsZXNoZWV0W2FjdGl2ZUNsYXNzXTtcbiAgLy8gMS4gZmFsbGJhY2sgdG8gZWxlbWVudCdzIGRlZmF1bHQgc3R5bGluZ1xuICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzdGFydFN0YXRlKSB7XG4gICAgICB0YXJnZXRTdGF0ZVtrZXldID0gZWwuc3R5bGVba2V5XTtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICB0YXJnZXRTdGF0ZVtrZXldID09IG51bGwgJiZcbiAgICAgICAgKCFhY3RpdmVTdGF0ZSB8fCBhY3RpdmVTdGF0ZVtrZXldID09IG51bGwpICYmXG4gICAgICAgICghZW5kU3RhdGUgfHwgZW5kU3RhdGVba2V5XSA9PSBudWxsKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJ0cmFuc2l0aW9uIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBkZWNsYXJlZCBpbiBlbnRlciBzdGFydGluZyBjbGFzcyAoLlwiICsgc3RhcnRDbGFzcyArIFwiKSwgXCIgK1xuICAgICAgICAgIFwiYnV0IG5vdCBkZWNsYXJlZCBhbnl3aGVyZSBpbiBlbnRlciBlbmRpbmcgY2xhc3MgKC5cIiArIGVuZENsYXNzICsgXCIpLCBcIiArXG4gICAgICAgICAgXCJlbnRlciBhY3RpdmUgY2FzcyAoLlwiICsgYWN0aXZlQ2xhc3MgKyBcIikgb3IgdGhlIGVsZW1lbnQncyBkZWZhdWx0IHN0eWxpbmcuIFwiICtcbiAgICAgICAgICBcIk5vdGUgaW4gV2VleCwgQ1NTIHByb3BlcnRpZXMgbmVlZCBleHBsaWNpdCB2YWx1ZXMgdG8gYmUgdHJhbnNpdGlvbmFibGUuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gMi4gaWYgc3RhdGUgaXMgbWl4ZWQgaW4gYWN0aXZlIHN0YXRlLCBleHRyYWN0IHRoZW0gd2hpbGUgZXhjbHVkaW5nXG4gIC8vICAgIHRyYW5zaXRpb24gcHJvcGVydGllc1xuICBpZiAoYWN0aXZlU3RhdGUpIHtcbiAgICBmb3IgKHZhciBrZXkkMSBpbiBhY3RpdmVTdGF0ZSkge1xuICAgICAgaWYgKGtleSQxLmluZGV4T2YoJ3RyYW5zaXRpb24nKSAhPT0gMCkge1xuICAgICAgICB0YXJnZXRTdGF0ZVtrZXkkMV0gPSBhY3RpdmVTdGF0ZVtrZXkkMV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIDMuIGV4cGxpY2l0IGVuZFN0YXRlIGhhcyBoaWdoZXN0IHByaW9yaXR5XG4gIGlmIChlbmRTdGF0ZSkge1xuICAgIGV4dGVuZCh0YXJnZXRTdGF0ZSwgZW5kU3RhdGUpO1xuICB9XG4gIHJldHVybiB0YXJnZXRTdGF0ZVxufVxuXG52YXIgcGxhdGZvcm1Nb2R1bGVzID0gW1xuICBhdHRycyxcbiAga2xhc3MsXG4gIGV2ZW50cyxcbiAgc3R5bGUsXG4gIHRyYW5zaXRpb25cbl07XG5cbi8qICAqL1xuXG4vLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGxcbi8vIGJ1aWx0LWluIG1vZHVsZXMgaGF2ZSBiZWVuIGFwcGxpZWQuXG52YXIgbW9kdWxlcyA9IHBsYXRmb3JtTW9kdWxlcy5jb25jYXQoYmFzZU1vZHVsZXMpO1xuXG52YXIgcGF0Y2ggPSBjcmVhdGVQYXRjaEZ1bmN0aW9uKHtcbiAgbm9kZU9wczogbm9kZU9wcyxcbiAgbW9kdWxlczogbW9kdWxlcyxcbiAgTE9OR19MSVNUX1RIUkVTSE9MRDogMTBcbn0pO1xuXG52YXIgcGxhdGZvcm1EaXJlY3RpdmVzID0ge1xufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGdldFZOb2RlVHlwZSAodm5vZGUpIHtcbiAgaWYgKCF2bm9kZS50YWcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gdm5vZGUudGFnLnJlcGxhY2UoL3Z1ZVxcLWNvbXBvbmVudFxcLShcXGQrXFwtKT8vLCAnJylcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVTcGFuICh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuY2hpbGRyZW4gJiZcbiAgICB2bm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAhdm5vZGUuY2hpbGRyZW5bMF0udGFnXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3R5bGUgKHZub2RlKSB7XG4gIGlmICghdm5vZGUgfHwgIXZub2RlLmRhdGEpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgcmVmID0gdm5vZGUuZGF0YTtcbiAgdmFyIHN0YXRpY1N0eWxlID0gcmVmLnN0YXRpY1N0eWxlO1xuICB2YXIgc3RhdGljQ2xhc3MgPSByZWYuc3RhdGljQ2xhc3M7XG4gIGlmICh2bm9kZS5kYXRhLnN0eWxlIHx8IHZub2RlLmRhdGEuY2xhc3MgfHwgc3RhdGljU3R5bGUgfHwgc3RhdGljQ2xhc3MpIHtcbiAgICB2YXIgc3R5bGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljU3R5bGUsIHZub2RlLmRhdGEuc3R5bGUpO1xuICAgIHZhciBjc3NNYXAgPSB2bm9kZS5jb250ZXh0LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICAgIHZhciBjbGFzc0xpc3QgPSBbXS5jb25jYXQoc3RhdGljQ2xhc3MsIHZub2RlLmRhdGEuY2xhc3MpO1xuICAgIGNsYXNzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAobmFtZSAmJiBjc3NNYXBbbmFtZV0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZXMsIGNzc01hcFtuYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0eWxlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRWTm9kZUNoaWxkcmVuIChjaGlsZHJlbikge1xuICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuLm1hcChmdW5jdGlvbiAodm5vZGUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFZOb2RlVHlwZSh2bm9kZSk7XG4gICAgdmFyIHByb3BzID0geyB0eXBlOiB0eXBlIH07XG5cbiAgICAvLyBjb252ZXJ0IHJhdyB0ZXh0IG5vZGVcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHByb3BzLnR5cGUgPSAnc3Bhbic7XG4gICAgICBwcm9wcy5hdHRyID0ge1xuICAgICAgICB2YWx1ZTogKHZub2RlLnRleHQgfHwgJycpLnRyaW0oKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMuc3R5bGUgPSBwYXJzZVN0eWxlKHZub2RlKTtcbiAgICAgIGlmICh2bm9kZS5kYXRhKSB7XG4gICAgICAgIHByb3BzLmF0dHIgPSB2bm9kZS5kYXRhLmF0dHJzO1xuICAgICAgICBpZiAodm5vZGUuZGF0YS5vbikge1xuICAgICAgICAgIHByb3BzLmV2ZW50cyA9IHZub2RlLmRhdGEub247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnc3BhbicgJiYgaXNTaW1wbGVTcGFuKHZub2RlKSkge1xuICAgICAgICBwcm9wcy5hdHRyID0gcHJvcHMuYXR0ciB8fCB7fTtcbiAgICAgICAgcHJvcHMuYXR0ci52YWx1ZSA9IHZub2RlLmNoaWxkcmVuWzBdLnRleHQudHJpbSgpO1xuICAgICAgICByZXR1cm4gcHJvcHNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBwcm9wcy5jaGlsZHJlbiA9IGNvbnZlcnRWTm9kZUNoaWxkcmVuKHZub2RlLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHNcbiAgfSlcbn1cblxudmFyIFJpY2h0ZXh0ID0ge1xuICBuYW1lOiAncmljaHRleHQnLFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHJldHVybiBoKCd3ZWV4OnJpY2h0ZXh0Jywge1xuICAgICAgb246IHRoaXMuX2V2ZW50cyxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHZhbHVlOiBjb252ZXJ0Vk5vZGVDaGlsZHJlbih0aGlzLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiB8fCBbXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG59O1xuXG4vKiAgKi9cblxuLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC5cbi8vIHN1cHBvcnRzIHRyYW5zaXRpb24gbW9kZSAob3V0LWluIC8gaW4tb3V0KVxuXG52YXIgdHJhbnNpdGlvblByb3BzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIGFwcGVhcjogQm9vbGVhbixcbiAgY3NzOiBCb29sZWFuLFxuICBtb2RlOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgZW50ZXJDbGFzczogU3RyaW5nLFxuICBsZWF2ZUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyVG9DbGFzczogU3RyaW5nLFxuICBsZWF2ZVRvQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBsZWF2ZUFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckNsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGFwcGVhclRvQ2xhc3M6IFN0cmluZyxcbiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XVxufTtcblxuLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+XG4vLyB3ZSB3YW50IHRvIHJlY3Vyc2l2ZWx5IHJldHJpZXZlIHRoZSByZWFsIGNvbXBvbmVudCB0byBiZSByZW5kZXJlZFxuZnVuY3Rpb24gZ2V0UmVhbENoaWxkICh2bm9kZSkge1xuICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICBpZiAoY29tcE9wdGlvbnMgJiYgY29tcE9wdGlvbnMuQ3Rvci5vcHRpb25zLmFic3RyYWN0KSB7XG4gICAgcmV0dXJuIGdldFJlYWxDaGlsZChnZXRGaXJzdENvbXBvbmVudENoaWxkKGNvbXBPcHRpb25zLmNoaWxkcmVuKSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdm5vZGVcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNpdGlvbkRhdGEgKGNvbXApIHtcbiAgdmFyIGRhdGEgPSB7fTtcbiAgdmFyIG9wdGlvbnMgPSBjb21wLiRvcHRpb25zO1xuICAvLyBwcm9wc1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHtcbiAgICBkYXRhW2tleV0gPSBjb21wW2tleV07XG4gIH1cbiAgLy8gZXZlbnRzLlxuICAvLyBleHRyYWN0IGxpc3RlbmVycyBhbmQgcGFzcyB0aGVtIGRpcmVjdGx5IHRvIHRoZSB0cmFuc2l0aW9uIG1ldGhvZHNcbiAgdmFyIGxpc3RlbmVycyA9IG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7XG4gICAgZGF0YVtjYW1lbGl6ZShrZXkkMSldID0gbGlzdGVuZXJzW2tleSQxXTtcbiAgfVxuICByZXR1cm4gZGF0YVxufVxuXG5mdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHtcbiAgaWYgKC9cXGQta2VlcC1hbGl2ZSQvLnRlc3QocmF3Q2hpbGQudGFnKSkge1xuICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywge1xuICAgICAgcHJvcHM6IHJhd0NoaWxkLmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkge1xuICB3aGlsZSAoKHZub2RlID0gdm5vZGUucGFyZW50KSkge1xuICAgIGlmICh2bm9kZS5kYXRhLnRyYW5zaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2FtZUNoaWxkIChjaGlsZCwgb2xkQ2hpbGQpIHtcbiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnXG59XG5cbnZhciBUcmFuc2l0aW9uJDEgPSB7XG4gIG5hbWU6ICd0cmFuc2l0aW9uJyxcbiAgcHJvcHM6IHRyYW5zaXRpb25Qcm9wcyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcylcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50YWcgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpOyB9KTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2FybiBtdWx0aXBsZSBlbGVtZW50c1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICc8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50LiBVc2UgJyArXG4gICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsXG4gICAgICAgIHRoaXMuJHBhcmVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kZSA9IHRoaXMubW9kZTtcblxuICAgIC8vIHdhcm4gaW52YWxpZCBtb2RlXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIG1vZGUgJiYgbW9kZSAhPT0gJ2luLW91dCcgJiYgbW9kZSAhPT0gJ291dC1pbidcbiAgICApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdpbnZhbGlkIDx0cmFuc2l0aW9uPiBtb2RlOiAnICsgbW9kZSxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhIGNvbXBvbmVudCByb290IG5vZGUgYW5kIHRoZSBjb21wb25lbnQnc1xuICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLlxuICAgIGlmIChoYXNQYXJlbnRUcmFuc2l0aW9uKHRoaXMuJHZub2RlKSkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdHJhbnNpdGlvbiBkYXRhIHRvIGNoaWxkXG4gICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZVxuICAgIHZhciBjaGlsZCA9IGdldFJlYWxDaGlsZChyYXdDaGlsZCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xlYXZpbmcpIHtcbiAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgYSBrZXkgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIHZub2RlIHR5cGUgYW5kIHRvIHRoaXMgdHJhbnNpdGlvblxuICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXNcbiAgICAvLyBkdXJpbmcgZW50ZXJpbmcuXG4gICAgdmFyIGlkID0gXCJfX3RyYW5zaXRpb24tXCIgKyAodGhpcy5fdWlkKSArIFwiLVwiO1xuICAgIGNoaWxkLmtleSA9IGNoaWxkLmtleSA9PSBudWxsXG4gICAgICA/IGNoaWxkLmlzQ29tbWVudFxuICAgICAgICA/IGlkICsgJ2NvbW1lbnQnXG4gICAgICAgIDogaWQgKyBjaGlsZC50YWdcbiAgICAgIDogaXNQcmltaXRpdmUoY2hpbGQua2V5KVxuICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KVxuICAgICAgICA6IGNoaWxkLmtleTtcblxuICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG4gICAgdmFyIG9sZFJhd0NoaWxkID0gdGhpcy5fdm5vZGU7XG4gICAgdmFyIG9sZENoaWxkID0gZ2V0UmVhbENoaWxkKG9sZFJhd0NoaWxkKTtcblxuICAgIC8vIG1hcmsgdi1zaG93XG4gICAgLy8gc28gdGhhdCB0aGUgdHJhbnNpdGlvbiBtb2R1bGUgY2FuIGhhbmQgb3ZlciB0aGUgY29udHJvbCB0byB0aGUgZGlyZWN0aXZlXG4gICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7XG4gICAgICBjaGlsZC5kYXRhLnNob3cgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9sZENoaWxkICYmXG4gICAgICBvbGRDaGlsZC5kYXRhICYmXG4gICAgICAhaXNTYW1lQ2hpbGQoY2hpbGQsIG9sZENoaWxkKSAmJlxuICAgICAgIWlzQXN5bmNQbGFjZWhvbGRlcihvbGRDaGlsZCkgJiZcbiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlXG4gICAgICAhKG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlICYmIG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpXG4gICAgKSB7XG4gICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmVcbiAgICAgIC8vIGltcG9ydGFudCBmb3IgZHluYW1pYyB0cmFuc2l0aW9ucyFcbiAgICAgIHZhciBvbGREYXRhID0gb2xkQ2hpbGQuZGF0YS50cmFuc2l0aW9uID0gZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn07XG5cbi8vIHJldXNlIHNhbWUgdHJhbnNpdGlvbiBjb21wb25lbnQgbG9naWMgZnJvbSB3ZWJcblxudmFyIHByb3BzID0gZXh0ZW5kKHtcbiAgdGFnOiBTdHJpbmcsXG4gIG1vdmVDbGFzczogU3RyaW5nXG59LCB0cmFuc2l0aW9uUHJvcHMpO1xuXG5kZWxldGUgcHJvcHMubW9kZTtcblxudmFyIFRyYW5zaXRpb25Hcm91cCA9IHtcbiAgcHJvcHM6IHByb3BzLFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHZhciBkb20gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnZG9tJyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZG9tLmdldENvbXBvbmVudFJlY3QoZWwucmVmLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmICghcmVzLnJlc3VsdCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoKFwiZmFpbGVkIHRvIGdldCByZWN0IGZvciBlbGVtZW50OiBcIiArIChlbC50YWcpKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocmVzLnNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTsgfTtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgdGhpcy5hbmltYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCBvcHRpb25zLCByZXNvbHZlKTtcbiAgICB9KTsgfTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgdHJhbnNpdGlvbkRhdGEgPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHJhd0NoaWxkcmVuW2ldO1xuICAgICAgaWYgKGMudGFnKSB7XG4gICAgICAgIGlmIChjLmtleSAhPSBudWxsICYmIFN0cmluZyhjLmtleSkuaW5kZXhPZignX192bGlzdCcpICE9PSAwKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjKTtcbiAgICAgICAgICBtYXBbYy5rZXldID0gY1xuICAgICAgICAgIDsoYy5kYXRhIHx8IChjLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBjLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgICAgICAgdmFyIG5hbWUgPSBvcHRzXG4gICAgICAgICAgICA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKVxuICAgICAgICAgICAgOiBjLnRhZztcbiAgICAgICAgICB3YXJuKChcIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8XCIgKyBuYW1lICsgXCI+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBrZXB0ID0gW107XG4gICAgICB2YXIgcmVtb3ZlZCA9IFtdO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcblxuICAgICAgICAvLyBUT0RPOiByZWNvcmQgYmVmb3JlIHBhdGNoIHBvc2l0aW9uc1xuXG4gICAgICAgIGlmIChtYXBbYy5rZXldKSB7XG4gICAgICAgICAga2VwdC5wdXNoKGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQucHVzaChjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7XG4gICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkO1xuICAgIH1cblxuICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pXG4gIH0sXG5cbiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkge1xuICAgIC8vIGZvcmNlIHJlbW92aW5nIHBhc3NcbiAgICB0aGlzLl9fcGF0Y2hfXyhcbiAgICAgIHRoaXMuX3Zub2RlLFxuICAgICAgdGhpcy5rZXB0LFxuICAgICAgZmFsc2UsIC8vIGh5ZHJhdGluZ1xuICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50IGF2b2lkcyB1bm5lY2Vzc2FyeSBtb3ZlcylcbiAgICApO1xuICAgIHRoaXMuX3Zub2RlID0gdGhpcy5rZXB0O1xuICB9LFxuXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQgKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuO1xuICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7XG4gICAgdmFyIG1vdmVEYXRhID0gY2hpbGRyZW4ubGVuZ3RoICYmIHRoaXMuZ2V0TW92ZURhdGEoY2hpbGRyZW5bMF0uY29udGV4dCwgbW92ZUNsYXNzKTtcbiAgICBpZiAoIW1vdmVEYXRhKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50aW5nIG1vdmUgYW5pbWF0aW9ucyBvbmNlXG4gICAgLy8gd2UgaGF2ZSBhY2Nlc3MgdG8gc3luYyBnZXRDb21wb25lbnRSZWN0KClcblxuICAgIC8vIGNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpXG5cbiAgICAvLyBQcm9taXNlLmFsbChjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgLy8gICBjb25zdCBvbGRQb3MgPSBjLmRhdGEucG9zXG4gICAgLy8gICBjb25zdCBuZXdQb3MgPSBjLmRhdGEubmV3UG9zXG4gICAgLy8gICBjb25zdCBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnRcbiAgICAvLyAgIGNvbnN0IGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3BcbiAgICAvLyAgIGlmIChkeCB8fCBkeSkge1xuICAgIC8vICAgICBjLmRhdGEubW92ZWQgPSB0cnVlXG4gICAgLy8gICAgIHJldHVybiB0aGlzLmFuaW1hdGUoYy5lbG0sIHtcbiAgICAvLyAgICAgICBzdHlsZXM6IHtcbiAgICAvLyAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke2R4fXB4LCR7ZHl9cHgpYFxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cbiAgICAvLyB9KSkudGhlbigoKSA9PiB7XG4gICAgLy8gICBjaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xuICAgIC8vICAgICBpZiAoYy5kYXRhLm1vdmVkKSB7XG4gICAgLy8gICAgICAgdGhpcy5hbmltYXRlKGMuZWxtLCB7XG4gICAgLy8gICAgICAgICBzdHlsZXM6IHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnJ1xuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIGR1cmF0aW9uOiBtb3ZlRGF0YS5kdXJhdGlvbiB8fCAwLFxuICAgIC8vICAgICAgICAgZGVsYXk6IG1vdmVEYXRhLmRlbGF5IHx8IDAsXG4gICAgLy8gICAgICAgICB0aW1pbmdGdW5jdGlvbjogbW92ZURhdGEudGltaW5nRnVuY3Rpb24gfHwgJ2xpbmVhcidcbiAgICAvLyAgICAgICB9KVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9KVxuICAgIC8vIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vdmVEYXRhOiBmdW5jdGlvbiBnZXRNb3ZlRGF0YSAoY29udGV4dCwgbW92ZUNsYXNzKSB7XG4gICAgICB2YXIgc3R5bGVzaGVldCA9IGNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gICAgICByZXR1cm4gc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXSAmJiBzdHlsZXNoZWV0WydAVFJBTlNJVElPTiddW21vdmVDbGFzc11cbiAgICB9XG4gIH1cbn07XG5cbi8vIGZ1bmN0aW9uIGNhbGxQZW5kaW5nQ2JzIChjKSB7XG4vLyAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuLy8gICBpZiAoYy5lbG0uX21vdmVDYikge1xuLy8gICAgIGMuZWxtLl9tb3ZlQ2IoKVxuLy8gICB9XG4vLyAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuLy8gICBpZiAoYy5lbG0uX2VudGVyQ2IpIHtcbi8vICAgICBjLmVsbS5fZW50ZXJDYigpXG4vLyAgIH1cbi8vIH1cblxudmFyIHBsYXRmb3JtQ29tcG9uZW50cyA9IHtcbiAgUmljaHRleHQ6IFJpY2h0ZXh0LFxuICBUcmFuc2l0aW9uOiBUcmFuc2l0aW9uJDEsXG4gIFRyYW5zaXRpb25Hcm91cDogVHJhbnNpdGlvbkdyb3VwXG59O1xuXG4vKiAgKi9cblxuLy8gVGhlc2UgdXRpbCBmdW5jdGlvbnMgYXJlIHNwbGl0IGludG8gaXRzIG93biBmaWxlIGJlY2F1c2UgUm9sbHVwIGNhbm5vdCBkcm9wXG4vLyBtYWtlTWFwKCkgZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMsIHNvIHRoZXNlIHZhcmlhYmxlcyBlbmQgdXBcbi8vIGJsb2F0aW5nIHRoZSB3ZWIgYnVpbGRzLlxuXG52YXIgaXNSZXNlcnZlZFRhZyQxID0gbWFrZU1hcChcbiAgJ3RlbXBsYXRlLHNjcmlwdCxzdHlsZSxlbGVtZW50LGNvbnRlbnQsc2xvdCxsaW5rLG1ldGEsc3ZnLHZpZXcsJyArXG4gICdhLGRpdixpbWcsaW1hZ2UsdGV4dCxzcGFuLGlucHV0LHN3aXRjaCx0ZXh0YXJlYSxzcGlubmVyLHNlbGVjdCwnICtcbiAgJ3NsaWRlcixzbGlkZXItbmVpZ2hib3IsaW5kaWNhdG9yLGNhbnZhcywnICtcbiAgJ2xpc3QsY2VsbCxoZWFkZXIsbG9hZGluZyxsb2FkaW5nLWluZGljYXRvcixyZWZyZXNoLHNjcm9sbGFibGUsc2Nyb2xsZXIsJyArXG4gICd2aWRlbyx3ZWIsZW1iZWQsdGFiYmFyLHRhYmhlYWRlcixkYXRlcGlja2VyLHRpbWVwaWNrZXIsbWFycXVlZSxjb3VudGRvd24nLFxuICB0cnVlXG4pO1xuXG4vLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKVxuLy8gbW9yZSBmbGV4aWJsZSB0aGFuIHdlYlxudmFyIGNhbkJlTGVmdE9wZW5UYWcgPSBtYWtlTWFwKFxuICAnd2ViLHNwaW5uZXIsc3dpdGNoLHZpZGVvLHRleHRhcmVhLGNhbnZhcywnICtcbiAgJ2luZGljYXRvcixtYXJxdWVlLGNvdW50ZG93bicsXG4gIHRydWVcbik7XG5cbnZhciBpc1J1bnRpbWVDb21wb25lbnQgPSBtYWtlTWFwKFxuICAncmljaHRleHQsdHJhbnNpdGlvbix0cmFuc2l0aW9uLWdyb3VwJyxcbiAgdHJ1ZVxuKTtcblxudmFyIGlzVW5hcnlUYWcgPSBtYWtlTWFwKFxuICAnZW1iZWQsaW1nLGltYWdlLGlucHV0LGxpbmssbWV0YScsXG4gIHRydWVcbik7XG5cbmZ1bmN0aW9uIG11c3RVc2VQcm9wICh0YWcsIHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cblxuXG5mdW5jdGlvbiBpc1Vua25vd25FbGVtZW50JDEgKHRhZykge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gcXVlcnkgKGVsLCBkb2N1bWVudCkge1xuICAvLyBkb2N1bWVudCBpcyBpbmplY3RlZCBieSB3ZWV4IGZhY3Rvcnkgd3JhcHBlclxuICB2YXIgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCdyb290Jyk7XG4gIHBsYWNlaG9sZGVyLmhhc0F0dHJpYnV0ZSA9IHBsYWNlaG9sZGVyLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHt9OyAvLyBoYWNrIGZvciBwYXRjaFxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICByZXR1cm4gcGxhY2Vob2xkZXJcbn1cblxuLyogICovXG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHNcblZ1ZSQyLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wO1xuVnVlJDIuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnJDE7XG5WdWUkMi5jb25maWcuaXNSdW50aW1lQ29tcG9uZW50ID0gaXNSdW50aW1lQ29tcG9uZW50O1xuVnVlJDIuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50JDE7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcnVudGltZSBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzXG5WdWUkMi5vcHRpb25zLmRpcmVjdGl2ZXMgPSBwbGF0Zm9ybURpcmVjdGl2ZXM7XG5WdWUkMi5vcHRpb25zLmNvbXBvbmVudHMgPSBwbGF0Zm9ybUNvbXBvbmVudHM7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZSQyLnByb3RvdHlwZS5fX3BhdGNoX18gPSBwYXRjaDtcblxuLy8gd3JhcCBtb3VudFxuVnVlJDIucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uIChcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIHJldHVybiBtb3VudENvbXBvbmVudChcbiAgICB0aGlzLFxuICAgIGVsICYmIHF1ZXJ5KGVsLCB0aGlzLiRkb2N1bWVudCksXG4gICAgaHlkcmF0aW5nXG4gIClcbn07XG5cbi8vIHRoaXMgZW50cnkgaXMgYnVpbHQgYW5kIHdyYXBwZWQgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb25cbi8vIHVzZWQgdG8gZ2VuZXJhdGUgYSBmcmVzaCBjb3B5IG9mIFZ1ZSBmb3IgZXZlcnkgV2VleCBpbnN0YW5jZS5cblxuZXhwb3J0cy5WdWUgPSBWdWUkMjtcblxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKiAgKi9cblxuLy8gdGhpcyB3aWxsIGJlIHByZXNlcnZlZCBkdXJpbmcgYnVpbGRcbi8vICRmbG93LWRpc2FibGUtbGluZVxudmFyIFZ1ZUZhY3RvcnkgPSByZXF1aXJlKCcuL2ZhY3RvcnknKTtcblxudmFyIGluc3RhbmNlT3B0aW9ucyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZSBpbnN0YW5jZSBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUNvbnRleHQgKFxuICBpbnN0YW5jZUlkLFxuICBydW50aW1lQ29udGV4dCxcbiAgZGF0YVxuKSB7XG4gIGlmICggZGF0YSA9PT0gdm9pZCAwICkgZGF0YSA9IHt9O1xuXG4gIHZhciB3ZWV4ID0gcnVudGltZUNvbnRleHQud2VleDtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VPcHRpb25zW2luc3RhbmNlSWRdID0ge1xuICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgY29uZmlnOiB3ZWV4LmNvbmZpZyxcbiAgICBkb2N1bWVudDogd2VleC5kb2N1bWVudCxcbiAgICBkYXRhOiBkYXRhXG4gIH07XG5cbiAgLy8gRWFjaCBpbnN0YW5jZSBoYXMgYSBpbmRlcGVuZGVudCBgVnVlYCBtb2R1bGUgaW5zdGFuY2VcbiAgdmFyIFZ1ZSA9IGluc3RhbmNlLlZ1ZSA9IGNyZWF0ZVZ1ZU1vZHVsZUluc3RhbmNlKGluc3RhbmNlSWQsIHdlZXgpO1xuXG4gIC8vIERFUFJFQ0FURURcbiAgdmFyIHRpbWVyQVBJcyA9IGdldEluc3RhbmNlVGltZXIoaW5zdGFuY2VJZCwgd2VleC5yZXF1aXJlTW9kdWxlKTtcblxuICB2YXIgaW5zdGFuY2VDb250ZXh0ID0gT2JqZWN0LmFzc2lnbih7IFZ1ZTogVnVlIH0sIHRpbWVyQVBJcyk7XG4gIE9iamVjdC5mcmVlemUoaW5zdGFuY2VDb250ZXh0KTtcbiAgcmV0dXJuIGluc3RhbmNlQ29udGV4dFxufVxuXG4vKipcbiAqIERlc3Ryb3kgYW4gaW5zdGFuY2Ugd2l0aCBpZC4gSXQgd2lsbCBtYWtlIHN1cmUgYWxsIG1lbW9yeSBvZlxuICogdGhpcyBpbnN0YW5jZSByZWxlYXNlZCBhbmQgbm8gbW9yZSBsZWFrcy5cbiAqL1xuZnVuY3Rpb24gZGVzdHJveUluc3RhbmNlIChpbnN0YW5jZUlkKSB7XG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlT3B0aW9uc1tpbnN0YW5jZUlkXTtcbiAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmFwcCBpbnN0YW5jZW9mIGluc3RhbmNlLlZ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBpbnN0YW5jZS5hcHAuJGRlc3Ryb3koKTtcbiAgICAgIGluc3RhbmNlLmRvY3VtZW50LmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGRlbGV0ZSBpbnN0YW5jZS5kb2N1bWVudDtcbiAgICBkZWxldGUgaW5zdGFuY2UuYXBwO1xuICB9XG4gIGRlbGV0ZSBpbnN0YW5jZU9wdGlvbnNbaW5zdGFuY2VJZF07XG59XG5cbi8qKlxuICogUmVmcmVzaCBhbiBpbnN0YW5jZSB3aXRoIGlkIGFuZCBuZXcgdG9wLWxldmVsIGNvbXBvbmVudCBkYXRhLlxuICogSXQgd2lsbCB1c2UgYFZ1ZS5zZXRgIG9uIGFsbCBrZXlzIG9mIHRoZSBuZXcgZGF0YS4gU28gaXQncyBiZXR0ZXJcbiAqIGRlZmluZSBhbGwgcG9zc2libGUgbWVhbmluZ2Z1bCBrZXlzIHdoZW4gaW5zdGFuY2UgY3JlYXRlZC5cbiAqL1xuZnVuY3Rpb24gcmVmcmVzaEluc3RhbmNlIChcbiAgaW5zdGFuY2VJZCxcbiAgZGF0YVxuKSB7XG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlT3B0aW9uc1tpbnN0YW5jZUlkXTtcbiAgaWYgKCFpbnN0YW5jZSB8fCAhKGluc3RhbmNlLmFwcCBpbnN0YW5jZW9mIGluc3RhbmNlLlZ1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKChcInJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgXCIgKyBpbnN0YW5jZUlkICsgXCIgbm90IGZvdW5kIVwiKSlcbiAgfVxuICBpZiAoaW5zdGFuY2UuVnVlICYmIGluc3RhbmNlLlZ1ZS5zZXQpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgaW5zdGFuY2UuVnVlLnNldChpbnN0YW5jZS5hcHAsIGtleSwgZGF0YVtrZXldKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSBgcmVmcmVzaEZpbmlzaGAgc2lnbmFsIG5lZWRlZC5cbiAgaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3JlZnJlc2hGaW5pc2gnIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmcmVzaCBpbnN0YW5jZSBvZiBWdWUgZm9yIGVhY2ggV2VleCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVnVlTW9kdWxlSW5zdGFuY2UgKFxuICBpbnN0YW5jZUlkLFxuICB3ZWV4XG4pIHtcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgVnVlRmFjdG9yeShleHBvcnRzLCB3ZWV4LmRvY3VtZW50KTtcbiAgdmFyIFZ1ZSA9IGV4cG9ydHMuVnVlO1xuXG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlT3B0aW9uc1tpbnN0YW5jZUlkXTtcblxuICAvLyBwYXRjaCByZXNlcnZlZCB0YWcgZGV0ZWN0aW9uIHRvIGFjY291bnQgZm9yIGR5bmFtaWNhbGx5IHJlZ2lzdGVyZWRcbiAgLy8gY29tcG9uZW50c1xuICB2YXIgd2VleFJlZ2V4ID0gL153ZWV4Oi9pO1xuICB2YXIgaXNSZXNlcnZlZFRhZyA9IFZ1ZS5jb25maWcuaXNSZXNlcnZlZFRhZyB8fCAoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pO1xuICB2YXIgaXNSdW50aW1lQ29tcG9uZW50ID0gVnVlLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQgfHwgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgVnVlLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gKCFpc1J1bnRpbWVDb21wb25lbnQobmFtZSkgJiYgd2VleC5zdXBwb3J0cygoXCJAY29tcG9uZW50L1wiICsgbmFtZSkpKSB8fFxuICAgICAgaXNSZXNlcnZlZFRhZyhuYW1lKSB8fFxuICAgICAgd2VleFJlZ2V4LnRlc3QobmFtZSlcbiAgfTtcbiAgVnVlLmNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBuYW1lLnJlcGxhY2Uod2VleFJlZ2V4LCAnJyk7IH07XG5cbiAgLy8gZXhwb3NlIHdlZXgtc3BlY2lmaWMgaW5mb1xuICBWdWUucHJvdG90eXBlLiRpbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcbiAgVnVlLnByb3RvdHlwZS4kZG9jdW1lbnQgPSBpbnN0YW5jZS5kb2N1bWVudDtcblxuICAvLyBleHBvc2Ugd2VleCBuYXRpdmUgbW9kdWxlIGdldHRlciBvbiBzdWJWdWUgcHJvdG90eXBlIHNvIHRoYXRcbiAgLy8gdmRvbSBydW50aW1lIG1vZHVsZXMgY2FuIGFjY2VzcyBuYXRpdmUgbW9kdWxlcyB2aWEgdm5vZGUuY29udGV4dFxuICBWdWUucHJvdG90eXBlLiRyZXF1aXJlV2VleE1vZHVsZSA9IHdlZXgucmVxdWlyZU1vZHVsZTtcblxuICAvLyBIYWNrIGBWdWVgIGJlaGF2aW9yIHRvIGhhbmRsZSBpbnN0YW5jZSBpbmZvcm1hdGlvbiBhbmQgZGF0YVxuICAvLyBiZWZvcmUgcm9vdCBjb21wb25lbnQgY3JlYXRlZC5cbiAgVnVlLm1peGluKHtcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgICAvLyByb290IGNvbXBvbmVudCAodm0pXG4gICAgICBpZiAob3B0aW9ucy5lbCkge1xuICAgICAgICAvLyBzZXQgZXh0ZXJuYWwgZGF0YSBvZiBpbnN0YW5jZVxuICAgICAgICB2YXIgZGF0YU9wdGlvbiA9IG9wdGlvbnMuZGF0YTtcbiAgICAgICAgdmFyIGludGVybmFsRGF0YSA9ICh0eXBlb2YgZGF0YU9wdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGRhdGFPcHRpb24oKSA6IGRhdGFPcHRpb24pIHx8IHt9O1xuICAgICAgICBvcHRpb25zLmRhdGEgPSBPYmplY3QuYXNzaWduKGludGVybmFsRGF0YSwgaW5zdGFuY2UuZGF0YSk7XG4gICAgICAgIC8vIHJlY29yZCBpbnN0YW5jZSBieSBpZFxuICAgICAgICBpbnN0YW5jZS5hcHAgPSB0aGlzO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgICAvLyByb290IGNvbXBvbmVudCAodm0pXG4gICAgICBpZiAob3B0aW9ucy5lbCAmJiB3ZWV4LmRvY3VtZW50ICYmIGluc3RhbmNlLmFwcCA9PT0gdGhpcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNlbmQgXCJjcmVhdGVGaW5pc2hcIiBzaWduYWwgdG8gbmF0aXZlLlxuICAgICAgICAgIHdlZXguZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ2NyZWF0ZUZpbmlzaCcgfSwgW10pO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIEp1c3QgaW5zdGFuY2UgdmFyaWFibGUgYHdlZXguY29uZmlnYFxuICAgKiBHZXQgaW5zdGFuY2UgY29uZmlnLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBWdWUucHJvdG90eXBlLiRnZXRDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluc3RhbmNlLmFwcCBpbnN0YW5jZW9mIFZ1ZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLmNvbmZpZ1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gVnVlXG59XG5cbi8qKlxuICogREVQUkVDQVRFRFxuICogR2VuZXJhdGUgSFRNTDUgVGltZXIgQVBJcy4gQW4gaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgdGhlIGNhbGxiYWNrXG4gKiB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGNhbGxiYWNrIGlkIHdoZW4gc2VudCB0byBuYXRpdmUuIFNvIHRoZVxuICogZnJhbWV3b3JrIGNhbiBtYWtlIHN1cmUgbm8gc2lkZSBlZmZlY3Qgb2YgdGhlIGNhbGxiYWNrIGhhcHBlbmVkIGFmdGVyXG4gKiBhbiBpbnN0YW5jZSBkZXN0cm95ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEluc3RhbmNlVGltZXIgKFxuICBpbnN0YW5jZUlkLFxuICBtb2R1bGVHZXR0ZXJcbikge1xuICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZU9wdGlvbnNbaW5zdGFuY2VJZF07XG4gIHZhciB0aW1lciA9IG1vZHVsZUdldHRlcigndGltZXInKTtcbiAgdmFyIHRpbWVyQVBJcyA9IHtcbiAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFyZ3NbMF0uYXBwbHkoYXJncywgYXJncy5zbGljZSgyKSk7XG4gICAgICB9O1xuXG4gICAgICB0aW1lci5zZXRUaW1lb3V0KGhhbmRsZXIsIGFyZ3NbMV0pO1xuICAgICAgcmV0dXJuIGluc3RhbmNlLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKClcbiAgICB9LFxuICAgIHNldEludGVydmFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFyZ3NbMF0uYXBwbHkoYXJncywgYXJncy5zbGljZSgyKSk7XG4gICAgICB9O1xuXG4gICAgICB0aW1lci5zZXRJbnRlcnZhbChoYW5kbGVyLCBhcmdzWzFdKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgfSxcbiAgICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uIChuKSB7XG4gICAgICB0aW1lci5jbGVhclRpbWVvdXQobik7XG4gICAgfSxcbiAgICBjbGVhckludGVydmFsOiBmdW5jdGlvbiAobikge1xuICAgICAgdGltZXIuY2xlYXJJbnRlcnZhbChuKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aW1lckFQSXNcbn1cblxuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZUNvbnRleHQgPSBjcmVhdGVJbnN0YW5jZUNvbnRleHQ7XG5leHBvcnRzLmRlc3Ryb3lJbnN0YW5jZSA9IGRlc3Ryb3lJbnN0YW5jZTtcbmV4cG9ydHMucmVmcmVzaEluc3RhbmNlID0gcmVmcmVzaEluc3RhbmNlO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgVGhlIGFwaSBmb3IgaW52b2tpbmcgd2l0aCBcIiRcIiBwcmVmaXhcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSAkdm0gaW5zdGVhZFxuICogZmluZCB0aGUgdm0gYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkIChpZCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyQgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBWbSMkdm0gaW5zdGVhZCcpXG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIGZpbmQgdGhlIGVsZW1lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRlbCAoaWQpIHtcbiAgY29uc3QgaW5mbyA9IHRoaXMuX2lkc1tpZF1cbiAgaWYgKGluZm8pIHtcbiAgICByZXR1cm4gaW5mby5lbFxuICB9XG59XG5cbi8qKlxuICogZmluZCB0aGUgdm0gb2YgdGhlIGN1c3RvbSBjb21wb25lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkdm0gKGlkKSB7XG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIEZpcmUgd2hlbiBkaWZmZXIgcmVuZGVyaW5nIGZpbmlzaGVkXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkcmVuZGVyVGhlbiAoZm4pIHtcbiAgY29uc3QgYXBwID0gdGhpcy5fYXBwXG4gIGNvbnN0IGRpZmZlciA9IGFwcC5kaWZmZXJcbiAgcmV0dXJuIGRpZmZlci50aGVuKCgpID0+IHtcbiAgICBmbigpXG4gIH0pXG59XG5cbi8qKlxuICogc2Nyb2xsIGFuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IGlkIGludG8gdmlldyxcbiAqIG1vcmVvdmVyIHNwZWNpZnkgYSBudW1iZXIgb2Ygb2Zmc2V0IG9wdGlvbmFsbHlcbiAqIEBwYXJhbSAge3N0cmluZ30gaWRcbiAqIEBwYXJhbSAge251bWJlcn0gb2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkc2Nyb2xsVG8gKGlkLCBvZmZzZXQpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2Nyb2xsVG8gaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9kb21cXCcpJyArXG4gICAgICAgICAgJy5zY3JvbGxUbyhlbCwgb3B0aW9ucylcIiBpbnN0ZWFkJylcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsKSB7XG4gICAgY29uc3QgZG9tID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ2RvbScpXG4gICAgZG9tLnNjcm9sbFRvRWxlbWVudChlbC5yZWYsIHsgb2Zmc2V0OiBvZmZzZXQgfSlcbiAgfVxufVxuXG4vKipcbiAqIHBlcmZvcm0gdHJhbnNpdGlvbiBhbmltYXRpb24gb24gYW4gZWxlbWVudCBzcGVjaWZpZWQgYnkgaWRcbiAqIEBwYXJhbSAge3N0cmluZ30gICBpZFxuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnNcbiAqIEBwYXJhbSAge29iamVjdH0gICBvcHRpb25zLnN0eWxlc1xuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnMuZHVyYXRpb24obXMpXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMudGltaW5nRnVuY3Rpb25dXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMuZGVsYXk9MChtcyldXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICR0cmFuc2l0aW9uIChpZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5zdHlsZXMpIHtcbiAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnYW5pbWF0aW9uJylcbiAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIG9wdGlvbnMsICguLi5hcmdzKSA9PiB7XG4gICAgICB0aGlzLl9zZXRTdHlsZShlbCwgb3B0aW9ucy5zdHlsZXMpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayguLi5hcmdzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgc29tZSBjb25maWdcbiAqIEByZXR1cm4ge29iamVjdH0gc29tZSBjb25maWcgZm9yIGFwcCBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZVVybFxuICogQHByb3BlcnR5IHtib29sZWFufSBkZWJ1Z1xuICogQHByb3BlcnR5IHtvYmplY3R9IGVudlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi53ZWV4VmVyc2lvbihleC4gMS4wLjApXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW52LmFwcE5hbWUoZXguIFRCL1RNKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5hcHBWZXJzaW9uKGV4LiA1LjAuMClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnYucGxhdGZvcm0oZXguIGlPUy9BbmRyb2lkKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5vc1ZlcnNpb24oZXguIDcuMC4wKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5kZXZpY2VNb2RlbCAqKm5hdGl2ZSBvbmx5KipcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuW2RldmljZVdpZHRoPTc1MF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuZGV2aWNlSGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkZ2V0Q29uZmlnIChjYWxsYmFjaykge1xuICBjb25zdCBjb25maWcgPSB0aGlzLl9hcHAub3B0aW9uc1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSB0aGUgY2FsbGJhY2sgb2YgVm0jJGdldENvbmZpZyhjYWxsYmFjaykgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAndGhpcyBhcGkgbm93IGNhbiBkaXJlY3RseSBSRVRVUk4gY29uZmlnIGluZm8uJylcbiAgICBjYWxsYmFjayhjb25maWcpXG4gIH1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiByZXF1ZXN0IG5ldHdvcmsgdmlhIGh0dHAgcHJvdG9jb2xcbiAqIEBwYXJhbSAge29iamVjdH0gICBwYXJhbXNcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gJHNlbmRIdHRwIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gVm0jJHNlbmRIdHRwIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvc3RyZWFtXFwnKScgK1xuICAgICAgICAgICcuc2VuZEh0dHAocGFyYW1zLCBjYWxsYmFjaylcIiBpbnN0ZWFkJylcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ3N0cmVhbScpXG4gIHN0cmVhbS5zZW5kSHR0cChwYXJhbXMsIGNhbGxiYWNrKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBvcGVuIGEgdXJsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9wZW5VUkwgKHVybCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyRvcGVuVVJMIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvZXZlbnRcXCcpJyArXG4gICAgICAgICAgJy5vcGVuVVJMKHVybClcIiBpbnN0ZWFkJylcbiAgY29uc3QgZXZlbnQgPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnZXZlbnQnKVxuICBldmVudC5vcGVuVVJMKHVybClcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogc2V0IGEgdGl0bGUgZm9yIHBhZ2VcbiAqIEBwYXJhbSAge3N0cmluZ30gdGl0bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRzZXRUaXRsZSAodGl0bGUpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2V0VGl0bGUgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9wYWdlSW5mb1xcJyknICtcbiAgICAgICAgICAnLnNldFRpdGxlKHRpdGxlKVwiIGluc3RlYWQnKVxuICBjb25zdCBwYWdlSW5mbyA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKCdwYWdlSW5mbycpXG4gIHBhZ2VJbmZvLnNldFRpdGxlKHRpdGxlKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBcInJlcXVpcmUoJ0B3ZWV4LW1vZHVsZS9tb2R1bGVOYW1lJykgaW5zdGVhZFwiXG4gKiBpbnZva2UgYSBuYXRpdmUgbWV0aG9kIGJ5IHNwZWNpZmluZyB0aGUgbmFtZSBvZiBtb2R1bGUgYW5kIG1ldGhvZFxuICogQHBhcmFtICB7c3RyaW5nfSBtb2R1bGVOYW1lXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSAgey4uLip9IHRoZSByZXN0IGFyZ3VtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gJGNhbGwgKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkY2FsbCBpcyBkZXByZWNhdGVkLCAnICtcbiAgICAncGxlYXNlIHVzZSBcInJlcXVpcmUoXFwnQHdlZXgtbW9kdWxlL21vZHVsZU5hbWVcXCcpXCIgaW5zdGVhZCcpXG4gIGNvbnN0IG1vZHVsZSA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKG1vZHVsZU5hbWUpXG4gIGlmIChtb2R1bGUgJiYgbW9kdWxlW21ldGhvZE5hbWVdKSB7XG4gICAgbW9kdWxlW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gZnJvbVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuZCAodGFyZ2V0LCAuLi5zcmMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIC4uLnNyYylcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdCBmaXJzdCA9IHNyYy5zaGlmdCgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlyc3QpIHtcbiAgICAgIHRhcmdldFtrZXldID0gZmlyc3Rba2V5XVxuICAgIH1cbiAgICBpZiAoc3JjLmxlbmd0aCkge1xuICAgICAgZXh0ZW5kKHRhcmdldCwgLi4uc3JjKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2VudW1lcmFibGVdXG4gKi9cblxuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICovXG5cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgY29uc3QgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LWxpa2V9IGxpc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc3RhcnRdIC0gc3RhcnQgaW5kZXhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMFxuICBsZXQgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnRcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KGkpXG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF1cbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbi8qKlxuICogU3RyaWN0IG9iamVjdCB0eXBlIGNoZWNrLiBPbmx5IHJldHVybnMgdHJ1ZVxuICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbmNvbnN0IE9CSkVDVF9TVFJJTkcgPSAnW29iamVjdCBPYmplY3RdJ1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IE9CSkVDVF9TVFJJTkdcbn1cblxuZXhwb3J0IHtcbiAgZXh0ZW5kLFxuICBkZWYsXG4gIHJlbW92ZSxcbiAgaGFzT3duLFxuICBiaW5kLFxuICB0b0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQge1xuICBleHRlbmQsXG4gIGRlZixcbiAgcmVtb3ZlLFxuICBoYXNPd24sXG4gIGJpbmQsXG4gIHRvQXJyYXksXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0XG59IGZyb20gJy4vc2hhcmVkJ1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICBjb25zdCBjID0gKHN0ciArICcnKS5jaGFyQ29kZUF0KDApXG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG5leHBvcnQgY29uc3QgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fVxuXG5sZXQgX1NldFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBTZXQudG9TdHJpbmcoKS5tYXRjaCgvbmF0aXZlIGNvZGUvKSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldFxufVxuZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgfVxuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gIT09IHVuZGVmaW5lZFxuICB9XG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09IG51bGwgfHwgdGhpcy5zZXRba2V5XSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuc2V0W2tleV0gPSAxXG4gIH1cbiAgX1NldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIH1cbn1cblxuZXhwb3J0IHsgX1NldCB9XG5cbi8qKlxuICogUG9seWZpbGwgaW4gaU9TNyBieSBuYXRpdmUgYmVjYXVzZSB0aGUgSmF2YVNjcmlwdCBwb2x5ZmlsbCBoYXMgbWVtb3J5IHByb2JsZW0uXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld1NldCAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIGlmICh0eXBlb2YgbmF0aXZlU2V0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBuYXRpdmVTZXQuY3JlYXRlKClcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIHJldHVybiBuZXcgX1NldCgpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXG4gIH1cbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxtaXRlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2dcbmV4cG9ydCBjb25zdCBjYW1lbGl6ZSA9IGNhY2hlZChzdHIgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgdG9VcHBlcilcbn0pXG5cbmZ1bmN0aW9uIHRvVXBwZXIgKF8sIGMpIHtcbiAgcmV0dXJuIGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJ1xufVxuXG4vKipcbiAqIEh5cGhlbmF0ZSBhIGNhbWVsQ2FzZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGh5cGhlbmF0ZVJFID0gLyhbYS16XFxkXSkoW0EtWl0pL2dcbmV4cG9ydCBjb25zdCBoeXBoZW5hdGUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKVxuICAgIC50b0xvd2VyQ2FzZSgpXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwb2YgKHYpIHtcbiAgY29uc3QgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KVxuICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpXG59XG5cbi8vIHdlZXggbmFtZSBydWxlc1xuXG5jb25zdCBXRUVYX0NPTVBPTkVOVF9SRUcgPSAvXkB3ZWV4LWNvbXBvbmVudFxcLy9cbmNvbnN0IFdFRVhfTU9EVUxFX1JFRyA9IC9eQHdlZXgtbW9kdWxlXFwvL1xuY29uc3QgTk9STUFMX01PRFVMRV9SRUcgPSAvXlxcLnsxLDJ9XFwvL1xuY29uc3QgSlNfU1VSRklYX1JFRyA9IC9cXC5qcyQvXG5cbmV4cG9ydCBjb25zdCBpc1dlZXhDb21wb25lbnQgPSBuYW1lID0+ICEhbmFtZS5tYXRjaChXRUVYX0NPTVBPTkVOVF9SRUcpXG5leHBvcnQgY29uc3QgaXNXZWV4TW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goV0VFWF9NT0RVTEVfUkVHKVxuZXhwb3J0IGNvbnN0IGlzTm9ybWFsTW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goTk9STUFMX01PRFVMRV9SRUcpXG5leHBvcnQgY29uc3QgaXNOcG1Nb2R1bGUgPSBuYW1lID0+ICFpc1dlZXhDb21wb25lbnQobmFtZSkgJiYgIWlzV2VleE1vZHVsZShuYW1lKSAmJiAhaXNOb3JtYWxNb2R1bGUobmFtZSlcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVdlZXhQcmVmaXggKHN0cikge1xuICBjb25zdCByZXN1bHQgPSBzdHIucmVwbGFjZShXRUVYX0NPTVBPTkVOVF9SRUcsICcnKS5yZXBsYWNlKFdFRVhfTU9EVUxFX1JFRywgJycpXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUpTU3VyZml4IChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKEpTX1NVUkZJWF9SRUcsICcnKVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgeyByZW1vdmUgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEZXAgKCkge1xuICB0aGlzLmlkID0gdWlkKytcbiAgdGhpcy5zdWJzID0gW11cbn1cblxuLy8gdGhlIGN1cnJlbnQgdGFyZ2V0IHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkLlxuLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZVxuLy8gd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQgYXQgYW55IHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbFxubGV0IHRhcmdldFN0YWNrID0gW11cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUYXJnZXQgKF90YXJnZXQpIHtcbiAgaWYgKERlcC50YXJnZXQpIHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldClcbiAgRGVwLnRhcmdldCA9IF90YXJnZXRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcFRhcmdldCAoKSB7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFjay5wb3AoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRUYXJnZXQgKCkge1xuICBEZXAudGFyZ2V0ID0gbnVsbFxuICB0YXJnZXRTdGFjayA9IFtdXG59XG5cbi8qKlxuICogQWRkIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICB0aGlzLnN1YnMucHVzaChzdWIpXG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICByZW1vdmUodGhpcy5zdWJzLCBzdWIpXG59XG5cbi8qKlxuICogQWRkIHNlbGYgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSB0YXJnZXQgd2F0Y2hlci5cbiAqL1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKVxuICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiBhIG5ldyB2YWx1ZS5cbiAqL1xuXG5EZXAucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gc3RhYmxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICBjb25zdCBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKClcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBzdWJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN1YnNbaV0udXBkYXRlKClcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgRGVwLCB7IHB1c2hUYXJnZXQsIHBvcFRhcmdldCB9IGZyb20gJy4vZGVwJ1xuLy8gaW1wb3J0IHsgcHVzaFdhdGNoZXIgfSBmcm9tICcuL2JhdGNoZXInXG5pbXBvcnQge1xuICByZW1vdmUsXG4gIGV4dGVuZCxcbiAgaXNPYmplY3QsXG4gIGNyZWF0ZU5ld1NldFxuICAvLyBfU2V0IGFzIFNldFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgd2F0Y2hlciBwYXJzZXMgYW4gZXhwcmVzc2lvbiwgY29sbGVjdHMgZGVwZW5kZW5jaWVzLFxuICogYW5kIGZpcmVzIGNhbGxiYWNrIHdoZW4gdGhlIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlcy5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLlxuICpcbiAqIEBwYXJhbSB7VnVlfSB2bVxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IGV4cE9yRm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgIC0ge0FycmF5fSBmaWx0ZXJzXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gdHdvV2F5XG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gZGVlcFxuICogICAgICAgICAgICAgICAgIC0ge0Jvb2xlYW59IHVzZXJcbiAqICAgICAgICAgICAgICAgICAtIHtCb29sZWFufSBzeW5jXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gbGF6eVxuICogICAgICAgICAgICAgICAgIC0ge0Z1bmN0aW9ufSBbcHJlUHJvY2Vzc11cbiAqICAgICAgICAgICAgICAgICAtIHtGdW5jdGlvbn0gW3Bvc3RQcm9jZXNzXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV2F0Y2hlciAodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKSB7XG4gIC8vIG1peCBpbiBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgZXh0ZW5kKHRoaXMsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgaXNGbiA9IHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nXG4gIHRoaXMudm0gPSB2bVxuICB2bS5fd2F0Y2hlcnMucHVzaCh0aGlzKVxuICB0aGlzLmV4cHJlc3Npb24gPSBleHBPckZuXG4gIHRoaXMuY2IgPSBjYlxuICB0aGlzLmlkID0gKyt1aWQgLy8gdWlkIGZvciBiYXRjaGluZ1xuICB0aGlzLmFjdGl2ZSA9IHRydWVcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eSAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXVxuICB0aGlzLm5ld0RlcHMgPSBbXVxuICB0aGlzLmRlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICB0aGlzLm5ld0RlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKGlzRm4pIHtcbiAgICB0aGlzLmdldHRlciA9IGV4cE9yRm5cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KClcbiAgLy8gc3RhdGUgZm9yIGF2b2lkaW5nIGZhbHNlIHRyaWdnZXJzIGZvciBkZWVwIGFuZCBBcnJheVxuICAvLyB3YXRjaGVycyBkdXJpbmcgdm0uX2RpZ2VzdCgpXG4gIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpXG4gIGNvbnN0IHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh0aGlzLnZtLCB0aGlzLnZtKVxuICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gIGlmICh0aGlzLmRlZXApIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZSlcbiAgfVxuICBwb3BUYXJnZXQoKVxuICB0aGlzLmNsZWFudXBEZXBzKClcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0RlcH0gZGVwXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gKGRlcCkge1xuICBjb25zdCBpZCA9IGRlcC5pZFxuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpXG4gICAgdGhpcy5uZXdEZXBzLnB1c2goZGVwKVxuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBpID0gdGhpcy5kZXBzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3QgZGVwID0gdGhpcy5kZXBzW2ldXG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKVxuICAgIH1cbiAgfVxuICBsZXQgdG1wID0gdGhpcy5kZXBJZHNcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkc1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcFxuICB0aGlzLm5ld0RlcElkcy5jbGVhcigpXG4gIHRtcCA9IHRoaXMuZGVwc1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHNcbiAgdGhpcy5uZXdEZXBzID0gdG1wXG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwXG59XG5cbi8qKlxuICogU3Vic2NyaWJlciBpbnRlcmZhY2UuXG4gKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGEgZGVwZW5kZW5jeSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hhbGxvd1xuICovXG5cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzaGFsbG93KSB7XG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHRoaXMucnVuKClcbiAgfVxuICAvLyB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAvLyAgIHRoaXMucnVuKClcbiAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyBpZiBxdWV1ZWQsIG9ubHkgb3ZlcndyaXRlIHNoYWxsb3cgd2l0aCBub24tc2hhbGxvdyxcbiAgLy8gICAvLyBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLlxuICAvLyAgIHRoaXMuc2hhbGxvdyA9IHRoaXMucXVldWVkXG4gIC8vICAgICA/IHNoYWxsb3dcbiAgLy8gICAgICAgPyB0aGlzLnNoYWxsb3dcbiAgLy8gICAgICAgOiBmYWxzZVxuICAvLyAgICAgOiAhIXNoYWxsb3dcbiAgLy8gICB0aGlzLnF1ZXVlZCA9IHRydWVcbiAgLy8gICBwdXNoV2F0Y2hlcih0aGlzKVxuICAvLyB9XG59XG5cbi8qKlxuICogQmF0Y2hlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIGJhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KClcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQ7IGJ1dCBvbmx5IGRvIHNvIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gbm9uLXNoYWxsb3cgdXBkYXRlIChjYXVzZWQgYnkgYSB2bSBkaWdlc3QpLlxuICAgICAgKChpc09iamVjdCh2YWx1ZSkgfHwgdGhpcy5kZWVwKSAmJiAhdGhpcy5zaGFsbG93KVxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpXG4gICAgfVxuICAgIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0KClcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlXG59XG5cbi8qKlxuICogRGVwZW5kIG9uIGFsbCBkZXBzIGNvbGxlY3RlZCBieSB0aGlzIHdhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gKCkge1xuICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgd2hpbGUgKGktLSkge1xuICAgIHRoaXMuZGVwc1tpXS5kZXBlbmQoKVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJjcmliZXIgbGlzdC5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkIG9yIGlzIHBlcmZvcm1pbmcgYSB2LWZvclxuICAgIC8vIHJlLXJlbmRlciAodGhlIHdhdGNoZXIgbGlzdCBpcyB0aGVuIGZpbHRlcmVkIGJ5IHYtZm9yKS5cbiAgICBpZiAoIXRoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWQgJiYgIXRoaXMudm0uX3ZGb3JSZW1vdmluZykge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKVxuICAgIH1cbiAgICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmRlcHNbaV0ucmVtb3ZlU3ViKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLnZtID0gdGhpcy5jYiA9IHRoaXMudmFsdWUgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBSZWNydXNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZFxuICogZ2V0dGVycywgc28gdGhhdCBldmVyeSBuZXN0ZWQgcHJvcGVydHkgaW5zaWRlIHRoZSBvYmplY3RcbiAqIGlzIGNvbGxlY3RlZCBhcyBhIFwiZGVlcFwiIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7U2V0fSBzZWVuXG4gKi9cblxuY29uc3Qgc2Vlbk9iamVjdHMgPSBjcmVhdGVOZXdTZXQoKSAvLyBuZXcgU2V0KClcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiB0cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIGxldCBpLCBrZXlzLCBpc0EsIGlzT1xuICBpZiAoIXNlZW4pIHtcbiAgICBzZWVuID0gc2Vlbk9iamVjdHNcbiAgICBzZWVuLmNsZWFyKClcbiAgfVxuICBpc0EgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgaXNPID0gaXNPYmplY3QodmFsKVxuICBpZiAoaXNBIHx8IGlzTykge1xuICAgIGlmICh2YWwuX19vYl9fKSB7XG4gICAgICBjb25zdCBkZXBJZCA9IHZhbC5fX29iX18uZGVwLmlkXG4gICAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vlbi5hZGQoZGVwSWQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0EpIHtcbiAgICAgIGkgPSB2YWwubGVuZ3RoXG4gICAgICB3aGlsZSAoaS0tKSB0cmF2ZXJzZSh2YWxbaV0sIHNlZW4pXG4gICAgfSBlbHNlIGlmIChpc08pIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpXG4gICAgICBpID0ga2V5cy5sZW5ndGhcbiAgICAgIHdoaWxlIChpLS0pIHRyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2VlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IHsgZGVmIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZVxuZXhwb3J0IGNvbnN0IGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90bylcblxuLyoqXG4gKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHNcbiAqL1xuXG47W1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJ1xuXVxuLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAvLyBjYWNoZSBvcmlnaW5hbCBtZXRob2RcbiAgY29uc3Qgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF1cbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICAvLyBhdm9pZCBsZWFraW5nIGFyZ3VtZW50czpcbiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9zdXJlLXdpdGgtYXJndW1lbnRzXG4gICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgY29uc3QgYXJncyA9IG5ldyBBcnJheShpKVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncylcbiAgICBjb25zdCBvYiA9IHRoaXMuX19vYl9fXG4gICAgbGV0IGluc2VydGVkXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3B1c2gnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NwbGljZSc6XG4gICAgICAgIGluc2VydGVkID0gYXJncy5zbGljZSgyKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIG9iLm9ic2VydmVBcnJheShpbnNlcnRlZClcbiAgICAvLyBub3RpZnkgY2hhbmdlXG4gICAgb2IuZGVwLm5vdGlmeSgpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufSlcblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCB3aXRoIGEgbmV3IHZhbHVlXG4gKiBhbmQgZW1pdHMgY29ycmVzcG9uZGluZyBldmVudC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHsqfSAtIHJlcGxhY2VkIGVsZW1lbnRcbiAqL1xuXG5kZWYoXG4gIGFycmF5UHJvdG8sXG4gICckc2V0JyxcbiAgZnVuY3Rpb24gJHNldCAoaW5kZXgsIHZhbCkge1xuICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gXCJBcnJheS5wcm90b3R5cGUuJHNldFwiIGlzIG5vdCBhIHN0YW5kYXJkIEFQSSxgXG4gICAgICArIGAgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24uYClcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gaW5kZXggKyAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwbGljZShpbmRleCwgMSwgdmFsKVswXVxuICB9XG4pXG5cbi8qKlxuICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBhdCBnaXZlbiBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuZGVmKFxuICBhcnJheVByb3RvLFxuICAnJHJlbW92ZScsXG4gIGZ1bmN0aW9uICRyZW1vdmUgKGluZGV4KSB7XG4gICAgY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcIkFycmF5LnByb3RvdHlwZS4kcmVtb3ZlXCIgaXMgbm90IGEgc3RhbmRhcmQgQVBJLGBcbiAgICAgICsgYCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbi5gKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy5sZW5ndGgpIHJldHVyblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pbmRleE9mKGluZGV4KVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbilcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IERlcCBmcm9tICcuL2RlcCdcbmltcG9ydCB7IGFycmF5TWV0aG9kcyB9IGZyb20gJy4vYXJyYXknXG5pbXBvcnQge1xuICBkZWYsXG4gIHJlbW92ZSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGhhc1Byb3RvLFxuICBoYXNPd24sXG4gIGlzUmVzZXJ2ZWRcbn0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKVxuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB0aGlzLmRlcCA9IG5ldyBEZXAoKVxuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBhdWdtZW50ID0gaGFzUHJvdG9cbiAgICAgID8gcHJvdG9BdWdtZW50XG4gICAgICA6IGNvcHlBdWdtZW50XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpXG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWxrKHZhbHVlKVxuICB9XG59XG5cbi8vIEluc3RhbmNlIG1ldGhvZHNcblxuLyoqXG4gKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG9cbiAqIGdldHRlci9zZXR0ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlblxuICogdmFsdWUgdHlwZSBpcyBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gKG9iaikge1xuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgdGhpcy5jb252ZXJ0KGtleSwgb2JqW2tleV0pXG4gIH1cbn1cblxuLyoqXG4gKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiAoaXRlbXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvYnNlcnZlKGl0ZW1zW2ldKVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHByb3BlcnR5IGludG8gZ2V0dGVyL3NldHRlciBzbyB3ZSBjYW4gZW1pdFxuICogdGhlIGV2ZW50cyB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC9jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuT2JzZXJ2ZXIucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgZGVmaW5lUmVhY3RpdmUodGhpcy52YWx1ZSwga2V5LCB2YWwpXG59XG5cbi8qKlxuICogQWRkIGFuIG93bmVyIHZtLCBzbyB0aGF0IHdoZW4gJHNldC8kZGVsZXRlIG11dGF0aW9uc1xuICogaGFwcGVuIHdlIGNhbiBub3RpZnkgb3duZXIgdm1zIHRvIHByb3h5IHRoZSBrZXlzIGFuZFxuICogZGlnZXN0IHRoZSB3YXRjaGVycy4gVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBvYmplY3RcbiAqIGlzIG9ic2VydmVkIGFzIGFuIGluc3RhbmNlJ3Mgcm9vdCAkZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1Z1ZX0gdm1cbiAqL1xuXG5PYnNlcnZlci5wcm90b3R5cGUuYWRkVm0gPSBmdW5jdGlvbiAodm0pIHtcbiAgKHRoaXMudm1zIHx8ICh0aGlzLnZtcyA9IFtdKSkucHVzaCh2bSlcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW4gb3duZXIgdm0uIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpc1xuICogc3dhcHBlZCBvdXQgYXMgYW4gaW5zdGFuY2UncyAkZGF0YSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtWdWV9IHZtXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbk9ic2VydmVyLnByb3RvdHlwZS5yZW1vdmVWbSA9IGZ1bmN0aW9uICh2bSkge1xuICByZW1vdmUodGhpcy52bXMsIHZtKVxufVxuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGludGVyY2VwdGluZ1xuICogdGhlIHByb3RvdHlwZSBjaGFpbiB1c2luZyBfX3Byb3RvX19cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gdGFyZ2V0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKi9cblxuZnVuY3Rpb24gcHJvdG9BdWdtZW50ICh0YXJnZXQsIHNyYykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuICB0YXJnZXQuX19wcm90b19fID0gc3JjXG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b1xuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKVxuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtWdWV9IFt2bV1cbiAqIEByZXR1cm4ge09ic2VydmVyfHVuZGVmaW5lZH1cbiAqIEBzdGF0aWNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIHZtKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IG9iXG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fXG4gIH0gZWxzZSBpZiAoXG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSAmJlxuICAgIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpICYmXG4gICAgIXZhbHVlLl9pc1Z1ZVxuICApIHtcbiAgICBvYiA9IG5ldyBPYnNlcnZlcih2YWx1ZSlcbiAgfVxuICBpZiAob2IgJiYgdm0pIHtcbiAgICBvYi5hZGRWbSh2bSlcbiAgfVxuICByZXR1cm4gb2Jcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiBhbiBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKG9iaiwga2V5LCB2YWwpIHtcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXG5cbiAgY29uc3QgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KVxuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIGNvbnN0IGdldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LmdldFxuICBjb25zdCBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXRcblxuICBsZXQgY2hpbGRPYiA9IG9ic2VydmUodmFsKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgZGVwLmRlcGVuZCgpXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBlLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgZSA9IHZhbHVlW2ldXG4gICAgICAgICAgICBlICYmIGUuX19vYl9fICYmIGUuX19vYl9fLmRlcC5kZXBlbmQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gbmV3VmFsXG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gb2JzZXJ2ZShuZXdWYWwpXG4gICAgICBkZXAubm90aWZ5KClcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQgKG9iaiwga2V5LCB2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc3BsaWNlKGtleSwgMSwgdmFsKVxuICB9XG4gIGlmIChoYXNPd24ob2JqLCBrZXkpKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob2JqLl9pc1Z1ZSkge1xuICAgIHNldChvYmouX2RhdGEsIGtleSwgdmFsKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9iID0gb2JqLl9fb2JfX1xuICBpZiAoIW9iKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBvYi5jb252ZXJ0KGtleSwgdmFsKVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICBwcm94eSh2bSwga2V5KVxuICAgICAgLy8gdm0uJGZvcmNlVXBkYXRlKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gZGVsIChvYmosIGtleSkge1xuICBpZiAoIWhhc093bihvYmosIGtleSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWxldGUgb2JqW2tleV1cbiAgY29uc3Qgb2IgPSBvYmouX19vYl9fXG5cbiAgaWYgKCFvYikge1xuICAgIGlmIChvYmouX2lzVnVlKSB7XG4gICAgICBkZWxldGUgb2JqLl9kYXRhW2tleV1cbiAgICAgIC8vIG9iai4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICB1bnByb3h5KHZtLCBrZXkpXG4gICAgICAvLyB2bS4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBLRVlfV09SRFMgPSBbJyRpbmRleCcsICckdmFsdWUnLCAnJGV2ZW50J11cbmV4cG9ydCBmdW5jdGlvbiBwcm94eSAodm0sIGtleSkge1xuICBpZiAoS0VZX1dPUkRTLmluZGV4T2Yoa2V5KSA+IC0xIHx8ICFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0sIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdm0uX2RhdGFba2V5XVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkge1xuICAgICAgICB2bS5fZGF0YVtrZXldID0gdmFsXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucHJveHkgKHZtLCBrZXkpIHtcbiAgaWYgKCFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBkZWxldGUgdm1ba2V5XVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cbmltcG9ydCBXYXRjaGVyIGZyb20gJy4vd2F0Y2hlcidcbmltcG9ydCBEZXAgZnJvbSAnLi9kZXAnXG5pbXBvcnQge1xuICBvYnNlcnZlLFxuICBwcm94eSxcbiAgdW5wcm94eVxufSBmcm9tICcuL29ic2VydmVyJ1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgYmluZFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXVxuICBpbml0RGF0YSh2bSlcbiAgaW5pdENvbXB1dGVkKHZtKVxuICBpbml0TWV0aG9kcyh2bSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICBsZXQgZGF0YSA9IHZtLl9kYXRhXG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9XG4gIH1cbiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgcHJveHkodm0sIGtleXNbaV0pXG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdm0pXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb21wdXRlZCAodm0pIHtcbiAgY29uc3QgY29tcHV0ZWQgPSB2bS5fY29tcHV0ZWRcbiAgaWYgKGNvbXB1dGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgICBjb25zdCB1c2VyRGVmID0gY29tcHV0ZWRba2V5XVxuICAgICAgY29uc3QgZGVmID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWYuZ2V0ID0gbWFrZUNvbXB1dGVkR2V0dGVyKHVzZXJEZWYsIHZtKVxuICAgICAgICBkZWYuc2V0ID0gbm9vcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmLmdldCA9IHVzZXJEZWYuZ2V0XG4gICAgICAgICAgPyB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICAgICAgPyBtYWtlQ29tcHV0ZWRHZXR0ZXIodXNlckRlZi5nZXQsIHZtKVxuICAgICAgICAgICAgOiBiaW5kKHVzZXJEZWYuZ2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgICAgZGVmLnNldCA9IHVzZXJEZWYuc2V0XG4gICAgICAgICAgPyBiaW5kKHVzZXJEZWYuc2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bSwga2V5LCBkZWYpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDb21wdXRlZEdldHRlciAoZ2V0dGVyLCBvd25lcikge1xuICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNoZXIob3duZXIsIGdldHRlciwgbnVsbCwge1xuICAgIGxhenk6IHRydWVcbiAgfSlcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVkR2V0dGVyICgpIHtcbiAgICBpZiAod2F0Y2hlci5kaXJ0eSkge1xuICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpXG4gICAgfVxuICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICB3YXRjaGVyLmRlcGVuZCgpXG4gICAgfVxuICAgIHJldHVybiB3YXRjaGVyLnZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNZXRob2RzICh2bSkge1xuICBjb25zdCBtZXRob2RzID0gdm0uX21ldGhvZHNcbiAgaWYgKG1ldGhvZHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgdm1ba2V5XSA9IG1ldGhvZHNba2V5XVxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBAdG9kbzogSXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgbmF0aXZlIGZyb20gYHJlZ2lzdGVyQ29tcG9uZW50cygpYC5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYXRpdmVDb21wb25lbnRNYXA6IHtcbiAgICB0ZXh0OiB0cnVlLFxuICAgIGltYWdlOiB0cnVlLFxuICAgIGNvbnRhaW5lcjogdHJ1ZSxcbiAgICBzbGlkZXI6IHtcbiAgICAgIHR5cGU6ICdzbGlkZXInLFxuICAgICAgYXBwZW5kOiAndHJlZSdcbiAgICB9LFxuICAgIGNlbGw6IHtcbiAgICAgIHR5cGU6ICdjZWxsJyxcbiAgICAgIGFwcGVuZDogJ3RyZWUnXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogRGlyZWN0aXZlIFBhcnNlclxuICovXG5cbmltcG9ydCB7IGJpbmQsIHR5cG9mIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcbmltcG9ydCBXYXRjaGVyIGZyb20gJy4uL2NvcmUvd2F0Y2hlcidcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuXG5jb25zdCB7IG5hdGl2ZUNvbXBvbmVudE1hcCB9ID0gY29uZmlnXG5cbmNvbnN0IFNFVFRFUlMgPSB7XG4gIGF0dHI6ICdzZXRBdHRyJyxcbiAgc3R5bGU6ICdzZXRTdHlsZScsXG4gIGV2ZW50OiAnYWRkRXZlbnQnXG59XG5cbi8qKlxuICogYXBwbHkgdGhlIG5hdGl2ZSBjb21wb25lbnQncyBvcHRpb25zKHNwZWNpZmllZCBieSB0ZW1wbGF0ZS50eXBlKVxuICogdG8gdGhlIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU5haXR2ZUNvbXBvbmVudE9wdGlvbnMgKHRlbXBsYXRlKSB7XG4gIGNvbnN0IHsgdHlwZSB9ID0gdGVtcGxhdGVcbiAgY29uc3Qgb3B0aW9ucyA9IG5hdGl2ZUNvbXBvbmVudE1hcFt0eXBlXVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAodGVtcGxhdGVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRlbXBsYXRlW2tleV0gPSBvcHRpb25zW2tleV1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cG9mKHRlbXBsYXRlW2tleV0pID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBvZihvcHRpb25zW2tleV0pID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1YmtleSBpbiBvcHRpb25zW2tleV0pIHtcbiAgICAgICAgICBpZiAodGVtcGxhdGVba2V5XVtzdWJrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlW2tleV1bc3Via2V5XSA9IG9wdGlvbnNba2V5XVtzdWJrZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYmluZCBhbGwgaWQsIGF0dHIsIGNsYXNzbmFtZXMsIHN0eWxlLCBldmVudHMgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEVsZW1lbnQgKHZtLCBlbCwgdGVtcGxhdGUpIHtcbiAgc2V0SWQodm0sIGVsLCB0ZW1wbGF0ZS5pZCwgdm0pXG4gIHNldEF0dHIodm0sIGVsLCB0ZW1wbGF0ZS5hdHRyKVxuICBzZXRDbGFzcyh2bSwgZWwsIHRlbXBsYXRlLmNsYXNzTGlzdClcbiAgc2V0U3R5bGUodm0sIGVsLCB0ZW1wbGF0ZS5zdHlsZSlcbiAgYmluZEV2ZW50cyh2bSwgZWwsIHRlbXBsYXRlLmV2ZW50cylcbn1cblxuLyoqXG4gKiBiaW5kIGFsbCBwcm9wcyB0byBzdWIgdm0gYW5kIGJpbmQgYWxsIHN0eWxlLCBldmVudHMgdG8gdGhlIHJvb3QgZWxlbWVudFxuICogb2YgdGhlIHN1YiB2bSBpZiBpdCBkb2Vzbid0IGhhdmUgYSByZXBsYWNlZCBtdWx0aS1ub2RlIGZyYWdtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kU3ViVm0gKHZtLCBzdWJWbSwgdGVtcGxhdGUsIHJlcGVhdEl0ZW0pIHtcbiAgc3ViVm0gPSBzdWJWbSB8fCB7fVxuICB0ZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IHt9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHN1YlZtLl9vcHRpb25zIHx8IHt9XG5cbiAgLy8gYmluZCBwcm9wc1xuICBsZXQgcHJvcHMgPSBvcHRpb25zLnByb3BzXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgcHJvcHMgPSBwcm9wcy5yZWR1Y2UoKHJlc3VsdCwgdmFsdWUpID0+IHtcbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSB0cnVlXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSwge30pXG4gIH1cblxuICBtZXJnZVByb3BzKHJlcGVhdEl0ZW0sIHByb3BzLCB2bSwgc3ViVm0pXG4gIG1lcmdlUHJvcHModGVtcGxhdGUuYXR0ciwgcHJvcHMsIHZtLCBzdWJWbSlcbn1cblxuLyoqXG4gKiBtZXJnZSBjbGFzcyBhbmQgc3R5bGVzIGZyb20gdm0gdG8gc3ViIHZtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFN1YlZtQWZ0ZXJJbml0aWFsaXplZCAodm0sIHN1YlZtLCB0ZW1wbGF0ZSwgdGFyZ2V0ID0ge30pIHtcbiAgbWVyZ2VDbGFzc1N0eWxlKHRlbXBsYXRlLmNsYXNzTGlzdCwgdm0sIHN1YlZtKVxuICBtZXJnZVN0eWxlKHRlbXBsYXRlLnN0eWxlLCB2bSwgc3ViVm0pXG5cbiAgLy8gYmluZCBzdWJWbSB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgaWYgKHRhcmdldC5jaGlsZHJlbikge1xuICAgIHRhcmdldC5jaGlsZHJlblt0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uX3ZtID0gc3ViVm1cbiAgfVxuICBlbHNlIHtcbiAgICB0YXJnZXQuX3ZtID0gc3ViVm1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgcHJvcHMgZnJvbSB2bSB0byBzdWIgdm0gYW5kIHdhdGNoIHRoZWlyIHVwZGF0ZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRhcmdldCwgcHJvcHMsIHZtLCBzdWJWbSkge1xuICBpZiAoIXRhcmdldCkge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgIGlmICghcHJvcHMgfHwgcHJvcHNba2V5XSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHdhdGNoKHZtLCB2YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICBzdWJWbVtrZXldID0gdlxuICAgICAgICB9KVxuICAgICAgICBzdWJWbVtrZXldID0gcmV0dXJuVmFsdWVcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdWJWbVtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCaW5kIHN0eWxlIGZyb20gdm0gdG8gc3ViIHZtIGFuZCB3YXRjaCB0aGVpciB1cGRhdGVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVN0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB3YXRjaCh2bSwgdmFsdWUsIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGlmIChzdWJWbS5fcm9vdEVsKSB7XG4gICAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHYpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBzdWJWbS5fcm9vdEVsLnNldFN0eWxlKGtleSwgcmV0dXJuVmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHN1YlZtLl9yb290RWwpIHtcbiAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgY2xhc3MgJiBzdHlsZSBmcm9tIHZtIHRvIHN1YiB2bSBhbmQgd2F0Y2ggdGhlaXIgdXBkYXRlcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VDbGFzc1N0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBjb25zdCBjc3MgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXN1YlZtLl9yb290RWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9ICdAb3JpZ2luYWxSb290RWwnXG4gIGNzc1tjbGFzc05hbWVdID0gc3ViVm0uX3Jvb3RFbC5jbGFzc1N0eWxlXG5cbiAgZnVuY3Rpb24gYWRkQ2xhc3NOYW1lIChsaXN0LCBuYW1lKSB7XG4gICAgaWYgKHR5cG9mKGxpc3QpID09PSAnYXJyYXknKSB7XG4gICAgICBsaXN0LnVuc2hpZnQobmFtZSlcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIHRhcmdldCwgdiA9PiB7XG4gICAgICBhZGRDbGFzc05hbWUodiwgY2xhc3NOYW1lKVxuICAgICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHYpXG4gICAgfSlcbiAgICBhZGRDbGFzc05hbWUodmFsdWUsIGNsYXNzTmFtZSlcbiAgICBzZXRDbGFzc1N0eWxlKHN1YlZtLl9yb290RWwsIGNzcywgdmFsdWUpXG4gIH1cbiAgZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICBhZGRDbGFzc05hbWUodGFyZ2V0LCBjbGFzc05hbWUpXG4gICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHRhcmdldClcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgaWQgdG8gYW4gZWxlbWVudFxuICogZWFjaCBpZCBpcyB1bmlxdWUgaW4gYSB3aG9sZSB2bVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SWQgKHZtLCBlbCwgaWQsIHRhcmdldCkge1xuICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWFwLCB7XG4gICAgdm06IHtcbiAgICAgIHZhbHVlOiB0YXJnZXQsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgfSxcbiAgICBlbDoge1xuICAgICAgZ2V0OiAoKSA9PiBlbCB8fCB0YXJnZXQuX3Jvb3RFbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBpZFxuICAgIGlkID0gaGFuZGxlci5jYWxsKHZtKVxuICAgIGlmIChpZCB8fCBpZCA9PT0gMCkge1xuICAgICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgICB9XG4gICAgd2F0Y2godm0sIGhhbmRsZXIsIChuZXdJZCkgPT4ge1xuICAgICAgaWYgKG5ld0lkKSB7XG4gICAgICAgIHZtLl9pZHNbbmV3SWRdID0gbWFwXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmIChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgYXR0ciB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHIgKHZtLCBlbCwgYXR0cikge1xuICBiaW5kRGlyKHZtLCBlbCwgJ2F0dHInLCBhdHRyKVxufVxuXG5mdW5jdGlvbiBzZXRDbGFzc1N0eWxlIChlbCwgY3NzLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgY2xhc3NMaXN0ID0gY2xhc3NMaXN0LnNwbGl0KC9cXHMrLylcbiAgfVxuICBjbGFzc0xpc3QuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgIGNsYXNzTGlzdC5zcGxpY2UoaSwgMSwgLi4ubmFtZS5zcGxpdCgvXFxzKy8pKVxuICB9KVxuICBjb25zdCBjbGFzc1N0eWxlID0ge31cbiAgY29uc3QgbGVuZ3RoID0gY2xhc3NMaXN0Lmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdHlsZSA9IGNzc1tjbGFzc0xpc3RbaV1dXG4gICAgaWYgKHN0eWxlKSB7XG4gICAgICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNsYXNzU3R5bGVba2V5XSA9IHN0eWxlW2tleV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGVsLnNldENsYXNzU3R5bGUoY2xhc3NTdHlsZSlcbn1cblxuLyoqXG4gKiBiaW5kIGNsYXNzbmFtZXMgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRDbGFzcyAodm0sIGVsLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgIT09ICdmdW5jdGlvbicgJiYgIUFycmF5LmlzQXJyYXkoY2xhc3NMaXN0KSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGNsYXNzTGlzdCkgJiYgIWNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICBlbC5zZXRDbGFzc1N0eWxlKHt9KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3R5bGUgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIGNsYXNzTGlzdCwgdiA9PiB7XG4gICAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgdilcbiAgICB9KVxuICAgIHNldENsYXNzU3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSlcbiAgfVxuICBlbHNlIHtcbiAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgY2xhc3NMaXN0KVxuICB9XG59XG5cbi8qKlxuICogYmluZCBzdHlsZSB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlICh2bSwgZWwsIHN0eWxlKSB7XG4gIGJpbmREaXIodm0sIGVsLCAnc3R5bGUnLCBzdHlsZSlcbn1cblxuLyoqXG4gKiBhZGQgYW4gZXZlbnQgdHlwZSBhbmQgaGFuZGxlciB0byBhbiBlbGVtZW50IGFuZCBnZW5lcmF0ZSBhIGRvbSB1cGRhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnQgKHZtLCBlbCwgdHlwZSwgaGFuZGxlcikge1xuICBlbC5hZGRFdmVudCh0eXBlLCBiaW5kKGhhbmRsZXIsIHZtKSlcbn1cblxuLyoqXG4gKiBhZGQgYWxsIGV2ZW50cyBvZiBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGJpbmRFdmVudHMgKHZtLCBlbCwgZXZlbnRzKSB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cylcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGxldCBoYW5kbGVyID0gZXZlbnRzW2tleV1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYW5kbGVyID0gdm1baGFuZGxlcl1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gVGhlIGV2ZW50IGhhbmRsZXIgXCIke2hhbmRsZXJ9XCIgaXMgbm90IGRlZmluZWQuYClcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0RXZlbnQodm0sIGVsLCBrZXksIGhhbmRsZXIpXG4gIH1cbn1cblxuLyoqXG4gKiBzZXQgYSBzZXJpZXMgb2YgbWVtYmVycyBhcyBhIGtpbmQgb2YgYW4gZWxlbWVudFxuICogZm9yIGV4YW1wbGU6IHN0eWxlLCBhdHRyLCAuLi5cbiAqIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHRoZW4gYmluZCB0aGUgZGF0YSBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGJpbmREaXIgKHZtLCBlbCwgbmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYmluZEtleSh2bSwgZWwsIG5hbWUsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxbU0VUVEVSU1tuYW1lXV0oa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBiaW5kIGRhdGEgY2hhbmdlcyB0byBhIGNlcnRhaW4ga2V5IHRvIGEgbmFtZSBzZXJpZXMgaW4gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBiaW5kS2V5ICh2bSwgZWwsIG5hbWUsIGtleSwgY2FsYykge1xuICBjb25zdCBtZXRob2ROYW1lID0gU0VUVEVSU1tuYW1lXVxuICAvLyB3YXRjaCB0aGUgY2FsYywgYW5kIHJldHVybnMgYSB2YWx1ZSBieSBjYWxjLmNhbGwoKVxuICBjb25zdCB2YWx1ZSA9IHdhdGNoKHZtLCBjYWxjLCAodmFsdWUpID0+IHtcbiAgICBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICAgIGVsW21ldGhvZE5hbWVdKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IGRpZmZlciA9IHZtICYmIHZtLl9hcHAgJiYgdm0uX2FwcC5kaWZmZXJcbiAgICBpZiAoZGlmZmVyKSB7XG4gICAgICBkaWZmZXIuYXBwZW5kKCdlbGVtZW50JywgZWwuZGVwdGggfHwgMCwgZWwucmVmLCBoYW5kbGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhhbmRsZXIoKVxuICAgIH1cbiAgfSlcblxuICBlbFttZXRob2ROYW1lXShrZXksIHZhbHVlKVxufVxuXG4vKipcbiAqIHdhdGNoIGEgY2FsYyBmdW5jdGlvbiBhbmQgY2FsbGJhY2sgaWYgdGhlIGNhbGMgdmFsdWUgY2hhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2ggKHZtLCBjYWxjLCBjYWxsYmFjaykge1xuICBpZiAodm0uX3N0YXRpYykge1xuICAgIHJldHVybiBjYWxjLmNhbGwodm0sIHZtKVxuICB9XG4gIGNvbnN0IHdhdGNoZXIgPSBuZXcgV2F0Y2hlcih2bSwgY2FsYywgZnVuY3Rpb24gKHZhbHVlLCBvbGRWYWx1ZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHZhbHVlID09PSBvbGRWYWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxiYWNrKHZhbHVlKVxuICB9KVxuXG4gIHJldHVybiB3YXRjaGVyLnZhbHVlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlldyBEb2N1bWVudCAmIEVsZW1lbnQgSGVscGVycy5cbiAqXG4gKiByZXF1aXJlZDpcbiAqIERvY3VtZW50IzogY3JlYXRlRWxlbWVudCwgY3JlYXRlQ29tbWVudCwgZ2V0UmVmXG4gKiBFbGVtZW50IzogYXBwZW5kQ2hpbGQsIGluc2VydEJlZm9yZSwgcmVtb3ZlQ2hpbGQsIG5leHRTaWJsaW5nXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBib2R5IGJ5IHR5cGVcbiAqIFVzaW5nIHRoaXMuX2FwcC5kb2NcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJvZHkgKHZtLCB0eXBlKSB7XG4gIGNvbnN0IGRvYyA9IHZtLl9hcHAuZG9jXG4gIHJldHVybiBkb2MuY3JlYXRlQm9keSh0eXBlKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50IGJ5IHR5cGVcbiAqIFVzaW5nIHRoaXMuX2FwcC5kb2NcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQgKHZtLCB0eXBlKSB7XG4gIGNvbnN0IGRvYyA9IHZtLl9hcHAuZG9jXG4gIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0eXBlKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgZnJhZyBibG9jayBmb3IgYW4gZWxlbWVudC5cbiAqIFRoZSBmcmFnIGJsb2NrIGhhcyBhIHN0YXJ0ZXIsIGVuZGVyIGFuZCB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCbG9jayAodm0sIGVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhcnQgPSBjcmVhdGVCbG9ja1N0YXJ0KHZtKVxuICBjb25zdCBlbmQgPSBjcmVhdGVCbG9ja0VuZCh2bSlcbiAgY29uc3QgYmxvY2tJZCA9IGxhc3Rlc3RCbG9ja0lkKytcbiAgaWYgKGVsZW1lbnQuZWxlbWVudCkge1xuICAgIGxldCB1cGRhdGVNYXJrID0gZWxlbWVudC51cGRhdGVNYXJrXG4gICAgaWYgKHVwZGF0ZU1hcmspIHtcbiAgICAgIGlmICh1cGRhdGVNYXJrLmVsZW1lbnQpIHtcbiAgICAgICAgdXBkYXRlTWFyayA9IHVwZGF0ZU1hcmsuZW5kXG4gICAgICB9XG4gICAgICBlbGVtZW50LmVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZW5kLCB1cGRhdGVNYXJrKVxuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEFmdGVyKHN0YXJ0LCB1cGRhdGVNYXJrKVxuICAgICAgZWxlbWVudC51cGRhdGVNYXJrID0gZW5kXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEJlZm9yZShzdGFydCwgZWxlbWVudC5lbmQpXG4gICAgICBlbGVtZW50LmVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVuZCwgZWxlbWVudC5lbmQpXG4gICAgfVxuICAgIGVsZW1lbnQgPSBlbGVtZW50LmVsZW1lbnRcbiAgfVxuICBlbHNlIHtcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKHN0YXJ0KVxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZW5kKVxuICB9XG4gIHJldHVybiB7IHN0YXJ0LCBlbmQsIGVsZW1lbnQsIGJsb2NrSWQgfVxufVxuXG5sZXQgbGFzdGVzdEJsb2NrSWQgPSAxXG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBibG9jayBzdGFydGVyLlxuICogVXNpbmcgdGhpcy5fYXBwLmRvY1xuICovXG5mdW5jdGlvbiBjcmVhdGVCbG9ja1N0YXJ0ICh2bSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICBjb25zdCBhbmNob3IgPSBkb2MuY3JlYXRlQ29tbWVudCgnc3RhcnQnKVxuICByZXR1cm4gYW5jaG9yXG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBibG9jayBlbmRlci5cbiAqIFVzaW5nIHRoaXMuX2FwcC5kb2NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmxvY2tFbmQgKHZtKSB7XG4gIGNvbnN0IGRvYyA9IHZtLl9hcHAuZG9jXG4gIGNvbnN0IGFuY2hvciA9IGRvYy5jcmVhdGVDb21tZW50KCdlbmQnKVxuICByZXR1cm4gYW5jaG9yXG59XG5cbi8qKlxuICogQXR0YWNoIHRhcmdldCB0byBhIGNlcnRhaW4gZGVzdCB1c2luZyBhcHBlbmRDaGlsZCBieSBkZWZhdWx0LlxuICogSWYgdGhlIGRlc3QgaXMgYSBmcmFnIGJsb2NrIHRoZW4gaW5zZXJ0IGJlZm9yZSB0aGUgZW5kZXIuXG4gKiBJZiB0aGUgdGFyZ2V0IGlzIGEgZnJhZyBibG9jayB0aGVuIGF0dGFjaCB0aGUgc3RhcnRlciBhbmQgZW5kZXIgaW4gb3JkZXIuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSAge29iamVjdH0gZGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoVGFyZ2V0ICh2bSwgdGFyZ2V0LCBkZXN0KSB7XG4gIGlmIChkZXN0LmVsZW1lbnQpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBkZXN0LmVuZFxuICAgIGNvbnN0IGFmdGVyID0gZGVzdC51cGRhdGVNYXJrXG4gICAgLy8gcHVzaCBuZXcgdGFyZ2V0IGZvciB3YXRjaCBsaXN0IHVwZGF0ZSBsYXRlclxuICAgIGlmIChkZXN0LmNoaWxkcmVuKSB7XG4gICAgICBkZXN0LmNoaWxkcmVuLnB1c2godGFyZ2V0KVxuICAgIH1cbiAgICAvLyBmb3IgY2hlY2sgcmVwZWF0IGNhc2VcbiAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG1vdmVUYXJnZXQodm0sIHRhcmdldCwgYWZ0ZXIpXG4gICAgICBkZXN0LnVwZGF0ZU1hcmsgPSB0YXJnZXQuZWxlbWVudCA/IHRhcmdldC5lbmQgOiB0YXJnZXRcbiAgICAgIHJldHVybiBzaWduYWxcbiAgICB9XG4gICAgZWxzZSBpZiAodGFyZ2V0LmVsZW1lbnQpIHtcbiAgICAgIGRlc3QuZWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LnN0YXJ0LCBiZWZvcmUpXG4gICAgICBkZXN0LmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRhcmdldC5lbmQsIGJlZm9yZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gZGVzdC5lbGVtZW50Lmluc2VydEJlZm9yZSh0YXJnZXQsIGJlZm9yZSlcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgICBkZXN0LmFwcGVuZENoaWxkKHRhcmdldC5zdGFydClcbiAgICAgIGRlc3QuYXBwZW5kQ2hpbGQodGFyZ2V0LmVuZClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gZGVzdC5hcHBlbmRDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTW92ZSB0YXJnZXQgYmVmb3JlIGEgY2VydGFpbiBlbGVtZW50LiBUaGUgdGFyZ2V0IG1heWJlIGJsb2NrIG9yIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSAge29iamVjdH0gYmVmb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlVGFyZ2V0ICh2bSwgdGFyZ2V0LCBhZnRlcikge1xuICBpZiAodGFyZ2V0LmVsZW1lbnQpIHtcbiAgICByZXR1cm4gbW92ZUJsb2NrKHRhcmdldCwgYWZ0ZXIpXG4gIH1cbiAgcmV0dXJuIG1vdmVFbGVtZW50KHRhcmdldCwgYWZ0ZXIpXG59XG5cbi8qKlxuICogTW92ZSBlbGVtZW50IGJlZm9yZSBhIGNlcnRhaW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGVsZW1lbnRcbiAqIEBwYXJhbSAge29iamVjdH0gYmVmb3JlXG4gKi9cbmZ1bmN0aW9uIG1vdmVFbGVtZW50IChlbGVtZW50LCBhZnRlcikge1xuICBjb25zdCBwYXJlbnQgPSBhZnRlci5wYXJlbnROb2RlXG4gIGlmIChwYXJlbnQpIHtcbiAgICByZXR1cm4gcGFyZW50Lmluc2VydEFmdGVyKGVsZW1lbnQsIGFmdGVyKVxuICB9XG59XG5cbi8qKlxuICogTW92ZSBhbGwgZWxlbWVudHMgb2YgdGhlIGJsb2NrIGJlZm9yZSBhIGNlcnRhaW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGZyYWdCbG9ja1xuICogQHBhcmFtICB7b2JqZWN0fSBiZWZvcmVcbiAqL1xuZnVuY3Rpb24gbW92ZUJsb2NrIChmcmFnQmxvY2ssIGFmdGVyKSB7XG4gIGNvbnN0IHBhcmVudCA9IGFmdGVyLnBhcmVudE5vZGVcblxuICBpZiAocGFyZW50KSB7XG4gICAgbGV0IGVsID0gZnJhZ0Jsb2NrLnN0YXJ0XG4gICAgbGV0IHNpZ25hbFxuICAgIGNvbnN0IGdyb3VwID0gW2VsXVxuXG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBmcmFnQmxvY2suZW5kKSB7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nXG4gICAgICBncm91cC5wdXNoKGVsKVxuICAgIH1cblxuICAgIGxldCB0ZW1wID0gYWZ0ZXJcbiAgICBncm91cC5ldmVyeSgoZWwpID0+IHtcbiAgICAgIHNpZ25hbCA9IHBhcmVudC5pbnNlcnRBZnRlcihlbCwgdGVtcClcbiAgICAgIHRlbXAgPSBlbFxuICAgICAgcmV0dXJuIHNpZ25hbCAhPT0gLTFcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNpZ25hbFxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIHRhcmdldCBmcm9tIERPTSB0cmVlLlxuICogSWYgdGhlIHRhcmdldCBpcyBhIGZyYWcgYmxvY2sgdGhlbiBjYWxsIF9yZW1vdmVCbG9ja1xuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUYXJnZXQgKHZtLCB0YXJnZXQsIHByZXNlcnZlQmxvY2sgPSBmYWxzZSkge1xuICBpZiAodGFyZ2V0LmVsZW1lbnQpIHtcbiAgICByZW1vdmVCbG9jayh0YXJnZXQsIHByZXNlcnZlQmxvY2spXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVtb3ZlRWxlbWVudCh0YXJnZXQpXG4gIH1cbiAgaWYgKHRhcmdldC5fdm0pIHtcbiAgICB0YXJnZXQuX3ZtLiRlbWl0KCdob29rOmRlc3Ryb3llZCcpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBjZXJ0YWluIGVsZW1lbnQuXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCAodGFyZ2V0KSB7XG4gIGNvbnN0IHBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlXG5cbiAgaWYgKHBhcmVudCkge1xuICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBmcmFnIGJsb2NrLlxuICogVGhlIHNlY29uZCBwYXJhbSBkZWNpZGVzIHdoZXRoZXIgdGhlIGJsb2NrIHNlbGYgc2hvdWxkIGJlIHJlbW92ZWQgdG9vLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gIGZyYWdCbG9ja1xuICogQHBhcmFtICB7Qm9vbGVhbn0gcHJlc2VydmVCbG9jaz1mYWxzZVxuICovXG5mdW5jdGlvbiByZW1vdmVCbG9jayAoZnJhZ0Jsb2NrLCBwcmVzZXJ2ZUJsb2NrID0gZmFsc2UpIHtcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgbGV0IGVsID0gZnJhZ0Jsb2NrLnN0YXJ0Lm5leHRTaWJsaW5nXG5cbiAgd2hpbGUgKGVsICYmIGVsICE9PSBmcmFnQmxvY2suZW5kKSB7XG4gICAgcmVzdWx0LnB1c2goZWwpXG4gICAgZWwgPSBlbC5uZXh0U2libGluZ1xuICB9XG5cbiAgaWYgKCFwcmVzZXJ2ZUJsb2NrKSB7XG4gICAgcmVtb3ZlRWxlbWVudChmcmFnQmxvY2suc3RhcnQpXG4gIH1cbiAgcmVzdWx0LmZvckVhY2goKGVsKSA9PiB7XG4gICAgcmVtb3ZlRWxlbWVudChlbClcbiAgfSlcbiAgaWYgKCFwcmVzZXJ2ZUJsb2NrKSB7XG4gICAgcmVtb3ZlRWxlbWVudChmcmFnQmxvY2suZW5kKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVmlld01vZGVsIHRlbXBsYXRlIHBhcnNlciAmIGRhdGEtYmluZGluZyBwcm9jZXNzXG4gKi9cblxuaW1wb3J0IHtcbiAgZXh0ZW5kLFxuICBpc09iamVjdCxcbiAgYmluZFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuaW1wb3J0IHtcbiAgaW5pdERhdGEsXG4gIGluaXRDb21wdXRlZFxufSBmcm9tICcuLi9jb3JlL3N0YXRlJ1xuaW1wb3J0IHtcbiAgYmluZEVsZW1lbnQsXG4gIHNldElkLFxuICBiaW5kU3ViVm0sXG4gIGJpbmRTdWJWbUFmdGVySW5pdGlhbGl6ZWQsXG4gIGFwcGx5TmFpdHZlQ29tcG9uZW50T3B0aW9ucyxcbiAgd2F0Y2hcbn0gZnJvbSAnLi9kaXJlY3RpdmUnXG5pbXBvcnQge1xuICBjcmVhdGVCbG9jayxcbiAgY3JlYXRlQm9keSxcbiAgY3JlYXRlRWxlbWVudCxcbiAgYXR0YWNoVGFyZ2V0LFxuICBtb3ZlVGFyZ2V0LFxuICByZW1vdmVUYXJnZXRcbn0gZnJvbSAnLi9kb20taGVscGVyJ1xuXG4vKipcbiAqIGJ1aWxkKClcbiAqICAgY29tcGlsZSh0ZW1wbGF0ZSwgcGFyZW50Tm9kZSlcbiAqICAgICBpZiAodHlwZSBpcyBjb250ZW50KSBjcmVhdGUgY29udGVudE5vZGVcbiAqICAgICBlbHNlIGlmIChkaXJzIGhhdmUgdi1mb3IpIGZvcmVhY2ggLT4gY3JlYXRlIGNvbnRleHRcbiAqICAgICAgIC0+IGNvbXBpbGUodGVtcGxhdGVXaXRob3V0Rm9yLCBwYXJlbnROb2RlKTogZGlmZihsaXN0KSBvbmNoYW5nZVxuICogICAgIGVsc2UgaWYgKGRpcnMgaGF2ZSB2LWlmKSBhc3NlcnRcbiAqICAgICAgIC0+IGNvbXBpbGUodGVtcGxhdGVXaXRob3V0SWYsIHBhcmVudE5vZGUpOiB0b2dnbGUoc2hvd24pIG9uY2hhbmdlXG4gKiAgICAgZWxzZSBpZiAodHlwZSBpcyBkeW5hbWljKVxuICogICAgICAgLT4gY29tcGlsZSh0ZW1wbGF0ZVdpdGhvdXREeW5hbWljVHlwZSwgcGFyZW50Tm9kZSk6IHdhdGNoKHR5cGUpIG9uY2hhbmdlXG4gKiAgICAgZWxzZSBpZiAodHlwZSBpcyBjdXN0b20pXG4gKiAgICAgICBhZGRDaGlsZFZtKHZtLCBwYXJlbnRWbSlcbiAqICAgICAgIGJ1aWxkKGV4dGVybmFsRGlycylcbiAqICAgICAgIGZvcmVhY2ggY2hpbGROb2RlcyAtPiBjb21waWxlKGNoaWxkTm9kZSwgdGVtcGxhdGUpXG4gKiAgICAgZWxzZSBpZiAodHlwZSBpcyBuYXRpdmUpXG4gKiAgICAgICBzZXQoZGlycyk6IHVwZGF0ZShpZC9hdHRyL3N0eWxlL2NsYXNzKSBvbmNoYW5nZVxuICogICAgICAgYXBwZW5kKHRlbXBsYXRlLCBwYXJlbnROb2RlKVxuICogICAgICAgZm9yZWFjaCBjaGlsZE5vZGVzIC0+IGNvbXBpbGUoY2hpbGROb2RlLCB0ZW1wbGF0ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkICh2bSkge1xuICBjb25zdCBvcHQgPSB2bS5fb3B0aW9ucyB8fCB7fVxuICBjb25zdCB0ZW1wbGF0ZSA9IG9wdC50ZW1wbGF0ZSB8fCB7fVxuXG4gIGlmIChvcHQucmVwbGFjZSkge1xuICAgIGlmICh0ZW1wbGF0ZS5jaGlsZHJlbiAmJiB0ZW1wbGF0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbXBpbGUodm0sIHRlbXBsYXRlLmNoaWxkcmVuWzBdLCB2bS5fcGFyZW50RWwpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZSh2bSwgdGVtcGxhdGUuY2hpbGRyZW4sIHZtLl9wYXJlbnRFbClcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgY29tcGlsZSh2bSwgdGVtcGxhdGUsIHZtLl9wYXJlbnRFbClcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIFwicmVhZHlcIiBsaWZlY3ljbGUgaW4gVm0oJHt2bS5fdHlwZX0pYClcbiAgdm0uJGVtaXQoJ2hvb2s6cmVhZHknKVxuICB2bS5fcmVhZHkgPSB0cnVlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgZWxlbWVudHMgYnkgY2hpbGQgb3IgY2hpbGRyZW4gYW5kIGFwcGVuZCB0byBwYXJlbnQgZWxlbWVudHMuXG4gKiBSb290IGVsZW1lbnQgaW5mbyB3b3VsZCBiZSBtZXJnZWQgaWYgaGFzLiBUaGUgZmlyc3QgYXJndW1lbnQgbWF5IGJlIGFuIGFycmF5XG4gKiBpZiB0aGUgcm9vdCBlbGVtZW50IHdpdGggb3B0aW9ucy5yZXBsYWNlIGhhcyBub3Qgb25seSBvbmUgY2hpbGQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8YXJyYXl9IHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgIGRlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICBtZXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUgKHZtLCB0YXJnZXQsIGRlc3QsIG1ldGEpIHtcbiAgY29uc3QgYXBwID0gdm0uX2FwcCB8fCB7fVxuXG4gIGlmIChhcHAubGFzdFNpZ25hbCA9PT0gLTEpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh0YXJnZXQuYXR0ciAmJiB0YXJnZXQuYXR0ci5oYXNPd25Qcm9wZXJ0eSgnc3RhdGljJykpIHtcbiAgICB2bS5fc3RhdGljID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHRhcmdldElzRnJhZ21lbnQodGFyZ2V0KSkge1xuICAgIGNvbXBpbGVGcmFnbWVudCh2bSwgdGFyZ2V0LCBkZXN0LCBtZXRhKVxuICAgIHJldHVyblxuICB9XG4gIG1ldGEgPSBtZXRhIHx8IHt9XG4gIGlmICh0YXJnZXRJc0NvbnRlbnQodGFyZ2V0KSkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgXCJjb250ZW50XCIgYmxvY2sgYnknLCB0YXJnZXQpXG4gICAgdm0uX2NvbnRlbnQgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh0YXJnZXROZWVkQ2hlY2tSZXBlYXQodGFyZ2V0LCBtZXRhKSkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgXCJyZXBlYXRcIiBsb2dpYyBieScsIHRhcmdldClcbiAgICBpZiAoZGVzdC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFRoZSByb290IGVsZW1lbnQgZG9lc1xcJ3Qgc3VwcG9ydCBgcmVwZWF0YCBkaXJlY3RpdmUhJylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb21waWxlUmVwZWF0KHZtLCB0YXJnZXQsIGRlc3QpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmICh0YXJnZXROZWVkQ2hlY2tTaG93bih0YXJnZXQsIG1ldGEpKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSBcImlmXCIgbG9naWMgYnknLCB0YXJnZXQpXG4gICAgaWYgKGRlc3QudHlwZSA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBUaGUgcm9vdCBlbGVtZW50IGRvZXNcXCd0IHN1cHBvcnQgYGlmYCBkaXJlY3RpdmUhJylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb21waWxlU2hvd24odm0sIHRhcmdldCwgZGVzdCwgbWV0YSlcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgdHlwZUdldHRlciA9IG1ldGEudHlwZSB8fCB0YXJnZXQudHlwZVxuICBpZiAodGFyZ2V0TmVlZENoZWNrVHlwZSh0eXBlR2V0dGVyLCBtZXRhKSkge1xuICAgIGNvbXBpbGVUeXBlKHZtLCB0YXJnZXQsIGRlc3QsIHR5cGVHZXR0ZXIsIG1ldGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgdHlwZSA9IHR5cGVHZXR0ZXJcbiAgY29uc3QgY29tcG9uZW50ID0gdGFyZ2V0SXNDb21wb3NlZCh2bSwgdGFyZ2V0LCB0eXBlKVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSBjb21wb3NlZCBjb21wb25lbnQgYnknLCB0YXJnZXQpXG4gICAgY29tcGlsZUN1c3RvbUNvbXBvbmVudCh2bSwgY29tcG9uZW50LCB0YXJnZXQsIGRlc3QsIHR5cGUsIG1ldGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSBuYXRpdmUgY29tcG9uZW50IGJ5JywgdGFyZ2V0KVxuICBjb21waWxlTmF0aXZlQ29tcG9uZW50KHZtLCB0YXJnZXQsIGRlc3QsIHR5cGUpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGFyZ2V0IGlzIGEgZnJhZ21lbnQgKGFuIGFycmF5KS5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICB0YXJnZXRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldElzRnJhZ21lbnQgKHRhcmdldCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGFyZ2V0IHR5cGUgaXMgY29udGVudC9zbG90LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gIHRhcmdldFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0SXNDb250ZW50ICh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC50eXBlID09PSAnY29udGVudCcgfHwgdGFyZ2V0LnR5cGUgPT09ICdzbG90J1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCBuZWVkIHRvIGNvbXBpbGUgYnkgYSBsaXN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gIHRhcmdldFxuICogQHBhcmFtICB7b2JqZWN0fSAgbWV0YVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmVlZENoZWNrUmVwZWF0ICh0YXJnZXQsIG1ldGEpIHtcbiAgcmV0dXJuICFtZXRhLmhhc093blByb3BlcnR5KCdyZXBlYXQnKSAmJiB0YXJnZXQucmVwZWF0XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGFyZ2V0IG5lZWQgdG8gY29tcGlsZSBieSBhIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9ICBtZXRhXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXROZWVkQ2hlY2tTaG93biAodGFyZ2V0LCBtZXRhKSB7XG4gIHJldHVybiAhbWV0YS5oYXNPd25Qcm9wZXJ0eSgnc2hvd24nKSAmJiB0YXJnZXQuc2hvd25cbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0YXJnZXQgbmVlZCB0byBjb21waWxlIGJ5IGEgZHluYW1pYyB0eXBlLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ3xmdW5jdGlvbn0gdHlwZUdldHRlclxuICogQHBhcmFtICB7b2JqZWN0fSAgICAgICAgICBtZXRhXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXROZWVkQ2hlY2tUeXBlICh0eXBlR2V0dGVyLCBtZXRhKSB7XG4gIHJldHVybiAodHlwZW9mIHR5cGVHZXR0ZXIgPT09ICdmdW5jdGlvbicpICYmICFtZXRhLmhhc093blByb3BlcnR5KCd0eXBlJylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGtpbmQgb2YgY29tcG9uZW50IGlzIGNvbXBvc2VkLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldElzQ29tcG9zZWQgKHZtLCB0YXJnZXQsIHR5cGUpIHtcbiAgbGV0IGNvbXBvbmVudFxuICBpZiAodm0uX2FwcCAmJiB2bS5fYXBwLmN1c3RvbUNvbXBvbmVudE1hcCkge1xuICAgIGNvbXBvbmVudCA9IHZtLl9hcHAuY3VzdG9tQ29tcG9uZW50TWFwW3R5cGVdXG4gIH1cbiAgaWYgKHZtLl9vcHRpb25zICYmIHZtLl9vcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICBjb21wb25lbnQgPSB2bS5fb3B0aW9ucy5jb21wb25lbnRzW3R5cGVdXG4gIH1cbiAgaWYgKHRhcmdldC5jb21wb25lbnQpIHtcbiAgICBjb21wb25lbnQgPSBjb21wb25lbnQgfHwge31cbiAgfVxuICByZXR1cm4gY29tcG9uZW50XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGxpc3Qgb2YgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICogQHBhcmFtIHtvYmplY3R9IG1ldGFcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUZyYWdtZW50ICh2bSwgdGFyZ2V0LCBkZXN0LCBtZXRhKSB7XG4gIGNvbnN0IGZyYWdCbG9jayA9IGNyZWF0ZUJsb2NrKHZtLCBkZXN0KVxuICB0YXJnZXQuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICBjb21waWxlKHZtLCBjaGlsZCwgZnJhZ0Jsb2NrLCBtZXRhKVxuICB9KVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSB0YXJnZXQgd2l0aCByZXBlYXQgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVSZXBlYXQgKHZtLCB0YXJnZXQsIGRlc3QpIHtcbiAgY29uc3QgcmVwZWF0ID0gdGFyZ2V0LnJlcGVhdFxuICBjb25zdCBvbGRTdHlsZSA9IHR5cGVvZiByZXBlYXQgPT09ICdmdW5jdGlvbidcbiAgbGV0IGdldHRlciA9IHJlcGVhdC5nZXR0ZXIgfHwgcmVwZWF0LmV4cHJlc3Npb24gfHwgcmVwZWF0XG4gIGlmICh0eXBlb2YgZ2V0dGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZ2V0dGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW10gfVxuICB9XG4gIGNvbnN0IGtleSA9IHJlcGVhdC5rZXkgfHwgJyRpbmRleCdcbiAgY29uc3QgdmFsdWUgPSByZXBlYXQudmFsdWUgfHwgJyR2YWx1ZSdcbiAgY29uc3QgdHJhY2tCeSA9IHJlcGVhdC50cmFja0J5IHx8IHRhcmdldC50cmFja0J5IHx8XG4gICAgKHRhcmdldC5hdHRyICYmIHRhcmdldC5hdHRyLnRyYWNrQnkpXG5cbiAgY29uc3QgZnJhZ0Jsb2NrID0gY3JlYXRlQmxvY2sodm0sIGRlc3QpXG4gIGZyYWdCbG9jay5jaGlsZHJlbiA9IFtdXG4gIGZyYWdCbG9jay5kYXRhID0gW11cbiAgZnJhZ0Jsb2NrLnZtcyA9IFtdXG5cbiAgYmluZFJlcGVhdCh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIHsgZ2V0dGVyLCBrZXksIHZhbHVlLCB0cmFja0J5LCBvbGRTdHlsZSB9KVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSB0YXJnZXQgd2l0aCBpZiBkaXJlY3RpdmUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVTaG93biAodm0sIHRhcmdldCwgZGVzdCwgbWV0YSkge1xuICBjb25zdCBuZXdNZXRhID0geyBzaG93bjogdHJ1ZSB9XG4gIGNvbnN0IGZyYWdCbG9jayA9IGNyZWF0ZUJsb2NrKHZtLCBkZXN0KVxuXG4gIGlmIChkZXN0LmVsZW1lbnQgJiYgZGVzdC5jaGlsZHJlbikge1xuICAgIGRlc3QuY2hpbGRyZW4ucHVzaChmcmFnQmxvY2spXG4gIH1cblxuICBpZiAobWV0YS5yZXBlYXQpIHtcbiAgICBuZXdNZXRhLnJlcGVhdCA9IG1ldGEucmVwZWF0XG4gIH1cblxuICBiaW5kU2hvd24odm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBuZXdNZXRhKVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSB0YXJnZXQgd2l0aCBkeW5hbWljIGNvbXBvbmVudCB0eXBlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9ICAgZGVzdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHlwZUdldHRlclxuICovXG5mdW5jdGlvbiBjb21waWxlVHlwZSAodm0sIHRhcmdldCwgZGVzdCwgdHlwZUdldHRlciwgbWV0YSkge1xuICBjb25zdCB0eXBlID0gdHlwZUdldHRlci5jYWxsKHZtKVxuICBjb25zdCBuZXdNZXRhID0gZXh0ZW5kKHsgdHlwZSB9LCBtZXRhKVxuICBjb25zdCBmcmFnQmxvY2sgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcblxuICBpZiAoZGVzdC5lbGVtZW50ICYmIGRlc3QuY2hpbGRyZW4pIHtcbiAgICBkZXN0LmNoaWxkcmVuLnB1c2goZnJhZ0Jsb2NrKVxuICB9XG5cbiAgd2F0Y2godm0sIHR5cGVHZXR0ZXIsICh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IG5ld01ldGEgPSBleHRlbmQoeyB0eXBlOiB2YWx1ZSB9LCBtZXRhKVxuICAgIHJlbW92ZVRhcmdldCh2bSwgZnJhZ0Jsb2NrLCB0cnVlKVxuICAgIGNvbXBpbGUodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBuZXdNZXRhKVxuICB9KVxuXG4gIGNvbXBpbGUodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBuZXdNZXRhKVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBjb21wb3NlZCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDdXN0b21Db21wb25lbnQgKHZtLCBjb21wb25lbnQsIHRhcmdldCwgZGVzdCwgdHlwZSwgbWV0YSkge1xuICBjb25zdCBDdG9yID0gdm0uY29uc3RydWN0b3JcbiAgY29uc3Qgc3ViVm0gPSBuZXcgQ3Rvcih0eXBlLCBjb21wb25lbnQsIHZtLCBkZXN0LCB1bmRlZmluZWQsIHtcbiAgICAnaG9vazppbml0JzogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHZtLl9zdGF0aWMpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljID0gdm0uX3N0YXRpY1xuICAgICAgfVxuICAgICAgc2V0SWQodm0sIG51bGwsIHRhcmdldC5pZCwgdGhpcylcbiAgICAgIC8vIGJpbmQgdGVtcGxhdGUgZWFybGllciBiZWNhdXNlIG9mIGxpZmVjeWNsZSBpc3N1ZXNcbiAgICAgIHRoaXMuX2V4dGVybmFsQmluZGluZyA9IHtcbiAgICAgICAgcGFyZW50OiB2bSxcbiAgICAgICAgdGVtcGxhdGU6IHRhcmdldFxuICAgICAgfVxuICAgIH0sXG4gICAgJ2hvb2s6Y3JlYXRlZCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGJpbmRTdWJWbSh2bSwgdGhpcywgdGFyZ2V0LCBtZXRhLnJlcGVhdClcbiAgICB9LFxuICAgICdob29rOnJlYWR5JzogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgY29tcGlsZUNoaWxkcmVuKHZtLCB0YXJnZXQsIHRoaXMuX2NvbnRlbnQpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICBiaW5kU3ViVm1BZnRlckluaXRpYWxpemVkKHZtLCBzdWJWbSwgdGFyZ2V0LCBkZXN0KVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGVsZW1lbnQgZnJvbSB0ZW1wbGF0ZSBhbmQgYXR0YWNoIHRvIHRoZSBkZXN0IGlmIG5lZWRlZC5cbiAqIFRoZSB0aW1lIHRvIGF0dGFjaCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1vZGUgc3RhdHVzIGlzIG5vZGUgb3IgdHJlZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGVtcGxhdGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjb21waWxlTmF0aXZlQ29tcG9uZW50ICh2bSwgdGVtcGxhdGUsIGRlc3QsIHR5cGUpIHtcbiAgYXBwbHlOYWl0dmVDb21wb25lbnRPcHRpb25zKHRlbXBsYXRlKVxuXG4gIGxldCBlbGVtZW50XG4gIGlmIChkZXN0LnJlZiA9PT0gJ19kb2N1bWVudEVsZW1lbnQnKSB7XG4gICAgLy8gaWYgaXRzIHBhcmVudCBpcyBkb2N1bWVudEVsZW1lbnQgdGhlbiBpdCdzIGEgYm9keVxuICAgIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGNvbXBpbGUgdG8gY3JlYXRlIGJvZHkgZm9yICR7dHlwZX1gKVxuICAgIGVsZW1lbnQgPSBjcmVhdGVCb2R5KHZtLCB0eXBlKVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGNvbXBpbGUgdG8gY3JlYXRlIGVsZW1lbnQgZm9yICR7dHlwZX1gKVxuICAgIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHZtLCB0eXBlKVxuICB9XG5cbiAgaWYgKCF2bS5fcm9vdEVsKSB7XG4gICAgdm0uX3Jvb3RFbCA9IGVsZW1lbnRcbiAgICAvLyBiaW5kIGV2ZW50IGVhcmxpZXIgYmVjYXVzZSBvZiBsaWZlY3ljbGUgaXNzdWVzXG4gICAgY29uc3QgYmluZGluZyA9IHZtLl9leHRlcm5hbEJpbmRpbmcgfHwge31cbiAgICBjb25zdCB0YXJnZXQgPSBiaW5kaW5nLnRlbXBsYXRlXG4gICAgY29uc3QgcGFyZW50Vm0gPSBiaW5kaW5nLnBhcmVudFxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV2ZW50cyAmJiBwYXJlbnRWbSAmJiBlbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gdGFyZ2V0LmV2ZW50cykge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gcGFyZW50Vm1bdGFyZ2V0LmV2ZW50c1t0eXBlXV1cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50KHR5cGUsIGJpbmQoaGFuZGxlciwgcGFyZW50Vm0pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmluZEVsZW1lbnQodm0sIGVsZW1lbnQsIHRlbXBsYXRlKVxuXG4gIGlmICh0ZW1wbGF0ZS5hdHRyICYmIHRlbXBsYXRlLmF0dHIuYXBwZW5kKSB7IC8vIGJhY2t3YXJkLCBhcHBlbmQgcHJvcCBpbiBhdHRyXG4gICAgdGVtcGxhdGUuYXBwZW5kID0gdGVtcGxhdGUuYXR0ci5hcHBlbmRcbiAgfVxuXG4gIGlmICh0ZW1wbGF0ZS5hcHBlbmQpIHsgLy8gZ2l2ZSB0aGUgYXBwZW5kIGF0dHJpYnV0ZSBmb3IgaW9zIGFkYXB0YXRpb25cbiAgICBlbGVtZW50LmF0dHIgPSBlbGVtZW50LmF0dHIgfHwge31cbiAgICBlbGVtZW50LmF0dHIuYXBwZW5kID0gdGVtcGxhdGUuYXBwZW5kXG4gIH1cblxuICBjb25zdCB0cmVlTW9kZSA9IHRlbXBsYXRlLmFwcGVuZCA9PT0gJ3RyZWUnXG4gIGNvbnN0IGFwcCA9IHZtLl9hcHAgfHwge31cbiAgaWYgKGFwcC5sYXN0U2lnbmFsICE9PSAtMSAmJiAhdHJlZU1vZGUpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGFwcGVuZCBzaW5nbGUgbm9kZSBmb3InLCBlbGVtZW50KVxuICAgIGFwcC5sYXN0U2lnbmFsID0gYXR0YWNoVGFyZ2V0KHZtLCBlbGVtZW50LCBkZXN0KVxuICB9XG4gIGlmIChhcHAubGFzdFNpZ25hbCAhPT0gLTEpIHtcbiAgICBjb21waWxlQ2hpbGRyZW4odm0sIHRlbXBsYXRlLCBlbGVtZW50KVxuICB9XG4gIGlmIChhcHAubGFzdFNpZ25hbCAhPT0gLTEgJiYgdHJlZU1vZGUpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGFwcGVuZCB3aG9sZSB0cmVlIGZvcicsIGVsZW1lbnQpXG4gICAgYXBwLmxhc3RTaWduYWwgPSBhdHRhY2hUYXJnZXQodm0sIGVsZW1lbnQsIGRlc3QpXG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYWxsIGNoaWxkcmVuIHRvIGEgY2VydGFpbiBwYXJlbnQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGVtcGxhdGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbiAodm0sIHRlbXBsYXRlLCBkZXN0KSB7XG4gIGNvbnN0IGFwcCA9IHZtLl9hcHAgfHwge31cbiAgY29uc3QgY2hpbGRyZW4gPSB0ZW1wbGF0ZS5jaGlsZHJlblxuICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiB7XG4gICAgICBjb21waWxlKHZtLCBjaGlsZCwgZGVzdClcbiAgICAgIHJldHVybiBhcHAubGFzdFNpZ25hbCAhPT0gLTFcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogV2F0Y2ggdGhlIGxpc3QgdXBkYXRlIGFuZCByZWZyZXNoIHRoZSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcmFnQmxvY2sge3ZtcywgZGF0YSwgY2hpbGRyZW59XG4gKiBAcGFyYW0ge29iamVjdH0gaW5mbyAgICAgIHtnZXR0ZXIsIGtleSwgdmFsdWUsIHRyYWNrQnksIG9sZFN0eWxlfVxuICovXG5mdW5jdGlvbiBiaW5kUmVwZWF0ICh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIGluZm8pIHtcbiAgY29uc3Qgdm1zID0gZnJhZ0Jsb2NrLnZtc1xuICBjb25zdCBjaGlsZHJlbiA9IGZyYWdCbG9jay5jaGlsZHJlblxuICBjb25zdCB7IGdldHRlciwgdHJhY2tCeSwgb2xkU3R5bGUgfSA9IGluZm9cbiAgY29uc3Qga2V5TmFtZSA9IGluZm8ua2V5XG4gIGNvbnN0IHZhbHVlTmFtZSA9IGluZm8udmFsdWVcblxuICBmdW5jdGlvbiBjb21waWxlSXRlbSAoaXRlbSwgaW5kZXgsIGNvbnRleHQpIHtcbiAgICBsZXQgbWVyZ2VkRGF0YVxuICAgIGlmIChvbGRTdHlsZSkge1xuICAgICAgbWVyZ2VkRGF0YSA9IGl0ZW1cbiAgICAgIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBtZXJnZWREYXRhW2tleU5hbWVdID0gaW5kZXhcbiAgICAgICAgaWYgKCFtZXJnZWREYXRhLmhhc093blByb3BlcnR5KCdJTkRFWCcpKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lcmdlZERhdGEsICdJTkRFWCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gXCJJTkRFWFwiIGluIHJlcGVhdCBpcyBkZXByZWNhdGVkLCAnICtcbiAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBcIiRpbmRleFwiIGluc3RlYWQnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIEVhY2ggbGlzdCBpdGVtIG11c3QgYmUgYW4gb2JqZWN0IGluIG9sZC1zdHlsZSByZXBlYXQsICdcbiAgICAgICAgICArICdwbGVhc2UgdXNlIGByZXBlYXQ9e3t2IGluIGxpc3R9fWAgaW5zdGVhZC4nKVxuICAgICAgICBtZXJnZWREYXRhID0ge31cbiAgICAgICAgbWVyZ2VkRGF0YVtrZXlOYW1lXSA9IGluZGV4XG4gICAgICAgIG1lcmdlZERhdGFbdmFsdWVOYW1lXSA9IGl0ZW1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtZXJnZWREYXRhID0ge31cbiAgICAgIG1lcmdlZERhdGFba2V5TmFtZV0gPSBpbmRleFxuICAgICAgbWVyZ2VkRGF0YVt2YWx1ZU5hbWVdID0gaXRlbVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZXh0ID0gbWVyZ2VDb250ZXh0KGNvbnRleHQsIG1lcmdlZERhdGEpXG4gICAgdm1zLnB1c2gobmV3Q29udGV4dClcbiAgICBjb21waWxlKG5ld0NvbnRleHQsIHRhcmdldCwgZnJhZ0Jsb2NrLCB7IHJlcGVhdDogaXRlbSB9KVxuICB9XG5cbiAgY29uc3QgbGlzdCA9IHdhdGNoQmxvY2sodm0sIGZyYWdCbG9jaywgZ2V0dGVyLCAncmVwZWF0JyxcbiAgICAoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gdGhlIFwicmVwZWF0XCIgaXRlbSBoYXMgY2hhbmdlZCcsIGRhdGEpXG4gICAgICBpZiAoIWZyYWdCbG9jayB8fCAhZGF0YSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBjaGlsZHJlbi5zbGljZSgpXG4gICAgICBjb25zdCBvbGRWbXMgPSB2bXMuc2xpY2UoKVxuICAgICAgY29uc3Qgb2xkRGF0YSA9IGZyYWdCbG9jay5kYXRhLnNsaWNlKClcbiAgICAgIC8vIDEuIGNvbGxlY3QgYWxsIG5ldyByZWZzIHRyYWNrIGJ5XG4gICAgICBjb25zdCB0cmFja01hcCA9IHt9XG4gICAgICBjb25zdCByZXVzZWRNYXAgPSB7fVxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0cmFja0J5ID8gaXRlbVt0cmFja0J5XSA6IChvbGRTdHlsZSA/IGl0ZW1ba2V5TmFtZV0gOiBpbmRleClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tNYXBba2V5XSA9IGl0ZW1cbiAgICAgIH0pXG5cbiAgICAgIC8vIDIuIHJlbW92ZSB1bnVzZWQgZWxlbWVudCBmb3JlYWNoIG9sZCBpdGVtXG4gICAgICBjb25zdCByZXVzZWRMaXN0ID0gW11cbiAgICAgIG9sZERhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJhY2tCeSA/IGl0ZW1bdHJhY2tCeV0gOiAob2xkU3R5bGUgPyBpdGVtW2tleU5hbWVdIDogaW5kZXgpXG4gICAgICAgIGlmICh0cmFja01hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgcmV1c2VkTWFwW2tleV0gPSB7XG4gICAgICAgICAgICBpdGVtLCBpbmRleCwga2V5LFxuICAgICAgICAgICAgdGFyZ2V0OiBvbGRDaGlsZHJlbltpbmRleF0sXG4gICAgICAgICAgICB2bTogb2xkVm1zW2luZGV4XVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXVzZWRMaXN0LnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZW1vdmVUYXJnZXQodm0sIG9sZENoaWxkcmVuW2luZGV4XSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gMy4gY3JlYXRlIG5ldyBlbGVtZW50IGZvcmVhY2ggbmV3IGl0ZW1cbiAgICAgIGNoaWxkcmVuLmxlbmd0aCA9IDBcbiAgICAgIHZtcy5sZW5ndGggPSAwXG4gICAgICBmcmFnQmxvY2suZGF0YSA9IGRhdGEuc2xpY2UoKVxuICAgICAgZnJhZ0Jsb2NrLnVwZGF0ZU1hcmsgPSBmcmFnQmxvY2suc3RhcnRcblxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0cmFja0J5ID8gaXRlbVt0cmFja0J5XSA6IChvbGRTdHlsZSA/IGl0ZW1ba2V5TmFtZV0gOiBpbmRleClcbiAgICAgICAgY29uc3QgcmV1c2VkID0gcmV1c2VkTWFwW2tleV1cbiAgICAgICAgaWYgKHJldXNlZCkge1xuICAgICAgICAgIGlmIChyZXVzZWQuaXRlbSA9PT0gcmV1c2VkTGlzdFswXSkge1xuICAgICAgICAgICAgcmV1c2VkTGlzdC5zaGlmdCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV1c2VkTGlzdC4kcmVtb3ZlKHJldXNlZC5pdGVtKVxuICAgICAgICAgICAgbW92ZVRhcmdldCh2bSwgcmV1c2VkLnRhcmdldCwgZnJhZ0Jsb2NrLnVwZGF0ZU1hcmssIHRydWUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNoaWxkcmVuLnB1c2gocmV1c2VkLnRhcmdldClcbiAgICAgICAgICB2bXMucHVzaChyZXVzZWQudm0pXG4gICAgICAgICAgaWYgKG9sZFN0eWxlKSB7XG4gICAgICAgICAgICByZXVzZWQudm0gPSBpdGVtXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV1c2VkLnZtW3ZhbHVlTmFtZV0gPSBpdGVtXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldXNlZC52bVtrZXlOYW1lXSA9IGluZGV4XG4gICAgICAgICAgZnJhZ0Jsb2NrLnVwZGF0ZU1hcmsgPSByZXVzZWQudGFyZ2V0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29tcGlsZUl0ZW0oaXRlbSwgaW5kZXgsIHZtKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBkZWxldGUgZnJhZ0Jsb2NrLnVwZGF0ZU1hcmtcbiAgICB9XG4gIClcblxuICBmcmFnQmxvY2suZGF0YSA9IGxpc3Quc2xpY2UoMClcbiAgbGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGNvbXBpbGVJdGVtKGl0ZW0sIGluZGV4LCB2bSlcbiAgfSlcbn1cblxuLyoqXG4gKiBXYXRjaCB0aGUgZGlzcGxheSB1cGRhdGUgYW5kIGFkZC9yZW1vdmUgdGhlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSAge29iamVjdH0gZnJhZ0Jsb2NrXG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gYmluZFNob3duICh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIG1ldGEpIHtcbiAgY29uc3QgZGlzcGxheSA9IHdhdGNoQmxvY2sodm0sIGZyYWdCbG9jaywgdGFyZ2V0LnNob3duLCAnc2hvd24nLFxuICAgIChkaXNwbGF5KSA9PiB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSB0aGUgXCJpZlwiIGl0ZW0gd2FzIGNoYW5nZWQnLCBkaXNwbGF5KVxuXG4gICAgICBpZiAoIWZyYWdCbG9jayB8fCAhIWZyYWdCbG9jay5kaXNwbGF5ID09PSAhIWRpc3BsYXkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBmcmFnQmxvY2suZGlzcGxheSA9ICEhZGlzcGxheVxuICAgICAgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgY29tcGlsZSh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIG1ldGEpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVtb3ZlVGFyZ2V0KHZtLCBmcmFnQmxvY2ssIHRydWUpXG4gICAgICB9XG4gICAgfVxuICApXG5cbiAgZnJhZ0Jsb2NrLmRpc3BsYXkgPSAhIWRpc3BsYXlcbiAgaWYgKGRpc3BsYXkpIHtcbiAgICBjb21waWxlKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbWV0YSlcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoIGNhbGMgdmFsdWUgY2hhbmdlcyBhbmQgYXBwZW5kIGNlcnRhaW4gdHlwZSBhY3Rpb24gdG8gZGlmZmVyLlxuICogSXQgaXMgdXNlZCBmb3IgaWYgb3IgcmVwZWF0IGRhdGEtYmluZGluZyBnZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgIGZyYWdCbG9ja1xuICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGNcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gaGFuZGxlclxuICogQHJldHVybiB7YW55fSAgICAgIGluaXQgdmFsdWUgb2YgY2FsY1xuICovXG5mdW5jdGlvbiB3YXRjaEJsb2NrICh2bSwgZnJhZ0Jsb2NrLCBjYWxjLCB0eXBlLCBoYW5kbGVyKSB7XG4gIGNvbnN0IGRpZmZlciA9IHZtICYmIHZtLl9hcHAgJiYgdm0uX2FwcC5kaWZmZXJcbiAgY29uc3QgY29uZmlnID0ge31cbiAgY29uc3QgZGVwdGggPSAoZnJhZ0Jsb2NrLmVsZW1lbnQuZGVwdGggfHwgMCkgKyAxXG5cbiAgcmV0dXJuIHdhdGNoKHZtLCBjYWxjLCAodmFsdWUpID0+IHtcbiAgICBjb25maWcubGF0ZXN0VmFsdWUgPSB2YWx1ZVxuICAgIGlmIChkaWZmZXIgJiYgIWNvbmZpZy5yZWNvcmRlZCkge1xuICAgICAgZGlmZmVyLmFwcGVuZCh0eXBlLCBkZXB0aCwgZnJhZ0Jsb2NrLmJsb2NrSWQsICgpID0+IHtcbiAgICAgICAgY29uc3QgbGF0ZXN0VmFsdWUgPSBjb25maWcubGF0ZXN0VmFsdWVcbiAgICAgICAgaGFuZGxlcihsYXRlc3RWYWx1ZSlcbiAgICAgICAgY29uZmlnLnJlY29yZGVkID0gZmFsc2VcbiAgICAgICAgY29uZmlnLmxhdGVzdFZhbHVlID0gdW5kZWZpbmVkXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25maWcucmVjb3JkZWQgPSB0cnVlXG4gIH0pXG59XG5cbi8qKlxuICogQ2xvbmUgYSBjb250ZXh0IGFuZCBtZXJnZSBjZXJ0YWluIGRhdGEuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBtZXJnZWREYXRhXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29udGV4dCAoY29udGV4dCwgbWVyZ2VkRGF0YSkge1xuICBjb25zdCBuZXdDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0KVxuICBuZXdDb250ZXh0Ll9kYXRhID0gbWVyZ2VkRGF0YVxuICBpbml0RGF0YShuZXdDb250ZXh0KVxuICBpbml0Q29tcHV0ZWQobmV3Q29udGV4dClcbiAgbmV3Q29udGV4dC5fcmVhbFBhcmVudCA9IGNvbnRleHRcbiAgaWYgKGNvbnRleHQuX3N0YXRpYykge1xuICAgIG5ld0NvbnRleHQuX3N0YXRpYyA9IGNvbnRleHQuX3N0YXRpY1xuICB9XG4gIHJldHVybiBuZXdDb250ZXh0XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogRXZlcnl0aGluZyBhYm91dCBjb21wb25lbnQgZXZlbnQgd2hpY2ggaW5jbHVkZXMgZXZlbnQgb2JqZWN0LCBldmVudCBsaXN0ZW5lcixcbiAqIGV2ZW50IGVtaXR0ZXIgYW5kIGxpZmVjeWNsZSBob29rcy5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IG9iamVjdCBkZWZpbml0aW9uLiBBbiBldmVudCBvYmplY3QgaGFzIGB0eXBlYCwgYHRpbWVzdGFtcGAgYW5kXG4gKiBgZGV0YWlsYCBmcm9tIHdoaWNoIGEgY29tcG9uZW50IGVtaXQuIFRoZSBldmVudCBvYmplY3QgY291bGQgYmUgZGlzcGF0Y2hlZCB0b1xuICogcGFyZW50cyBvciBicm9hZGNhc3RlZCB0byBjaGlsZHJlbiBleGNlcHQgYHRoaXMuc3RvcCgpYCBpcyBjYWxsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHthbnl9ICAgIGRldGFpbFxuICovXG5mdW5jdGlvbiBFdnQgKHR5cGUsIGRldGFpbCkge1xuICBpZiAoZGV0YWlsIGluc3RhbmNlb2YgRXZ0KSB7XG4gICAgcmV0dXJuIGRldGFpbFxuICB9XG5cbiAgdGhpcy50aW1lc3RhbXAgPSBEYXRlLm5vdygpXG4gIHRoaXMuZGV0YWlsID0gZGV0YWlsXG4gIHRoaXMudHlwZSA9IHR5cGVcblxuICBsZXQgc2hvdWxkU3RvcCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIHN0b3AgZGlzcGF0Y2ggYW5kIGJyb2FkY2FzdFxuICAgKi9cbiAgdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZFN0b3AgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgaWYgaXQgY2FuJ3QgYmUgZGlzcGF0Y2hlZCBvciBicm9hZGNhc3RlZFxuICAgKi9cbiAgdGhpcy5oYXNTdG9wcGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzaG91bGRTdG9wXG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IGJ1dCBub3QgYnJvYWRjYXN0IGRvd24gb3IgZGlzcGF0Y2ggdXAuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge2FueX0gICAgZGV0YWlsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkZW1pdCAodHlwZSwgZGV0YWlsKSB7XG4gIGNvbnN0IGV2ZW50cyA9IHRoaXMuX3ZtRXZlbnRzXG4gIGNvbnN0IGhhbmRsZXJMaXN0ID0gZXZlbnRzW3R5cGVdXG4gIGlmIChoYW5kbGVyTGlzdCkge1xuICAgIGNvbnN0IGV2dCA9IG5ldyBFdnQodHlwZSwgZGV0YWlsKVxuICAgIGhhbmRsZXJMaXN0LmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBldnQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgYW4gZXZlbnQgYW5kIGRpc3BhdGNoIGl0IHVwLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRldGFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gJGRpc3BhdGNoICh0eXBlLCBkZXRhaWwpIHtcbiAgY29uc3QgZXZ0ID0gbmV3IEV2dCh0eXBlLCBkZXRhaWwpXG4gIHRoaXMuJGVtaXQodHlwZSwgZXZ0KVxuXG4gIGlmICghZXZ0Lmhhc1N0b3BwZWQoKSAmJiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50LiRkaXNwYXRjaCkge1xuICAgIHRoaXMuX3BhcmVudC4kZGlzcGF0Y2godHlwZSwgZXZ0KVxuICB9XG59XG5cbi8qKlxuICogRW1pdCBhbiBldmVudCBhbmQgYnJvYWRjYXN0IGl0IGRvd24uXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge2FueX0gICAgZGV0YWlsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkYnJvYWRjYXN0ICh0eXBlLCBkZXRhaWwpIHtcbiAgY29uc3QgZXZ0ID0gbmV3IEV2dCh0eXBlLCBkZXRhaWwpXG4gIHRoaXMuJGVtaXQodHlwZSwgZXZ0KVxuXG4gIGlmICghZXZ0Lmhhc1N0b3BwZWQoKSAmJiB0aGlzLl9jaGlsZHJlblZtcykge1xuICAgIHRoaXMuX2NoaWxkcmVuVm1zLmZvckVhY2goKHN1YlZtKSA9PiB7XG4gICAgICBzdWJWbS4kYnJvYWRjYXN0KHR5cGUsIGV2dClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQWRkIGV2ZW50IGxpc3RlbmVyLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGVcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkb24gKHR5cGUsIGhhbmRsZXIpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZXZlbnRzID0gdGhpcy5fdm1FdmVudHNcbiAgY29uc3QgaGFuZGxlckxpc3QgPSBldmVudHNbdHlwZV0gfHwgW11cbiAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKVxuICBldmVudHNbdHlwZV0gPSBoYW5kbGVyTGlzdFxuXG4gIC8vIGZpeGVkIG9sZCB2ZXJzaW9uIGxpZmVjeWNsZSBkZXNpZ25cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlID09PSAnaG9vazpyZWFkeScgJiYgdGhpcy5fcmVhZHkpIHtcbiAgICB0aGlzLiRlbWl0KCdob29rOnJlYWR5JylcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBldmVudCBsaXN0ZW5lci5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9mZiAodHlwZSwgaGFuZGxlcikge1xuICBpZiAoIXR5cGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBldmVudHMgPSB0aGlzLl92bUV2ZW50c1xuICBpZiAoIWhhbmRsZXIpIHtcbiAgICBkZWxldGUgZXZlbnRzW3R5cGVdXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgaGFuZGxlckxpc3QgPSBldmVudHNbdHlwZV1cbiAgaWYgKCFoYW5kbGVyTGlzdCkge1xuICAgIHJldHVyblxuICB9XG4gIGhhbmRsZXJMaXN0LiRyZW1vdmUoaGFuZGxlcilcbn1cblxuY29uc3QgTElGRV9DWUNMRV9UWVBFUyA9IFsnaW5pdCcsICdjcmVhdGVkJywgJ3JlYWR5JywgJ2Rlc3Ryb3llZCddXG5cbi8qKlxuICogSW5pdCBldmVudHM6XG4gKiAxLiBsaXN0ZW4gYGV2ZW50c2AgaW4gY29tcG9uZW50IG9wdGlvbnMgJiBgZXh0ZXJuYWxFdmVudHNgLlxuICogMi4gYmluZCBsaWZlY3ljbGUgaG9va3MuXG4gKiBAcGFyYW0gIHtWbX0gICAgIHZtXG4gKiBAcGFyYW0gIHtvYmplY3R9IGV4dGVybmFsRXZlbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXZlbnRzICh2bSwgZXh0ZXJuYWxFdmVudHMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHZtLl9vcHRpb25zIHx8IHt9XG4gIGNvbnN0IGV2ZW50cyA9IG9wdGlvbnMuZXZlbnRzIHx8IHt9XG4gIGZvciAoY29uc3QgdHlwZTEgaW4gZXZlbnRzKSB7XG4gICAgdm0uJG9uKHR5cGUxLCBldmVudHNbdHlwZTFdKVxuICB9XG4gIGZvciAoY29uc3QgdHlwZTIgaW4gZXh0ZXJuYWxFdmVudHMpIHtcbiAgICB2bS4kb24odHlwZTIsIGV4dGVybmFsRXZlbnRzW3R5cGUyXSlcbiAgfVxuICBMSUZFX0NZQ0xFX1RZUEVTLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICB2bS4kb24oYGhvb2s6JHt0eXBlfWAsIG9wdGlvbnNbdHlwZV0pXG4gIH0pXG59XG5cbi8qKlxuICogQmluZCBldmVudCByZWxhdGVkIG1ldGhvZHMgdG8gVmlld01vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtICB7Vm19IHZtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbkV2ZW50cyAodm0pIHtcbiAgdm0uJGVtaXQgPSAkZW1pdFxuICB2bS4kZGlzcGF0Y2ggPSAkZGlzcGF0Y2hcbiAgdm0uJGJyb2FkY2FzdCA9ICRicm9hZGNhc3RcbiAgdm0uJG9uID0gJG9uXG4gIHZtLiRvZmYgPSAkb2ZmXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVmlld01vZGVsIENvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQge1xuICBpbml0U3RhdGVcbn0gZnJvbSAnLi4vY29yZS9zdGF0ZSdcbmltcG9ydCB7XG4gIGJ1aWxkXG59IGZyb20gJy4vY29tcGlsZXInXG5pbXBvcnQge1xuICBzZXQsXG4gIGRlbFxufSBmcm9tICcuLi9jb3JlL29ic2VydmVyJ1xuaW1wb3J0IHtcbiAgd2F0Y2hcbn0gZnJvbSAnLi9kaXJlY3RpdmUnXG5pbXBvcnQge1xuICBpbml0RXZlbnRzLFxuICBtaXhpbkV2ZW50c1xufSBmcm9tICcuL2V2ZW50cydcblxuLyoqXG4gKiBWaWV3TW9kZWwgY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgICAgY29tcG9uZW50IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJlbnRWbSAgIHdoaWNoIGNvbnRhaW5zIF9hcHBcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJlbnRFbCAgIHJvb3QgZWxlbWVudCBvciBmcmFnIGJsb2NrXG4gKiBAcGFyYW0ge29iamVjdH0gbWVyZ2VkRGF0YSBleHRlcm5hbCBkYXRhXG4gKiBAcGFyYW0ge29iamVjdH0gZXh0ZXJuYWxFdmVudHMgZXh0ZXJuYWwgZXZlbnRzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFZtIChcbiAgdHlwZSxcbiAgb3B0aW9ucyxcbiAgcGFyZW50Vm0sXG4gIHBhcmVudEVsLFxuICBtZXJnZWREYXRhLFxuICBleHRlcm5hbEV2ZW50c1xuKSB7XG4gIHBhcmVudFZtID0gcGFyZW50Vm0gfHwge31cbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50Vm0uX3JlYWxQYXJlbnQgPyBwYXJlbnRWbS5fcmVhbFBhcmVudCA6IHBhcmVudFZtXG4gIHRoaXMuX2FwcCA9IHBhcmVudFZtLl9hcHAgfHwge31cbiAgcGFyZW50Vm0uX2NoaWxkcmVuVm1zICYmIHBhcmVudFZtLl9jaGlsZHJlblZtcy5wdXNoKHRoaXMpXG5cbiAgaWYgKCFvcHRpb25zICYmIHRoaXMuX2FwcC5jdXN0b21Db21wb25lbnRNYXApIHtcbiAgICBvcHRpb25zID0gdGhpcy5fYXBwLmN1c3RvbUNvbXBvbmVudE1hcFt0eXBlXVxuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgY29uc3QgZGF0YSA9IG9wdGlvbnMuZGF0YSB8fCB7fVxuXG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zXG4gIHRoaXMuX21ldGhvZHMgPSBvcHRpb25zLm1ldGhvZHMgfHwge31cbiAgdGhpcy5fY29tcHV0ZWQgPSBvcHRpb25zLmNvbXB1dGVkIHx8IHt9XG4gIHRoaXMuX2NzcyA9IG9wdGlvbnMuc3R5bGUgfHwge31cbiAgdGhpcy5faWRzID0ge31cbiAgdGhpcy5fdm1FdmVudHMgPSB7fVxuICB0aGlzLl9jaGlsZHJlblZtcyA9IFtdXG4gIHRoaXMuX3R5cGUgPSB0eXBlXG5cbiAgLy8gYmluZCBldmVudHMgYW5kIGxpZmVjeWNsZXNcbiAgaW5pdEV2ZW50cyh0aGlzLCBleHRlcm5hbEV2ZW50cylcblxuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBcImluaXRcIiBsaWZlY3ljbGUgaW4gVm0oJHt0aGlzLl90eXBlfSlgKVxuICB0aGlzLiRlbWl0KCdob29rOmluaXQnKVxuICB0aGlzLl9pbml0ZWQgPSB0cnVlXG5cbiAgLy8gcHJveHkgZGF0YSBhbmQgbWV0aG9kc1xuICAvLyBvYnNlcnZlIGRhdGEgYW5kIGFkZCB0aGlzIHRvIHZtc1xuICB0aGlzLl9kYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyBkYXRhKCkgOiBkYXRhXG4gIGlmIChtZXJnZWREYXRhKSB7XG4gICAgZXh0ZW5kKHRoaXMuX2RhdGEsIG1lcmdlZERhdGEpXG4gIH1cbiAgaW5pdFN0YXRlKHRoaXMpXG5cbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gXCJjcmVhdGVkXCIgbGlmZWN5Y2xlIGluIFZtKCR7dGhpcy5fdHlwZX0pYClcbiAgdGhpcy4kZW1pdCgnaG9vazpjcmVhdGVkJylcbiAgdGhpcy5fY3JlYXRlZCA9IHRydWVcblxuICAvLyBiYWNrd2FyZCBvbGQgcmVhZHkgZW50cnlcbiAgaWYgKG9wdGlvbnMubWV0aG9kcyAmJiBvcHRpb25zLm1ldGhvZHMucmVhZHkpIHtcbiAgICBjb25zb2xlLndhcm4oJ1wiZXhwb3J0cy5tZXRob2RzLnJlYWR5XCIgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAncGxlYXNlIHVzZSBcImV4cG9ydHMuY3JlYXRlZFwiIGluc3RlYWQnKVxuICAgIG9wdGlvbnMubWV0aG9kcy5yZWFkeS5jYWxsKHRoaXMpXG4gIH1cblxuICBpZiAoIXRoaXMuX2FwcC5kb2MpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGlmIG5vIHBhcmVudEVsZW1lbnQgdGhlbiBzcGVjaWZ5IHRoZSBkb2N1bWVudEVsZW1lbnRcbiAgdGhpcy5fcGFyZW50RWwgPSBwYXJlbnRFbCB8fCB0aGlzLl9hcHAuZG9jLmRvY3VtZW50RWxlbWVudFxuICBidWlsZCh0aGlzKVxufVxuXG5taXhpbkV2ZW50cyhWbS5wcm90b3R5cGUpXG5cbi8qKlxuICogV2F0Y2ggYW4gZnVuY3Rpb24gYW5kIGJpbmQgYWxsIHRoZSBkYXRhIGFwcGVhcmVkIGluIGl0LiBXaGVuIHRoZSByZWxhdGVkXG4gKiBkYXRhIGNoYW5nZXMsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIG5ldyB2YWx1ZSBhcyAxc3QgcGFyYW0uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cblZtLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7XG4gIHdhdGNoKHRoaXMsIGZuLCBjYWxsYmFjaylcbn1cblxuVm0uc2V0ID0gc2V0XG5WbS5kZWxldGUgPSBkZWxcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IG5hdGl2ZU1vZHVsZXMgPSB7fVxuXG4vLyBmb3IgdGVzdGluZ1xuXG4vKipcbiAqIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGUgKG1vZHVsZU5hbWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU1vZHVsZXNbbW9kdWxlTmFtZV1cbn1cblxuLyoqXG4gKiBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJNb2R1bGVzICgpIHtcbiAgbmF0aXZlTW9kdWxlcyA9IHt9XG59XG5cbi8vIGZvciBmcmFtZXdvcmtcblxuLyoqXG4gKiBpbml0IG1vZHVsZXMgZm9yIGFuIGFwcCBpbnN0YW5jZVxuICogdGhlIHNlY29uZCBwYXJhbSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVwbGFjZSBhbiBleGlzdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE1vZHVsZXMgKG1vZHVsZXMsIGlmUmVwbGFjZSkge1xuICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgaW4gbW9kdWxlcykge1xuICAgIC8vIGluaXQgYG1vZHVsZXNbbW9kdWxlTmFtZV1bXWBcbiAgICBsZXQgbWV0aG9kcyA9IG5hdGl2ZU1vZHVsZXNbbW9kdWxlTmFtZV1cbiAgICBpZiAoIW1ldGhvZHMpIHtcbiAgICAgIG1ldGhvZHMgPSB7fVxuICAgICAgbmF0aXZlTW9kdWxlc1ttb2R1bGVOYW1lXSA9IG1ldGhvZHNcbiAgICB9XG5cbiAgICAvLyBwdXNoIGVhY2ggbm9uLWV4aXN0ZWQgbmV3IG1ldGhvZFxuICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0aG9kID0ge1xuICAgICAgICAgIG5hbWU6IG1ldGhvZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbWV0aG9kc1ttZXRob2QubmFtZV0gfHwgaWZSZXBsYWNlKSB7XG4gICAgICAgIG1ldGhvZHNbbWV0aG9kLm5hbWVdID0gbWV0aG9kXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGluaXQgYXBwIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRNZXRob2RzIChWbSwgYXBpcykge1xuICBjb25zdCBwID0gVm0ucHJvdG90eXBlXG5cbiAgZm9yIChjb25zdCBhcGlOYW1lIGluIGFwaXMpIHtcbiAgICBpZiAoIXAuaGFzT3duUHJvcGVydHkoYXBpTmFtZSkpIHtcbiAgICAgIHBbYXBpTmFtZV0gPSBhcGlzW2FwaU5hbWVdXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogZ2V0IGEgbW9kdWxlIG9mIG1ldGhvZHMgZm9yIGFuIGFwcCBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZU1vZHVsZSAoYXBwLCBuYW1lKSB7XG4gIGNvbnN0IG1ldGhvZHMgPSBuYXRpdmVNb2R1bGVzW25hbWVdXG4gIGNvbnN0IHRhcmdldCA9IHt9XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBpbiBtZXRob2RzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gbW9kdWxlR2V0dGVyICgpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBhcHAuY2FsbFRhc2tzKHtcbiAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIG1vZHVsZVNldHRlciAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBhcHAuY2FsbFRhc2tzKHtcbiAgICAgICAgICAgIG1vZHVsZTogbmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIGFyZ3M6IFt2YWx1ZV1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbi8qKlxuICogZ2V0IGEgY3VzdG9tIGNvbXBvbmVudCBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQ3VzdG9tQ29tcG9uZW50IChhcHAsIG5hbWUpIHtcbiAgY29uc3QgeyBjdXN0b21Db21wb25lbnRNYXAgfSA9IGFwcFxuICByZXR1cm4gY3VzdG9tQ29tcG9uZW50TWFwW25hbWVdXG59XG5cbi8qKlxuICogcmVnaXN0ZXIgYSBjdXN0b20gY29tcG9uZW50IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50IChhcHAsIG5hbWUsIGRlZikge1xuICBjb25zdCB7IGN1c3RvbUNvbXBvbmVudE1hcCB9ID0gYXBwXG5cbiAgaWYgKGN1c3RvbUNvbXBvbmVudE1hcFtuYW1lXSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIGRlZmluZSBhIGNvbXBvbmVudCgke25hbWV9KSB0aGF0IGFscmVhZHkgZXhpc3RzYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGN1c3RvbUNvbXBvbmVudE1hcFtuYW1lXSA9IGRlZlxufVxuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gU2VtVmVyO1xuXG4vLyBUaGUgZGVidWcgZnVuY3Rpb24gaXMgZXhjbHVkZWQgZW50aXJlbHkgZnJvbSB0aGUgbWluaWZpZWQgdmVyc2lvbi5cbi8qIG5vbWluICovIHZhciBkZWJ1Zztcbi8qIG5vbWluICovIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICAvKiBub21pbiAqLyBwcm9jZXNzLmVudiAmJlxuICAgIC8qIG5vbWluICovIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgICAvKiBub21pbiAqLyAvXFxic2VtdmVyXFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSlcbiAgLyogbm9taW4gKi8gZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICAvKiBub21pbiAqLyB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgLyogbm9taW4gKi8gYXJncy51bnNoaWZ0KCdTRU1WRVInKTtcbiAgICAvKiBub21pbiAqLyBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICAvKiBub21pbiAqLyB9O1xuLyogbm9taW4gKi8gZWxzZVxuICAvKiBub21pbiAqLyBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmV4cG9ydHMuU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCc7XG5cbnZhciBNQVhfTEVOR1RIID0gMjU2O1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxudmFyIHJlID0gZXhwb3J0cy5yZSA9IFtdO1xudmFyIHNyYyA9IGV4cG9ydHMuc3JjID0gW107XG52YXIgUiA9IDA7XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbnZhciBOVU1FUklDSURFTlRJRklFUiA9IFIrKztcbnNyY1tOVU1FUklDSURFTlRJRklFUl0gPSAnMHxbMS05XVxcXFxkKic7XG52YXIgTlVNRVJJQ0lERU5USUZJRVJMT09TRSA9IFIrKztcbnNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSA9ICdbMC05XSsnO1xuXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbnZhciBOT05OVU1FUklDSURFTlRJRklFUiA9IFIrKztcbnNyY1tOT05OVU1FUklDSURFTlRJRklFUl0gPSAnXFxcXGQqW2EtekEtWi1dW2EtekEtWjAtOS1dKic7XG5cblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbnZhciBNQUlOVkVSU0lPTiA9IFIrKztcbnNyY1tNQUlOVkVSU0lPTl0gPSAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxudmFyIE1BSU5WRVJTSU9OTE9PU0UgPSBSKys7XG5zcmNbTUFJTlZFUlNJT05MT09TRV0gPSAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKSc7XG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cblxudmFyIFBSRVJFTEVBU0VJREVOVElGSUVSID0gUisrO1xuc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSA9ICcoPzonICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgc3JjW05PTk5VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxudmFyIFBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gPSAnKD86JyArIHNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcgKyBzcmNbTk9OTlVNRVJJQ0lERU5USUZJRVJdICsgJyknO1xuXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxudmFyIFBSRVJFTEVBU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRV0gPSAnKD86LSgnICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgICAgICAnKD86XFxcXC4nICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSXSArICcpKikpJztcblxudmFyIFBSRVJFTEVBU0VMT09TRSA9IFIrKztcbnNyY1tQUkVSRUxFQVNFTE9PU0VdID0gJyg/Oi0/KCcgKyBzcmNbUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4nICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdICsgJykqKSknO1xuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG52YXIgQlVJTERJREVOVElGSUVSID0gUisrO1xuc3JjW0JVSUxESURFTlRJRklFUl0gPSAnWzAtOUEtWmEtei1dKyc7XG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG52YXIgQlVJTEQgPSBSKys7XG5zcmNbQlVJTERdID0gJyg/OlxcXFwrKCcgKyBzcmNbQlVJTERJREVOVElGSUVSXSArXG4gICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tCVUlMRElERU5USUZJRVJdICsgJykqKSknO1xuXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG52YXIgRlVMTCA9IFIrKztcbnZhciBGVUxMUExBSU4gPSAndj8nICsgc3JjW01BSU5WRVJTSU9OXSArXG4gICAgICAgICAgICAgICAgc3JjW1BSRVJFTEVBU0VdICsgJz8nICtcbiAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nO1xuXG5zcmNbRlVMTF0gPSAnXicgKyBGVUxMUExBSU4gKyAnJCc7XG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbnZhciBMT09TRVBMQUlOID0gJ1t2PVxcXFxzXSonICsgc3JjW01BSU5WRVJTSU9OTE9PU0VdICtcbiAgICAgICAgICAgICAgICAgc3JjW1BSRVJFTEVBU0VMT09TRV0gKyAnPycgK1xuICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nO1xuXG52YXIgTE9PU0UgPSBSKys7XG5zcmNbTE9PU0VdID0gJ14nICsgTE9PU0VQTEFJTiArICckJztcblxudmFyIEdUTFQgPSBSKys7XG5zcmNbR1RMVF0gPSAnKCg/Ojx8Pik/PT8pJztcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxudmFyIFhSQU5HRUlERU5USUZJRVJMT09TRSA9IFIrKztcbnNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdID0gc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJ3x4fFh8XFxcXConO1xudmFyIFhSQU5HRUlERU5USUZJRVIgPSBSKys7XG5zcmNbWFJBTkdFSURFTlRJRklFUl0gPSBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJ3x4fFh8XFxcXConO1xuXG52YXIgWFJBTkdFUExBSU4gPSBSKys7XG5zcmNbWFJBTkdFUExBSU5dID0gJ1t2PVxcXFxzXSooJyArIHNyY1tYUkFOR0VJREVOVElGSUVSXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1tQUkVSRUxFQVNFXSArICcpPycgK1xuICAgICAgICAgICAgICAgICAgIHNyY1tCVUlMRF0gKyAnPycgK1xuICAgICAgICAgICAgICAgICAgICcpPyk/JztcblxudmFyIFhSQU5HRVBMQUlOTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFUExBSU5MT09TRV0gPSAnW3Y9XFxcXHNdKignICsgc3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgc3JjW1BSRVJFTEVBU0VMT09TRV0gKyAnKT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tCVUlMRF0gKyAnPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyk/KT8nO1xuXG52YXIgWFJBTkdFID0gUisrO1xuc3JjW1hSQU5HRV0gPSAnXicgKyBzcmNbR1RMVF0gKyAnXFxcXHMqJyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnJCc7XG52YXIgWFJBTkdFTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFTE9PU0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKicgKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnJCc7XG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG52YXIgTE9ORVRJTERFID0gUisrO1xuc3JjW0xPTkVUSUxERV0gPSAnKD86fj4/KSc7XG5cbnZhciBUSUxERVRSSU0gPSBSKys7XG5zcmNbVElMREVUUklNXSA9ICcoXFxcXHMqKScgKyBzcmNbTE9ORVRJTERFXSArICdcXFxccysnO1xucmVbVElMREVUUklNXSA9IG5ldyBSZWdFeHAoc3JjW1RJTERFVFJJTV0sICdnJyk7XG52YXIgdGlsZGVUcmltUmVwbGFjZSA9ICckMX4nO1xuXG52YXIgVElMREUgPSBSKys7XG5zcmNbVElMREVdID0gJ14nICsgc3JjW0xPTkVUSUxERV0gKyBzcmNbWFJBTkdFUExBSU5dICsgJyQnO1xudmFyIFRJTERFTE9PU0UgPSBSKys7XG5zcmNbVElMREVMT09TRV0gPSAnXicgKyBzcmNbTE9ORVRJTERFXSArIHNyY1tYUkFOR0VQTEFJTkxPT1NFXSArICckJztcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbnZhciBMT05FQ0FSRVQgPSBSKys7XG5zcmNbTE9ORUNBUkVUXSA9ICcoPzpcXFxcXiknO1xuXG52YXIgQ0FSRVRUUklNID0gUisrO1xuc3JjW0NBUkVUVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW0xPTkVDQVJFVF0gKyAnXFxcXHMrJztcbnJlW0NBUkVUVFJJTV0gPSBuZXcgUmVnRXhwKHNyY1tDQVJFVFRSSU1dLCAnZycpO1xudmFyIGNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJztcblxudmFyIENBUkVUID0gUisrO1xuc3JjW0NBUkVUXSA9ICdeJyArIHNyY1tMT05FQ0FSRVRdICsgc3JjW1hSQU5HRVBMQUlOXSArICckJztcbnZhciBDQVJFVExPT1NFID0gUisrO1xuc3JjW0NBUkVUTE9PU0VdID0gJ14nICsgc3JjW0xPTkVDQVJFVF0gKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnJCc7XG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG52YXIgQ09NUEFSQVRPUkxPT1NFID0gUisrO1xuc3JjW0NPTVBBUkFUT1JMT09TRV0gPSAnXicgKyBzcmNbR1RMVF0gKyAnXFxcXHMqKCcgKyBMT09TRVBMQUlOICsgJykkfF4kJztcbnZhciBDT01QQVJBVE9SID0gUisrO1xuc3JjW0NPTVBBUkFUT1JdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKignICsgRlVMTFBMQUlOICsgJykkfF4kJztcblxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxudmFyIENPTVBBUkFUT1JUUklNID0gUisrO1xuc3JjW0NPTVBBUkFUT1JUUklNXSA9ICcoXFxcXHMqKScgKyBzcmNbR1RMVF0gK1xuICAgICAgICAgICAgICAgICAgICAgICdcXFxccyooJyArIExPT1NFUExBSU4gKyAnfCcgKyBzcmNbWFJBTkdFUExBSU5dICsgJyknO1xuXG4vLyB0aGlzIG9uZSBoYXMgdG8gdXNlIHRoZSAvZyBmbGFnXG5yZVtDT01QQVJBVE9SVFJJTV0gPSBuZXcgUmVnRXhwKHNyY1tDT01QQVJBVE9SVFJJTV0sICdnJyk7XG52YXIgY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMyc7XG5cblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbnZhciBIWVBIRU5SQU5HRSA9IFIrKztcbnNyY1tIWVBIRU5SQU5HRV0gPSAnXlxcXFxzKignICsgc3JjW1hSQU5HRVBMQUlOXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJ1xcXFxzKy1cXFxccysnICtcbiAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbWFJBTkdFUExBSU5dICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnXFxcXHMqJCc7XG5cbnZhciBIWVBIRU5SQU5HRUxPT1NFID0gUisrO1xuc3JjW0hZUEhFTlJBTkdFTE9PU0VdID0gJ15cXFxccyooJyArIHNyY1tYUkFOR0VQTEFJTkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMrLVxcXFxzKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXFxccyokJztcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxudmFyIFNUQVIgPSBSKys7XG5zcmNbU1RBUl0gPSAnKDx8Pik/PT9cXFxccypcXFxcKic7XG5cbi8vIENvbXBpbGUgdG8gYWN0dWFsIHJlZ2V4cCBvYmplY3RzLlxuLy8gQWxsIGFyZSBmbGFnLWZyZWUsIHVubGVzcyB0aGV5IHdlcmUgY3JlYXRlZCBhYm92ZSB3aXRoIGEgZmxhZy5cbmZvciAodmFyIGkgPSAwOyBpIDwgUjsgaSsrKSB7XG4gIGRlYnVnKGksIHNyY1tpXSk7XG4gIGlmICghcmVbaV0pXG4gICAgcmVbaV0gPSBuZXcgUmVnRXhwKHNyY1tpXSk7XG59XG5cbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmZ1bmN0aW9uIHBhcnNlKHZlcnNpb24sIGxvb3NlKSB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKVxuICAgIHJldHVybiB2ZXJzaW9uO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSClcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgciA9IGxvb3NlID8gcmVbTE9PU0VdIDogcmVbRlVMTF07XG4gIGlmICghci50ZXN0KHZlcnNpb24pKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgbG9vc2UpO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydHMudmFsaWQgPSB2YWxpZDtcbmZ1bmN0aW9uIHZhbGlkKHZlcnNpb24sIGxvb3NlKSB7XG4gIHZhciB2ID0gcGFyc2UodmVyc2lvbiwgbG9vc2UpO1xuICByZXR1cm4gdiA/IHYudmVyc2lvbiA6IG51bGw7XG59XG5cblxuZXhwb3J0cy5jbGVhbiA9IGNsZWFuO1xuZnVuY3Rpb24gY2xlYW4odmVyc2lvbiwgbG9vc2UpIHtcbiAgdmFyIHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIGxvb3NlKTtcbiAgcmV0dXJuIHMgPyBzLnZlcnNpb24gOiBudWxsO1xufVxuXG5leHBvcnRzLlNlbVZlciA9IFNlbVZlcjtcblxuZnVuY3Rpb24gU2VtVmVyKHZlcnNpb24sIGxvb3NlKSB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgaWYgKHZlcnNpb24ubG9vc2UgPT09IGxvb3NlKVxuICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgZWxzZVxuICAgICAgdmVyc2lvbiA9IHZlcnNpb24udmVyc2lvbjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIFZlcnNpb246ICcgKyB2ZXJzaW9uKTtcbiAgfVxuXG4gIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmVyc2lvbiBpcyBsb25nZXIgdGhhbiAnICsgTUFYX0xFTkdUSCArICcgY2hhcmFjdGVycycpXG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNlbVZlcikpXG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgbG9vc2UpO1xuXG4gIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBsb29zZSk7XG4gIHRoaXMubG9vc2UgPSBsb29zZTtcbiAgdmFyIG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChsb29zZSA/IHJlW0xPT1NFXSA6IHJlW0ZVTExdKTtcblxuICBpZiAoIW0pXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnICsgdmVyc2lvbik7XG5cbiAgdGhpcy5yYXcgPSB2ZXJzaW9uO1xuXG4gIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gIHRoaXMubWFqb3IgPSArbVsxXTtcbiAgdGhpcy5taW5vciA9ICttWzJdO1xuICB0aGlzLnBhdGNoID0gK21bM107XG5cbiAgaWYgKHRoaXMubWFqb3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWFqb3IgPCAwKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG5cbiAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG5cbiAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgcGF0Y2ggdmVyc2lvbicpXG5cbiAgLy8gbnVtYmVyaWZ5IGFueSBwcmVyZWxlYXNlIG51bWVyaWMgaWRzXG4gIGlmICghbVs0XSlcbiAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgZWxzZVxuICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24oaWQpIHtcbiAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgIHZhciBudW0gPSAraWQ7XG4gICAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICAgIHJldHVybiBudW07XG4gICAgICB9XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSk7XG5cbiAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXTtcbiAgdGhpcy5mb3JtYXQoKTtcbn1cblxuU2VtVmVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy52ZXJzaW9uID0gdGhpcy5tYWpvciArICcuJyArIHRoaXMubWlub3IgKyAnLicgKyB0aGlzLnBhdGNoO1xuICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aClcbiAgICB0aGlzLnZlcnNpb24gKz0gJy0nICsgdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKTtcbiAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbn07XG5cblNlbVZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbn07XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIGRlYnVnKCdTZW1WZXIuY29tcGFyZScsIHRoaXMudmVyc2lvbiwgdGhpcy5sb29zZSwgb3RoZXIpO1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpXG4gICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLmxvb3NlKTtcblxuICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKTtcbn07XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZU1haW4gPSBmdW5jdGlvbihvdGhlcikge1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpXG4gICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLmxvb3NlKTtcblxuICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKTtcbn07XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZVByZSA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSlcbiAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMubG9vc2UpO1xuXG4gIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgcmV0dXJuIC0xO1xuICBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aClcbiAgICByZXR1cm4gMTtcbiAgZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKVxuICAgIHJldHVybiAwO1xuXG4gIHZhciBpID0gMDtcbiAgZG8ge1xuICAgIHZhciBhID0gdGhpcy5wcmVyZWxlYXNlW2ldO1xuICAgIHZhciBiID0gb3RoZXIucHJlcmVsZWFzZVtpXTtcbiAgICBkZWJ1ZygncHJlcmVsZWFzZSBjb21wYXJlJywgaSwgYSwgYik7XG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gMDtcbiAgICBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gLTE7XG4gICAgZWxzZSBpZiAoYSA9PT0gYilcbiAgICAgIGNvbnRpbnVlO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYik7XG4gIH0gd2hpbGUgKCsraSk7XG59O1xuXG4vLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4vLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG5TZW1WZXIucHJvdG90eXBlLmluYyA9IGZ1bmN0aW9uKHJlbGVhc2UsIGlkZW50aWZpZXIpIHtcbiAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgIHRoaXMubWlub3IgPSAwO1xuICAgICAgdGhpcy5tYWpvcisrO1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgIHRoaXMubWlub3IrKztcbiAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllcik7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcbiAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAvLyBwcmVwYXRjaC5cbiAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyKTtcbiAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbWFqb3InOlxuICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgIGlmICh0aGlzLm1pbm9yICE9PSAwIHx8IHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5tYWpvcisrO1xuICAgICAgdGhpcy5taW5vciA9IDA7XG4gICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWlub3InOlxuICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMubWlub3IrKztcbiAgICAgIHRoaXMucGF0Y2ggPSAwO1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYXRjaCc6XG4gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLnBhdGNoKys7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgLy8gMS4wLjAgXCJwcmVcIiB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgIGNhc2UgJ3ByZSc6XG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gWzBdO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rKztcbiAgICAgICAgICAgIGkgPSAtMjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IC0xKSAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goMCk7XG4gICAgICB9XG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlWzBdID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpXG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgMF07XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCAwXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICcgKyByZWxlYXNlKTtcbiAgfVxuICB0aGlzLmZvcm1hdCgpO1xuICB0aGlzLnJhdyA9IHRoaXMudmVyc2lvbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5leHBvcnRzLmluYyA9IGluYztcbmZ1bmN0aW9uIGluYyh2ZXJzaW9uLCByZWxlYXNlLCBsb29zZSwgaWRlbnRpZmllcikge1xuICBpZiAodHlwZW9mKGxvb3NlKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyID0gbG9vc2U7XG4gICAgbG9vc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKS5pbmMocmVsZWFzZSwgaWRlbnRpZmllcikudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnRzLmRpZmYgPSBkaWZmO1xuZnVuY3Rpb24gZGlmZih2ZXJzaW9uMSwgdmVyc2lvbjIpIHtcbiAgaWYgKGVxKHZlcnNpb24xLCB2ZXJzaW9uMikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdjEgPSBwYXJzZSh2ZXJzaW9uMSk7XG4gICAgdmFyIHYyID0gcGFyc2UodmVyc2lvbjIpO1xuICAgIGlmICh2MS5wcmVyZWxlYXNlLmxlbmd0aCB8fCB2Mi5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHYxKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdtYWpvcicgfHwga2V5ID09PSAnbWlub3InIHx8IGtleSA9PT0gJ3BhdGNoJykge1xuICAgICAgICAgIGlmICh2MVtrZXldICE9PSB2MltrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ByZScra2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuICdwcmVyZWxlYXNlJztcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIHYxKSB7XG4gICAgICBpZiAoa2V5ID09PSAnbWFqb3InIHx8IGtleSA9PT0gJ21pbm9yJyB8fCBrZXkgPT09ICdwYXRjaCcpIHtcbiAgICAgICAgaWYgKHYxW2tleV0gIT09IHYyW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuY29tcGFyZUlkZW50aWZpZXJzID0gY29tcGFyZUlkZW50aWZpZXJzO1xuXG52YXIgbnVtZXJpYyA9IC9eWzAtOV0rJC87XG5mdW5jdGlvbiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYikge1xuICB2YXIgYW51bSA9IG51bWVyaWMudGVzdChhKTtcbiAgdmFyIGJudW0gPSBudW1lcmljLnRlc3QoYik7XG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYTtcbiAgICBiID0gK2I7XG4gIH1cblxuICByZXR1cm4gKGFudW0gJiYgIWJudW0pID8gLTEgOlxuICAgICAgICAgKGJudW0gJiYgIWFudW0pID8gMSA6XG4gICAgICAgICBhIDwgYiA/IC0xIDpcbiAgICAgICAgIGEgPiBiID8gMSA6XG4gICAgICAgICAwO1xufVxuXG5leHBvcnRzLnJjb21wYXJlSWRlbnRpZmllcnMgPSByY29tcGFyZUlkZW50aWZpZXJzO1xuZnVuY3Rpb24gcmNvbXBhcmVJZGVudGlmaWVycyhhLCBiKSB7XG4gIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSk7XG59XG5cbmV4cG9ydHMubWFqb3IgPSBtYWpvcjtcbmZ1bmN0aW9uIG1ham9yKGEsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5tYWpvcjtcbn1cblxuZXhwb3J0cy5taW5vciA9IG1pbm9yO1xuZnVuY3Rpb24gbWlub3IoYSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1pbm9yO1xufVxuXG5leHBvcnRzLnBhdGNoID0gcGF0Y2g7XG5mdW5jdGlvbiBwYXRjaChhLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkucGF0Y2g7XG59XG5cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5mdW5jdGlvbiBjb21wYXJlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5jb21wYXJlKG5ldyBTZW1WZXIoYiwgbG9vc2UpKTtcbn1cblxuZXhwb3J0cy5jb21wYXJlTG9vc2UgPSBjb21wYXJlTG9vc2U7XG5mdW5jdGlvbiBjb21wYXJlTG9vc2UoYSwgYikge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCB0cnVlKTtcbn1cblxuZXhwb3J0cy5yY29tcGFyZSA9IHJjb21wYXJlO1xuZnVuY3Rpb24gcmNvbXBhcmUoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYiwgYSwgbG9vc2UpO1xufVxuXG5leHBvcnRzLnNvcnQgPSBzb3J0O1xuZnVuY3Rpb24gc29ydChsaXN0LCBsb29zZSkge1xuICByZXR1cm4gbGlzdC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jb21wYXJlKGEsIGIsIGxvb3NlKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMucnNvcnQgPSByc29ydDtcbmZ1bmN0aW9uIHJzb3J0KGxpc3QsIGxvb3NlKSB7XG4gIHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBleHBvcnRzLnJjb21wYXJlKGEsIGIsIGxvb3NlKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuZ3QgPSBndDtcbmZ1bmN0aW9uIGd0KGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDA7XG59XG5cbmV4cG9ydHMubHQgPSBsdDtcbmZ1bmN0aW9uIGx0KGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDA7XG59XG5cbmV4cG9ydHMuZXEgPSBlcTtcbmZ1bmN0aW9uIGVxKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMDtcbn1cblxuZXhwb3J0cy5uZXEgPSBuZXE7XG5mdW5jdGlvbiBuZXEoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwO1xufVxuXG5leHBvcnRzLmd0ZSA9IGd0ZTtcbmZ1bmN0aW9uIGd0ZShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMDtcbn1cblxuZXhwb3J0cy5sdGUgPSBsdGU7XG5mdW5jdGlvbiBsdGUoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDA7XG59XG5cbmV4cG9ydHMuY21wID0gY21wO1xuZnVuY3Rpb24gY21wKGEsIG9wLCBiLCBsb29zZSkge1xuICB2YXIgcmV0O1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIGEgPSBhLnZlcnNpb247XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSBiID0gYi52ZXJzaW9uO1xuICAgICAgcmV0ID0gYSA9PT0gYjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyE9PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSBhID0gYS52ZXJzaW9uO1xuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0JykgYiA9IGIudmVyc2lvbjtcbiAgICAgIHJldCA9IGEgIT09IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcnOiBjYXNlICc9JzogY2FzZSAnPT0nOiByZXQgPSBlcShhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJyE9JzogcmV0ID0gbmVxKGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPic6IHJldCA9IGd0KGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPj0nOiByZXQgPSBndGUoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICc8JzogcmV0ID0gbHQoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICc8PSc6IHJldCA9IGx0ZShhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgb3BlcmF0b3I6ICcgKyBvcCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0cy5Db21wYXJhdG9yID0gQ29tcGFyYXRvcjtcbmZ1bmN0aW9uIENvbXBhcmF0b3IoY29tcCwgbG9vc2UpIHtcbiAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgaWYgKGNvbXAubG9vc2UgPT09IGxvb3NlKVxuICAgICAgcmV0dXJuIGNvbXA7XG4gICAgZWxzZVxuICAgICAgY29tcCA9IGNvbXAudmFsdWU7XG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpXG4gICAgcmV0dXJuIG5ldyBDb21wYXJhdG9yKGNvbXAsIGxvb3NlKTtcblxuICBkZWJ1ZygnY29tcGFyYXRvcicsIGNvbXAsIGxvb3NlKTtcbiAgdGhpcy5sb29zZSA9IGxvb3NlO1xuICB0aGlzLnBhcnNlKGNvbXApO1xuXG4gIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKVxuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgZWxzZVxuICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wZXJhdG9yICsgdGhpcy5zZW12ZXIudmVyc2lvbjtcblxuICBkZWJ1ZygnY29tcCcsIHRoaXMpO1xufVxuXG52YXIgQU5ZID0ge307XG5Db21wYXJhdG9yLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKGNvbXApIHtcbiAgdmFyIHIgPSB0aGlzLmxvb3NlID8gcmVbQ09NUEFSQVRPUkxPT1NFXSA6IHJlW0NPTVBBUkFUT1JdO1xuICB2YXIgbSA9IGNvbXAubWF0Y2gocik7XG5cbiAgaWYgKCFtKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29tcGFyYXRvcjogJyArIGNvbXApO1xuXG4gIHRoaXMub3BlcmF0b3IgPSBtWzFdO1xuICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz0nKVxuICAgIHRoaXMub3BlcmF0b3IgPSAnJztcblxuICAvLyBpZiBpdCBsaXRlcmFsbHkgaXMganVzdCAnPicgb3IgJycgdGhlbiBhbGxvdyBhbnl0aGluZy5cbiAgaWYgKCFtWzJdKVxuICAgIHRoaXMuc2VtdmVyID0gQU5ZO1xuICBlbHNlXG4gICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMubG9vc2UpO1xufTtcblxuQ29tcGFyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWU7XG59O1xuXG5Db21wYXJhdG9yLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24odmVyc2lvbikge1xuICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5sb29zZSk7XG5cbiAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJylcbiAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLmxvb3NlKTtcblxuICByZXR1cm4gY21wKHZlcnNpb24sIHRoaXMub3BlcmF0b3IsIHRoaXMuc2VtdmVyLCB0aGlzLmxvb3NlKTtcbn07XG5cbkNvbXBhcmF0b3IucHJvdG90eXBlLmludGVyc2VjdHMgPSBmdW5jdGlvbihjb21wLCBsb29zZSkge1xuICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIENvbXBhcmF0b3IgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHZhciByYW5nZVRtcDtcblxuICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJycpIHtcbiAgICByYW5nZVRtcCA9IG5ldyBSYW5nZShjb21wLnZhbHVlLCBsb29zZSk7XG4gICAgcmV0dXJuIHNhdGlzZmllcyh0aGlzLnZhbHVlLCByYW5nZVRtcCwgbG9vc2UpO1xuICB9IGVsc2UgaWYgKGNvbXAub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgcmFuZ2VUbXAgPSBuZXcgUmFuZ2UodGhpcy52YWx1ZSwgbG9vc2UpO1xuICAgIHJldHVybiBzYXRpc2ZpZXMoY29tcC5zZW12ZXIsIHJhbmdlVG1wLCBsb29zZSk7XG4gIH1cblxuICB2YXIgc2FtZURpcmVjdGlvbkluY3JlYXNpbmcgPVxuICAgICh0aGlzLm9wZXJhdG9yID09PSAnPj0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc+JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPicpO1xuICB2YXIgc2FtZURpcmVjdGlvbkRlY3JlYXNpbmcgPVxuICAgICh0aGlzLm9wZXJhdG9yID09PSAnPD0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc8JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJzw9JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPCcpO1xuICB2YXIgc2FtZVNlbVZlciA9IHRoaXMuc2VtdmVyLnZlcnNpb24gPT09IGNvbXAuc2VtdmVyLnZlcnNpb247XG4gIHZhciBkaWZmZXJlbnREaXJlY3Rpb25zSW5jbHVzaXZlID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPD0nKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPj0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc8PScpO1xuICB2YXIgb3Bwb3NpdGVEaXJlY3Rpb25zTGVzc1RoYW4gPVxuICAgIGNtcCh0aGlzLnNlbXZlciwgJzwnLCBjb21wLnNlbXZlciwgbG9vc2UpICYmXG4gICAgKCh0aGlzLm9wZXJhdG9yID09PSAnPj0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc+JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJzw9JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPCcpKTtcbiAgdmFyIG9wcG9zaXRlRGlyZWN0aW9uc0dyZWF0ZXJUaGFuID1cbiAgICBjbXAodGhpcy5zZW12ZXIsICc+JywgY29tcC5zZW12ZXIsIGxvb3NlKSAmJlxuICAgICgodGhpcy5vcGVyYXRvciA9PT0gJzw9JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPCcpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc+PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJz4nKSk7XG5cbiAgcmV0dXJuIHNhbWVEaXJlY3Rpb25JbmNyZWFzaW5nIHx8IHNhbWVEaXJlY3Rpb25EZWNyZWFzaW5nIHx8XG4gICAgKHNhbWVTZW1WZXIgJiYgZGlmZmVyZW50RGlyZWN0aW9uc0luY2x1c2l2ZSkgfHxcbiAgICBvcHBvc2l0ZURpcmVjdGlvbnNMZXNzVGhhbiB8fCBvcHBvc2l0ZURpcmVjdGlvbnNHcmVhdGVyVGhhbjtcbn07XG5cblxuZXhwb3J0cy5SYW5nZSA9IFJhbmdlO1xuZnVuY3Rpb24gUmFuZ2UocmFuZ2UsIGxvb3NlKSB7XG4gIGlmIChyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLmxvb3NlID09PSBsb29zZSkge1xuICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgbG9vc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnZhbHVlLCBsb29zZSk7XG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmFuZ2UpKVxuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKTtcblxuICB0aGlzLmxvb3NlID0gbG9vc2U7XG5cbiAgLy8gRmlyc3QsIHNwbGl0IGJhc2VkIG9uIGJvb2xlYW4gb3IgfHxcbiAgdGhpcy5yYXcgPSByYW5nZTtcbiAgdGhpcy5zZXQgPSByYW5nZS5zcGxpdCgvXFxzKlxcfFxcfFxccyovKS5tYXAoZnVuY3Rpb24ocmFuZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVJhbmdlKHJhbmdlLnRyaW0oKSk7XG4gIH0sIHRoaXMpLmZpbHRlcihmdW5jdGlvbihjKSB7XG4gICAgLy8gdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgcmVsZXZhbnQgZm9yIHdoYXRldmVyIHJlYXNvblxuICAgIHJldHVybiBjLmxlbmd0aDtcbiAgfSk7XG5cbiAgaWYgKCF0aGlzLnNldC5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIFNlbVZlciBSYW5nZTogJyArIHJhbmdlKTtcbiAgfVxuXG4gIHRoaXMuZm9ybWF0KCk7XG59XG5cblJhbmdlLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yYW5nZSA9IHRoaXMuc2V0Lm1hcChmdW5jdGlvbihjb21wcykge1xuICAgIHJldHVybiBjb21wcy5qb2luKCcgJykudHJpbSgpO1xuICB9KS5qb2luKCd8fCcpLnRyaW0oKTtcbiAgcmV0dXJuIHRoaXMucmFuZ2U7XG59O1xuXG5SYW5nZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucmFuZ2U7XG59O1xuXG5SYW5nZS5wcm90b3R5cGUucGFyc2VSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7XG4gIHZhciBsb29zZSA9IHRoaXMubG9vc2U7XG4gIHJhbmdlID0gcmFuZ2UudHJpbSgpO1xuICBkZWJ1ZygncmFuZ2UnLCByYW5nZSwgbG9vc2UpO1xuICAvLyBgMS4yLjMgLSAxLjIuNGAgPT4gYD49MS4yLjMgPD0xLjIuNGBcbiAgdmFyIGhyID0gbG9vc2UgPyByZVtIWVBIRU5SQU5HRUxPT1NFXSA6IHJlW0hZUEhFTlJBTkdFXTtcbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKGhyLCBoeXBoZW5SZXBsYWNlKTtcbiAgZGVidWcoJ2h5cGhlbiByZXBsYWNlJywgcmFuZ2UpO1xuICAvLyBgPiAxLjIuMyA8IDEuMi41YCA9PiBgPjEuMi4zIDwxLjIuNWBcbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW0NPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKTtcbiAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlLCByZVtDT01QQVJBVE9SVFJJTV0pO1xuXG4gIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSk7XG5cbiAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVtDQVJFVFRSSU1dLCBjYXJldFRyaW1SZXBsYWNlKTtcblxuICAvLyBub3JtYWxpemUgc3BhY2VzXG4gIHJhbmdlID0gcmFuZ2Uuc3BsaXQoL1xccysvKS5qb2luKCcgJyk7XG5cbiAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICB2YXIgY29tcFJlID0gbG9vc2UgPyByZVtDT01QQVJBVE9STE9PU0VdIDogcmVbQ09NUEFSQVRPUl07XG4gIHZhciBzZXQgPSByYW5nZS5zcGxpdCgnICcpLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHBhcnNlQ29tcGFyYXRvcihjb21wLCBsb29zZSk7XG4gIH0pLmpvaW4oJyAnKS5zcGxpdCgvXFxzKy8pO1xuICBpZiAodGhpcy5sb29zZSkge1xuICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgc2V0ID0gc2V0LmZpbHRlcihmdW5jdGlvbihjb21wKSB7XG4gICAgICByZXR1cm4gISFjb21wLm1hdGNoKGNvbXBSZSk7XG4gICAgfSk7XG4gIH1cbiAgc2V0ID0gc2V0Lm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIG5ldyBDb21wYXJhdG9yKGNvbXAsIGxvb3NlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNldDtcbn07XG5cblJhbmdlLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24ocmFuZ2UsIGxvb3NlKSB7XG4gIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBSYW5nZSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuc2V0LnNvbWUoZnVuY3Rpb24odGhpc0NvbXBhcmF0b3JzKSB7XG4gICAgcmV0dXJuIHRoaXNDb21wYXJhdG9ycy5ldmVyeShmdW5jdGlvbih0aGlzQ29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHJhbmdlLnNldC5zb21lKGZ1bmN0aW9uKHJhbmdlQ29tcGFyYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlQ29tcGFyYXRvcnMuZXZlcnkoZnVuY3Rpb24ocmFuZ2VDb21wYXJhdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBsb29zZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuZXhwb3J0cy50b0NvbXBhcmF0b3JzID0gdG9Db21wYXJhdG9ycztcbmZ1bmN0aW9uIHRvQ29tcGFyYXRvcnMocmFuZ2UsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKS5zZXQubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gY29tcC5tYXAoZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfSkuam9pbignICcpLnRyaW0oKS5zcGxpdCgnICcpO1xuICB9KTtcbn1cblxuLy8gY29tcHJpc2VkIG9mIHhyYW5nZXMsIHRpbGRlcywgc3RhcnMsIGFuZCBndGx0J3MgYXQgdGhpcyBwb2ludC5cbi8vIGFscmVhZHkgcmVwbGFjZWQgdGhlIGh5cGhlbiByYW5nZXNcbi8vIHR1cm4gaW50byBhIHNldCBvZiBKVVNUIGNvbXBhcmF0b3JzLlxuZnVuY3Rpb24gcGFyc2VDb21wYXJhdG9yKGNvbXAsIGxvb3NlKSB7XG4gIGRlYnVnKCdjb21wJywgY29tcCk7XG4gIGNvbXAgPSByZXBsYWNlQ2FyZXRzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCk7XG4gIGNvbXAgPSByZXBsYWNlVGlsZGVzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZVhSYW5nZXMoY29tcCwgbG9vc2UpO1xuICBkZWJ1ZygneHJhbmdlJywgY29tcCk7XG4gIGNvbXAgPSByZXBsYWNlU3RhcnMoY29tcCwgbG9vc2UpO1xuICBkZWJ1Zygnc3RhcnMnLCBjb21wKTtcbiAgcmV0dXJuIGNvbXA7XG59XG5cbmZ1bmN0aW9uIGlzWChpZCkge1xuICByZXR1cm4gIWlkIHx8IGlkLnRvTG93ZXJDYXNlKCkgPT09ICd4JyB8fCBpZCA9PT0gJyonO1xufVxuXG4vLyB+LCB+PiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIH4yLCB+Mi54LCB+Mi54LngsIH4+Miwgfj4yLnggfj4yLngueCAtLT4gPj0yLjAuMCA8My4wLjBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wXG4vLyB+MS4yLCB+MS4yLngsIH4+MS4yLCB+PjEuMi54IC0tPiA+PTEuMi4wIDwxLjMuMFxuLy8gfjEuMi4zLCB+PjEuMi4zIC0tPiA+PTEuMi4zIDwxLjMuMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMFxuZnVuY3Rpb24gcmVwbGFjZVRpbGRlcyhjb21wLCBsb29zZSkge1xuICByZXR1cm4gY29tcC50cmltKCkuc3BsaXQoL1xccysvKS5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiByZXBsYWNlVGlsZGUoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VUaWxkZShjb21wLCBsb29zZSkge1xuICB2YXIgciA9IGxvb3NlID8gcmVbVElMREVMT09TRV0gOiByZVtUSUxERV07XG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgZnVuY3Rpb24oXywgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcik7XG4gICAgdmFyIHJldDtcblxuICAgIGlmIChpc1goTSkpXG4gICAgICByZXQgPSAnJztcbiAgICBlbHNlIGlmIChpc1gobSkpXG4gICAgICByZXQgPSAnPj0nICsgTSArICcuMC4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgZWxzZSBpZiAoaXNYKHApKVxuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMFxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VUaWxkZSBwcicsIHByKTtcbiAgICAgIGlmIChwci5jaGFyQXQoMCkgIT09ICctJylcbiAgICAgICAgcHIgPSAnLScgKyBwcjtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyBwciArXG4gICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICB9IGVsc2VcbiAgICAgIC8vIH4xLjIuMyA9PSA+PTEuMi4zIDwxLjMuMFxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcblxuICAgIGRlYnVnKCd0aWxkZSByZXR1cm4nLCByZXQpO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuXG4vLyBeIC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gXjIsIF4yLngsIF4yLngueCAtLT4gPj0yLjAuMCA8My4wLjBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjBcbi8vIF4xLjIsIF4xLjIueCAtLT4gPj0xLjIuMCA8Mi4wLjBcbi8vIF4xLjIuMyAtLT4gPj0xLjIuMyA8Mi4wLjBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjBcbmZ1bmN0aW9uIHJlcGxhY2VDYXJldHMoY29tcCwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gcmVwbGFjZUNhcmV0KGNvbXAsIGxvb3NlKTtcbiAgfSkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQ2FyZXQoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCwgbG9vc2UpO1xuICB2YXIgciA9IGxvb3NlID8gcmVbQ0FSRVRMT09TRV0gOiByZVtDQVJFVF07XG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgZnVuY3Rpb24oXywgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcik7XG4gICAgdmFyIHJldDtcblxuICAgIGlmIChpc1goTSkpXG4gICAgICByZXQgPSAnJztcbiAgICBlbHNlIGlmIChpc1gobSkpXG4gICAgICByZXQgPSAnPj0nICsgTSArICcuMC4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICBpZiAoTSA9PT0gJzAnKVxuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpO1xuICAgICAgaWYgKHByLmNoYXJBdCgwKSAhPT0gJy0nKVxuICAgICAgICBwciA9ICctJyArIHByO1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKVxuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyBwciArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyBtICsgJy4nICsgKCtwICsgMSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyBwciArXG4gICAgICAgICAgICAgICcgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ25vIHByJyk7XG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyBtICsgJy4nICsgKCtwICsgMSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICAgJyA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlWFJhbmdlcyhjb21wLCBsb29zZSkge1xuICBkZWJ1ZygncmVwbGFjZVhSYW5nZXMnLCBjb21wLCBsb29zZSk7XG4gIHJldHVybiBjb21wLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gcmVwbGFjZVhSYW5nZShjb21wLCBsb29zZSk7XG4gIH0pLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVhSYW5nZShjb21wLCBsb29zZSkge1xuICBjb21wID0gY29tcC50cmltKCk7XG4gIHZhciByID0gbG9vc2UgPyByZVtYUkFOR0VMT09TRV0gOiByZVtYUkFOR0VdO1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIGZ1bmN0aW9uKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcik7XG4gICAgdmFyIHhNID0gaXNYKE0pO1xuICAgIHZhciB4bSA9IHhNIHx8IGlzWChtKTtcbiAgICB2YXIgeHAgPSB4bSB8fCBpc1gocCk7XG4gICAgdmFyIGFueVggPSB4cDtcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WClcbiAgICAgIGd0bHQgPSAnJztcblxuICAgIGlmICh4TSkge1xuICAgICAgaWYgKGd0bHQgPT09ICc+JyB8fCBndGx0ID09PSAnPCcpIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBhbGxvd2VkXG4gICAgICAgIHJldCA9ICc8MC4wLjAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3RsdCAmJiBhbnlYKSB7XG4gICAgICAvLyByZXBsYWNlIFggd2l0aCAwXG4gICAgICBpZiAoeG0pXG4gICAgICAgIG0gPSAwO1xuICAgICAgaWYgKHhwKVxuICAgICAgICBwID0gMDtcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICAvLyA+MS4yLjMgPT4gPj0gMS4yLjRcbiAgICAgICAgZ3RsdCA9ICc+PSc7XG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDE7XG4gICAgICAgICAgbSA9IDA7XG4gICAgICAgICAgcCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgICAgICBtID0gK20gKyAxO1xuICAgICAgICAgIHAgPSAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCc7XG4gICAgICAgIGlmICh4bSlcbiAgICAgICAgICBNID0gK00gKyAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbSA9ICttICsgMTtcbiAgICAgIH1cblxuICAgICAgcmV0ID0gZ3RsdCArIE0gKyAnLicgKyBtICsgJy4nICsgcDtcbiAgICB9IGVsc2UgaWYgKHhtKSB7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuMC4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICB9XG5cbiAgICBkZWJ1ZygneFJhbmdlIHJldHVybicsIHJldCk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cblxuLy8gQmVjYXVzZSAqIGlzIEFORC1lZCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgY29tcGFyYXRvcixcbi8vIGFuZCAnJyBtZWFucyBcImFueSB2ZXJzaW9uXCIsIGp1c3QgcmVtb3ZlIHRoZSAqcyBlbnRpcmVseS5cbmZ1bmN0aW9uIHJlcGxhY2VTdGFycyhjb21wLCBsb29zZSkge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgbG9vc2UpO1xuICAvLyBMb29zZW5lc3MgaXMgaWdub3JlZCBoZXJlLiAgc3RhciBpcyBhbHdheXMgYXMgbG9vc2UgYXMgaXQgZ2V0cyFcbiAgcmV0dXJuIGNvbXAudHJpbSgpLnJlcGxhY2UocmVbU1RBUl0sICcnKTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gc3RyaW5nLnJlcGxhY2UocmVbSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wIEFueSAzLjQueCB3aWxsIGRvXG4vLyAxLjIgLSAzLjQgPT4gPj0xLjIuMCA8My41LjBcbmZ1bmN0aW9uIGh5cGhlblJlcGxhY2UoJDAsXG4gICAgICAgICAgICAgICAgICAgICAgIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gICAgICAgICAgICAgICAgICAgICAgIHRvLCB0TSwgdG0sIHRwLCB0cHIsIHRiKSB7XG5cbiAgaWYgKGlzWChmTSkpXG4gICAgZnJvbSA9ICcnO1xuICBlbHNlIGlmIChpc1goZm0pKVxuICAgIGZyb20gPSAnPj0nICsgZk0gKyAnLjAuMCc7XG4gIGVsc2UgaWYgKGlzWChmcCkpXG4gICAgZnJvbSA9ICc+PScgKyBmTSArICcuJyArIGZtICsgJy4wJztcbiAgZWxzZVxuICAgIGZyb20gPSAnPj0nICsgZnJvbTtcblxuICBpZiAoaXNYKHRNKSlcbiAgICB0byA9ICcnO1xuICBlbHNlIGlmIChpc1godG0pKVxuICAgIHRvID0gJzwnICsgKCt0TSArIDEpICsgJy4wLjAnO1xuICBlbHNlIGlmIChpc1godHApKVxuICAgIHRvID0gJzwnICsgdE0gKyAnLicgKyAoK3RtICsgMSkgKyAnLjAnO1xuICBlbHNlIGlmICh0cHIpXG4gICAgdG8gPSAnPD0nICsgdE0gKyAnLicgKyB0bSArICcuJyArIHRwICsgJy0nICsgdHByO1xuICBlbHNlXG4gICAgdG8gPSAnPD0nICsgdG87XG5cbiAgcmV0dXJuIChmcm9tICsgJyAnICsgdG8pLnRyaW0oKTtcbn1cblxuXG4vLyBpZiBBTlkgb2YgdGhlIHNldHMgbWF0Y2ggQUxMIG9mIGl0cyBjb21wYXJhdG9ycywgdGhlbiBwYXNzXG5SYW5nZS5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKHZlcnNpb24pIHtcbiAgaWYgKCF2ZXJzaW9uKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKVxuICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMubG9vc2UpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbikpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiB0ZXN0U2V0KHNldCwgdmVyc2lvbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKTtcbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyID09PSBBTlkpXG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGFsbG93ZWQgPSBzZXRbaV0uc2VtdmVyO1xuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaClcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5zYXRpc2ZpZXMgPSBzYXRpc2ZpZXM7XG5mdW5jdGlvbiBzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIGxvb3NlKSB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKTtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbik7XG59XG5cbmV4cG9ydHMubWF4U2F0aXNmeWluZyA9IG1heFNhdGlzZnlpbmc7XG5mdW5jdGlvbiBtYXhTYXRpc2Z5aW5nKHZlcnNpb25zLCByYW5nZSwgbG9vc2UpIHtcbiAgdmFyIG1heCA9IG51bGw7XG4gIHZhciBtYXhTViA9IG51bGw7XG4gIHRyeSB7XG4gICAgdmFyIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7IC8vIHNhdGlzZmllcyh2LCByYW5nZSwgbG9vc2UpXG4gICAgICBpZiAoIW1heCB8fCBtYXhTVi5jb21wYXJlKHYpID09PSAtMSkgeyAvLyBjb21wYXJlKG1heCwgdiwgdHJ1ZSlcbiAgICAgICAgbWF4ID0gdjtcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgbG9vc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1heDtcbn1cblxuZXhwb3J0cy5taW5TYXRpc2Z5aW5nID0gbWluU2F0aXNmeWluZztcbmZ1bmN0aW9uIG1pblNhdGlzZnlpbmcodmVyc2lvbnMsIHJhbmdlLCBsb29zZSkge1xuICB2YXIgbWluID0gbnVsbDtcbiAgdmFyIG1pblNWID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB2YXIgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKTtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHsgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBsb29zZSlcbiAgICAgIGlmICghbWluIHx8IG1pblNWLmNvbXBhcmUodikgPT09IDEpIHsgLy8gY29tcGFyZShtaW4sIHYsIHRydWUpXG4gICAgICAgIG1pbiA9IHY7XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIGxvb3NlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtaW47XG59XG5cbmV4cG9ydHMudmFsaWRSYW5nZSA9IHZhbGlkUmFuZ2U7XG5mdW5jdGlvbiB2YWxpZFJhbmdlKHJhbmdlLCBsb29zZSkge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSkucmFuZ2UgfHwgJyonO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZVxuZXhwb3J0cy5sdHIgPSBsdHI7XG5mdW5jdGlvbiBsdHIodmVyc2lvbiwgcmFuZ2UsIGxvb3NlKSB7XG4gIHJldHVybiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIGxvb3NlKTtcbn1cblxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuZXhwb3J0cy5ndHIgPSBndHI7XG5mdW5jdGlvbiBndHIodmVyc2lvbiwgcmFuZ2UsIGxvb3NlKSB7XG4gIHJldHVybiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPicsIGxvb3NlKTtcbn1cblxuZXhwb3J0cy5vdXRzaWRlID0gb3V0c2lkZTtcbmZ1bmN0aW9uIG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIGxvb3NlKSB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKTtcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKTtcblxuICB2YXIgZ3RmbiwgbHRlZm4sIGx0Zm4sIGNvbXAsIGVjb21wO1xuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndDtcbiAgICAgIGx0ZWZuID0gbHRlO1xuICAgICAgbHRmbiA9IGx0O1xuICAgICAgY29tcCA9ICc+JztcbiAgICAgIGVjb21wID0gJz49JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0O1xuICAgICAgbHRlZm4gPSBndGU7XG4gICAgICBsdGZuID0gZ3Q7XG4gICAgICBjb21wID0gJzwnO1xuICAgICAgZWNvbXAgPSAnPD0nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJyk7XG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2lmZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIGxvb3NlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV07XG5cbiAgICB2YXIgaGlnaCA9IG51bGw7XG4gICAgdmFyIGxvdyA9IG51bGw7XG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yO1xuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3I7XG4gICAgICBpZiAoZ3Rmbihjb21wYXJhdG9yLnNlbXZlciwgaGlnaC5zZW12ZXIsIGxvb3NlKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvcjtcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgbG9vc2UpKSB7XG4gICAgICAgIGxvdyA9IGNvbXBhcmF0b3I7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBsb3dlc3QgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhbiBvcGVyYXRvciBhbmQgb3VyIHZlcnNpb25cbiAgICAvLyBpcyBsZXNzIHRoYW4gaXQgdGhlbiBpdCBpc24ndCBoaWdoZXIgdGhhbiB0aGUgcmFuZ2VcbiAgICBpZiAoKCFsb3cub3BlcmF0b3IgfHwgbG93Lm9wZXJhdG9yID09PSBjb21wKSAmJlxuICAgICAgICBsdGVmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnRzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlO1xuZnVuY3Rpb24gcHJlcmVsZWFzZSh2ZXJzaW9uLCBsb29zZSkge1xuICB2YXIgcGFyc2VkID0gcGFyc2UodmVyc2lvbiwgbG9vc2UpO1xuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsO1xufVxuXG5leHBvcnRzLmludGVyc2VjdHMgPSBpbnRlcnNlY3RzO1xuZnVuY3Rpb24gaW50ZXJzZWN0cyhyMSwgcjIsIGxvb3NlKSB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBsb29zZSlcbiAgcjIgPSBuZXcgUmFuZ2UocjIsIGxvb3NlKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMilcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0LCB0eXBvZiB9IGZyb20gJy4uL3V0aWwvaW5kZXgnXG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFZlcnNpb24uIGllOiAxLCAxLjAsIDEuMC4wXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZlcnNpb24gKHYpIHtcbiAgY29uc3QgaXNWYWxpZCA9IHNlbXZlci52YWxpZCh2KVxuICBpZiAoaXNWYWxpZCkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICB2ID0gdHlwZW9mICh2KSA9PT0gJ3N0cmluZycgPyB2IDogJydcbiAgY29uc3Qgc3BsaXQgPSB2LnNwbGl0KCcuJylcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgd2hpbGUgKGkgPCAzKSB7XG4gICAgY29uc3QgcyA9IHR5cGVvZiAoc3BsaXRbaV0pID09PSAnc3RyaW5nJyAmJiBzcGxpdFtpXSA/IHNwbGl0W2ldIDogJzAnXG4gICAgcmVzdWx0LnB1c2gocylcbiAgICBpKytcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuam9pbignLicpXG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9ucyBmcm9tIGRpZmZlcmVudCBlcnJvciBrZXkuIExpa2U6XG4gKiAtIGNvZGVcbiAqIC0gZXJyb3JNZXNzYWdlXG4gKiAtIGVycm9yVHlwZVxuICogLSBpc0Rvd25ncmFkZVxuICogQHBhcmFtICB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNyaXRlcmlhXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvciAoa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpc0Rvd25ncmFkZTogdHJ1ZSxcbiAgICBlcnJvclR5cGU6IDEsXG4gICAgY29kZTogMTAwMFxuICB9XG4gIGNvbnN0IGdldE1zZyA9IGZ1bmN0aW9uIChrZXksIHZhbCwgY3JpdGVyaWEpIHtcbiAgICByZXR1cm4gJ0Rvd25ncmFkZVsnICsga2V5ICsgJ10gOjogZGV2aWNlSW5mbyAnXG4gICAgICArIHZhbCArICcgbWF0Y2hlZCBjcml0ZXJpYSAnICsgY3JpdGVyaWFcbiAgfVxuICBjb25zdCBfa2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcblxuICByZXN1bHQuZXJyb3JNZXNzYWdlID0gZ2V0TXNnKGtleSwgdmFsLCBjcml0ZXJpYSlcblxuICBpZiAoX2tleS5pbmRleE9mKCdvc3ZlcnNpb24nKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDAxXG4gIH1cbiAgZWxzZSBpZiAoX2tleS5pbmRleE9mKCdhcHB2ZXJzaW9uJykgPj0gMCkge1xuICAgIHJlc3VsdC5jb2RlID0gMTAwMlxuICB9XG4gIGVsc2UgaWYgKF9rZXkuaW5kZXhPZignd2VleHZlcnNpb24nKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDAzXG4gIH1cbiAgZWxzZSBpZiAoX2tleS5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDRcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBXRUVYIGZyYW1ld29yayBpbnB1dChkZXZpY2VJbmZvKVxuICoge1xuICogICBwbGF0Zm9ybTogJ2lPUycgb3IgJ2FuZHJvaWQnXG4gKiAgIG9zVmVyc2lvbjogJzEuMC4wJyBvciAnMS4wJyBvciAnMSdcbiAqICAgYXBwVmVyc2lvbjogJzEuMC4wJyBvciAnMS4wJyBvciAnMSdcbiAqICAgd2VleFZlcnNpb246ICcxLjAuMCcgb3IgJzEuMCcgb3IgJzEnXG4gKiAgIGREZXZpY2VNb2RlbDogJ01PREVMX05BTUUnXG4gKiB9XG4gKlxuICogZG93bmdyYWRlIGNvbmZpZyhjb25maWcpXG4gKiB7XG4gKiAgIGlvczoge1xuICogICAgIG9zVmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgYXBwVmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgd2VleFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGRldmljZU1vZGVsOiBbJ21vZGVsQScsICdtb2RlbEInLCAuLi5dXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9XG4gKiB9XG4gKlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZGV2aWNlSW5mbyBXZWV4IFNESyBmcmFtZXdvcmsgaW5wdXRcbiAqIEBwYXJhbSAge29iamVjdH0gY29uZmlnICAgICB1c2VyIGlucHV0XG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgeyBpc0Rvd25ncmFkZTogdHJ1ZS9mYWxzZSwgZXJyb3JNZXNzYWdlLi4uIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrIChjb25maWcsIGRldmljZUluZm8pIHtcbiAgZGV2aWNlSW5mbyA9IGRldmljZUluZm8gfHwgZ2xvYmFsLldYRW52aXJvbm1lbnRcbiAgZGV2aWNlSW5mbyA9IGlzUGxhaW5PYmplY3QoZGV2aWNlSW5mbykgPyBkZXZpY2VJbmZvIDoge31cblxuICBsZXQgcmVzdWx0ID0ge1xuICAgIGlzRG93bmdyYWRlOiBmYWxzZSAvLyBkZWZhdXRsIGlzIHBhc3NcbiAgfVxuXG4gIGlmICh0eXBvZihjb25maWcpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbGV0IGN1c3RvbURvd25ncmFkZSA9IGNvbmZpZy5jYWxsKHRoaXMsIGRldmljZUluZm8sIHtcbiAgICAgIHNlbXZlcjogc2VtdmVyLFxuICAgICAgbm9ybWFsaXplVmVyc2lvblxuICAgIH0pXG5cbiAgICBjdXN0b21Eb3duZ3JhZGUgPSAhIWN1c3RvbURvd25ncmFkZVxuXG4gICAgcmVzdWx0ID0gY3VzdG9tRG93bmdyYWRlID8gZ2V0RXJyb3IoJ2N1c3RvbScsICcnLCAnY3VzdG9tIHBhcmFtcycpIDogcmVzdWx0XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uZmlnID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cblxuICAgIGNvbnN0IHBsYXRmb3JtID0gZGV2aWNlSW5mby5wbGF0Zm9ybSB8fCAndW5rbm93J1xuICAgIGNvbnN0IGRQbGF0Zm9ybSA9IHBsYXRmb3JtLnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBjT2JqID0gY29uZmlnW2RQbGF0Zm9ybV0gfHwge31cblxuICAgIGZvciAoY29uc3QgaSBpbiBkZXZpY2VJbmZvKSB7XG4gICAgICBjb25zdCBrZXkgPSBpXG4gICAgICBjb25zdCBrZXlMb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpXG4gICAgICBjb25zdCB2YWwgPSBkZXZpY2VJbmZvW2ldXG4gICAgICBjb25zdCBpc1ZlcnNpb24gPSBrZXlMb3dlci5pbmRleE9mKCd2ZXJzaW9uJykgPj0gMFxuICAgICAgY29uc3QgaXNEZXZpY2VNb2RlbCA9IGtleUxvd2VyLmluZGV4T2YoJ2RldmljZW1vZGVsJykgPj0gMFxuICAgICAgY29uc3QgY3JpdGVyaWEgPSBjT2JqW2ldXG5cbiAgICAgIGlmIChjcml0ZXJpYSAmJiBpc1ZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgYyA9IG5vcm1hbGl6ZVZlcnNpb24oY3JpdGVyaWEpXG4gICAgICAgIGNvbnN0IGQgPSBub3JtYWxpemVWZXJzaW9uKGRldmljZUluZm9baV0pXG5cbiAgICAgICAgaWYgKHNlbXZlci5zYXRpc2ZpZXMoZCwgYykpIHtcbiAgICAgICAgICByZXN1bHQgPSBnZXRFcnJvcihrZXksIHZhbCwgY3JpdGVyaWEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNEZXZpY2VNb2RlbCkge1xuICAgICAgICBjb25zdCBfY3JpdGVyaWEgPSB0eXBvZihjcml0ZXJpYSkgPT09ICdhcnJheScgPyBjcml0ZXJpYSA6IFtjcml0ZXJpYV1cbiAgICAgICAgaWYgKF9jcml0ZXJpYS5pbmRleE9mKHZhbCkgPj0gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Vmlld3BvcnQgKGFwcCwgY29uZmlncyA9IHt9KSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBTZXQgdmlld3BvcnQgKHdpZHRoOiAke2NvbmZpZ3Mud2lkdGh9KSBmb3IgYXBwIyR7YXBwLmlkfS5gKVxuICAgIHZhbGlkYXRlVmlld3BvcnQoY29uZmlncylcbiAgfVxuXG4gIC8vIFNlbmQgdmlld3BvcnQgY29uZmlncyB0byBuYXRpdmVcbiAgaWYgKGFwcCAmJiBhcHAuY2FsbFRhc2tzKSB7XG4gICAgcmV0dXJuIGFwcC5jYWxsVGFza3MoW3tcbiAgICAgIG1vZHVsZTogJ21ldGEnLFxuICAgICAgbWV0aG9kOiAnc2V0Vmlld3BvcnQnLFxuICAgICAgYXJnczogW2NvbmZpZ3NdXG4gICAgfV0pXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gQ2FuJ3QgZmluZCBcImNhbGxUYXNrc1wiIG1ldGhvZCBvbiBjdXJyZW50IGFwcC5gKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIHZpZXdwb3J0IGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZpZXdwb3J0IChjb25maWdzID0ge30pIHtcbiAgY29uc3QgeyB3aWR0aCB9ID0gY29uZmlnc1xuICBpZiAod2lkdGgpIHtcbiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAnbnVtYmVyJyAmJiB3aWR0aCAhPT0gJ2RldmljZS13aWR0aCcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gTm90IHN1cHBvcnQgdG8gdXNlICR7d2lkdGh9IGFzIHZpZXdwb3J0IHdpZHRoLmApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIHRoZSB2aWV3cG9ydCBjb25maWcgc2hvdWxkIGNvbnRhaW4gdGhlIFwid2lkdGhcIiBwcm9wZXJ0eS4nKVxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInXG5pbXBvcnQgVm0gZnJvbSAnLi4vLi4vdm0vaW5kZXgnXG5pbXBvcnQgKiBhcyBkb3duZ3JhZGUgZnJvbSAnLi4vZG93bmdyYWRlJ1xuaW1wb3J0IHsgc2V0Vmlld3BvcnQgfSBmcm9tICcuLi92aWV3cG9ydCdcbmltcG9ydCB7XG4gIHJlcXVpcmVDdXN0b21Db21wb25lbnRcbn0gZnJvbSAnLi4vcmVnaXN0ZXInXG5pbXBvcnQge1xuICBpc1BsYWluT2JqZWN0LFxuICBpc1dlZXhDb21wb25lbnQsXG4gIGlzTnBtTW9kdWxlLFxuICByZW1vdmVXZWV4UHJlZml4LFxuICByZW1vdmVKU1N1cmZpeFxufSBmcm9tICcuLi8uLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIGJvb3RzdHJhcCBhcHAgZnJvbSBhIGNlcnRhaW4gY3VzdG9tIGNvbXBvbmVudCB3aXRoIGNvbmZpZyAmIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvb3RzdHJhcCAoYXBwLCBuYW1lLCBjb25maWcsIGRhdGEpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gYm9vdHN0cmFwIGZvciAke25hbWV9YClcblxuICAvLyAxLiB2YWxpZGF0ZSBjdXN0b20gY29tcG9uZW50IG5hbWUgZmlyc3RcbiAgbGV0IGNsZWFuTmFtZVxuICBpZiAoaXNXZWV4Q29tcG9uZW50KG5hbWUpKSB7XG4gICAgY2xlYW5OYW1lID0gcmVtb3ZlV2VleFByZWZpeChuYW1lKVxuICB9XG4gIGVsc2UgaWYgKGlzTnBtTW9kdWxlKG5hbWUpKSB7XG4gICAgY2xlYW5OYW1lID0gcmVtb3ZlSlNTdXJmaXgobmFtZSlcbiAgICAvLyBjaGVjayBpZiBkZWZpbmUgYnkgb2xkICdkZWZpbmUnIG1ldGhvZFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghcmVxdWlyZUN1c3RvbUNvbXBvbmVudChhcHAsIGNsZWFuTmFtZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYEl0J3Mgbm90IGEgY29tcG9uZW50OiAke25hbWV9YClcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgV3JvbmcgY29tcG9uZW50IG5hbWU6ICR7bmFtZX1gKVxuICB9XG5cbiAgLy8gMi4gdmFsaWRhdGUgY29uZmlndXJhdGlvblxuICBjb25maWcgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAvLyAyLjEgdHJhbnNmb3JtZXIgdmVyc2lvbiBjaGVja1xuICBpZiAodHlwZW9mIGNvbmZpZy50cmFuc2Zvcm1lclZlcnNpb24gPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGdsb2JhbC50cmFuc2Zvcm1lclZlcnNpb24gPT09ICdzdHJpbmcnICYmXG4gICAgIXNlbXZlci5zYXRpc2ZpZXMoY29uZmlnLnRyYW5zZm9ybWVyVmVyc2lvbixcbiAgICAgIGdsb2JhbC50cmFuc2Zvcm1lclZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgSlMgQnVuZGxlIHZlcnNpb246ICR7Y29uZmlnLnRyYW5zZm9ybWVyVmVyc2lvbn0gYCArXG4gICAgICBgbm90IGNvbXBhdGlibGUgd2l0aCAke2dsb2JhbC50cmFuc2Zvcm1lclZlcnNpb259YClcbiAgfVxuICAvLyAyLjIgZG93bmdyYWRlIHZlcnNpb24gY2hlY2tcbiAgY29uc3QgZG93bmdyYWRlUmVzdWx0ID0gZG93bmdyYWRlLmNoZWNrKGNvbmZpZy5kb3duZ3JhZGUpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZG93bmdyYWRlUmVzdWx0LmlzRG93bmdyYWRlKSB7XG4gICAgYXBwLmNhbGxUYXNrcyhbe1xuICAgICAgbW9kdWxlOiAnaW5zdGFuY2VXcmFwJyxcbiAgICAgIG1ldGhvZDogJ2Vycm9yJyxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgZG93bmdyYWRlUmVzdWx0LmVycm9yVHlwZSxcbiAgICAgICAgZG93bmdyYWRlUmVzdWx0LmNvZGUsXG4gICAgICAgIGRvd25ncmFkZVJlc3VsdC5lcnJvck1lc3NhZ2VcbiAgICAgIF1cbiAgICB9XSlcbiAgICByZXR1cm4gbmV3IEVycm9yKGBEb3duZ3JhZGVbJHtkb3duZ3JhZGVSZXN1bHQuY29kZX1dOiAke2Rvd25ncmFkZVJlc3VsdC5lcnJvck1lc3NhZ2V9YClcbiAgfVxuXG4gIC8vIHNldCB2aWV3cG9ydFxuICBpZiAoY29uZmlnLnZpZXdwb3J0KSB7XG4gICAgc2V0Vmlld3BvcnQoYXBwLCBjb25maWcudmlld3BvcnQpXG4gIH1cblxuICAvLyAzLiBjcmVhdGUgYSBuZXcgVm0gd2l0aCBjdXN0b20gY29tcG9uZW50IG5hbWUgYW5kIGRhdGFcbiAgYXBwLnZtID0gbmV3IFZtKGNsZWFuTmFtZSwgbnVsbCwgeyBfYXBwOiBhcHAgfSwgbnVsbCwgZGF0YSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgaXNXZWV4Q29tcG9uZW50LFxuICBpc1dlZXhNb2R1bGUsXG4gIGlzTm9ybWFsTW9kdWxlLFxuICBpc05wbU1vZHVsZSxcbiAgcmVtb3ZlV2VleFByZWZpeCxcbiAgcmVtb3ZlSlNTdXJmaXhcbn0gZnJvbSAnLi4vLi4vdXRpbC9pbmRleCdcbmltcG9ydCB7XG4gIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50LFxuICByZXF1aXJlQ3VzdG9tQ29tcG9uZW50LFxuICBpbml0TW9kdWxlc1xufSBmcm9tICcuLi9yZWdpc3RlcidcblxuLyoqXG4gKiBkZWZpbmUobmFtZSwgZmFjdG9yeSkgZm9yIHByaW1hcnkgdXNhZ2VcbiAqIG9yXG4gKiBkZWZpbmUobmFtZSwgZGVwcywgZmFjdG9yeSkgZm9yIGNvbXBhdGliaWxpdHlcbiAqIE5vdGljZTogRE8gTk9UIHVzZSBmdW5jdGlvbiBkZWZpbmUoKSB7fSxcbiAqIGl0IHdpbGwgY2F1c2UgZXJyb3IgYWZ0ZXIgYnVpbGRlZCBieSB3ZWJwYWNrXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZpbmVGbiA9IGZ1bmN0aW9uIChhcHAsIG5hbWUsIC4uLmFyZ3MpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gZGVmaW5lIGEgY29tcG9uZW50ICR7bmFtZX1gKVxuXG4gIC8vIGFkYXB0IGFyZ3M6XG4gIC8vIDEuIG5hbWUsIGRlcHNbXSwgZmFjdG9yeSgpXG4gIC8vIDIuIG5hbWUsIGZhY3RvcnkoKVxuICAvLyAzLiBuYW1lLCBkZWZpbml0aW9ue31cbiAgbGV0IGZhY3RvcnksIGRlZmluaXRpb25cbiAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgIGRlZmluaXRpb24gPSBhcmdzWzFdXG4gIH1cbiAgZWxzZSB7XG4gICAgZGVmaW5pdGlvbiA9IGFyZ3NbMF1cbiAgfVxuICBpZiAodHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBmYWN0b3J5ID0gZGVmaW5pdGlvblxuICAgIGRlZmluaXRpb24gPSBudWxsXG4gIH1cblxuICAvLyByZXNvbHZlIGRlZmluaXRpb24gZnJvbSBmYWN0b3J5XG4gIGlmIChmYWN0b3J5KSB7XG4gICAgY29uc3QgciA9IChuYW1lKSA9PiB7XG4gICAgICBpZiAoaXNXZWV4Q29tcG9uZW50KG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVDdXN0b21Db21wb25lbnQoYXBwLCBjbGVhbk5hbWUpXG4gICAgICB9XG4gICAgICBpZiAoaXNXZWV4TW9kdWxlKG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgICAgICAgcmV0dXJuIGFwcC5yZXF1aXJlTW9kdWxlKGNsZWFuTmFtZSlcbiAgICAgIH1cbiAgICAgIGlmIChpc05vcm1hbE1vZHVsZShuYW1lKSB8fCBpc05wbU1vZHVsZShuYW1lKSkge1xuICAgICAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVKU1N1cmZpeChuYW1lKVxuICAgICAgICByZXR1cm4gYXBwLmNvbW1vbk1vZHVsZXNbY2xlYW5OYW1lXVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtID0geyBleHBvcnRzOiB7fX1cbiAgICBmYWN0b3J5KHIsIG0uZXhwb3J0cywgbSlcbiAgICBkZWZpbml0aW9uID0gbS5leHBvcnRzXG4gIH1cblxuICAvLyBhcHBseSBkZWZpbml0aW9uXG4gIGlmIChpc1dlZXhDb21wb25lbnQobmFtZSkpIHtcbiAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVXZWV4UHJlZml4KG5hbWUpXG4gICAgcmVnaXN0ZXJDdXN0b21Db21wb25lbnQoYXBwLCBjbGVhbk5hbWUsIGRlZmluaXRpb24pXG4gIH1cbiAgZWxzZSBpZiAoaXNXZWV4TW9kdWxlKG5hbWUpKSB7XG4gICAgY29uc3QgY2xlYW5OYW1lID0gcmVtb3ZlV2VleFByZWZpeChuYW1lKVxuICAgIGluaXRNb2R1bGVzKHsgW2NsZWFuTmFtZV06IGRlZmluaXRpb24gfSlcbiAgfVxuICBlbHNlIGlmIChpc05vcm1hbE1vZHVsZShuYW1lKSkge1xuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZUpTU3VyZml4KG5hbWUpXG4gICAgYXBwLmNvbW1vbk1vZHVsZXNbY2xlYW5OYW1lXSA9IGRlZmluaXRpb25cbiAgfVxuICBlbHNlIGlmIChpc05wbU1vZHVsZShuYW1lKSkge1xuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZUpTU3VyZml4KG5hbWUpXG4gICAgaWYgKGRlZmluaXRpb24udGVtcGxhdGUgfHxcbiAgICAgICAgZGVmaW5pdGlvbi5zdHlsZSB8fFxuICAgICAgICBkZWZpbml0aW9uLm1ldGhvZHMpIHtcbiAgICAgIC8vIGRvd25ncmFkZSB0byBvbGQgZGVmaW5lIG1ldGhvZCAoZGVmaW5lKCdjb21wb25lbnROYW1lJywgZmFjdG9yeSkpXG4gICAgICAvLyB0aGUgZXhwb3J0cyBjb250YWluIG9uZSBrZXkgb2YgdGVtcGxhdGUsIHN0eWxlIG9yIG1ldGhvZHNcbiAgICAgIC8vIGJ1dCBpdCBoYXMgcmlzayEhIVxuICAgICAgcmVnaXN0ZXJDdXN0b21Db21wb25lbnQoYXBwLCBjbGVhbk5hbWUsIGRlZmluaXRpb24pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYXBwLmNvbW1vbk1vZHVsZXNbY2xlYW5OYW1lXSA9IGRlZmluaXRpb25cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIgKGFwcCwgdHlwZSwgb3B0aW9ucykge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFJlZ2lzdGVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSBpbnN0YWxsIGxhc3Rlc3QgdHJhbnNmb3JtZXIuJylcbiAgcmVnaXN0ZXJDdXN0b21Db21wb25lbnQoYXBwLCB0eXBlLCBvcHRpb25zKVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGFwaSB0aGF0IGludm9rZWQgYnkganMgYnVuZGxlIGNvZGVcbiAqXG4gKiAtIGRlZmluZShuYW1lLCBmYWN0b3J5KTogZGVmaW5lIGEgbmV3IGNvbXBvc2VkIGNvbXBvbmVudCB0eXBlXG4gKiAtIGJvb3RzdHJhcCh0eXBlLCBjb25maWcsIGRhdGEpOiByZXF1aXJlIGEgY2VydGFpbiB0eXBlICZcbiAqICAgICAgICAgcmVuZGVyIHdpdGggKG9wdGlvbmFsKSBkYXRhXG4gKlxuICogZGVwcmVjYXRlZDpcbiAqIC0gcmVnaXN0ZXIodHlwZSwgb3B0aW9ucyk6IHJlZ2lzdGVyIGEgbmV3IGNvbXBvc2VkIGNvbXBvbmVudCB0eXBlXG4gKiAtIHJlbmRlcih0eXBlLCBkYXRhKTogcmVuZGVyIGJ5IGEgY2VydGFpbiB0eXBlIHdpdGggKG9wdGlvbmFsKSBkYXRhXG4gKiAtIHJlcXVpcmUodHlwZSkoZGF0YSk6IHJlcXVpcmUgYSB0eXBlIHRoZW4gcmVuZGVyIHdpdGggZGF0YVxuICovXG5cbmV4cG9ydCB7IGJvb3RzdHJhcCB9IGZyb20gJy4vYm9vdHN0cmFwJ1xuZXhwb3J0IHsgZGVmaW5lRm4sIHJlZ2lzdGVyIH0gZnJvbSAnLi9kZWZpbmUnXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogaW5zdGFuY2UgY29udHJvbHMgZnJvbSBuYXRpdmVcbiAqXG4gKiAtIGZpcmUgZXZlbnRcbiAqIC0gY2FsbGJhY2tcbiAqIC0gcmVmcmVzaFxuICogLSBkZXN0cm95XG4gKlxuICogY29ycmVzcG9uZGVkIHdpdGggdGhlIEFQSSBvZiBpbnN0YW5jZSBtYW5hZ2VyIChmcmFtZXdvcmsuanMpXG4gKi9cbmltcG9ydCB7IGV4dGVuZCwgdHlwb2YgfSBmcm9tICcuLi8uLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIFJlZnJlc2ggYW4gYXBwIHdpdGggZGF0YSB0byBpdHMgcm9vdCBjb21wb25lbnQgb3B0aW9ucy5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2ggKGFwcCwgZGF0YSkge1xuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBSZWZyZXNoIHdpdGhgLCBkYXRhLFxuICAgICAgICAgICAgYGluIGluc3RhbmNlWyR7YXBwLmlkfV1gKVxuICBjb25zdCB2bSA9IGFwcC52bVxuICBpZiAodm0gJiYgZGF0YSkge1xuICAgIGlmICh0eXBlb2Ygdm0ucmVmcmVzaERhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZtLnJlZnJlc2hEYXRhKGRhdGEpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZXh0ZW5kKHZtLCBkYXRhKVxuICAgIH1cbiAgICBhcHAuZGlmZmVyLmZsdXNoKClcbiAgICBhcHAuZG9jLnRhc2tDZW50ZXIuc2VuZCgnZG9tJywgeyBhY3Rpb246ICdyZWZyZXNoRmluaXNoJyB9LCBbXSlcbiAgICByZXR1cm5cbiAgfVxuICByZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgXCIke2RhdGF9XCJgKVxufVxuXG4vKipcbiAqIERlc3Ryb3kgYW4gYXBwLlxuICogQHBhcmFtICB7b2JqZWN0fSBhcHBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3kgKGFwcCkge1xuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBEZXN0b3J5IGFuIGluc3RhbmNlKCR7YXBwLmlkfSlgKVxuXG4gIGlmIChhcHAudm0pIHtcbiAgICBkZXN0cm95Vm0oYXBwLnZtKVxuICB9XG5cbiAgYXBwLmlkID0gJydcbiAgYXBwLm9wdGlvbnMgPSBudWxsXG4gIGFwcC5ibG9ja3MgPSBudWxsXG4gIGFwcC52bSA9IG51bGxcbiAgYXBwLmRvYy50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpXG4gIGFwcC5kb2MuZGVzdHJveSgpXG4gIGFwcC5kb2MgPSBudWxsXG4gIGFwcC5jdXN0b21Db21wb25lbnRNYXAgPSBudWxsXG4gIGFwcC5jb21tb25Nb2R1bGVzID0gbnVsbFxufVxuXG4vKipcbiAqIERlc3Ryb3kgYW4gVm0uXG4gKiBAcGFyYW0ge29iamVjdH0gdm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3lWbSAodm0pIHtcbiAgZGVsZXRlIHZtLl9hcHBcbiAgZGVsZXRlIHZtLl9jb21wdXRlZFxuICBkZWxldGUgdm0uX2Nzc1xuICBkZWxldGUgdm0uX2RhdGFcbiAgZGVsZXRlIHZtLl9pZHNcbiAgZGVsZXRlIHZtLl9tZXRob2RzXG4gIGRlbGV0ZSB2bS5fb3B0aW9uc1xuICBkZWxldGUgdm0uX3BhcmVudFxuICBkZWxldGUgdm0uX3BhcmVudEVsXG4gIGRlbGV0ZSB2bS5fcm9vdEVsXG5cbiAgLy8gcmVtb3ZlIGFsbCB3YXRjaGVyc1xuICBpZiAodm0uX3dhdGNoZXJzKSB7XG4gICAgbGV0IHdhdGNoZXJDb3VudCA9IHZtLl93YXRjaGVycy5sZW5ndGhcbiAgICB3aGlsZSAod2F0Y2hlckNvdW50LS0pIHtcbiAgICAgIHZtLl93YXRjaGVyc1t3YXRjaGVyQ291bnRdLnRlYXJkb3duKClcbiAgICB9XG4gICAgZGVsZXRlIHZtLl93YXRjaGVyc1xuICB9XG5cbiAgLy8gZGVzdHJveSBjaGlsZCB2bXMgcmVjdXJzaXZlbHlcbiAgaWYgKHZtLl9jaGlsZHJlblZtcykge1xuICAgIGxldCB2bUNvdW50ID0gdm0uX2NoaWxkcmVuVm1zLmxlbmd0aFxuICAgIHdoaWxlICh2bUNvdW50LS0pIHtcbiAgICAgIGRlc3Ryb3lWbSh2bS5fY2hpbGRyZW5WbXNbdm1Db3VudF0pXG4gICAgfVxuICAgIGRlbGV0ZSB2bS5fY2hpbGRyZW5WbXNcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIFwiZGVzdHJveWVkXCIgbGlmZWN5Y2xlIGluIFZtKCR7dm0uX3R5cGV9KWApXG4gIHZtLiRlbWl0KCdob29rOmRlc3Ryb3llZCcpXG5cbiAgZGVsZXRlIHZtLl90eXBlXG4gIGRlbGV0ZSB2bS5fdm1FdmVudHNcbn1cblxuLyoqXG4gKiBHZXQgYSBKU09OIG9iamVjdCB0byBkZXNjcmliZSB0aGUgZG9jdW1lbnQgYm9keS5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290RWxlbWVudCAoYXBwKSB7XG4gIGNvbnN0IGRvYyA9IGFwcC5kb2MgfHwge31cbiAgY29uc3QgYm9keSA9IGRvYy5ib2R5IHx8IHt9XG4gIHJldHVybiBib2R5LnRvSlNPTiA/IGJvZHkudG9KU09OKCkgOiB7fVxufVxuXG4vKipcbiAqIEZpcmUgYW4gZXZlbnQgZnJvbSByZW5kZXJlci4gVGhlIGV2ZW50IGhhcyB0eXBlLCBhbiBldmVudCBvYmplY3QgYW5kIGFuXG4gKiBlbGVtZW50IHJlZi4gSWYgdGhlIGV2ZW50IGNvbWVzIHdpdGggc29tZSB2aXJ0dWFsLURPTSBjaGFuZ2VzLCBpdCBzaG91bGRcbiAqIGhhdmUgb25lIG1vcmUgcGFyYW1ldGVyIHRvIGRlc2NyaWJlIHRoZSBjaGFuZ2VzLlxuICogQHBhcmFtICB7b2JqZWN0fSBhcHBcbiAqIEBwYXJhbSAge3N0cmluZ30gcmVmXG4gKiBAcGFyYW0gIHt0eXBlfSAgIHR5cGVcbiAqIEBwYXJhbSAge29iamVjdH0gZVxuICogQHBhcmFtICB7b2JqZWN0fSBkb21DaGFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXJlRXZlbnQgKGFwcCwgcmVmLCB0eXBlLCBlLCBkb21DaGFuZ2VzKSB7XG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIEZpcmUgYSBcIiR7dHlwZX1cIiBldmVudCBvbiBhbiBlbGVtZW50KCR7cmVmfSkgaW4gaW5zdGFuY2UoJHthcHAuaWR9KWApXG4gIGlmIChBcnJheS5pc0FycmF5KHJlZikpIHtcbiAgICByZWYuc29tZSgocmVmKSA9PiB7XG4gICAgICByZXR1cm4gZmlyZUV2ZW50KGFwcCwgcmVmLCB0eXBlLCBlKSAhPT0gZmFsc2VcbiAgICB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGVsID0gYXBwLmRvYy5nZXRSZWYocmVmKVxuICBpZiAoZWwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhcHAuZG9jLmZpcmVFdmVudChlbCwgdHlwZSwgZSwgZG9tQ2hhbmdlcylcbiAgICBhcHAuZGlmZmVyLmZsdXNoKClcbiAgICBhcHAuZG9jLnRhc2tDZW50ZXIuc2VuZCgnZG9tJywgeyBhY3Rpb246ICd1cGRhdGVGaW5pc2gnIH0sIFtdKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuICByZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGVsZW1lbnQgcmVmZXJlbmNlIFwiJHtyZWZ9XCJgKVxufVxuXG4vKipcbiAqIE1ha2UgYSBjYWxsYmFjayBmb3IgYSBjZXJ0YWluIGFwcC5cbiAqIEBwYXJhbSAge29iamVjdH0gICBhcHBcbiAqIEBwYXJhbSAge251bWJlcn0gICBjYWxsYmFja0lkXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgZGF0YVxuICogQHBhcmFtICB7Ym9vbGVhbn0gIGlmS2VlcEFsaXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxsYmFjayAoYXBwLCBjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSkge1xuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBJbnZva2UgYSBjYWxsYmFjaygke2NhbGxiYWNrSWR9KSB3aXRoYCwgZGF0YSxcbiAgICAgICAgICAgIGBpbiBpbnN0YW5jZSgke2FwcC5pZH0pYClcbiAgY29uc3QgcmVzdWx0ID0gYXBwLmRvYy50YXNrQ2VudGVyLmNhbGxiYWNrKGNhbGxiYWNrSWQsIGRhdGEsIGlmS2VlcEFsaXZlKVxuICB1cGRhdGVBY3Rpb25zKGFwcClcbiAgYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAndXBkYXRlRmluaXNoJyB9LCBbXSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENvbGxlY3QgYWxsIHZpcnR1YWwtRE9NIG11dGF0aW9ucyB0b2dldGhlciBhbmQgc2VuZCB0aGVtIHRvIHJlbmRlcmVyLlxuICogQHBhcmFtICB7b2JqZWN0fSBhcHBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFjdGlvbnMgKGFwcCkge1xuICBhcHAuZGlmZmVyLmZsdXNoKClcbn1cblxuLyoqXG4gKiBDYWxsIGFsbCB0YXNrcyBmcm9tIGFuIGFwcCB0byByZW5kZXJlciAobmF0aXZlKS5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcGFyYW0gIHthcnJheX0gIHRhc2tzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxsVGFza3MgKGFwcCwgdGFza3MpIHtcbiAgbGV0IHJlc3VsdFxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBvZih0YXNrcykgIT09ICdhcnJheScpIHtcbiAgICB0YXNrcyA9IFt0YXNrc11cbiAgfVxuXG4gIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgcmVzdWx0ID0gYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoXG4gICAgICAnbW9kdWxlJyxcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlOiB0YXNrLm1vZHVsZSxcbiAgICAgICAgbWV0aG9kOiB0YXNrLm1ldGhvZFxuICAgICAgfSxcbiAgICAgIHRhc2suYXJnc1xuICAgIClcbiAgfSlcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogaW5zdGFuY2UgY29udHJvbHMgZnJvbSBuYXRpdmVcbiAqXG4gKiAtIGluaXQgYnVuZGxlXG4gKlxuICogY29ycmVzcG9uZGVkIHdpdGggdGhlIEFQSSBvZiBpbnN0YW5jZSBtYW5hZ2VyIChmcmFtZXdvcmsuanMpXG4gKi9cblxuaW1wb3J0IFZtIGZyb20gJy4uLy4uL3ZtL2luZGV4J1xuaW1wb3J0IHsgcmVtb3ZlV2VleFByZWZpeCB9IGZyb20gJy4uLy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQge1xuICBkZWZpbmVGbixcbiAgYm9vdHN0cmFwLFxuICByZWdpc3RlclxufSBmcm9tICcuLi9idW5kbGUvaW5kZXgnXG5pbXBvcnQgeyB1cGRhdGVBY3Rpb25zIH0gZnJvbSAnLi9taXNjJ1xuXG4vKipcbiAqIEluaXQgYW4gYXBwIGJ5IHJ1biBjb2RlIHdpdGdoIGRhdGFcbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvZGVcbiAqIEBwYXJhbSAge29iamVjdH0gZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAoYXBwLCBjb2RlLCBkYXRhLCBzZXJ2aWNlcykge1xuICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBJbnRpYWxpemUgYW4gaW5zdGFuY2Ugd2l0aDpcXG4nLCBkYXRhKVxuICBsZXQgcmVzdWx0XG5cbiAgLy8gcHJlcGFyZSBhcHAgZW52IG1ldGhvZHNcbiAgY29uc3QgYnVuZGxlRGVmaW5lID0gKC4uLmFyZ3MpID0+IGRlZmluZUZuKGFwcCwgLi4uYXJncylcbiAgY29uc3QgYnVuZGxlQm9vdHN0cmFwID0gKG5hbWUsIGNvbmZpZywgX2RhdGEpID0+IHtcbiAgICByZXN1bHQgPSBib290c3RyYXAoYXBwLCBuYW1lLCBjb25maWcsIF9kYXRhIHx8IGRhdGEpXG4gICAgdXBkYXRlQWN0aW9ucyhhcHApXG4gICAgYXBwLmRvYy5saXN0ZW5lci5jcmVhdGVGaW5pc2goKVxuICAgIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIEFmdGVyIGludGlhbGl6ZWQgYW4gaW5zdGFuY2UoJHthcHAuaWR9KWApXG4gIH1cbiAgY29uc3QgYnVuZGxlVm0gPSBWbVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBidW5kbGVSZWdpc3RlciA9ICguLi5hcmdzKSA9PiByZWdpc3RlcihhcHAsIC4uLmFyZ3MpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGNvbnN0IGJ1bmRsZVJlbmRlciA9IChuYW1lLCBfZGF0YSkgPT4ge1xuICAgIHJlc3VsdCA9IGJvb3RzdHJhcChhcHAsIG5hbWUsIHt9LCBfZGF0YSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBidW5kbGVSZXF1aXJlID0gbmFtZSA9PiBfZGF0YSA9PiB7XG4gICAgcmVzdWx0ID0gYm9vdHN0cmFwKGFwcCwgbmFtZSwge30sIF9kYXRhKVxuICB9XG4gIGNvbnN0IGJ1bmRsZURvY3VtZW50ID0gYXBwLmRvY1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBidW5kbGVSZXF1aXJlTW9kdWxlID0gbmFtZSA9PiBhcHAucmVxdWlyZU1vZHVsZShyZW1vdmVXZWV4UHJlZml4KG5hbWUpKVxuXG4gIGNvbnN0IHdlZXhHbG9iYWxPYmplY3QgPSB7XG4gICAgY29uZmlnOiBhcHAub3B0aW9ucyxcbiAgICBkZWZpbmU6IGJ1bmRsZURlZmluZSxcbiAgICBib290c3RyYXA6IGJ1bmRsZUJvb3RzdHJhcCxcbiAgICByZXF1aXJlTW9kdWxlOiBidW5kbGVSZXF1aXJlTW9kdWxlLFxuICAgIGRvY3VtZW50OiBidW5kbGVEb2N1bWVudCxcbiAgICBWbTogYnVuZGxlVm1cbiAgfVxuXG4gIE9iamVjdC5mcmVlemUod2VleEdsb2JhbE9iamVjdClcblxuICAvLyBwcmVwYXJlIGNvZGVcbiAgbGV0IGZ1bmN0aW9uQm9keVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBjb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gYGZ1bmN0aW9uICgpIHsuLi59YCAtPiBgey4uLn1gXG4gICAgLy8gbm90IHZlcnkgc3RyaWN0XG4gICAgZnVuY3Rpb25Cb2R5ID0gY29kZS50b1N0cmluZygpLnN1YnN0cigxMilcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBlbHNlIGlmIChjb2RlKSB7XG4gICAgZnVuY3Rpb25Cb2R5ID0gY29kZS50b1N0cmluZygpXG4gIH1cbiAgLy8gd3JhcCBJRkZFIGFuZCB1c2Ugc3RyaWN0IG1vZGVcbiAgZnVuY3Rpb25Cb2R5ID0gYChmdW5jdGlvbihnbG9iYWwpe1xcblxcblwidXNlIHN0cmljdFwiO1xcblxcbiAke2Z1bmN0aW9uQm9keX0gXFxuXFxufSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlgXG5cbiAgLy8gcnVuIGNvZGUgYW5kIGdldCByZXN1bHRcbiAgY29uc3QgeyBXWEVudmlyb25tZW50IH0gPSBnbG9iYWxcbiAgY29uc3QgdGltZXJBUElzID0ge31cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKFdYRW52aXJvbm1lbnQgJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSAhPT0gJ1dlYicpIHtcbiAgICAvLyB0aW1lciBBUElzIHBvbHlmaWxsIGluIG5hdGl2ZVxuICAgIGNvbnN0IHRpbWVyID0gYXBwLnJlcXVpcmVNb2R1bGUoJ3RpbWVyJylcbiAgICBPYmplY3QuYXNzaWduKHRpbWVyQVBJcywge1xuICAgICAgc2V0VGltZW91dDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhcmdzWzBdKC4uLmFyZ3Muc2xpY2UoMikpXG4gICAgICAgIH1cbiAgICAgICAgdGltZXIuc2V0VGltZW91dChoYW5kbGVyLCBhcmdzWzFdKVxuICAgICAgICByZXR1cm4gYXBwLmRvYy50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgICB9LFxuICAgICAgc2V0SW50ZXJ2YWw6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1swXSguLi5hcmdzLnNsaWNlKDIpKVxuICAgICAgICB9XG4gICAgICAgIHRpbWVyLnNldEludGVydmFsKGhhbmRsZXIsIGFyZ3NbMV0pXG4gICAgICAgIHJldHVybiBhcHAuZG9jLnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKClcbiAgICAgIH0sXG4gICAgICBjbGVhclRpbWVvdXQ6IChuKSA9PiB7XG4gICAgICAgIHRpbWVyLmNsZWFyVGltZW91dChuKVxuICAgICAgfSxcbiAgICAgIGNsZWFySW50ZXJ2YWw6IChuKSA9PiB7XG4gICAgICAgIHRpbWVyLmNsZWFySW50ZXJ2YWwobilcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8vIHJ1biBjb2RlIGFuZCBnZXQgcmVzdWx0XG4gIGNvbnN0IGdsb2JhbE9iamVjdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBkZWZpbmU6IGJ1bmRsZURlZmluZSxcbiAgICByZXF1aXJlOiBidW5kbGVSZXF1aXJlLFxuICAgIGJvb3RzdHJhcDogYnVuZGxlQm9vdHN0cmFwLFxuICAgIHJlZ2lzdGVyOiBidW5kbGVSZWdpc3RlcixcbiAgICByZW5kZXI6IGJ1bmRsZVJlbmRlcixcbiAgICBfX3dlZXhfZGVmaW5lX186IGJ1bmRsZURlZmluZSwgLy8gYWxpYXMgZm9yIGRlZmluZVxuICAgIF9fd2VleF9ib290c3RyYXBfXzogYnVuZGxlQm9vdHN0cmFwLCAvLyBhbGlhcyBmb3IgYm9vdHN0cmFwXG4gICAgX193ZWV4X2RvY3VtZW50X186IGJ1bmRsZURvY3VtZW50LFxuICAgIF9fd2VleF9yZXF1aXJlX186IGJ1bmRsZVJlcXVpcmVNb2R1bGUsXG4gICAgX193ZWV4X3ZpZXdtb2RlbF9fOiBidW5kbGVWbSxcbiAgICB3ZWV4OiB3ZWV4R2xvYmFsT2JqZWN0XG4gIH0sIHRpbWVyQVBJcywgc2VydmljZXMpXG4gIGlmICghY2FsbEZ1bmN0aW9uTmF0aXZlKGdsb2JhbE9iamVjdHMsIGZ1bmN0aW9uQm9keSkpIHtcbiAgICAvLyBJZiBmYWlsZWQgdG8gY29tcGlsZSBmdW5jdGlvbkJvZHkgb24gbmF0aXZlIHNpZGUsXG4gICAgLy8gZmFsbGJhY2sgdG8gY2FsbEZ1bmN0aW9uLlxuICAgIGNhbGxGdW5jdGlvbihnbG9iYWxPYmplY3RzLCBmdW5jdGlvbkJvZHkpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQ2FsbCBhIG5ldyBmdW5jdGlvbiBib2R5IHdpdGggc29tZSBnbG9iYWwgb2JqZWN0cy5cbiAqIEBwYXJhbSAge29iamVjdH0gZ2xvYmFsT2JqZWN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbiAoZ2xvYmFsT2JqZWN0cywgYm9keSkge1xuICBjb25zdCBnbG9iYWxLZXlzID0gW11cbiAgY29uc3QgZ2xvYmFsVmFsdWVzID0gW11cbiAgZm9yIChjb25zdCBrZXkgaW4gZ2xvYmFsT2JqZWN0cykge1xuICAgIGdsb2JhbEtleXMucHVzaChrZXkpXG4gICAgZ2xvYmFsVmFsdWVzLnB1c2goZ2xvYmFsT2JqZWN0c1trZXldKVxuICB9XG4gIGdsb2JhbEtleXMucHVzaChib2R5KVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGdW5jdGlvbiguLi5nbG9iYWxLZXlzKVxuICByZXR1cm4gcmVzdWx0KC4uLmdsb2JhbFZhbHVlcylcbn1cblxuLyoqXG4gKiBDYWxsIGEgbmV3IGZ1bmN0aW9uIGdlbmVyYXRlZCBvbiB0aGUgVjggbmF0aXZlIHNpZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGdsb2JhbE9iamVjdHNcbiAqIEBwYXJhbSAge3N0cmluZ30gYm9keVxuICogQHJldHVybiB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgaWYgbm8gZXJyb3Igb2NjdXJyZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbk5hdGl2ZSAoZ2xvYmFsT2JqZWN0cywgYm9keSkge1xuICBpZiAodHlwZW9mIGNvbXBpbGVBbmRSdW5CdW5kbGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBmbiA9IHZvaWQgMFxuICBsZXQgaXNOYXRpdmVDb21waWxlT2sgPSBmYWxzZVxuICBsZXQgc2NyaXB0ID0gJyhmdW5jdGlvbiAoJ1xuICBjb25zdCBnbG9iYWxLZXlzID0gW11cbiAgY29uc3QgZ2xvYmFsVmFsdWVzID0gW11cbiAgZm9yIChjb25zdCBrZXkgaW4gZ2xvYmFsT2JqZWN0cykge1xuICAgIGdsb2JhbEtleXMucHVzaChrZXkpXG4gICAgZ2xvYmFsVmFsdWVzLnB1c2goZ2xvYmFsT2JqZWN0c1trZXldKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYmFsS2V5cy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBzY3JpcHQgKz0gZ2xvYmFsS2V5c1tpXVxuICAgIHNjcmlwdCArPSAnLCdcbiAgfVxuICBzY3JpcHQgKz0gZ2xvYmFsS2V5c1tnbG9iYWxLZXlzLmxlbmd0aCAtIDFdXG4gIHNjcmlwdCArPSAnKSB7J1xuICBzY3JpcHQgKz0gYm9keVxuICBzY3JpcHQgKz0gJ30gKSdcblxuICB0cnkge1xuICAgIGNvbnN0IHdlZXggPSBnbG9iYWxPYmplY3RzLndlZXggfHwge31cbiAgICBjb25zdCBjb25maWcgPSB3ZWV4LmNvbmZpZyB8fCB7fVxuICAgIGZuID0gY29tcGlsZUFuZFJ1bkJ1bmRsZShzY3JpcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5idW5kbGVVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5idW5kbGVEaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb2RlQ2FjaGVQYXRoKVxuICAgIGlmIChmbiAmJiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuKC4uLmdsb2JhbFZhbHVlcylcbiAgICAgIGlzTmF0aXZlQ29tcGlsZU9rID0gdHJ1ZVxuICAgIH1cbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgfVxuXG4gIHJldHVybiBpc05hdGl2ZUNvbXBpbGVPa1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGluc3RhbmNlIGNvbnRyb2xzIGZyb20gbmF0aXZlXG4gKlxuICogLSBpbml0IGJ1bmRsZVxuICogLSBmaXJlIGV2ZW50XG4gKiAtIGNhbGxiYWNrXG4gKiAtIGRlc3Ryb3lcbiAqXG4gKiBjb3JyZXNwb25kZWQgd2l0aCB0aGUgQVBJIG9mIGluc3RhbmNlIG1hbmFnZXIgKGZyYW1ld29yay5qcylcbiAqL1xuZXhwb3J0IHsgaW5pdCB9IGZyb20gJy4vaW5pdCdcblxuZXhwb3J0IHtcbiAgcmVmcmVzaCxcbiAgZGVzdHJveSxcbiAgZ2V0Um9vdEVsZW1lbnQsXG4gIGZpcmVFdmVudCxcbiAgY2FsbGJhY2ssXG4gIHVwZGF0ZUFjdGlvbnMsXG4gIGNhbGxUYXNrc1xufSBmcm9tICcuL21pc2MnXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpZmZlciB7XG4gIGNvbnN0cnVjdG9yIChpZCkge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMubWFwID0gW11cbiAgICB0aGlzLmhvb2tzID0gW11cbiAgfVxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAubGVuZ3RoID09PSAwXG4gIH1cbiAgYXBwZW5kICh0eXBlLCBkZXB0aCA9IDAsIHJlZiwgaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5oYXNUaW1lcikge1xuICAgICAgdGhpcy5oYXNUaW1lciA9IHRydWVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc1RpbWVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5mbHVzaCh0cnVlKVxuICAgICAgfSwgMClcbiAgICB9XG4gICAgY29uc3QgbWFwID0gdGhpcy5tYXBcbiAgICBpZiAoIW1hcFtkZXB0aF0pIHtcbiAgICAgIG1hcFtkZXB0aF0gPSB7fVxuICAgIH1cbiAgICBjb25zdCBncm91cCA9IG1hcFtkZXB0aF1cbiAgICBpZiAoIWdyb3VwW3R5cGVdKSB7XG4gICAgICBncm91cFt0eXBlXSA9IHt9XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnZWxlbWVudCcpIHtcbiAgICAgIGlmICghZ3JvdXBbdHlwZV1bcmVmXSkge1xuICAgICAgICBncm91cFt0eXBlXVtyZWZdID0gW11cbiAgICAgIH1cbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0ucHVzaChoYW5kbGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0gPSBoYW5kbGVyXG4gICAgfVxuICB9XG4gIGZsdXNoIChpc1RpbWVvdXQpIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLm1hcC5zbGljZSgpXG4gICAgdGhpcy5tYXAubGVuZ3RoID0gMFxuICAgIG1hcC5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdyZXBlYXQnKVxuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdzaG93bicpXG4gICAgICBjYWxsVHlwZUxpc3QoZ3JvdXAsICdlbGVtZW50JylcbiAgICB9KVxuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmhvb2tzLnNsaWNlKClcbiAgICB0aGlzLmhvb2tzLmxlbmd0aCA9IDBcbiAgICBob29rcy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgZm4oKVxuICAgIH0pXG5cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9XG4gIH1cbiAgdGhlbiAoZm4pIHtcbiAgICB0aGlzLmhvb2tzLnB1c2goZm4pXG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbFR5cGVNYXAgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIG1hcFtyZWZdKClcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsVHlwZUxpc3QgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIGNvbnN0IGxpc3QgPSBtYXBbcmVmXVxuICAgIGxpc3QuZm9yRWFjaCgoaGFuZGxlcikgPT4geyBoYW5kbGVyKCkgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFdlZXggQXBwIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCBEaWZmZXIgZnJvbSAnLi9kaWZmZXInXG5pbXBvcnQgcmVuZGVyZXIgZnJvbSAnLi4vY29uZmlnJ1xuXG4vKipcbiAqIEFwcCBjb25zdHJ1Y3RvciBmb3IgV2VleCBmcmFtZXdvcmsuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCAoaWQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pZCA9IGlkXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy52bSA9IG51bGxcbiAgdGhpcy5jdXN0b21Db21wb25lbnRNYXAgPSB7fVxuICB0aGlzLmNvbW1vbk1vZHVsZXMgPSB7fVxuXG4gIC8vIGRvY3VtZW50XG4gIHRoaXMuZG9jID0gbmV3IHJlbmRlcmVyLkRvY3VtZW50KFxuICAgIGlkLFxuICAgIHRoaXMub3B0aW9ucy5idW5kbGVVcmwsXG4gICAgbnVsbCxcbiAgICByZW5kZXJlci5MaXN0ZW5lclxuICApXG4gIHRoaXMuZGlmZmVyID0gbmV3IERpZmZlcihpZClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBXZWV4IGluc3RhbmNlIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCB7IHJlcXVpcmVNb2R1bGUgfSBmcm9tICcuL3JlZ2lzdGVyJ1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucywgY2FsbFRhc2tzIH0gZnJvbSAnLi9jdHJsL2luZGV4J1xuaW1wb3J0IEFwcCBmcm9tICcuL2luc3RhbmNlJ1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUucmVxdWlyZU1vZHVsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiByZXF1aXJlTW9kdWxlKHRoaXMsIG5hbWUpXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuQXBwLnByb3RvdHlwZS51cGRhdGVBY3Rpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdXBkYXRlQWN0aW9ucyh0aGlzKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUuY2FsbFRhc2tzID0gZnVuY3Rpb24gKHRhc2tzKSB7XG4gIHJldHVybiBjYWxsVGFza3ModGhpcywgdGFza3MpXG59XG5cbi8qKlxuICogUHJldmVudCBtb2RpZmljYXRpb24gb2YgQXBwIGFuZCBBcHAucHJvdG90eXBlXG4gKi9cbk9iamVjdC5mcmVlemUoQXBwKVxuT2JqZWN0LmZyZWV6ZShBcHAucHJvdG90eXBlKVxuXG5leHBvcnQgZGVmYXVsdCBBcHBcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlTWFwID0ge31cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IEFwcCBmcm9tICcuLi9hcHAvaW5kZXgnXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHsgaW5pdCBhcyBpbml0QXBwIH0gZnJvbSAnLi4vYXBwL2N0cmwvaW5kZXgnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIENyZWF0ZSBhIFdlZXggaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnNcbiAqICAgICAgICAgb3B0aW9uIGBIQVNfTE9HYCBlbmFibGUgcHJpbnQgbG9nXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqIEBwYXJhbSAge29iamVjdH0gaW5mbyB7IGNyZWF0ZWQsIC4uLiBzZXJ2aWNlcyB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSAoaWQsIGNvZGUsIG9wdGlvbnMsIGRhdGEsIGluZm8pIHtcbiAgY29uc3QgeyBzZXJ2aWNlcyB9ID0gaW5mbyB8fCB7fVxuICByZXNldFRhcmdldCgpXG4gIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICBsZXQgcmVzdWx0XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBBcHAoaWQsIG9wdGlvbnMpXG4gICAgaW5zdGFuY2VNYXBbaWRdID0gaW5zdGFuY2VcbiAgICByZXN1bHQgPSBpbml0QXBwKGluc3RhbmNlLCBjb2RlLCBkYXRhLCBzZXJ2aWNlcylcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSA/IHJlc3VsdCA6IGluc3RhbmNlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0IHtcbiAgcmVmcmVzaCxcbiAgZGVzdHJveVxufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcbmltcG9ydCB7IGluc3RhbmNlTWFwIH0gZnJvbSAnLi9tYXAnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIEluaXQgY29uZmlnIGluZm9ybWF0aW9ucyBmb3IgV2VleCBmcmFtZXdvcmtcbiAqIEBwYXJhbSAge29iamVjdH0gY2ZnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0IChjZmcpIHtcbiAgY29uZmlnLkRvY3VtZW50ID0gY2ZnLkRvY3VtZW50XG4gIGNvbmZpZy5FbGVtZW50ID0gY2ZnLkVsZW1lbnRcbiAgY29uZmlnLkNvbW1lbnQgPSBjZmcuQ29tbWVudFxuICBjb25maWcuc2VuZFRhc2tzID0gY2ZnLnNlbmRUYXNrc1xuICBjb25maWcuTGlzdGVuZXIgPSBjZmcuTGlzdGVuZXJcbn1cblxuLyoqXG4gKiBSZWZyZXNoIGEgV2VleCBpbnN0YW5jZSB3aXRoIGRhdGEuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7b2JqZWN0fSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoSW5zdGFuY2UgKGlkLCBkYXRhKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gcmVmcmVzaChpbnN0YW5jZSwgZGF0YSlcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRGVzdHJveSBhIFdlZXggaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIC8vIE1hcmt1cCBzb21lIGdsb2JhbCBzdGF0ZSBpbiBuYXRpdmUgc2lkZVxuICBpZiAodHlwZW9mIG1hcmt1cFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWFya3VwU3RhdGUoKVxuICB9XG5cbiAgcmVzZXRUYXJnZXQoKVxuICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBpbnN0YW5jZSBpZCBcIiR7aWR9XCJgKVxuICB9XG4gIGRlc3Ryb3koaW5zdGFuY2UpXG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbiAgLy8gbm90aWZ5Q29udGV4dERpc3Bvc2VkIGlzIHVzZWQgdG8gdGVsbCB2OCB0byBkbyBhIGZ1bGwgR0MsXG4gIC8vIGJ1dCB0aGlzIHdvdWxkIGhhdmUgYSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gd2VleCxcbiAgLy8gYmVjYXVzZSBhbGwgdGhlIGlubGluZSBjYWNoZSBpbiB2OCB3b3VsZCBnZXQgY2xlYXJlZFxuICAvLyBkdXJpbmcgYSBmdWxsIEdDLlxuICAvLyBUbyB0YWtlIGNhcmUgb2YgYm90aCBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlLCBqdXN0IHRlbGwgdjhcbiAgLy8gdG8gZG8gYSBmdWxsIEdDIGV2ZXJ5IGVpZ2h0ZWVuIHRpbWVzLlxuICBjb25zdCBpZE51bSA9IE1hdGgucm91bmQoaWQpXG4gIGNvbnN0IHJvdW5kID0gMThcbiAgaWYgKGlkTnVtID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGlkTnVtICUgcm91bmRcbiAgICBpZiAoIXJlbWFpbmRlciAmJiB0eXBlb2Ygbm90aWZ5VHJpbU1lbW9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbm90aWZ5VHJpbU1lbW9yeSgpXG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0YW5jZU1hcFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgVm0gZnJvbSAnLi4vdm0vaW5kZXgnXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL2NvbmZpZydcbmltcG9ydCB7XG4gIGluaXRNb2R1bGVzLFxuICBpbml0TWV0aG9kc1xufSBmcm9tICcuLi9hcHAvcmVnaXN0ZXInXG5cbmNvbnN0IHtcbiAgbmF0aXZlQ29tcG9uZW50TWFwXG59ID0gY29uZmlnXG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgb2YgZWFjaCBuYXRpdmUgY29tcG9uZW50LlxuICogQHBhcmFtICB7YXJyYXl9IGNvbXBvbmVudHMgYXJyYXkgb2YgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzIChjb21wb25lbnRzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIHJlZ2lzdGVyIChuYW1lKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmF0aXZlQ29tcG9uZW50TWFwW25hbWVdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmFtZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYXRpdmVDb21wb25lbnRNYXBbbmFtZS50eXBlXSA9IG5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG1vZHVsZXMgYSBvYmplY3Qgb2YgbW9kdWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVzIChtb2R1bGVzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TW9kdWxlcyhtb2R1bGVzKVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwaXMgYSBvYmplY3Qgb2YgYXBpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZXRob2RzIChtZXRob2RzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbWV0aG9kcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TWV0aG9kcyhWbSwgbWV0aG9kcylcbiAgfVxufVxuXG4vLyBAdG9kbzogSGFjayBmb3IgdGhpcyBmcmFtZXdvcmsgb25seS4gV2lsbCBiZSByZS1kZXNpZ25lZCBvciByZW1vdmVkIGxhdGVyLlxuZ2xvYmFsLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kc1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHtcbiAgZmlyZUV2ZW50LFxuICBjYWxsYmFja1xufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcblxuY29uc3QganNIYW5kbGVycyA9IHtcbiAgZmlyZUV2ZW50OiAoaWQsIC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gZmlyZUV2ZW50KGluc3RhbmNlTWFwW2lkXSwgLi4uYXJncylcbiAgfSxcbiAgY2FsbGJhY2s6IChpZCwgLi4uYXJncykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhpbnN0YW5jZU1hcFtpZF0sIC4uLmFyZ3MpXG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVUYXNrcyAoaWQsIHRhc2tzKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGlmIChpbnN0YW5jZSAmJiBBcnJheS5pc0FycmF5KHRhc2tzKSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxuICAgIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBqc0hhbmRsZXJzW3Rhc2subWV0aG9kXVxuICAgICAgY29uc3QgYXJncyA9IFsuLi50YXNrLmFyZ3NdXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChpZClcbiAgICAgICAgcmVzdWx0cy5wdXNoKGhhbmRsZXIoLi4uYXJncykpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiIG9yIHRhc2tzYClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaW5zdGFuY2VNYXAgfSBmcm9tICcuL21hcCdcbmltcG9ydCB7XG4gIGdldFJvb3RFbGVtZW50XG59IGZyb20gJy4uL2FwcC9jdHJsL2luZGV4J1xuXG4vKipcbiAqIEdldCBhIHdob2xlIGVsZW1lbnQgdHJlZSBvZiBhbiBpbnN0YW5jZSBmb3IgZGVidWdnaW5nLlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7b2JqZWN0fSBhIHZpcnR1YWwgZG9tIHRyZWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gZ2V0Um9vdEVsZW1lbnQoaW5zdGFuY2UpXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzdWx0ID0gbmV3IEVycm9yKGBpbnZhbGlkIGluc3RhbmNlIGlkIFwiJHtpZH1cImApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgV2VleCBmcmFtZXdvcmsgZW50cnkuXG4gKi9cblxuaW1wb3J0ICogYXMgbWV0aG9kcyBmcm9tICcuL2FwaS9tZXRob2RzJ1xuXG5pbXBvcnQgVm0gZnJvbSAnLi92bSdcbmV4cG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSAnLi9zdGF0aWMvY3JlYXRlJ1xuZXhwb3J0IHsgaW5pdCwgcmVmcmVzaEluc3RhbmNlLCBkZXN0cm95SW5zdGFuY2UgfSBmcm9tICcuL3N0YXRpYy9saWZlJ1xuaW1wb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9IGZyb20gJy4vc3RhdGljL3JlZ2lzdGVyJ1xuZXhwb3J0IHsgcmVjZWl2ZVRhc2tzIH0gZnJvbSAnLi9zdGF0aWMvYnJpZGdlJ1xuZXhwb3J0IHsgZ2V0Um9vdCB9IGZyb20gJy4vc3RhdGljL21pc2MnXG5cbi8vIHJlZ2lzdGVyIHNwZWNpYWwgbWV0aG9kcyBmb3IgV2VleCBmcmFtZXdvcmtcbnJlZ2lzdGVyTWV0aG9kcyhtZXRob2RzKVxuXG4vKipcbiAqIFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIFZtIGFuZCBWbS5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmZyZWV6ZShWbSlcblxuZXhwb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9XG4iLCJtb2R1bGUuZXhwb3J0cyA9IC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL25vZGVfbW9kdWxlcy8ubnBtaW5zdGFsbC9ldmVudC10YXJnZXQtc2hpbS8yLjAuMC9ldmVudC10YXJnZXQtc2hpbS9saWIvY29tbW9ucy5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmlxdWUga2V5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQSBuYW1lIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIHtzeW1ib2x8c3RyaW5nfSBHZW5lcmF0ZWQgdW5pcXVlIGtleS5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBjcmVhdGVVbmlxdWVLZXkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGVVbmlxdWVLZXkgPSAoXG4gICAgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbCA6IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIC8qIG90aGVyd2lzZSAqLyBmdW5jdGlvbiBjcmVhdGVVbmlxdWVLZXkobmFtZSkge1xuICAgICAgICByZXR1cm4gXCJbW1wiICsgbmFtZSArIFwiX1wiICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDgpLnNsaWNlKDIpICsgXCJdXVwiXG4gICAgfVxuKVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdCBvciBub3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHggLSBUaGUgdmFsdWUgdG8gYmUgY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBpc09iamVjdCA9IG1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiB4ICE9PSBudWxsXG59XG5cbi8qKlxuICogVGhlIGtleSBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5MSVNURU5FUlMgPSBjcmVhdGVVbmlxdWVLZXkoXCJsaXN0ZW5lcnNcIilcblxuLyoqXG4gKiBBIHZhbHVlIG9mIGtpbmQgZm9yIGxpc3RlbmVycyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgY2FwdHVyaW5nIHBoYXNlLlxuICpcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5DQVBUVVJFID0gMVxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGluIHRoZSBidWJibGluZyBwaGFzZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQlVCQkxFID0gMlxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQVRUUklCVVRFID0gM1xuXG4vKipcbiAqIEB0eXBlZGVmIG9iamVjdCBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBraW5kIC0gVGhlIGtpbmQgb2YgdGhlIGxpc3RlbmVyLlxuICogQHByb3BlcnR5IHtMaXN0ZW5lck5vZGV8bnVsbH0gbmV4dCAtIFRoZSBuZXh0IG5vZGUuXG4gKiAgICAgIElmIHRoaXMgbm9kZSBpcyB0aGUgbGFzdCwgdGhpcyBpcyBgbnVsbGAuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbm9kZSBvZiBzaW5nbHkgbGlua2VkIGxpc3QgZm9yIGEgbGlzdCBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBBIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGtpbmQgLSBUaGUga2luZCBvZiB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9uY2VdIC0gVGhlIGZsYWcgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBhdCB0aGUgZmlyc3QgY2FsbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFzc2l2ZV0gLSBUaGUgZmxhZyB0byBpZ25vcmUgYGV2ZW50LnByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKiBAcmV0dXJucyB7TGlzdGVuZXJOb2RlfSBUaGUgY3JlYXRlZCBsaXN0ZW5lciBub2RlLlxuICovXG5tb2R1bGUuZXhwb3J0cy5uZXdOb2RlID0gZnVuY3Rpb24gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBpc09iamVjdChvcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBvbmNlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICBwYXNzaXZlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgIH1cbn1cblxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2VtaXR0ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRFbWl0dGVyKTtcblxuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2VcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRFbWl0dGVyLCBbe1xuICAgIGtleTogXCJfYWRkTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaCh7IGxpc3RlbmVyOiBsaXN0ZW5lciwgb25jZTogb25jZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIC8vIGFsaWFzXG4gICAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChfbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuICEoX2xpc3RlbmVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIHNwZWNpZmllZCBldmVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGluc3RhbmNlIG9mIEV2ZW50RW1pdHRlciBmb3IgY2hhaW5pbmcuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZm9yRWFjaChmdW5jdGlvbiAoX2xpc3RlbmVyKSB7XG4gICAgICAgIF9saXN0ZW5lci5saXN0ZW5lci5hcHBseShfdGhpcywgW3BheWxvYWRdKTtcbiAgICAgICAgaWYgKF9saXN0ZW5lci5vbmNlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgX2xpc3RlbmVyLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRFbWl0dGVyO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvbm9kZV9tb2R1bGVzLy5ucG1pbnN0YWxsL2V2ZW50LXRhcmdldC1zaGltLzIuMC4wL2V2ZW50LXRhcmdldC1zaGltL2xpYi9ldmVudC10YXJnZXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKmdsb2JhbHMgd2luZG93ICovXG5cbnZhciBDb21tb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb21tb25zICovIDApXG52YXIgQ3VzdG9tRXZlbnRUYXJnZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2N1c3RvbS1ldmVudC10YXJnZXQgKi8gMTUpXG52YXIgRXZlbnRXcmFwcGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9ldmVudC13cmFwcGVyICovIDE2KVxudmFyIGlzT2JqZWN0ID0gQ29tbW9ucy5pc09iamVjdFxudmFyIExJU1RFTkVSUyA9IENvbW1vbnMuTElTVEVORVJTXG52YXIgQ0FQVFVSRSA9IENvbW1vbnMuQ0FQVFVSRVxudmFyIEJVQkJMRSA9IENvbW1vbnMuQlVCQkxFXG52YXIgQVRUUklCVVRFID0gQ29tbW9ucy5BVFRSSUJVVEVcbnZhciBuZXdOb2RlID0gQ29tbW9ucy5uZXdOb2RlXG52YXIgZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQgPSBDdXN0b21FdmVudFRhcmdldC5kZWZpbmVDdXN0b21FdmVudFRhcmdldFxudmFyIGNyZWF0ZUV2ZW50V3JhcHBlciA9IEV2ZW50V3JhcHBlci5jcmVhdGVFdmVudFdyYXBwZXJcbnZhciBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID0gRXZlbnRXcmFwcGVyLlNUT1BfSU1NRURJQVRFX1BST1BBR0FUSU9OX0ZMQUdcbnZhciBQQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBFdmVudFdyYXBwZXIuUEFTU0lWRV9MSVNURU5FUl9GTEFHXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBmbGFnIHdoaWNoIHNob3dzIHRoZXJlIGlzIHRoZSBuYXRpdmUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2Ugb2JqZWN0LlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xudmFyIEhBU19FVkVOVFRBUkdFVF9JTlRFUkZBQ0UgPSAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiB3aW5kb3cuRXZlbnRUYXJnZXQgIT09IFwidW5kZWZpbmVkXCJcbilcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBJbnRlcmZhY2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gZm9yIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG52YXIgRXZlbnRUYXJnZXQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgLy8gdGhpc1tMSVNURU5FUlNdIGlzIGEgTWFwLlxuICAgICAgICAvLyBJdHMga2V5IGlzIGV2ZW50IHR5cGUuXG4gICAgICAgIC8vIEl0cyB2YWx1ZSBpcyBMaXN0ZW5lck5vZGUgb2JqZWN0IG9yIG51bGwuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGludGVyZmFjZSBMaXN0ZW5lck5vZGUge1xuICAgICAgICAvLyAgICAgdmFyIGxpc3RlbmVyOiBGdW5jdGlvblxuICAgICAgICAvLyAgICAgdmFyIGtpbmQ6IENBUFRVUkV8QlVCQkxFfEFUVFJJQlVURVxuICAgICAgICAvLyAgICAgdmFyIG5leHQ6IExpc3RlbmVyTm9kZXxudWxsXG4gICAgICAgIC8vIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIExJU1RFTkVSUywge3ZhbHVlOiBPYmplY3QuY3JlYXRlKG51bGwpfSlcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KEV2ZW50VGFyZ2V0LCBhcmd1bWVudHNbMF0pXG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gdXNlIHRvIGV4dGVuZCB3aXRoIGF0dHJpYnV0ZSBsaXN0ZW5lciBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyBlLmcuXG4gICAgICAgIC8vICAgICBjbGFzcyBNeUN1c3RvbU9iamVjdCBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiLCBcImVycm9yXCIpIHtcbiAgICAgICAgLy8gICAgICAgICAvLy4uLlxuICAgICAgICAvLyAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQsIHR5cGVzKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgIH1cbn1cblxuRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcbiAgICAoSEFTX0VWRU5UVEFSR0VUX0lOVEVSRkFDRSA/IHdpbmRvdy5FdmVudFRhcmdldCA6IE9iamVjdCkucHJvdG90eXBlLFxuICAgIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbGlzdGVuZXIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcXCJsaXN0ZW5lclxcXCIgaXMgbm90IGFuIG9iamVjdC5cIilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGlzT2JqZWN0KG9wdGlvbnMpID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpIDogQm9vbGVhbihvcHRpb25zKVxuICAgICAgICAgICAgICAgIHZhciBraW5kID0gKGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFKVxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpc1tMSVNURU5FUlNdW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW0xJU1RFTkVSU11bdHlwZV0gPSBuZXdOb2RlKGxpc3RlbmVyLCBraW5kLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gbnVsbFxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBhIGR1cGxpY2F0ZWQgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKSA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSA6IEJvb2xlYW4ob3B0aW9ucylcbiAgICAgICAgICAgICAgICB2YXIga2luZCA9IChjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRSlcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXNbTElTVEVORVJTXVt0eXBlXVxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbTElTVEVORVJTXVt0eXBlXSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzW0xJU1RFTkVSU11bdHlwZV1cbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2Fubm90IHJld3JpdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzLCBzbyB3cmFwIG9iamVjdC5cbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZCA9IGNyZWF0ZUV2ZW50V3JhcHBlcihldmVudCwgdGhpcylcblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBwYXJ0aWNpcGF0aW5nIGluIGEgdHJlZS5cbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpc3RlbmVyIGlmIGl0J3Mgb25jZVxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tMSVNURU5FUlNdW3R5cGVdID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBub2RlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFtQQVNTSVZFX0xJU1RFTkVSX0ZMQUddID0gbm9kZS5wYXNzaXZlXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5saXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmNhbGwodGhpcywgd3JhcHBlZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmtpbmQgIT09IEFUVFJJQlVURSAmJiB0eXBlb2Ygbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50KHdyYXBwZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBpZiBgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCB3YXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlZFtTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXdyYXBwZWQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH1cbilcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmdldEluc3RhbmNlID0gZ2V0SW5zdGFuY2U7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5yZWdpc3RlckNvbXBvbmVudHMgPSByZWdpc3RlckNvbXBvbmVudHM7XG5leHBvcnRzLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kcztcbmV4cG9ydHMucmVnaXN0ZXJNb2R1bGVzID0gcmVnaXN0ZXJNb2R1bGVzO1xuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlO1xuZXhwb3J0cy5yZWZyZXNoSW5zdGFuY2UgPSByZWZyZXNoSW5zdGFuY2U7XG5leHBvcnRzLmRlc3Ryb3lJbnN0YW5jZSA9IGRlc3Ryb3lJbnN0YW5jZTtcbmV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7XG5leHBvcnRzLnJlY2VpdmVUYXNrcyA9IHJlY2VpdmVUYXNrcztcblxudmFyIF9idWlsdGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9idWlsdGluICovIDQpO1xuXG52YXIgX2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VtaXR0ZXIgKi8gMSk7XG5cbnZhciBfZW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbWl0dGVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIE5hdGl2ZUNvbXBvbmVudHMgPSB7fTtcbnZhciBOYXRpdmVNb2R1bGVzID0ge307XG5cbnZhciBEb2N1bWVudCA9IHZvaWQgMDtcbnZhciBFbGVtZW50ID0gdm9pZCAwO1xudmFyIENvbW1lbnQgPSB2b2lkIDA7XG5cbnZhciBNT0RVTEVfTkFNRV9QUkVGSVggPSAnQHdlZXgtbW9kdWxlLyc7XG52YXIgTU9EQUxfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ21vZGFsJztcbnZhciBOQVZJR0FUT1JfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ25hdmlnYXRvcic7XG4vLyBJbnN0YW5jZSBodWJcbnZhciBpbnN0YW5jZXMgPSB7fTtcbi8vIEJ1bmRsZXMgaHViXG52YXIgYnVuZGxlcyA9IHt9O1xudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRUb0luc3RhbmNlKGV2ZW50LCB0YXJnZXRPcmlnaW4pIHtcbiAgdmFyIGluc3RhbmNlO1xuICBmb3IgKHZhciBpIGluIGluc3RhbmNlcykge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgICAgaWYgKHRhcmdldE9yaWdpbiA9PT0gJyonIHx8IHRhcmdldE9yaWdpbiA9PT0gaW5zdGFuY2Uub3JpZ2luKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldCA9IGluc3RhbmNlLndpbmRvdztcbiAgICAgICAgLy8gRklYTUU6IE5lZWQgYXN5bmM/XG4gICAgICAgIGluc3RhbmNlLndpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCkge1xuICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5zdGFuY2UgaWQgXCInICsgaW5zdGFuY2VJZCArICdcIicpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gaW5pdChjb25maWcpIHtcbiAgRG9jdW1lbnQgPSBjb25maWcuRG9jdW1lbnQ7XG4gIEVsZW1lbnQgPSBjb25maWcuRWxlbWVudDtcbiAgQ29tbWVudCA9IGNvbmZpZy5Db21tZW50O1xufVxuXG4vKipcbiAqIHJlZ2lzdGVyIHRoZSBuYW1lIG9mIGVhY2ggbmF0aXZlIGNvbXBvbmVudFxuICogQHBhcmFtICB7YXJyYXl9IGNvbXBvbmVudHMgYXJyYXkgb2YgbmFtZVxuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudHMoY29tcG9uZW50cykge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiByZWdpc3RlcihuYW1lKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE5hdGl2ZUNvbXBvbmVudHNbbmFtZV0gPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5hbWUpKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5hbWUudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgTmF0aXZlQ29tcG9uZW50c1tuYW1lLnR5cGVdID0gbmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfX3dlZXhfbW9kdWxlX3N1cHBvcnRzX18obmFtZSkge1xuICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gQm9vbGVhbihOYXRpdmVNb2R1bGVzW25hbWVdKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kdWxlTmFtZSA9IHBhcnRzWzBdO1xuICAgIHZhciBtZXRob2ROYW1lID0gcGFydHNbMV07XG4gICAgdmFyIG1vZHVsZU1ldGhvZHMgPSBOYXRpdmVNb2R1bGVzW21vZHVsZU5hbWVdO1xuXG4gICAgaWYgKG1vZHVsZU1ldGhvZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlTWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbWV0aG9kID0gbW9kdWxlTWV0aG9kc1tpXTtcbiAgICAgICAgaWYgKCh0eXBlb2YgbWV0aG9kID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihtZXRob2QpKSA9PT0gJ29iamVjdCcgJiYgbWV0aG9kLm5hbWUgPT09IG1ldGhvZE5hbWUgfHwgbWV0aG9kID09PSBtZXRob2ROYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX193ZWV4X3RhZ19zdXBwb3J0c19fKG5hbWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4oTmF0aXZlQ29tcG9uZW50c1tuYW1lXSk7XG59XG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGlcbiAqIEBwYXJhbSAge29iamVjdH0gYXBpcyBhIG9iamVjdCBvZiBhcGlzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTWV0aG9kcyhhcGlzKSB7fVxuLy8gTm9vcFxuXG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGVcbiAqIEBwYXJhbSAge29iamVjdH0gbW9kdWxlcyBhIG9iamVjdCBvZiBtb2R1bGVzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyhuZXdNb2R1bGVzKSB7XG4gIGlmICgodHlwZW9mIG5ld01vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5ld01vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIG5ld01vZHVsZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3TW9kdWxlcywgbmFtZSkpIHtcbiAgICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXSA9IG5ld01vZHVsZXNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkJ1aWx0aW5Nb2R1bGVzKG1vZHVsZXMsIG1vZHVsZUZhY3RvcmllcywgY29udGV4dCkge1xuICBmb3IgKHZhciBtb2R1bGVOYW1lIGluIG1vZHVsZUZhY3Rvcmllcykge1xuICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0gPSB7XG4gICAgICBmYWN0b3J5OiBtb2R1bGVGYWN0b3JpZXNbbW9kdWxlTmFtZV0uYmluZChjb250ZXh0KSxcbiAgICAgIG1vZHVsZTogeyBleHBvcnRzOiB7fSB9LFxuICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG5mdW5jdGlvbiBnZW5OYXRpdmVNb2R1bGVzKG1vZHVsZXMsIGRvY3VtZW50KSB7XG4gIGlmICgodHlwZW9mIE5hdGl2ZU1vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5hdGl2ZU1vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChuYW1lKSB7XG4gICAgICB2YXIgbW9kdWxlTmFtZSA9IE1PRFVMRV9OQU1FX1BSRUZJWCArIG5hbWU7XG4gICAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0ge1xuICAgICAgICBtb2R1bGU6IHsgZXhwb3J0czoge30gfSxcbiAgICAgICAgaXNJbml0aWFsaXplZDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWV0aG9kID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG1ldGhvZC5uYW1lO1xuXG4gICAgICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0ubW9kdWxlLmV4cG9ydHNbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICB2YXIgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdEFyZyAmJiAodHlwZW9mIGxhc3RBcmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxhc3RBcmcpKSA9PT0gJ29iamVjdCcgJiYgbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGluIGFyZ3NcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGliYWJhL3dlZXgvaXNzdWVzLzE2NzdcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7XG4gICAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWVcbiAgICAgICAgICB9LCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIE5hdGl2ZU1vZHVsZXMpIHtcbiAgICAgIF9sb29wKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBhIFdlZXggaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqIEBwYXJhbSAge3N0cmluZ30gX193ZWV4X2NvZGVfX1xuICogQHBhcmFtICB7b2JqZWN0fSBbX193ZWV4X29wdGlvbnNfX10ge2J1bmRsZVVybCwgZGVidWd9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGluc3RhbmNlSWQsIF9fd2VleF9jb2RlX18sIF9fd2VleF9vcHRpb25zX18sIF9fd2VleF9kYXRhX18sIF9fd2VleF9jb25maWdfXykge1xuICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGlmIChpbnN0YW5jZSA9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBNYXJrIHN0YXJ0IHRpbWVcbiAgICB2YXIgcmVzcG9uc2VFbmQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBfX3dlZXhfZW52X18gPSAodHlwZW9mIFdYRW52aXJvbm1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKFdYRW52aXJvbm1lbnQpKSA9PT0gJ29iamVjdCcgJiYgV1hFbnZpcm9ubWVudCB8fCB7fTtcbiAgICAvLyBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHVzZSBidWlsdC1pbiBwcm9taXNlIGZpcnN0XG4gICAgdmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJ1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uICovIDYpKCk7XG5cbiAgICB2YXIgX1Byb21pc2UgPSB0eXBlb2YgX1Byb21pc2UgPT09ICdmdW5jdGlvbicgPyBfUHJvbWlzZSA6IHNoYXJlZC5Qcm9taXNlO1xuICAgIHZhciBfU3ltYm9sID0gdHlwZW9mIF9TeW1ib2wgPT09ICdmdW5jdGlvbicgPyBfU3ltYm9sIDogc2hhcmVkLlN5bWJvbDtcbiAgICB2YXIgX1NldCA9IHR5cGVvZiBfU2V0ID09PSAnZnVuY3Rpb24nID8gX1NldCA6IHNoYXJlZC5TZXQ7XG4gICAgdmFyIF9NYXAgPSB0eXBlb2YgX01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9NYXAgOiBzaGFyZWQuTWFwO1xuICAgIHZhciBfV2Vha01hcCA9IHR5cGVvZiBfV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9XZWFrTWFwIDogc2hhcmVkLldlYWtNYXA7XG4gICAgdmFyIF9XZWFrU2V0ID0gdHlwZW9mIF9XZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gX1dlYWtTZXQgOiBzaGFyZWQuV2Vha1NldDtcbiAgICB2YXIgVVJMID0gc2hhcmVkLlVSTCxcbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zID0gc2hhcmVkLlVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgRm9udEZhY2UgPSBzaGFyZWQuRm9udEZhY2UsXG4gICAgICAgIG1hdGNoTWVkaWEgPSBzaGFyZWQubWF0Y2hNZWRpYTtcblxuICAgIHZhciBidW5kbGVVcmwgPSBfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCB8fCAnYWJvdXQ6YmxhbmsnO1xuXG4gICAgaWYgKCFfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE11c3QgaGF2ZSBidW5kbGVVcmwgb3B0aW9uIHdoZW4gY3JlYXRlSW5zdGFuY2UsIGRvd25ncmFkZSB0byBcImFib3V0OmJsYW5rXCIuJyk7XG4gICAgfSBlbHNlIGlmICghYnVuZGxlVXJsLnNwbGl0KCcvLycpWzBdKSB7XG4gICAgICBidW5kbGVVcmwgPSAnaHR0cHM6JyArIGJ1bmRsZVVybDtcbiAgICB9XG5cbiAgICB2YXIgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoaW5zdGFuY2VJZCwgYnVuZGxlVXJsKTtcbiAgICB2YXIgZG9jdW1lbnRVUkwgPSBuZXcgVVJMKGJ1bmRsZVVybCk7XG4gICAgdmFyIG1vZHVsZXMgPSB7fTtcblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdID0ge1xuICAgICAgZG9jdW1lbnQ6IGRvY3VtZW50LFxuICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2VJZCxcbiAgICAgIGJ1bmRsZVVybDogYnVuZGxlVXJsLFxuICAgICAgYnVuZGxlQ29kZTogX193ZWV4X2NvZGVfXyxcbiAgICAgIG1vZHVsZXM6IG1vZHVsZXMsXG4gICAgICBvcmlnaW46IGRvY3VtZW50VVJMLm9yaWdpbixcbiAgICAgIHVpZDogMFxuICAgIH07XG5cbiAgICAvLyBHZW5lcmF0ZSBuYXRpdmUgbW9kdWxlcyBtYXAgYXQgaW5zdGFuY2UgaW5pdFxuICAgIGdlbk5hdGl2ZU1vZHVsZXMobW9kdWxlcywgZG9jdW1lbnQpO1xuICAgIHZhciBfX3dlZXhfZGVmaW5lX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2RlZmluZS53ZWV4ICovIDcpKG1vZHVsZXMpO1xuICAgIHZhciBfX3dlZXhfcmVxdWlyZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9yZXF1aXJlLndlZXggKi8gOCkobW9kdWxlcyk7XG4gICAgdmFyIF9fd2VleF9kb3duZ3JhZGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZG93bmdyYWRlLndlZXggKi8gOSkoX193ZWV4X3JlcXVpcmVfXyk7XG4gICAgLy8gRXh0ZW5kIGRvY3VtZW50XG4gICAgX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9kb2N1bWVudC53ZWV4ICovIDExKShfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCk7XG5cbiAgICB2YXIgbG9jYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2xvY2F0aW9uLndlZXggKi8gMTIpKF9fd2VleF9yZXF1aXJlX18sIGRvY3VtZW50VVJMKTtcblxuICAgIHZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZmV0Y2gud2VleCAqLyAxMykoX193ZWV4X3JlcXVpcmVfXywgX1Byb21pc2UpLFxuICAgICAgICBmZXRjaCA9IF9yZXF1aXJlLmZldGNoLFxuICAgICAgICBIZWFkZXJzID0gX3JlcXVpcmUuSGVhZGVycyxcbiAgICAgICAgUmVxdWVzdCA9IF9yZXF1aXJlLlJlcXVlc3QsXG4gICAgICAgIFJlc3BvbnNlID0gX3JlcXVpcmUuUmVzcG9uc2U7XG5cbiAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3htbGh0dHByZXF1ZXN0LndlZXggKi8gMTQpKF9fd2VleF9yZXF1aXJlX18pO1xuICAgIHZhciBXZWJTb2NrZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3dlYnNvY2tldC53ZWV4ICovIDE3KShfX3dlZXhfcmVxdWlyZV9fKTtcblxuICAgIHZhciBfcmVxdWlyZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3RpbWVyLndlZXggKi8gMTgpKF9fd2VleF9yZXF1aXJlX18sIGRvY3VtZW50KSxcbiAgICAgICAgc2V0VGltZW91dCA9IF9yZXF1aXJlMi5zZXRUaW1lb3V0LFxuICAgICAgICBjbGVhclRpbWVvdXQgPSBfcmVxdWlyZTIuY2xlYXJUaW1lb3V0LFxuICAgICAgICBzZXRJbnRlcnZhbCA9IF9yZXF1aXJlMi5zZXRJbnRlcnZhbCxcbiAgICAgICAgY2xlYXJJbnRlcnZhbCA9IF9yZXF1aXJlMi5jbGVhckludGVydmFsLFxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBfcmVxdWlyZTIucmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSA9IF9yZXF1aXJlMi5jYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgIHZhciBfcmVxdWlyZTMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jhc2U2NC53ZWV4ICovIDE5KSgpLFxuICAgICAgICBhdG9iID0gX3JlcXVpcmUzLmF0b2IsXG4gICAgICAgIGJ0b2EgPSBfcmVxdWlyZTMuYnRvYTtcblxuICAgIHZhciBwZXJmb3JtYW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcGVyZm9ybWFuY2Uud2VleCAqLyAyMCkocmVzcG9uc2VFbmQpO1xuXG4gICAgdmFyIF9yZXF1aXJlNCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZXZlbnQud2VleCAqLyAyMSkoKSxcbiAgICAgICAgRXZlbnQgPSBfcmVxdWlyZTQuRXZlbnQsXG4gICAgICAgIEN1c3RvbUV2ZW50ID0gX3JlcXVpcmU0LkN1c3RvbUV2ZW50O1xuXG4gICAgdmFyIHdpbmRvd0VtaXR0ZXIgPSBuZXcgX2VtaXR0ZXIyLmRlZmF1bHQoKTtcblxuICAgIHZhciB3aW5kb3cgPSB7XG4gICAgICAvLyBFU1xuICAgICAgUHJvbWlzZTogX1Byb21pc2UsXG4gICAgICBTeW1ib2w6IF9TeW1ib2wsXG4gICAgICBNYXA6IF9NYXAsXG4gICAgICBTZXQ6IF9TZXQsXG4gICAgICBXZWFrTWFwOiBfV2Vha01hcCxcbiAgICAgIFdlYWtTZXQ6IF9XZWFrU2V0LFxuICAgICAgLy8gVzNDOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvYnJvd3NlcnMuaHRtbCNicm93c2luZy1jb250ZXh0LW5hbWVcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgLy8gVGhpcyByZWFkLW9ubHkgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgd2luZG93IGlzIGNsb3NlZCBvciBub3QuXG4gICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgYXRvYjogYXRvYixcbiAgICAgIGJ0b2E6IGJ0b2EsXG4gICAgICBwZXJmb3JtYW5jZTogcGVyZm9ybWFuY2UsXG4gICAgICAvLyBXM0NcbiAgICAgIGRvY3VtZW50OiBkb2N1bWVudCxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWh0bWw1LTIwMDkwNDIzL2Jyb3dzZXJzLmh0bWwjZG9tLW5hdmlnYXRvclxuICAgICAgbmF2aWdhdG9yOiB7XG4gICAgICAgIHByb2R1Y3Q6ICdXZWV4JyxcbiAgICAgICAgcGxhdGZvcm06IF9fd2VleF9lbnZfXy5wbGF0Zm9ybSxcbiAgICAgICAgYXBwTmFtZTogX193ZWV4X2Vudl9fLmFwcE5hbWUsXG4gICAgICAgIGFwcFZlcnNpb246IF9fd2VleF9lbnZfXy5hcHBWZXJzaW9uLFxuICAgICAgICAvLyBXZWV4LzAuMTIgaU9TLzkuMyAoaVBob25lNywyKSBBcHBOYW1lLzAuMTJcbiAgICAgICAgdXNlckFnZW50OiAnV2VleC8nICsgX193ZWV4X2Vudl9fLndlZXhWZXJzaW9uICsgJyAnICsgX193ZWV4X2Vudl9fLnBsYXRmb3JtICsgJy8nICsgX193ZWV4X2Vudl9fLm9zVmVyc2lvbiArICcgKCcgKyBfX3dlZXhfZW52X18uZGV2aWNlTW9kZWwgKyAnKSAnICsgX193ZWV4X2Vudl9fLmFwcE5hbWUgKyAnLycgKyBfX3dlZXhfZW52X18uYXBwVmVyc2lvblxuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS12aWV3LyN0aGUtc2NyZWVuLWludGVyZmFjZVxuICAgICAgc2NyZWVuOiB7XG4gICAgICAgIHdpZHRoOiBfX3dlZXhfZW52X18uZGV2aWNlV2lkdGgsXG4gICAgICAgIGhlaWdodDogX193ZWV4X2Vudl9fLmRldmljZUhlaWdodCxcbiAgICAgICAgYXZhaWxXaWR0aDogX193ZWV4X2Vudl9fLmRldmljZVdpZHRoLFxuICAgICAgICBhdmFpbEhlaWdodDogX193ZWV4X2Vudl9fLmRldmljZUhlaWdodCxcbiAgICAgICAgY29sb3JEZXB0aDogMjQsXG4gICAgICAgIHBpeGVsRGVwdGg6IDI0XG4gICAgICB9LFxuICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogX193ZWV4X2Vudl9fLnNjYWxlLFxuICAgICAgZmV0Y2g6IGZldGNoLFxuICAgICAgSGVhZGVyczogSGVhZGVycyxcbiAgICAgIFJlc3BvbnNlOiBSZXNwb25zZSxcbiAgICAgIFJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBYTUxIdHRwUmVxdWVzdDogWE1MSHR0cFJlcXVlc3QsXG4gICAgICBVUkw6IFVSTCxcbiAgICAgIFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zLFxuICAgICAgRm9udEZhY2U6IEZvbnRGYWNlLFxuICAgICAgV2ViU29ja2V0OiBXZWJTb2NrZXQsXG4gICAgICBFdmVudDogRXZlbnQsXG4gICAgICBDdXN0b21FdmVudDogQ3VzdG9tRXZlbnQsXG4gICAgICBtYXRjaE1lZGlhOiBtYXRjaE1lZGlhLFxuICAgICAgc2V0VGltZW91dDogc2V0VGltZW91dCxcbiAgICAgIGNsZWFyVGltZW91dDogY2xlYXJUaW1lb3V0LFxuICAgICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgICAgY2xlYXJJbnRlcnZhbDogY2xlYXJJbnRlcnZhbCxcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZTogcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IGNhbmNlbEFuaW1hdGlvbkZyYW1lLFxuICAgICAgYWxlcnQ6IGZ1bmN0aW9uIGFsZXJ0KG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIG1vZGFsID0gX193ZWV4X3JlcXVpcmVfXyhNT0RBTF9NT0RVTEUpO1xuICAgICAgICBtb2RhbC5hbGVydCh7XG4gICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9LFxuICAgICAgb3BlbjogZnVuY3Rpb24gb3Blbih1cmwpIHtcbiAgICAgICAgdmFyIHdlZXhOYXZpZ2F0b3IgPSBfX3dlZXhfcmVxdWlyZV9fKE5BVklHQVRPUl9NT0RVTEUpO1xuICAgICAgICB3ZWV4TmF2aWdhdG9yLnB1c2goe1xuICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgIGFuaW1hdGVkOiB0cnVlXG4gICAgICAgIH0sIG5vb3ApO1xuICAgICAgfSxcbiAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgICAgdmFyIHdlZXhOYXZpZ2F0b3IgPSBfX3dlZXhfcmVxdWlyZV9fKE5BVklHQVRPUl9NT0RVTEUpO1xuICAgICAgICB3ZWV4TmF2aWdhdG9yLmNsb3NlKHtcbiAgICAgICAgICBhbmltYXRlZDogdHJ1ZVxuICAgICAgICB9LCBub29wLCBub29wKTtcbiAgICAgIH0sXG4gICAgICBwb3N0TWVzc2FnZTogZnVuY3Rpb24gcG9zdE1lc3NhZ2UobWVzc2FnZSwgdGFyZ2V0T3JpZ2luKSB7XG4gICAgICAgIHZhciBldmVudCA9IHtcbiAgICAgICAgICBvcmlnaW46IGxvY2F0aW9uLm9yaWdpbixcbiAgICAgICAgICBkYXRhOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKSxcbiAgICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgICAgc291cmNlOiB3aW5kb3cgLy8gRklYTUU6IG1heWJlIG5vdCBleHBvcnQgd2luZG93XG4gICAgICAgIH07XG4gICAgICAgIGRpc3BhdGNoRXZlbnRUb0luc3RhbmNlKGV2ZW50LCB0YXJnZXRPcmlnaW4pO1xuICAgICAgfSxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgd2luZG93RW1pdHRlci5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB3aW5kb3dFbWl0dGVyLm9mZih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICB9LFxuICAgICAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChlKSB7XG4gICAgICAgIHdpbmRvd0VtaXR0ZXIuZW1pdChlLnR5cGUsIGUpO1xuICAgICAgfSxcbiAgICAgIC8vIE1vZHVsZUpTXG4gICAgICBkZWZpbmU6IF9fd2VleF9kZWZpbmVfXyxcbiAgICAgIHJlcXVpcmU6IF9fd2VleF9yZXF1aXJlX18sXG4gICAgICAvLyBXZWV4XG4gICAgICBfX3dlZXhfZG9jdW1lbnRfXzogZG9jdW1lbnQsXG4gICAgICBfX3dlZXhfbW9kdWxlX3N1cHBvcnRzX186IF9fd2VleF9tb2R1bGVfc3VwcG9ydHNfXyxcbiAgICAgIF9fd2VleF90YWdfc3VwcG9ydHNfXzogX193ZWV4X3RhZ19zdXBwb3J0c19fLFxuICAgICAgX193ZWV4X2RlZmluZV9fOiBfX3dlZXhfZGVmaW5lX18sXG4gICAgICBfX3dlZXhfcmVxdWlyZV9fOiBfX3dlZXhfcmVxdWlyZV9fLFxuICAgICAgX193ZWV4X2Rvd25ncmFkZV9fOiBfX3dlZXhfZG93bmdyYWRlX18sXG4gICAgICBfX3dlZXhfZW52X186IF9fd2VleF9lbnZfXyxcbiAgICAgIF9fd2VleF9jb2RlX186IF9fd2VleF9jb2RlX18sXG4gICAgICBfX3dlZXhfb3B0aW9uc19fOiBfX3dlZXhfb3B0aW9uc19fLFxuICAgICAgX193ZWV4X2RhdGFfXzogX193ZWV4X2RhdGFfXyxcbiAgICAgIF9fd2VleF9jb25maWdfXzogX193ZWV4X2NvbmZpZ19fXG4gICAgfTtcblxuICAgIGluc3RhbmNlLndpbmRvdyA9IHdpbmRvdy5zZWxmID0gd2luZG93LndpbmRvdyA9IHdpbmRvdztcblxuICAgIHZhciBidWlsdGluR2xvYmFscyA9IHt9O1xuICAgIHZhciBidWlsdGluTW9kdWxlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBidWlsdGluR2xvYmFscyA9IF9fd2VleF9jb25maWdfXy5zZXJ2aWNlcy5idWlsdGluR2xvYmFscztcbiAgICAgIC8vIE1vZHVsZXMgc2hvdWxkIHdyYXAgYXMgbW9kdWxlIGZhY3RvcnkgZm9ybWF0XG4gICAgICBidWlsdGluTW9kdWxlcyA9IF9fd2VleF9jb25maWdfXy5zZXJ2aWNlcy5idWlsdGluTW9kdWxlcztcbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgT2JqZWN0LmFzc2lnbih3aW5kb3csIGJ1aWx0aW5HbG9iYWxzKTtcblxuICAgIHZhciBtb2R1bGVGYWN0b3JpZXMgPSBfZXh0ZW5kcyh7fSwgX2J1aWx0aW4uTW9kdWxlRmFjdG9yaWVzLCBidWlsdGluTW9kdWxlcyk7XG4gICAgZ2VuQnVpbHRpbk1vZHVsZXMobW9kdWxlcywgbW9kdWxlRmFjdG9yaWVzLCB3aW5kb3cpO1xuICAgIC8vIEluIHdlZXggaU9TIG9yIEFuZHJvaWRcbiAgICBpZiAoX193ZWV4X2Vudl9fLnBsYXRmb3JtICE9PSAnV2ViJykge1xuICAgICAgdmFyIHRpbWluZyA9IHBlcmZvcm1hbmNlLnRpbWluZztcbiAgICAgIHRpbWluZy5kb21Mb2FkaW5nID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gVXNlIHRoZSBjYWNoZWQgaW5pdCBmdW5jdGlvbiwgaWYgZXhpc3RlZCBpbiBidW5kbGVzXG4gICAgICB2YXIgX2luaXQgPSBidW5kbGVzW19fd2VleF9jb2RlX19dID8gYnVuZGxlc1tfX3dlZXhfY29kZV9fXSA6IG5ldyBGdW5jdGlvbignd2l0aCh0aGlzKXsoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtcXG4nICsgX193ZWV4X2NvZGVfXyArICdcXG59KS5jYWxsKHRoaXMpfScpO1xuXG4gICAgICBfaW5pdC5jYWxsKFxuICAgICAgLy8gQ29udGV4dCBpcyB3aW5kb3dcbiAgICAgIHdpbmRvdyk7XG5cbiAgICAgIHRpbWluZy5kb21JbnRlcmFjdGl2ZSA9IHRpbWluZy5kb21Db21wbGV0ZSA9IHRpbWluZy5kb21JbnRlcmFjdGl2ZSA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIENhY2hlIHRoZSBpbml0IGZ1bmN0aW9uXG4gICAgICBidW5kbGVzW19fd2VleF9jb2RlX19dID0gX2luaXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHdlZXggaDVcbiAgICAgIHZhciBfaW5pdDIgPSBuZXcgRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiO1xcbicgKyBfX3dlZXhfY29kZV9fKTtcblxuICAgICAgX2luaXQyLmNhbGwod2luZG93KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YW5jZSBpZCBcIicgKyBpbnN0YW5jZUlkICsgJ1wiIGV4aXN0ZWQgd2hlbiBjcmVhdGUgaW5zdGFuY2UnKTtcbiAgfVxufVxuXG4vKipcbiAqIHJlZnJlc2ggYSBXZWV4IGluc3RhbmNlXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gcmVmcmVzaEluc3RhbmNlKGluc3RhbmNlSWQsIGRhdGEpIHtcbiAgdmFyIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHZhciBkb2N1bWVudCA9IGluc3RhbmNlLmRvY3VtZW50O1xuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZmlyZUV2ZW50KCdyZWZyZXNoJywge1xuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBkYXRhOiBkYXRhXG4gIH0pO1xuICBkb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAncmVmcmVzaEZpbmlzaCcgfSwgW10pO1xufVxuXG4vKipcbiAqIGRlc3Ryb3kgYSBXZWV4IGluc3RhbmNlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqL1xuZnVuY3Rpb24gZGVzdHJveUluc3RhbmNlKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHZhciBidW5kbGVDb2RlID0gaW5zdGFuY2UuYnVuZGxlQ29kZTtcbiAgaW5zdGFuY2Uud2luZG93LmNsb3NlZCA9IHRydWU7XG5cbiAgdmFyIGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5maXJlRXZlbnQoJ2Rlc3RvcnknLCB7XG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH0pO1xuXG4gIGlmIChkb2N1bWVudC5kZXN0cm95KSB7XG4gICAgZG9jdW1lbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgaWYgKGRvY3VtZW50LnRhc2tDZW50ZXIgJiYgZG9jdW1lbnQudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2spIHtcbiAgICBkb2N1bWVudC50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpO1xuICB9XG5cbiAgZGVsZXRlIGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgZGVsZXRlIGJ1bmRsZXNbYnVuZGxlQ29kZV07XG59XG5cbi8qKlxuICogZ2V0IGEgd2hvbGUgZWxlbWVudCB0cmVlIG9mIGFuIGluc3RhbmNlXG4gKiBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqIEByZXR1cm4ge29iamVjdH0gYSB2aXJ0dWFsIGRvbSB0cmVlXG4gKi9cbmZ1bmN0aW9uIGdldFJvb3QoaW5zdGFuY2VJZCkge1xuICB2YXIgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKTtcbiAgdmFyIGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG4gIHJldHVybiBkb2N1bWVudC50b0pTT04gPyBkb2N1bWVudC50b0pTT04oKSA6IHt9O1xufVxuXG5mdW5jdGlvbiBmaXJlRXZlbnQoZG9jLCByZWYsIHR5cGUsIGUsIGRvbUNoYW5nZXMsIHBhcmFtcykge1xuICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgcmVmLnNvbWUoZnVuY3Rpb24gKHJlZikge1xuICAgICAgcmV0dXJuIGZpcmVFdmVudChkb2MsIHJlZiwgdHlwZSwgZSkgIT09IGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbCA9IGRvYy5nZXRSZWYocmVmKTtcblxuICBpZiAoZWwpIHtcbiAgICB2YXIgcmVzdWx0ID0gZG9jLmZpcmVFdmVudChlbCwgdHlwZSwgZSwgZG9tQ2hhbmdlcywgcGFyYW1zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIicgKyByZWYgKyAnXCInKTtcbn1cblxuLyoqXG4gKiBhY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtICB7YXJyYXl9IHRhc2tzIGxpc3Qgd2l0aCBgbWV0aG9kYCBhbmQgYGFyZ3NgXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhpbnN0YW5jZUlkLCB0YXNrcykge1xuICB2YXIgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICBpZiAodGFzay5tZXRob2QgPT09ICdmaXJlRXZlbnQnKSB7XG4gICAgICAgIHZhciBfdGFzayRhcmdzID0gX3NsaWNlZFRvQXJyYXkodGFzay5hcmdzLCA1KSxcbiAgICAgICAgICAgIG5vZGVJZCA9IF90YXNrJGFyZ3NbMF0sXG4gICAgICAgICAgICB0eXBlID0gX3Rhc2skYXJnc1sxXSxcbiAgICAgICAgICAgIGRhdGEgPSBfdGFzayRhcmdzWzJdLFxuICAgICAgICAgICAgZG9tQ2hhbmdlcyA9IF90YXNrJGFyZ3NbM10sXG4gICAgICAgICAgICBwYXJhbXMgPSBfdGFzayRhcmdzWzRdO1xuXG4gICAgICAgIHJlc3VsdCA9IGZpcmVFdmVudChkb2N1bWVudCwgbm9kZUlkLCB0eXBlLCBkYXRhLCBkb21DaGFuZ2VzLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIGlmICh0YXNrLm1ldGhvZCA9PT0gJ2NhbGxiYWNrJykge1xuICAgICAgICB2YXIgX3Rhc2skYXJnczIgPSBfc2xpY2VkVG9BcnJheSh0YXNrLmFyZ3MsIDMpLFxuICAgICAgICAgICAgdWlkID0gX3Rhc2skYXJnczJbMF0sXG4gICAgICAgICAgICBfZGF0YSA9IF90YXNrJGFyZ3MyWzFdLFxuICAgICAgICAgICAgaWZLZWVwQWxpdmUgPSBfdGFzayRhcmdzMlsyXTtcblxuICAgICAgICByZXN1bHQgPSBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrKHVpZCwgX2RhdGEsIGlmS2VlcEFsaXZlKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8vIEZJWE1FOiBIYWNrIGZvciByb2xsdXAgYnVpbGQgXCJpbXBvcnQgUmF4IGZyb20gJ3dlZXgtcmF4LWZyYW1ld29yaydcIiwgaW4gcm9sbHVwIGlmIGBtb2R1bGUuZXhwb3J0c2AgaGFzIGBfX2VzTW9kdWxlYCBrZXkgbXVzdCByZXR1cm4gYnkgZXhwb3J0IGRlZmF1bHRcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvYnVpbHRpbi5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBNb2R1bGVGYWN0b3JpZXMgPSBleHBvcnRzLk1vZHVsZUZhY3RvcmllcyA9IHtcbiAgJ3JheCc6IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJheC9kaXN0L3JheC5mYWN0b3J5ICovIDUpXG59O1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3JheC9kaXN0L3JheC5mYWN0b3J5LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG4gIHZhciBfX3dlZXhfZG9jdW1lbnRfXyA9IHRoaXNbXCJfX3dlZXhfZG9jdW1lbnRfX1wiXTtcbnZhciBkb2N1bWVudCA9IHRoaXNbXCJkb2N1bWVudFwiXTtcbiAgbW9kdWxlLmV4cG9ydHMgPSAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTcpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLypcbiAqIFN0YXRlZnVsIHRoaW5ncyBpbiBydW50aW1lXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgY29tcG9uZW50OiBudWxsLFxuICBtb3VudElEOiAxLFxuICBzYW5kYm94OiB0cnVlLFxuICAvLyBSb290c1xuICByb290Q29tcG9uZW50czoge30sXG4gIHJvb3RJbnN0YW5jZXM6IHt9LFxuICAvLyBJbmplY3RcbiAgaG9vazogbnVsbCxcbiAgZHJpdmVyOiBudWxsLFxuICBtb25pdG9yOiBudWxsXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9lbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VubW91bnRDb21wb25lbnRBdE5vZGUpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9yb290ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cbnZhciBfcm9vdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yb290KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBJbnN0YW5jZSBtYW5hZ2VyXG4gKi9cbnZhciBLRVkgPSAnJCRpbnN0YW5jZSc7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgc2V0OiBmdW5jdGlvbiBzZXQobm9kZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIW5vZGVbS0VZXSkge1xuICAgICAgbm9kZVtLRVldID0gaW5zdGFuY2U7XG4gICAgICAvLyBSZWNvcmQgcm9vdCBpbnN0YW5jZSB0byByb290cyBtYXBcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQucm9vdEluc3RhbmNlc1tpbnN0YW5jZS5yb290SURdID0gaW5zdGFuY2U7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF0gPSBpbnN0YW5jZS5faW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIGdldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVbS0VZXTtcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobm9kZSkge1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0KG5vZGUpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgbm9kZVtLRVldID0gbnVsbDtcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgZGVsZXRlIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICAgIGRlbGV0ZSBfaG9zdDIuZGVmYXVsdC5yb290SW5zdGFuY2VzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtb3VudDogZnVuY3Rpb24gbW91bnQoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRJbnN0YW5jZSkge1xuICAgIGlmIChmYWxzZSkge1xuICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYmVmb3JlUmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHJlbmRlciBjYWxsYmFja1xuICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5iZWZvcmVSZW5kZXIgJiYgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmJlZm9yZVJlbmRlcigpO1xuXG4gICAgLy8gUmVhbCBuYXRpdmUgcm9vdCBub2RlIGlzIGJvZHlcbiAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgIGNvbnRhaW5lciA9IF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5jcmVhdGVCb2R5KCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbmNlcHR1YWwgcGFyZW50IGNvbXBvbmVudC5cbiAgICB2YXIgcGFyZW50Q29udGV4dCA9IHZvaWQgMDtcbiAgICBpZiAocGFyZW50SW5zdGFuY2UpIHtcbiAgICAgIHZhciBwYXJlbnRJbnRlcm5hbCA9IHBhcmVudEluc3RhbmNlLl9pbnRlcm5hbDtcbiAgICAgIHBhcmVudENvbnRleHQgPSBwYXJlbnRJbnRlcm5hbC5fcHJvY2Vzc0NoaWxkQ29udGV4dChwYXJlbnRJbnRlcm5hbC5fY29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZSb290SW5zdGFuY2UgPSB0aGlzLmdldChjb250YWluZXIpO1xuICAgIHZhciBoYXNQcmV2Um9vdEluc3RhbmNlID0gcHJldlJvb3RJbnN0YW5jZSAmJiBwcmV2Um9vdEluc3RhbmNlLmlzUm9vdENvbXBvbmVudDtcblxuICAgIGlmIChoYXNQcmV2Um9vdEluc3RhbmNlKSB7XG4gICAgICB2YXIgcHJldlJlbmRlcmVkQ29tcG9uZW50ID0gcHJldlJvb3RJbnN0YW5jZS5nZXRSZW5kZXJlZENvbXBvbmVudCgpO1xuICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJldlJlbmRlcmVkQ29tcG9uZW50Ll9jdXJyZW50RWxlbWVudDtcbiAgICAgIGlmICgoMCwgX3Nob3VsZFVwZGF0ZUNvbXBvbmVudDIuZGVmYXVsdCkocHJldkVsZW1lbnQsIGVsZW1lbnQpKSB7XG4gICAgICAgIHZhciBwcmV2VW5tYXNrZWRDb250ZXh0ID0gcHJldlJlbmRlcmVkQ29tcG9uZW50Ll9jb250ZXh0O1xuICAgICAgICBwcmV2UmVuZGVyZWRDb21wb25lbnQudXBkYXRlQ29tcG9uZW50KHByZXZFbGVtZW50LCBlbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBwYXJlbnRDb250ZXh0IHx8IHByZXZVbm1hc2tlZENvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiBwcmV2Um9vdEluc3RhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldlJvb3RJbnN0YW5jZSk7XG4gICAgICAgICgwLCBfdW5tb3VudENvbXBvbmVudEF0Tm9kZTIuZGVmYXVsdCkoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgd3JhcHBlZEVsZW1lbnQgPSAoMCwgX2VsZW1lbnQuY3JlYXRlRWxlbWVudCkoX3Jvb3QyLmRlZmF1bHQsIG51bGwsIGVsZW1lbnQpO1xuICAgIHZhciByZW5kZXJlZENvbXBvbmVudCA9ICgwLCBfaW5zdGFudGlhdGVDb21wb25lbnQyLmRlZmF1bHQpKHdyYXBwZWRFbGVtZW50KTtcbiAgICB2YXIgZGVmYXVsdENvbnRleHQgPSBwYXJlbnRDb250ZXh0IHx8IHt9O1xuICAgIHZhciByb290SW5zdGFuY2UgPSByZW5kZXJlZENvbXBvbmVudC5tb3VudENvbXBvbmVudChjb250YWluZXIsIG51bGwsIGRlZmF1bHRDb250ZXh0KTtcbiAgICB0aGlzLnNldChjb250YWluZXIsIHJvb3RJbnN0YW5jZSk7XG5cbiAgICAvLyBBZnRlciByZW5kZXIgY2FsbGJhY2tcbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYWZ0ZXJSZW5kZXIgJiYgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFmdGVyUmVuZGVyKHJvb3RJbnN0YW5jZSk7XG5cbiAgICAvLyBEZXZ0b29sIHJlbmRlciBuZXcgcm9vdCBob29rXG4gICAgX2hvc3QyLmRlZmF1bHQuaG9vay5Nb3VudC5fcmVuZGVyTmV3Um9vdENvbXBvbmVudChyb290SW5zdGFuY2UuX2ludGVybmFsKTtcblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJSZW5kZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdEluc3RhbmNlO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gaW5zdGFudGlhdGVDb21wb25lbnQoZWxlbWVudCkge1xuICB2YXIgaW5zdGFuY2UgPSB2b2lkIDA7XG5cbiAgaWYgKGVsZW1lbnQgPT09IHVuZGVmaW5lZCB8fCBlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IGZhbHNlIHx8IGVsZW1lbnQgPT09IHRydWUpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5FbXB0eUNvbXBvbmVudCgpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5GcmFnbWVudENvbXBvbmVudChlbGVtZW50KTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGVsZW1lbnQpKSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudC50eXBlKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlIHN0cmluZyB2YWx1ZXNcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGluc3RhbmNlID0gbmV3IF9ob3N0Mi5kZWZhdWx0Lk5hdGl2ZUNvbXBvbmVudChlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgX2hvc3QyLmRlZmF1bHQuQ29tcG9zaXRlQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgX2hvc3QyLmRlZmF1bHQuVGV4dENvbXBvbmVudChlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudCB0eXBlOiAnICsgZWxlbWVudCArICcuIChrZXlzOiAnICsgT2JqZWN0LmtleXMoZWxlbWVudCkgKyAnKScpO1xuICB9XG5cbiAgaW5zdGFuY2UuX21vdW50SW5kZXggPSAwO1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gaW5zdGFudGlhdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlQ29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkge1xuICAvLyBUT0RPOiBwcmV2RWxlbWVudCBhbmQgbmV4dEVsZW1lbnQgY291bGQgYmUgYXJyYXlcbiAgdmFyIHByZXZFbXB0eSA9IHByZXZFbGVtZW50ID09PSBudWxsO1xuICB2YXIgbmV4dEVtcHR5ID0gbmV4dEVsZW1lbnQgPT09IG51bGw7XG4gIGlmIChwcmV2RW1wdHkgfHwgbmV4dEVtcHR5KSB7XG4gICAgcmV0dXJuIHByZXZFbXB0eSA9PT0gbmV4dEVtcHR5O1xuICB9XG5cbiAgdmFyIHByZXZUeXBlID0gdHlwZW9mIHByZXZFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwcmV2RWxlbWVudCk7XG4gIHZhciBuZXh0VHlwZSA9IHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV4dEVsZW1lbnQpO1xuICBpZiAocHJldlR5cGUgPT09ICdzdHJpbmcnIHx8IHByZXZUeXBlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXh0VHlwZSA9PT0gJ3N0cmluZycgfHwgbmV4dFR5cGUgPT09ICdudW1iZXInO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIHByZXZFbGVtZW50LnR5cGUgPT09IG5leHRFbGVtZW50LnR5cGUgJiYgcHJldkVsZW1lbnQua2V5ID09PSBuZXh0RWxlbWVudC5rZXk7XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gc2hvdWxkVXBkYXRlQ29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEJhc2UgY29tcG9uZW50IGNsYXNzLlxuICovXG52YXIgQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcG9uZW50KTtcblxuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMucmVmcyA9IHt9O1xuICAgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJpc0NvbXBvbmVudENsYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzQ29tcG9uZW50Q2xhc3MoKSB7fVxuICB9LCB7XG4gICAga2V5OiBcInNldFN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFN0YXRlKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMudXBkYXRlci5zZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yY2VVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMudXBkYXRlci5mb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gQ29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG52YXIgX2luc3RhbmNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbmNlKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIENvbXBvbmVudFRyZWU6IHtcbiAgICBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTogZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICAgICAgcmV0dXJuIF9pbnN0YW5jZTIuZGVmYXVsdC5nZXQobm9kZSk7XG4gICAgfSxcbiAgICBnZXROb2RlRnJvbUluc3RhbmNlOiBmdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHtcbiAgICAgIC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0ZSlcbiAgICAgIHdoaWxlIChpbnN0Ll9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgICBpbnN0ID0gaW5zdC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgIHJldHVybiBpbnN0Ll9uYXRpdmVOb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBNb3VudDoge1xuICAgIF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOiBfaG9zdDIuZGVmYXVsdC5yb290Q29tcG9uZW50cyxcblxuICAgIC8vIFN0dWIgLSBSZWFjdCBEZXZUb29scyBleHBlY3RzIHRvIGZpbmQgdGhpcyBtZXRob2QgYW5kIHJlcGxhY2UgaXRcbiAgICAvLyB3aXRoIGEgd3JhcHBlciBpbiBvcmRlciB0byBvYnNlcnZlIG5ldyByb290IGNvbXBvbmVudHMgYmVpbmcgYWRkZWRcbiAgICBfcmVuZGVyTmV3Um9vdENvbXBvbmVudDogZnVuY3Rpb24gX3JlbmRlck5ld1Jvb3RDb21wb25lbnQoKSB7fVxuICB9LFxuICBSZWNvbmNpbGVyOiB7XG4gICAgLy8gU3R1YnMgLSBSZWFjdCBEZXZUb29scyBleHBlY3RzIHRvIGZpbmQgdGhlc2UgbWV0aG9kcyBhbmQgcmVwbGFjZSB0aGVtXG4gICAgLy8gd2l0aCB3cmFwcGVycyBpbiBvcmRlciB0byBvYnNlcnZlIGNvbXBvbmVudHMgYmVpbmcgbW91bnRlZCwgdXBkYXRlZCBhbmRcbiAgICAvLyB1bm1vdW50ZWRcbiAgICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gbW91bnRDb21wb25lbnQoKSB7fSxcbiAgICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiByZWNlaXZlQ29tcG9uZW50KCkge30sXG4gICAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudCgpIHt9XG4gIH0sXG4gIC8vIG1vbml0b3IgdGhlIGluZm8gb2YgYWxsIGNvbXBvbmVudHNcbiAgbW9uaXRvcjogbnVsbFxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50O1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfZmxhdHRlbkNoaWxkcmVuID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblxudmFyIF9mbGF0dGVuQ2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmxhdHRlbkNoaWxkcmVuKTtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRSZW5kZXJFcnJvckluZm8oKSB7XG4gIGlmIChfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQpIHtcbiAgICB2YXIgbmFtZSA9IF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gRWxlbWVudCh0eXBlLCBrZXksIHJlZiwgcHJvcHMsIG93bmVyKSB7XG4gIGlmIChfdW5pdmVyc2FsRW52LmlzV2VleCkge1xuICAgIHByb3BzID0gZmlsdGVyUHJvcHModHlwZSwgcHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFbGVtZW50O1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZShzdHlsZSkge1xuICBpZiAoIXN0eWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZmxhdHRlblN0eWxlKHN0eWxlW2ldKTtcbiAgICAgIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBjb21wdXRlZFN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBUT0RPOiBtb3ZlIHRvIHdlZXgtZHJ2aWVyXG5mdW5jdGlvbiBmaWx0ZXJQcm9wcyh0eXBlLCBwcm9wcykge1xuICAvLyBPbmx5IGZvciB3ZWV4IHRleHRcbiAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gICAgLy8gVmFsdWUgaXMgZmlyc3RcbiAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuam9pbignJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjaGlsZHJlbiA9ICcnO1xuICAgICAgfVxuXG4gICAgICBwcm9wcy52YWx1ZSA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdjcmVhdGVFbGVtZW50OiB0eXBlIHNob3VsZCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyArIGdldFJlbmRlckVycm9ySW5mbygpKTtcbiAgfVxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIgcHJvcE5hbWUgPSB2b2lkIDA7XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICByZWYgPSBjb25maWcucmVmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLnJlZjtcbiAgICBrZXkgPSBjb25maWcua2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGNvbmZpZy5rZXkpO1xuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKCFSRVNFUlZFRF9QUk9QU1twcm9wTmFtZV0pIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMCkge1xuICAgIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSAmJiAhQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZEFycmF5ID0gY2hpbGRyZW47XG4gICAgICBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgICAgIGNoaWxkQXJyYXkgPSBuZXcgQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcHMuY2hpbGRyZW4gPSAoMCwgX2ZsYXR0ZW5DaGlsZHJlbjIuZGVmYXVsdCkoY2hpbGRBcnJheSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgJiYgKEFycmF5LmlzQXJyYXkocHJvcHMuc3R5bGUpIHx8IF90eXBlb2YocHJvcHMuc3R5bGUpID09PSAnb2JqZWN0JykpIHtcbiAgICBwcm9wcy5zdHlsZSA9IGZsYXR0ZW5TdHlsZShwcm9wcy5zdHlsZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHByb3BzLCBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5KHR5cGUpIHtcbiAgdmFyIGZhY3RvcnkgPSBjcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7XG4gIC8vIEV4cG9zZSB0aGUgdHlwZSBvbiB0aGUgZmFjdG9yeSBhbmQgdGhlIHByb3RvdHlwZSBzbyB0aGF0IGl0IGNhbiBiZVxuICAvLyBlYXNpbHkgYWNjZXNzZWQgb24gZWxlbWVudHMuIEUuZy4gYDxGb28gLz4udHlwZSA9PT0gRm9vYC5cbiAgLy8gVGhpcyBzaG91bGQgbm90IGJlIG5hbWVkIGBjb25zdHJ1Y3RvcmAgc2luY2UgdGhpcyBtYXkgbm90IGJlIHRoZSBmdW5jdGlvblxuICAvLyB0aGF0IGNyZWF0ZWQgdGhlIGVsZW1lbnQsIGFuZCBpdCBtYXkgbm90IGV2ZW4gYmUgYSBjb25zdHJ1Y3Rvci5cbiAgZmFjdG9yeS50eXBlID0gdHlwZTtcbiAgcmV0dXJuIGZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcpIHtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudChlbGVtZW50KSkge1xuICAgIHRocm93IEVycm9yKCdjbG9uZUVsZW1lbnQ6IG5vdCBhIHZhbGlkIGVsZW1lbnQuJyArIGdldFJlbmRlckVycm9ySW5mbygpKTtcbiAgfVxuXG4gIC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcbiAgdmFyIHByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcblxuICAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcpIHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcmVmIGFuZCBvd25lciBpZiBoYXMgYSBuZXcgcmVmXG4gICAgaWYgKGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50O1xuICAgIH1cblxuICAgIGlmIChjb25maWcua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleSA9IFN0cmluZyhjb25maWcua2V5KTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdm9pZCAwO1xuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcbiAgICB2YXIgcHJvcE5hbWUgPSB2b2lkIDA7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChjb25maWcuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjaGlsZHJlbiA9IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBjaGlsZHJlbltfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSAoMCwgX2ZsYXR0ZW5DaGlsZHJlbjIuZGVmYXVsdCkoY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHByb3BzLCBvd25lcik7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmplY3QpKSA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC50eXBlICYmIG9iamVjdC5wcm9wcztcbn1cblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmbGF0dGVuQ2hpbGRyZW47XG5mdW5jdGlvbiB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRyYXZlcnNlQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpO1xuXG4gIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0WzBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3R5cGVvZjIgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mMihTeW1ib2wuaXRlcmF0b3IpID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZjIob2JqKTtcbn07XG5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjZG9tLW5hdmlnYXRvci1hcHBjb2RlbmFtZVxudmFyIGlzV2ViID0gZXhwb3J0cy5pc1dlYiA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgKG5hdmlnYXRvci5hcHBDb2RlTmFtZSA9PT0gJ01vemlsbGEnIHx8IG5hdmlnYXRvci5wcm9kdWN0ID09PSAnR2Vja28nKTtcbnZhciBpc05vZGUgPSBleHBvcnRzLmlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhIShwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG52YXIgaXNXZWV4ID0gZXhwb3J0cy5pc1dlZXggPSB0eXBlb2YgY2FsbE5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJztcbnZhciBpc1JlYWN0TmF0aXZlID0gZXhwb3J0cy5pc1JlYWN0TmF0aXZlID0gdHlwZW9mIF9fZmJCYXRjaGVkQnJpZGdlQ29uZmlnICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IG1vZHVsZS5leHBvcnRzO1xuZXhwb3J0cy5kZWZhdWx0ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKG5vZGUpIHtcbiAgdmFyIGNvbXBvbmVudCA9IF9pbnN0YW5jZTIuZGVmYXVsdC5nZXQobm9kZSk7XG5cbiAgaWYgKCFjb21wb25lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfaW5zdGFuY2UyLmRlZmF1bHQucmVtb3ZlKG5vZGUpO1xuICBjb21wb25lbnQuX2ludGVybmFsLnVubW91bnRDb21wb25lbnQoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpO1xuXG52YXIgX2luamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmplY3QpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgLy8gQ29tcGF0aWJsZSB3aXRoIGByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaylgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAvLyBJbml0IGluamVjdFxuICAoMCwgX2luamVjdDIuZGVmYXVsdCkob3B0aW9ucyk7XG5cbiAgdmFyIHJvb3RDb21wb25lbnQgPSBfaW5zdGFuY2UyLmRlZmF1bHQubW91bnQoZWxlbWVudCwgY29udGFpbmVyLCBvcHRpb25zLnBhcmVudCk7XG4gIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHJvb3RDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjay5jYWxsKGNvbXBvbmVudEluc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRJbnN0YW5jZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gcmVuZGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX3JlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG52YXIgX3JlZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWYpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9nZXRFbGVtZW50S2V5TmFtZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEVsZW1lbnRLZXlOYW1lKTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBUUkVFID0gJ3RyZWUnO1xudmFyIEVWRU5UX1BSRUZJWF9SRUdFWFAgPSAvb25bQS1aXS87XG5cbi8qKlxuICogTmF0aXZlIENvbXBvbmVudFxuICovXG5cbnZhciBOYXRpdmVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5hdGl2ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5hdGl2ZUNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTmF0aXZlQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBwYXJlbnRJbnN0YW5jZSwgY29udGV4dCwgY2hpbGRNb3VudGVyKSB7XG4gICAgICAvLyBQYXJlbnQgbmF0aXZlIGVsZW1lbnRcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX3BhcmVudEluc3RhbmNlID0gcGFyZW50SW5zdGFuY2U7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMuX21vdW50SUQgPSBfaG9zdDIuZGVmYXVsdC5tb3VudElEKys7XG5cbiAgICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgICBfaW50ZXJuYWw6IHRoaXMsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgfTtcbiAgICAgIHZhciBhcHBlbmRUeXBlID0gcHJvcHMuYXBwZW5kOyAvLyBEZWZhdWx0IGlzIG5vZGVcblxuICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgLy8gQ2xvbmUgYSBjb3B5IGZvciBzdHlsZSBkaWZmXG4gICAgICB0aGlzLl9wcmV2U3R5bGVDb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoYXBwZW5kVHlwZSAhPT0gVFJFRSkge1xuICAgICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgICAgY2hpbGRNb3VudGVyKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50ICYmIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZikge1xuICAgICAgICBfcmVmMi5kZWZhdWx0LmF0dGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZiwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGVuZFR5cGUgPT09IFRSRUUpIHtcbiAgICAgICAgaWYgKGNoaWxkTW91bnRlcikge1xuICAgICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0ge307XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuSW1hZ2UgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkoZWxlbWVudCk7XG4gICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkocmVuZGVyZWRDaGlsZHJlbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuW25hbWVdID0gcmVuZGVyZWRDaGlsZDtcbiAgICAgICAgcmVuZGVyZWRDaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNb3VudFxuICAgICAgICB2YXIgbW91bnRJbWFnZSA9IHJlbmRlcmVkQ2hpbGQubW91bnRDb21wb25lbnQoX3RoaXMuZ2V0TmF0aXZlTm9kZSgpLCBfdGhpcy5faW5zdGFuY2UsIGNvbnRleHQsIG51bGwpO1xuICAgICAgICByZXR1cm4gbW91bnRJbWFnZTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZHJlbkltYWdlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VubW91bnRDaGlsZHJlbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDaGlsZHJlbihub3RSZW1vdmVDaGlsZCkge1xuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuXG4gICAgICBpZiAocmVuZGVyZWRDaGlsZHJlbikge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHJlbmRlcmVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHJlbmRlcmVkQ2hpbGRyZW5bbmFtZV07XG4gICAgICAgICAgcmVuZGVyZWRDaGlsZC51bm1vdW50Q29tcG9uZW50KG5vdFJlbW92ZUNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUpIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZjtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIF9yZWYyLmRlZmF1bHQuZGV0YWNoKHRoaXMuX2N1cnJlbnRFbGVtZW50Ll9vd25lciwgcmVmLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9pbnN0YW5jZTIuZGVmYXVsdC5yZW1vdmUodGhpcy5fbmF0aXZlTm9kZSk7XG4gICAgICAgIGlmICghbm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQ2hpbGQodGhpcy5fbmF0aXZlTm9kZSwgdGhpcy5fcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnModGhpcy5fbmF0aXZlTm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5tb3VudENoaWxkcmVuKG5vdFJlbW92ZUNoaWxkKTtcblxuICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudEluc3RhbmNlID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgdGhpcy5fcHJldlN0eWxlQ29weSA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlQ29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgcHJldkNvbnRleHQsIG5leHRDb250ZXh0KSB7XG4gICAgICAvLyBSZXBsYWNlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDtcblxuICAgICAgX3JlZjIuZGVmYXVsdC51cGRhdGUocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCB0aGlzKTtcblxuICAgICAgdmFyIHByZXZQcm9wcyA9IHByZXZFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIG5leHRQcm9wcyA9IG5leHRFbGVtZW50LnByb3BzO1xuXG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnRpZXMocHJldlByb3BzLCBuZXh0UHJvcHMpO1xuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbihuZXh0UHJvcHMuY2hpbGRyZW4sIG5leHRDb250ZXh0KTtcblxuICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlUHJvcGVydGllcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMocHJldlByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBwcm9wS2V5ID0gdm9pZCAwO1xuICAgICAgdmFyIHN0eWxlTmFtZSA9IHZvaWQgMDtcbiAgICAgIHZhciBzdHlsZVVwZGF0ZXMgPSB2b2lkIDA7XG4gICAgICBmb3IgKHByb3BLZXkgaW4gcHJldlByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTiB8fCBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIXByZXZQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBwcmV2UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAgIHZhciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2U3R5bGVDb3B5O1xuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcHJldlN0eWxlQ29weSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoRVZFTlRfUFJFRklYX1JFR0VYUC50ZXN0KHByb3BLZXkpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcmV2UHJvcHNbcHJvcEtleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBwcm9wS2V5LnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHByZXZQcm9wc1twcm9wS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5nZXROYXRpdmVOb2RlKCksIHByb3BLZXksIHByZXZQcm9wc1twcm9wS2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgICAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgICAgIHZhciBwcmV2UHJvcCA9IHByb3BLZXkgPT09IFNUWUxFID8gdGhpcy5fcHJldlN0eWxlQ29weSA6IHByZXZQcm9wcyAhPSBudWxsID8gcHJldlByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4gfHwgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gcHJldlByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBwcmV2UHJvcCA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHN0eWxlXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgICAgLy8gQ2xvbmUgcHJvcGVydHlcbiAgICAgICAgICAgIG5leHRQcm9wID0gdGhpcy5fcHJldlN0eWxlQ29weSA9IE9iamVjdC5hc3NpZ24oe30sIG5leHRQcm9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcHJldlN0eWxlQ29weSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHByZXZQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgcHJldlByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIHByZXZQcm9wKSB7XG4gICAgICAgICAgICAgIGlmIChwcmV2UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBwcmV2UHJvcGAuXG4gICAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBwcmV2UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NpZ24gbmV4dCBwcm9wIHdoZW4gcHJldiBzdHlsZSBpcyBudWxsXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZXZlbnQgYmluZGluZ1xuICAgICAgICB9IGVsc2UgaWYgKEVWRU5UX1BSRUZJWF9SRUdFWFAudGVzdChwcm9wS2V5KSkge1xuICAgICAgICAgIHZhciBldmVudE5hbWUgPSBwcm9wS2V5LnNsaWNlKDIpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHByZXZQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgZXZlbnROYW1lLCBwcmV2UHJvcCwgbmV4dFByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgZXZlbnROYW1lLCBuZXh0UHJvcCwgbmV4dFByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIG90aGVyIHByb3BlcnR5XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSB7fTtcbiAgICAgICAgICBwYXlsb2FkW3Byb3BLZXldID0gbmV4dFByb3A7XG4gICAgICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXRBdHRyaWJ1dGUodGhpcy5nZXROYXRpdmVOb2RlKCksIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleSwgcHJldlByb3BzW3Byb3BLZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5yZWNvcmRPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiB0aGlzLl9tb3VudElELFxuICAgICAgICAgICAgICB0eXBlOiAndXBkYXRlIGF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLnJlY29yZE9wZXJhdGlvbih7XG4gICAgICAgICAgICBpbnN0YW5jZUlEOiB0aGlzLl9tb3VudElELFxuICAgICAgICAgICAgdHlwZTogJ3VwZGF0ZSBzdHlsZScsXG4gICAgICAgICAgICBwYXlsb2FkOiBzdHlsZVVwZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuc2V0U3R5bGVzKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNoaWxkcmVuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuRWxlbWVudHMsIGNvbnRleHQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAvLyBwcmV2IHJlbmRlcmVkIGNoaWxkcmVuXG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcblxuICAgICAgaWYgKG5leHRDaGlsZHJlbkVsZW1lbnRzID09IG51bGwgJiYgcHJldkNoaWxkcmVuID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dENoaWxkcmVuID0ge307XG4gICAgICB2YXIgb2xkTm9kZXMgPSB7fTtcblxuICAgICAgaWYgKG5leHRDaGlsZHJlbkVsZW1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5leHRDaGlsZHJlbkVsZW1lbnRzKSkge1xuICAgICAgICAgIG5leHRDaGlsZHJlbkVsZW1lbnRzID0gW25leHRDaGlsZHJlbkVsZW1lbnRzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBuZXh0IGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gbmV4dENoaWxkcmVuRWxlbWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIHZhciBuZXh0RWxlbWVudCA9IG5leHRDaGlsZHJlbkVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB2YXIgbmFtZSA9ICgwLCBfZ2V0RWxlbWVudEtleU5hbWUyLmRlZmF1bHQpKG5leHRDaGlsZHJlbiwgbmV4dEVsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICB2YXIgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuICYmIHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Q2hpbGQgJiYgcHJldkNoaWxkLl9jdXJyZW50RWxlbWVudDtcblxuICAgICAgICAgIGlmIChwcmV2Q2hpbGQgIT0gbnVsbCAmJiAoMCwgX3Nob3VsZFVwZGF0ZUNvbXBvbmVudDIuZGVmYXVsdCkocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gUGFzcyB0aGUgc2FtZSBjb250ZXh0IHdoZW4gdXBkYXRpbmcgY2hpZHJlblxuICAgICAgICAgICAgcHJldkNoaWxkLnVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIGNvbnRleHQsIGNvbnRleHQpO1xuICAgICAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gcHJldkNoaWxkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVbm1vdW50IHRoZSBwcmV2Q2hpbGQgd2hlbiBuZXh0Q2hpbGQgaXMgZGlmZmVyZW50IGVsZW1lbnQgdHlwZS5cbiAgICAgICAgICAgIGlmIChwcmV2Q2hpbGQpIHtcbiAgICAgICAgICAgICAgdmFyIG9sZE5hdGl2ZU5vZGUgPSBwcmV2Q2hpbGQuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgICAgICAgICAvLyBEZWxheSByZW1vdmUgY2hpbGRcbiAgICAgICAgICAgICAgcHJldkNoaWxkLnVubW91bnRDb21wb25lbnQodHJ1ZSk7XG4gICAgICAgICAgICAgIG9sZE5vZGVzW25hbWVdID0gb2xkTmF0aXZlTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLlxuICAgICAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkobmV4dEVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZmlyc3RQcmV2Q2hpbGQgPSB2b2lkIDA7XG4gICAgICB2YXIgZGVsYXlSZW1vdmVGaXJzdFByZXZDaGlsZCA9IHZvaWQgMDtcbiAgICAgIC8vIFVubW91bnQgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuXG4gICAgICBpZiAocHJldkNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgX25hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKCFwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkoX25hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3ByZXZDaGlsZCA9IHByZXZDaGlsZHJlbltfbmFtZV07XG4gICAgICAgICAgdmFyIHNob3VsZFJlbW92ZSA9ICFuZXh0Q2hpbGRyZW5bX25hbWVdO1xuXG4gICAgICAgICAgLy8gU3RvcmUgb2xkIGZpcnN0IGNoaWxkIHJlZiBmb3IgYXBwZW5kIG5vZGUgYWhlYWQgYW5kIG1heWJlIGRlbGF5IHJlbW92ZSBpdFxuICAgICAgICAgIGlmICghZmlyc3RQcmV2Q2hpbGQpIHtcbiAgICAgICAgICAgIGZpcnN0UHJldkNoaWxkID0gX3ByZXZDaGlsZDtcbiAgICAgICAgICAgIGRlbGF5UmVtb3ZlRmlyc3RQcmV2Q2hpbGQgPSBzaG91bGRSZW1vdmU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZW1vdmUpIHtcbiAgICAgICAgICAgIF9wcmV2Q2hpbGQudW5tb3VudENvbXBvbmVudCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV4dENoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBgbmV4dEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBjaGlsZCBpbiBgbmV4dENoaWxkcmVuYCwgYnV0XG4gICAgICAgICAgLy8gYGxhc3RJbmRleGAgd2lsbCBiZSB0aGUgbGFzdCBpbmRleCB2aXNpdGVkIGluIGBwcmV2Q2hpbGRyZW5gLlxuICAgICAgICAgIHZhciBsYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHZhciBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgIHZhciBsYXN0UGxhY2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgdmFyIG5leHROYXRpdmVOb2RlID0gW107XG5cbiAgICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfbmFtZTIpIHtcbiAgICAgICAgICAgIGlmICghbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KF9uYW1lMikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICdjb250aW51ZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Q2hpbGQgPSBuZXh0Q2hpbGRyZW5bX25hbWUyXTtcbiAgICAgICAgICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW19uYW1lMl07XG5cbiAgICAgICAgICAgIGlmIChwcmV2Q2hpbGQgPT09IG5leHRDaGlsZCkge1xuICAgICAgICAgICAgICB2YXIgcHJldkNoaWxkTmF0aXZlTm9kZSA9IHByZXZDaGlsZC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYXJyYXkgdHlwZVxuICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJldkNoaWxkTmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q2hpbGROYXRpdmVOb2RlID0gW3ByZXZDaGlsZE5hdGl2ZU5vZGVdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gSWYgdGhlIGluZGV4IG9mIGBjaGlsZGAgaXMgbGVzcyB0aGFuIGBsYXN0SW5kZXhgLCB0aGVuIGl0IG5lZWRzIHRvXG4gICAgICAgICAgICAgIC8vIGJlIG1vdmVkLiBPdGhlcndpc2UsIHdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgaXQgYmVjYXVzZSBhIGNoaWxkIHdpbGwgYmVcbiAgICAgICAgICAgICAgLy8gaW5zZXJ0ZWQgb3IgbW92ZWQgYmVmb3JlIGBjaGlsZGAuXG4gICAgICAgICAgICAgIGlmIChwcmV2Q2hpbGQuX21vdW50SW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3QgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXN0UGxhY2VkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIGxhc3RQbGFjZWROb2RlID0gbGFzdFBsYWNlZE5vZGVbbGFzdFBsYWNlZE5vZGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSBwcmV2Q2hpbGROYXRpdmVOb2RlLmxlbmd0aCAtIDE7IF9pID49IDA7IF9pLS0pIHtcbiAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5pbnNlcnRBZnRlcihwcmV2Q2hpbGROYXRpdmVOb2RlW19pXSwgbGFzdFBsYWNlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG5leHROYXRpdmVOb2RlID0gbmV4dE5hdGl2ZU5vZGUuY29uY2F0KHByZXZDaGlsZE5hdGl2ZU5vZGUpO1xuXG4gICAgICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgcHJldkNoaWxkLl9tb3VudEluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHByZXZDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGBsYXN0SW5kZXhgIGJlZm9yZSBgX21vdW50SW5kZXhgIGdldHMgdW5zZXQgYnkgdW5tb3VudGluZy5cbiAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gX3RoaXMyLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICAgICAgLy8gRnJhZ21lbnQgZXh0ZW5kZWQgbmF0aXZlIGNvbXBvbmVudCwgc28gaWYgcGFyZW50IGlzIGZyYWdtZW50IHNob3VsZCBnZXQgdGhpcy5fcGFyZW50XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudCkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBfdGhpczIuX3BhcmVudDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG5leHRDaGlsZC5tb3VudENvbXBvbmVudChwYXJlbnQsIF90aGlzMi5faW5zdGFuY2UsIGNvbnRleHQsIGZ1bmN0aW9uIChuZXdDaGlsZCwgcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogUmV3b3JrIHRoZSBkdXBsaWNhdGUgY29kZVxuICAgICAgICAgICAgICAgIHZhciBvbGRDaGlsZCA9IG9sZE5vZGVzW19uYW1lMl07XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQgPSBbbmV3Q2hpbGRdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvbGRDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIG9sZENoaWxkIG9yIG5ld0NoaWxkIGFsbCBtYXliZSBmcmFnbWVudFxuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9sZENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDaGlsZCA9IFtvbGRDaGlsZF07XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIG5ld0NoaWxkIGNvdW50IGxhcmdlIHRoZW4gb2xkQ2hpbGRcbiAgICAgICAgICAgICAgICAgIHZhciBsYXN0TmV3Q2hpbGQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZXdDaGlsZC5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkW19pMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRDaGlsZFtfaTJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlcGxhY2VDaGlsZChjaGlsZCwgb2xkQ2hpbGRbX2kyXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEFmdGVyKGNoaWxkLCBsYXN0TmV3Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3ROZXdDaGlsZCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBuZXdDaGlsZCBjb3VudCBsZXNzIHRoZW4gb2xkQ2hpbGRcbiAgICAgICAgICAgICAgICAgIGlmIChuZXdDaGlsZC5sZW5ndGggPCBvbGRDaGlsZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gbmV3Q2hpbGQubGVuZ3RoOyBfaTMgPCBvbGRDaGlsZC5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKG9sZENoaWxkW19pM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBjaGlsZCBhdCBhIHNwZWNpZmljIGluZGV4XG5cbiAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjaGlsZFxuICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFzdFBsYWNlZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQbGFjZWROb2RlID0gbGFzdFBsYWNlZE5vZGVbbGFzdFBsYWNlZE5vZGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHZhciBwcmV2Rmlyc3ROYXRpdmVOb2RlID0gdm9pZCAwO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZmlyc3RQcmV2Q2hpbGQgJiYgIWxhc3RQbGFjZWROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZGaXJzdE5hdGl2ZU5vZGUgPSBmaXJzdFByZXZDaGlsZC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZGaXJzdE5hdGl2ZU5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJldkZpcnN0TmF0aXZlTm9kZSA9IHByZXZGaXJzdE5hdGl2ZU5vZGVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2k0ID0gbmV3Q2hpbGQubGVuZ3RoIC0gMTsgX2k0ID49IDA7IF9pNC0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfY2hpbGQgPSBuZXdDaGlsZFtfaTRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBsYWNlZE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuaW5zZXJ0QWZ0ZXIoX2NoaWxkLCBsYXN0UGxhY2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldkZpcnN0TmF0aXZlTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5pbnNlcnRCZWZvcmUoX2NoaWxkLCBwcmV2Rmlyc3ROYXRpdmVOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYXBwZW5kQ2hpbGQoX2NoaWxkLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV4dE5hdGl2ZU5vZGUgPSBuZXh0TmF0aXZlTm9kZS5jb25jYXQobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmV4dENoaWxkLl9tb3VudEluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgIGxhc3RQbGFjZWROb2RlID0gbmV4dENoaWxkLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX25hbWUyIGluIG5leHRDaGlsZHJlbikge1xuICAgICAgICAgICAgdmFyIF9yZXQyID0gX2xvb3AoX25hbWUyKTtcblxuICAgICAgICAgICAgaWYgKF9yZXQyID09PSAnY29udGludWUnKSBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTeW5jIHVwZGF0ZSBuYXRpdmUgcmVmc1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KF90aGlzMi5fbmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIGFsbCBhbmQgcHVzaCB0aGUgbmV3IGFycmF5XG4gICAgICAgICAgICBfdGhpczIuX25hdGl2ZU5vZGUuc3BsaWNlKDAsIF90aGlzMi5fbmF0aXZlTm9kZS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0TmF0aXZlTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBfdGhpczIuX25hdGl2ZU5vZGUucHVzaChuZXh0TmF0aXZlTm9kZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVsYXlSZW1vdmVGaXJzdFByZXZDaGlsZCkge1xuICAgICAgICBmaXJzdFByZXZDaGlsZC51bm1vdW50Q29tcG9uZW50KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBuZXh0Q2hpbGRyZW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlRWxlbWVudCh0aGlzLl9pbnN0YW5jZSk7XG4gICAgICAgIF9pbnN0YW5jZTIuZGVmYXVsdC5zZXQodGhpcy5fbmF0aXZlTm9kZSwgdGhpcy5faW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbmF0aXZlTm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRQdWJsaWNJbnN0YW5jZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldE5hbWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5hdGl2ZUNvbXBvbmVudDtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gTmF0aXZlQ29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbi8qXG4gKiBSZWYgbWFuYWdlclxuICovXG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb21wb25lbnQpIHtcbiAgICB2YXIgcHJldlJlZiA9IHByZXZFbGVtZW50ICE9IG51bGwgJiYgcHJldkVsZW1lbnQucmVmO1xuICAgIHZhciBuZXh0UmVmID0gbmV4dEVsZW1lbnQgIT0gbnVsbCAmJiBuZXh0RWxlbWVudC5yZWY7XG5cbiAgICAvLyBVcGRhdGUgcmVmcyBpbiBvd25lciBjb21wb25lbnRcbiAgICBpZiAocHJldlJlZiAhPT0gbmV4dFJlZikge1xuICAgICAgLy8gRGV0YWNoIHByZXYgUmVuZGVyZWRFbGVtZW50J3MgcmVmXG4gICAgICBwcmV2UmVmICE9IG51bGwgJiYgdGhpcy5kZXRhY2gocHJldkVsZW1lbnQuX293bmVyLCBwcmV2UmVmLCBjb21wb25lbnQpO1xuICAgICAgLy8gQXR0YWNoIG5leHQgUmVuZGVyZWRFbGVtZW50J3MgcmVmXG4gICAgICBuZXh0UmVmICE9IG51bGwgJiYgdGhpcy5hdHRhY2gobmV4dEVsZW1lbnQuX293bmVyLCBuZXh0UmVmLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfSxcbiAgYXR0YWNoOiBmdW5jdGlvbiBhdHRhY2gob3duZXJDb21wb25lbnQsIHJlZiwgY29tcG9uZW50KSB7XG4gICAgaWYgKCFvd25lckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWlnaHQgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgJyArICdgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSYXggbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHZhciBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25lckNvbXBvbmVudC5faW5zdGFuY2UucmVmc1tyZWZdID0gaW5zdGFuY2U7XG4gICAgfVxuICB9LFxuICBkZXRhY2g6IGZ1bmN0aW9uIGRldGFjaChvd25lckNvbXBvbmVudCwgcmVmLCBjb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2hlbiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQgaXMgdW5tb3VudGVkIGFuZCB3aGVuZXZlciB0aGUgcmVmIGNoYW5nZXMsIHRoZSBvbGQgcmVmIHdpbGwgYmUgY2FsbGVkIHdpdGggbnVsbCBhcyBhbiBhcmd1bWVudC5cbiAgICAgIHJlZihudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVzdCBtYXRjaCBjb21wb25lbnQgYW5kIHJlZiBjb3VsZCBkZXRhY2ggdGhlIHJlZiBvbiBvd25lciB3aGVuIEEncyBiZWZvcmUgcmVmIGlzIEIncyBjdXJyZW50IHJlZlxuICAgICAgdmFyIGluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgICBpZiAob3duZXJDb21wb25lbnQuX2luc3RhbmNlLnJlZnNbcmVmXSA9PT0gaW5zdGFuY2UpIHtcbiAgICAgICAgZGVsZXRlIG93bmVyQ29tcG9uZW50Ll9pbnN0YW5jZS5yZWZzW3JlZl07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGNoaWxkcmVuLCBlbGVtZW50LCBpbmRleCkge1xuICB2YXIgZWxlbWVudEtleSA9IGVsZW1lbnQgJiYgZWxlbWVudC5rZXk7XG4gIHZhciBoYXNLZXkgPSB0eXBlb2YgZWxlbWVudEtleSA9PT0gJ3N0cmluZyc7XG4gIHZhciBkZWZhdWx0TmFtZSA9ICcuJyArIGluZGV4LnRvU3RyaW5nKDM2KTtcblxuICBpZiAoaGFzS2V5KSB7XG4gICAgdmFyIGtleU5hbWUgPSAnJCcgKyBlbGVtZW50S2V5O1xuICAgIC8vIENoaWxkIGtleXMgbXVzdCBiZSB1bmlxdWUuXG4gICAgdmFyIGtleVVuaXF1ZSA9IGNoaWxkcmVuW2tleU5hbWVdID09PSB1bmRlZmluZWQ7XG4gICAgLy8gT25seSB0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkIHdoZW4gZW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5XG4gICAgaWYgKCFrZXlVbmlxdWUpIGNvbnNvbGUud2FybignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5IFwiJyArIGVsZW1lbnRLZXkgKyAnXCIuJyk7XG5cbiAgICByZXR1cm4ga2V5VW5pcXVlID8ga2V5TmFtZSA6IGRlZmF1bHROYW1lO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkZWZhdWx0TmFtZTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNSZW0gPSBpc1JlbTtcbmV4cG9ydHMuY2FsY1JlbSA9IGNhbGNSZW07XG5leHBvcnRzLmdldFJlbSA9IGdldFJlbTtcbmV4cG9ydHMuc2V0UmVtID0gc2V0UmVtO1xuZXhwb3J0cy5pc1VuaXROdW1iZXIgPSBpc1VuaXROdW1iZXI7XG5leHBvcnRzLmNvbnZlcnRVbml0ID0gY29udmVydFVuaXQ7XG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIFVOSVRMRVNTX05VTUJFUl9QUk9QUyA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIC8vIFdlIG1ha2UgbGluZUhlaWdodCBkZWZhdWx0IGlzIHB4IHRoYXQgaXMgZGlmZiB3aXRoIHczYyBzcGVjXG4gIC8vIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcbiAgLy8gV2VleCBvbmx5XG4gIGxpbmVzOiB0cnVlXG59O1xudmFyIFNVRkZJWCA9ICdyZW0nO1xudmFyIFJFTV9SRUcgPSAvWy0rXT9cXGQqXFwuP1xcZCtyZW0vZztcblxuLy8gRGVmYXVsdCAxIHJlbSB0byAxIHB4XG52YXIgZGVmYXVsdFJlbVVuaXQgPSAxO1xuXG4vKipcbiAqIElzIHN0cmluZyBjb250YWlucyByZW1cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1JlbShzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pbmRleE9mKFNVRkZJWCkgIT09IC0xO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSByZW0gdG8gcGl4ZWxzOiAnMS4ycmVtJyA9PiAxLjIgKiByZW1cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByZW1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNhbGNSZW0oc3RyKSB7XG4gIHZhciByZW1Vbml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBkZWZhdWx0UmVtVW5pdDtcblxuICByZXR1cm4gc3RyLnJlcGxhY2UoUkVNX1JFRywgZnVuY3Rpb24gKHJlbSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHJlbSkgKiByZW1Vbml0ICsgJ3B4JztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbSgpIHtcbiAgcmV0dXJuIGRlZmF1bHRSZW1Vbml0O1xufVxuXG5mdW5jdGlvbiBzZXRSZW0ocmVtKSB7XG4gIGRlZmF1bHRSZW1Vbml0ID0gcmVtO1xufVxuXG5mdW5jdGlvbiBpc1VuaXROdW1iZXIodmFsLCBwcm9wKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhVU5JVExFU1NfTlVNQkVSX1BST1BTW3Byb3BdO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5pdCh2YWwsIHByb3ApIHtcbiAgdmFyIHJlbVVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRlZmF1bHRSZW1Vbml0O1xuXG4gIGlmIChwcm9wICYmIGlzVW5pdE51bWJlcih2YWwsIHByb3ApKSB7XG4gICAgcmV0dXJuIHZhbCAqIHJlbVVuaXQgKyAncHgnO1xuICB9IGVsc2UgaWYgKGlzUmVtKHZhbCkpIHtcbiAgICByZXR1cm4gY2FsY1JlbSh2YWwsIHJlbVVuaXQpO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IG1vZHVsZS5leHBvcnRzO1xuZXhwb3J0cy5kZWZhdWx0ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUgPSB0cmFuc2Zvcm1Qcm9wc0F0dHJzVG9TdHlsZTtcbmV4cG9ydHMucmVuYW1lUHJvcHNBdHRyID0gcmVuYW1lUHJvcHNBdHRyO1xuLyoqXG4gKiB0cmFuc2Zvcm1Qcm9wQXR0cnNUb1N0eWxlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge0FycmF5fSBhdHRyc1xuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qcm9wc0F0dHJzVG9TdHlsZShwcm9wcywgYXR0cnMpIHtcbiAgcHJvcHMuc3R5bGUgPSBwcm9wcy5zdHlsZSB8fCB7fTtcblxuICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgaWYgKHByb3BzW2F0dHJdICYmICFwcm9wcy5zdHlsZVthdHRyXSkge1xuICAgICAgcHJvcHMuc3R5bGVbYXR0cl0gPSBwcm9wc1thdHRyXTtcbiAgICAgIGRlbGV0ZSBwcm9wc1thdHRyXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbi8qKlxuICogcmVuYW1lUHJvcHNBdHRyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge1N0cmluZ30gb3JpZ2luYWxBdHRyTmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IG5ld0F0dHJOYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZVByb3BzQXR0cihwcm9wcywgb3JpZ2luYWxBdHRyTmFtZSwgbmV3QXR0ck5hbWUpIHtcbiAgaWYgKHByb3BzW29yaWdpbmFsQXR0ck5hbWVdICYmICFwcm9wc1tuZXdBdHRyTmFtZV0pIHtcbiAgICBwcm9wc1tuZXdBdHRyTmFtZV0gPSBwcm9wc1tvcmlnaW5hbEF0dHJOYW1lXTtcbiAgICBkZWxldGUgcHJvcHNbb3JpZ2luYWxBdHRyTmFtZV07XG4gIH1cblxuICByZXR1cm4gcHJvcHM7XG59XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuZXhwb3J0cy5kZWZhdWx0ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gSWYgYSBuYXRpdmUgbm9kZSwgd2VleCBtYXkgbm90IGV4cG9ydCBvd25lckRvY3VtZW50IHByb3BlcnR5XG4gIGlmIChpbnN0YW5jZS5vd25lckRvY3VtZW50IHx8IGluc3RhbmNlLm5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLy8gTmF0aXZlIGNvbXBvbmVudFxuICBpZiAoaW5zdGFuY2UuX25hdGl2ZU5vZGUpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuX25hdGl2ZU5vZGU7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5nZXRFbGVtZW50QnlJZChpbnN0YW5jZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignZmluZERPTU5vZGU6IGZpbmQgYnkgbmVpdGhlciBjb21wb25lbnQgbm9yIERPTSBub2RlLicpO1xuICB9XG5cbiAgLy8gQ29tcG9zaXRlIGNvbXBvbmVudFxuICB2YXIgaW50ZXJuYWwgPSBpbnN0YW5jZS5faW50ZXJuYWw7XG5cbiAgaWYgKGludGVybmFsKSB7XG4gICAgd2hpbGUgKCFpbnRlcm5hbC5fbmF0aXZlTm9kZSkge1xuICAgICAgaW50ZXJuYWwgPSBpbnRlcm5hbC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gICAgICAvLyBJZiBub3QgbW91bnRlZFxuICAgICAgaWYgKGludGVybmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbC5fbmF0aXZlTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmRET01Ob2RlOiBmaW5kIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZmluZERPTU5vZGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5DaGlsZHJlbiA9IGV4cG9ydHMudmVyc2lvbiA9IGV4cG9ydHMuc2V0TmF0aXZlUHJvcHMgPSBleHBvcnRzLmZpbmRDb21wb25lbnRJbnN0YW5jZSA9IGV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGV4cG9ydHMuZmluZERPTU5vZGUgPSBleHBvcnRzLmh5ZHJhdGUgPSBleHBvcnRzLnJlbmRlciA9IGV4cG9ydHMuUHJvcFR5cGVzID0gZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gZXhwb3J0cy5Db21wb25lbnQgPSBleHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBleHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbl9fd2VicGFja19yZXF1aXJlX18oMTgpO1xuXG52YXIgX2VsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbnZhciBfcHVyZWNvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXG52YXIgX3B1cmVjb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHVyZWNvbXBvbmVudCk7XG5cbnZhciBfcHJvcHR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5cbnZhciBfcHJvcHR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3B0eXBlcyk7XG5cbnZhciBfcmVuZGVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG52YXIgX3JlbmRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW5kZXIyKTtcblxudmFyIF9oeWRyYXRlMiA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpO1xuXG52YXIgX2h5ZHJhdGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHlkcmF0ZTIpO1xuXG52YXIgX2ZpbmRET01Ob2RlMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG52YXIgX2ZpbmRET01Ob2RlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZpbmRET01Ob2RlMik7XG5cbnZhciBfdW5tb3VudENvbXBvbmVudEF0Tm9kZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG52YXIgX3VubW91bnRDb21wb25lbnRBdE5vZGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdW5tb3VudENvbXBvbmVudEF0Tm9kZTIpO1xuXG52YXIgX2ZpbmRDb21wb25lbnRJbnN0YW5jZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKTtcblxudmFyIF9maW5kQ29tcG9uZW50SW5zdGFuY2UzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmluZENvbXBvbmVudEluc3RhbmNlMik7XG5cbnZhciBfc2V0TmF0aXZlUHJvcHMyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG5cbnZhciBfc2V0TmF0aXZlUHJvcHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2V0TmF0aXZlUHJvcHMyKTtcblxudmFyIF92ZXJzaW9uMiA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpO1xuXG52YXIgX3ZlcnNpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmVyc2lvbjIpO1xuXG52YXIgX2NoaWxkcmVuID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nik7XG5cbnZhciBfY2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBfZWxlbWVudC5jcmVhdGVFbGVtZW50O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBfZWxlbWVudC5jbG9uZUVsZW1lbnQ7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gX2VsZW1lbnQuaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBfZWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5Db21wb25lbnQgPSBfY29tcG9uZW50Mi5kZWZhdWx0O1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gX3B1cmVjb21wb25lbnQyLmRlZmF1bHQ7XG5leHBvcnRzLlByb3BUeXBlcyA9IF9wcm9wdHlwZXMyLmRlZmF1bHQ7XG5leHBvcnRzLnJlbmRlciA9IF9yZW5kZXIzLmRlZmF1bHQ7XG5leHBvcnRzLmh5ZHJhdGUgPSBfaHlkcmF0ZTMuZGVmYXVsdDtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBfZmluZERPTU5vZGUzLmRlZmF1bHQ7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSBfdW5tb3VudENvbXBvbmVudEF0Tm9kZTMuZGVmYXVsdDtcbmV4cG9ydHMuZmluZENvbXBvbmVudEluc3RhbmNlID0gX2ZpbmRDb21wb25lbnRJbnN0YW5jZTMuZGVmYXVsdDtcbmV4cG9ydHMuc2V0TmF0aXZlUHJvcHMgPSBfc2V0TmF0aXZlUHJvcHMzLmRlZmF1bHQ7XG5leHBvcnRzLnZlcnNpb24gPSBfdmVyc2lvbjMuZGVmYXVsdDtcbmV4cG9ydHMuQ2hpbGRyZW4gPSBfY2hpbGRyZW4yLmRlZmF1bHQ7XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9ob29rID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxudmFyIF9ob29rMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvb2spO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdChfaG9vazIuZGVmYXVsdCk7XG59XG5cbi8qKiovIH0pLFxuLyogMTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIgX2NvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciByb290Q291bnRlciA9IDE7XG5cbnZhciBSb290ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFJvb3QsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvb3QoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvb3QpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IFJvb3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihSb290KSkuY2FsbC5hcHBseShfcmVmLCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMucm9vdElEID0gcm9vdENvdW50ZXIrKywgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUm9vdCwgW3tcbiAgICBrZXk6ICdpc1Jvb3RDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Jvb3RDb21wb25lbnQoKSB7fVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0UHVibGljSW5zdGFuY2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlbmRlcmVkQ29tcG9uZW50KCkuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlbmRlcmVkQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUm9vdDtcbn0oX2NvbXBvbmVudDIuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFJvb3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBQdXJlIGNvbXBvbmVudCBjbGFzcy5cbiAqL1xudmFyIFB1cmVDb21wb25lbnQgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUHVyZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXJlQ29tcG9uZW50KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUHVyZUNvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFB1cmVDb21wb25lbnQpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHVyZUNvbXBvbmVudCwgW3tcbiAgICBrZXk6ICdpc1B1cmVDb21wb25lbnRDbGFzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUHVyZUNvbXBvbmVudENsYXNzKCkge31cbiAgfV0pO1xuXG4gIHJldHVybiBQdXJlQ29tcG9uZW50O1xufShfY29tcG9uZW50Mi5kZWZhdWx0KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUHVyZUNvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG4vKlxuICogQ3VycmVudCBQcm9wVHlwZXMgb25seSBleHBvcnQgc29tZSBhcGkgd2l0aCByZWFjdCwgbm90IHZhbGlkYXRlIGluIHJ1bnRpbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHJldHVybiB0eXBlQ2hlY2tlcjtcbiAgfVxuXG4gIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIC8vIE5vb3BcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG52YXIgdHlwZUNoZWNrZXIgPSBjcmVhdGVUeXBlQ2hlY2tlcigpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIGFycmF5OiB0eXBlQ2hlY2tlcixcbiAgYm9vbDogdHlwZUNoZWNrZXIsXG4gIGZ1bmM6IHR5cGVDaGVja2VyLFxuICBudW1iZXI6IHR5cGVDaGVja2VyLFxuICBvYmplY3Q6IHR5cGVDaGVja2VyLFxuICBzdHJpbmc6IHR5cGVDaGVja2VyLFxuICBzeW1ib2w6IHR5cGVDaGVja2VyLFxuICBlbGVtZW50OiB0eXBlQ2hlY2tlcixcbiAgbm9kZTogdHlwZUNoZWNrZXIsXG4gIGFueTogdHlwZUNoZWNrZXIsXG4gIGFycmF5T2Y6IHR5cGVDaGVja2VyLFxuICBpbnN0YW5jZU9mOiB0eXBlQ2hlY2tlcixcbiAgb2JqZWN0T2Y6IHR5cGVDaGVja2VyLFxuICBvbmVPZjogdHlwZUNoZWNrZXIsXG4gIG9uZU9mVHlwZTogdHlwZUNoZWNrZXIsXG4gIHNoYXBlOiB0eXBlQ2hlY2tlclxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogMjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGluamVjdDtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfZW1wdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcblxudmFyIF9lbXB0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbXB0eSk7XG5cbnZhciBfbmF0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cbnZhciBfbmF0aXZlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX25hdGl2ZSk7XG5cbnZhciBfdGV4dCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xuXG52YXIgX3RleHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdGV4dCk7XG5cbnZhciBfY29tcG9zaXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cbnZhciBfY29tcG9zaXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvc2l0ZSk7XG5cbnZhciBfZnJhZ21lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTtcblxudmFyIF9mcmFnbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmFnbWVudCk7XG5cbnZhciBfZHJpdmVyV2VleCA9IF9fd2VicGFja19yZXF1aXJlX18oMzApO1xuXG52YXIgX2RyaXZlcldlZXgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZHJpdmVyV2VleCk7XG5cbnZhciBfZHJpdmVyQnJvd3NlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDApO1xuXG52YXIgX2RyaXZlckJyb3dzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZHJpdmVyQnJvd3Nlcik7XG5cbnZhciBfaG9vayA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfaG9vazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob29rKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gaW5qZWN0KF9yZWYpIHtcbiAgdmFyIGRyaXZlciA9IF9yZWYuZHJpdmVyLFxuICAgICAgaG9vayA9IF9yZWYuaG9vayxcbiAgICAgIG1lYXN1cmVyID0gX3JlZi5tZWFzdXJlcixcbiAgICAgIGRldmljZVdpZHRoID0gX3JlZi5kZXZpY2VXaWR0aCxcbiAgICAgIHZpZXdwb3J0V2lkdGggPSBfcmVmLnZpZXdwb3J0V2lkdGgsXG4gICAgICBldmVudFJlZ2lzdHJ5ID0gX3JlZi5ldmVudFJlZ2lzdHJ5O1xuXG4gIC8vIEluamVjdCBjb21wb25lbnQgY2xhc3NcbiAgX2hvc3QyLmRlZmF1bHQuRW1wdHlDb21wb25lbnQgPSBfZW1wdHkyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0Lk5hdGl2ZUNvbXBvbmVudCA9IF9uYXRpdmUyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LlRleHRDb21wb25lbnQgPSBfdGV4dDIuZGVmYXVsdDtcbiAgX2hvc3QyLmRlZmF1bHQuRnJhZ21lbnRDb21wb25lbnQgPSBfZnJhZ21lbnQyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LkNvbXBvc2l0ZUNvbXBvbmVudCA9IF9jb21wb3NpdGUyLmRlZmF1bHQ7XG5cbiAgLy8gSW5qZWN0IGRldnRvb2wgaG9va1xuICBfaG9zdDIuZGVmYXVsdC5ob29rID0gaG9vayB8fCBfaG9vazIuZGVmYXVsdDtcblxuICAvLyBJbmplY3QgcGVyZm9ybWFuY2UgbWVhc3VyZXJcbiAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgPSBtZWFzdXJlcjtcblxuICAvLyBJbmplY3QgcmVuZGVyIGRyaXZlclxuICBpZiAoIV9ob3N0Mi5kZWZhdWx0LmRyaXZlcikge1xuICAgIGlmICghZHJpdmVyKSB7XG4gICAgICBpZiAoX3VuaXZlcnNhbEVudi5pc1dlZXgpIHtcbiAgICAgICAgZHJpdmVyID0gX2RyaXZlcldlZXgyLmRlZmF1bHQ7XG4gICAgICB9IGVsc2UgaWYgKF91bml2ZXJzYWxFbnYuaXNXZWIpIHtcbiAgICAgICAgZHJpdmVyID0gX2RyaXZlckJyb3dzZXIyLmRlZmF1bHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignTm8gYnVpbHRpbiBkcml2ZXIgbWF0Y2hlZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIgPSBkcml2ZXI7XG4gIH1cblxuICBpZiAoZGV2aWNlV2lkdGggJiYgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnNldERldmljZVdpZHRoKSB7XG4gICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnNldERldmljZVdpZHRoKGRldmljZVdpZHRoKTtcbiAgfVxuXG4gIGlmICh2aWV3cG9ydFdpZHRoICYmIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXRWaWV3cG9ydFdpZHRoKSB7XG4gICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnNldFZpZXdwb3J0V2lkdGgodmlld3BvcnRXaWR0aCk7XG4gIH1cblxuICBpZiAoZXZlbnRSZWdpc3RyeSkge1xuICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5ldmVudFJlZ2lzdHJ5ID0gZXZlbnRSZWdpc3RyeTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEVtcHR5IENvbXBvbmVudFxuICovXG52YXIgRW1wdHlDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVtcHR5Q29tcG9uZW50KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbXB0eUNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRW1wdHlDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIHBhcmVudEluc3RhbmNlLCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX3BhcmVudEluc3RhbmNlID0gcGFyZW50SW5zdGFuY2U7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgICBfaW50ZXJuYWw6IHRoaXNcbiAgICAgIH07XG5cbiAgICAgIHZhciBuYXRpdmVOb2RlID0gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgJiYgIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9uYXRpdmVOb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJlbnRJbnN0YW5jZSA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBOb29wXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICAvLyBXZWV4IG5hdGl2ZSBub2RlXG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlRW1wdHkoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZU5vZGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVtcHR5Q29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFbXB0eUNvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiBUZXh0IENvbXBvbmVudFxuICovXG52YXIgVGV4dENvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGV4dENvbXBvbmVudChlbGVtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRDb21wb25lbnQpO1xuXG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX3N0cmluZ1RleHQgPSBTdHJpbmcoZWxlbWVudCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dENvbXBvbmVudCwgW3tcbiAgICBrZXk6ICdtb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdW50Q29tcG9uZW50KHBhcmVudCwgcGFyZW50SW5zdGFuY2UsIGNvbnRleHQsIGNoaWxkTW91bnRlcikge1xuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgdGhpcy5fcGFyZW50SW5zdGFuY2UgPSBwYXJlbnRJbnN0YW5jZTtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcblxuICAgICAgLy8gV2VleCBkb20gb3BlcmF0aW9uXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgICAgX2ludGVybmFsOiB0aGlzXG4gICAgICB9O1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgJiYgIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50SW5zdGFuY2UgPSBudWxsO1xuICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgICB0aGlzLl9zdHJpbmdUZXh0ID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAvLyBJZiBzb21lIHRleHQgZG8gbm90aW5nXG4gICAgICBpZiAocHJldkVsZW1lbnQgIT09IG5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFJlcGxhY2UgY3VycmVudCBlbGVtZW50XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgIC8vIERldnRvb2wgcmVhZCB0aGUgbGF0ZXN0IHN0cmluZ1RleHQgdmFsdWVcbiAgICAgICAgdGhpcy5fc3RyaW5nVGV4dCA9IFN0cmluZyhuZXh0RWxlbWVudCk7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci51cGRhdGVUZXh0KHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCB0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlVGV4dCh0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0Q29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBUZXh0Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9zdGF0ZWxlc3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTtcblxudmFyIF9zdGF0ZWxlc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RhdGVsZXNzKTtcblxudmFyIF91cGRhdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG5cbnZhciBfdXBkYXRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91cGRhdGVyKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX3JlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG52YXIgX3JlZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWYpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9zaGFsbG93RXF1YWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblxudmFyIF9zaGFsbG93RXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hhbGxvd0VxdWFsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gcGVyZm9ybUluU2FuZGJveChmbiwgaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVFcnJvcihpbnN0YW5jZSwgZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKGluc3RhbmNlLCBlcnJvcikge1xuICB2YXIgYm91bmRhcnkgPSB2b2lkIDA7XG5cbiAgd2hpbGUgKGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRhcnkgPSBpbnN0YW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuX2ludGVybmFsICYmIGluc3RhbmNlLl9pbnRlcm5hbC5fcGFyZW50SW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UuX2ludGVybmFsLl9wYXJlbnRJbnN0YW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJvdW5kYXJ5KSB7XG4gICAgYm91bmRhcnkuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IpO1xuICB9IGVsc2Uge1xuICAgIGlmIChfaG9zdDIuZGVmYXVsdC5zYW5kYm94KSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbnZhciBtZWFzdXJlTGlmZUN5Y2xlID0gdm9pZCAwO1xuaWYgKGZhbHNlKSB7XG4gIG1lYXN1cmVMaWZlQ3ljbGUgPSBmdW5jdGlvbiBtZWFzdXJlTGlmZUN5Y2xlKGNhbGxiYWNrLCBpbnN0YW5jZUlELCB0eXBlKSB7XG4gICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYmVmb3JlTGlmZUN5Y2xlKGluc3RhbmNlSUQsIHR5cGUpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJMaWZlQ3ljbGUoaW5zdGFuY2VJRCwgdHlwZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29tcG9zaXRlIENvbXBvbmVudFxuICovXG5cbnZhciBDb21wb3NpdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvc2l0ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2l0ZUNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcG9zaXRlQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ2dldE5hbWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSB8fCBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBwYXJlbnRJbnN0YW5jZSwgY29udGV4dCwgY2hpbGRNb3VudGVyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9wYXJlbnRJbnN0YW5jZSA9IHBhcmVudEluc3RhbmNlO1xuICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB0aGlzLl9tb3VudElEID0gX2hvc3QyLmRlZmF1bHQubW91bnRJRCsrO1xuICAgICAgdGhpcy5fdXBkYXRlQ291bnQgPSAwO1xuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYmVmb3JlTW91bnRDb21wb25lbnQodGhpcy5fbW91bnRJRCwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIHB1YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgICB2YXIgaXNDbGFzcyA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gICAgICB2YXIgaXNDb21wb25lbnRDbGFzcyA9IGlzQ2xhc3MgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc0NvbXBvbmVudENsYXNzO1xuICAgICAgLy8gQ2xhc3Mgc3RhdGVsZXNzIGNvbXBvbmVudCB3aXRob3V0IHN0YXRlIGJ1dCBoYXZlIGxpZmVjeWNsZXNcbiAgICAgIHZhciBpc1N0YXRlbGVzc0NsYXNzID0gaXNDbGFzcyAmJiBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlcjtcblxuICAgICAgLy8gQ29udGV4dCBwcm9jZXNzXG4gICAgICB2YXIgcHVibGljQ29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwdWJsaWMgY2xhc3NcbiAgICAgIHZhciBpbnN0YW5jZSA9IHZvaWQgMDtcbiAgICAgIHZhciByZW5kZXJlZEVsZW1lbnQgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChpc0NvbXBvbmVudENsYXNzIHx8IGlzU3RhdGVsZXNzQ2xhc3MpIHtcbiAgICAgICAgLy8gQ29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIGluc3RhbmNlID0gbmV3IENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgX3VwZGF0ZXIyLmRlZmF1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZ1bmN0aW9uYWwgc3RhdGVsZXNzIGNvbXBvbmVudCB3aXRob3V0IHN0YXRlIGFuZCBsaWZlY3ljbGVzXG4gICAgICAgIGluc3RhbmNlID0gbmV3IF9zdGF0ZWxlc3MyLmRlZmF1bHQoQ29tcG9uZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wb25lbnQgdHlwZTogJyArIENvbXBvbmVudCArICcuIChrZXlzOiAnICsgT2JqZWN0LmtleXMoQ29tcG9uZW50KSArICcpJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3JcbiAgICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgICBpbnN0YW5jZS5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICAgIGluc3RhbmNlLnJlZnMgPSB7fTtcblxuICAgICAgLy8gSW5qZWN0IHRoZSB1cGRhdGVyIGludG8gaW5zdGFuY2VcbiAgICAgIGluc3RhbmNlLnVwZGF0ZXIgPSBfdXBkYXRlcjIuZGVmYXVsdDtcbiAgICAgIGluc3RhbmNlLl9pbnRlcm5hbCA9IHRoaXM7XG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAvLyBJbml0IHN0YXRlLCBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbFxuICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRPRE8gY2xvbmUgdGhlIHN0YXRlP1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciA9IG51bGw7XG4gICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uIGVycm9yQ2FsbGJhY2soZSkge1xuICAgICAgICBlcnJvciA9IGU7XG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgICAgICAgfSwgX3RoaXMuX21vdW50SUQsICdjb21wb25lbnRXaWxsTW91bnQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBpbnN0YW5jZSwgZXJyb3JDYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSB0aGlzO1xuICAgICAgICAvLyBQcm9jZXNzIHBlbmRpbmcgc3RhdGUgd2hlbiBjYWxsIHNldFN0YXRlIGluIGNvbXBvbmVudFdpbGxNb3VudFxuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQpO1xuXG4gICAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudCA9IGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICAgICAgfSwgX3RoaXMuX21vdW50SUQsICdyZW5kZXInKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBpbnN0YW5jZSwgZXJyb3JDYWxsYmFjayk7XG5cbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShyZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQubW91bnRDb21wb25lbnQodGhpcy5fcGFyZW50LCBpbnN0YW5jZSwgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgY2hpbGRNb3VudGVyKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGluc3RhbmNlLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCAmJiB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYpIHtcbiAgICAgICAgX3JlZjIuZGVmYXVsdC5hdHRhY2godGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyLCB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQpIHtcbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9tb3VudElELCAnY29tcG9uZW50RGlkTW91bnQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KHRoaXMpO1xuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJNb3VudENvbXBvbmVudCh0aGlzLl9tb3VudElEKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VubW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KG5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KSB7XG4gICAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgICAgIH0sIGluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIGluc3RhbmNlLl9pbnRlcm5hbCA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCAhPSBudWxsKSB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWY7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICBfcmVmMi5kZWZhdWx0LmRldGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHJlZiwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudC51bm1vdW50Q29tcG9uZW50KG5vdFJlbW92ZUNoaWxkKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudEluc3RhbmNlID0gbnVsbDtcblxuICAgICAgLy8gUmVzZXQgcGVuZGluZyBmaWVsZHNcbiAgICAgIC8vIEV2ZW4gaWYgdGhpcyBjb21wb25lbnQgaXMgc2NoZWR1bGVkIGZvciBhbm90aGVyIHVwZGF0ZSBpbiBSZWFjdFVwZGF0ZXMsXG4gICAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSByZXNldC5cbiAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAvLyBUaGVzZSBmaWVsZHMgZG8gbm90IHJlYWxseSBuZWVkIHRvIGJlIHJlc2V0IHNpbmNlIHRoaXMgb2JqZWN0IGlzIG5vXG4gICAgICAvLyBsb25nZXIgYWNjZXNzaWJsZS5cbiAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29udGFpbiBrZXlzIHNwZWNpZmllZCBpblxuICAgICAqIGBjb250ZXh0VHlwZXNgXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ19wcm9jZXNzQ29udGV4dCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICAgIHZhciBjb250ZXh0VHlwZXMgPSBDb21wb25lbnQuY29udGV4dFR5cGVzO1xuICAgICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIG1hc2tlZENvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIGNvbnRleHROYW1lIGluIGNvbnRleHRUeXBlcykge1xuICAgICAgICBtYXNrZWRDb250ZXh0W2NvbnRleHROYW1lXSA9IGNvbnRleHRbY29udGV4dE5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX3Byb2Nlc3NDaGlsZENvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0NoaWxkQ29udGV4dChjdXJyZW50Q29udGV4dCkge1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICYmIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCgpO1xuICAgICAgaWYgKGNoaWxkQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudENvbnRleHQsIGNoaWxkQ29udGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VycmVudENvbnRleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX3Byb2Nlc3NQZW5kaW5nU3RhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc1BlbmRpbmdTdGF0ZShwcm9wcywgY29udGV4dCkge1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICB2YXIgcXVldWUgPSB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZTtcbiAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnN0YXRlO1xuICAgICAgfVxuICAgICAgLy8gUmVzZXQgcGVuZGluZyBxdWV1ZVxuICAgICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIGluc3RhbmNlLnN0YXRlKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRpYWwgPSBxdWV1ZVtpXTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXh0U3RhdGUsIHR5cGVvZiBwYXJ0aWFsID09PSAnZnVuY3Rpb24nID8gcGFydGlhbC5jYWxsKGluc3RhbmNlLCBuZXh0U3RhdGUsIHByb3BzLCBjb250ZXh0KSA6IHBhcnRpYWwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZVbm1hc2tlZENvbnRleHQsIG5leHRVbm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYmVmb3JlVXBkYXRlQ29tcG9uZW50KHRoaXMuX21vdW50SUQsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwZGF0ZSBjb21wb25lbnQgXFwnJyArIHRoaXMuZ2V0TmFtZSgpICsgJ1xcJyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdW5tb3VudGVkIChvciBmYWlsZWQgdG8gbW91bnQpLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgd2lsbFJlY2VpdmUgPSBmYWxzZTtcbiAgICAgIHZhciBuZXh0Q29udGV4dCA9IHZvaWQgMDtcbiAgICAgIHZhciBuZXh0UHJvcHMgPSB2b2lkIDA7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgY29udGV4dCBoYXMgY2hhbmdlZCBvciBub3RcbiAgICAgIGlmICh0aGlzLl9jb250ZXh0ID09PSBuZXh0VW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICAgIG5leHRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRDb250ZXh0ID0gdGhpcy5fcHJvY2Vzc0NvbnRleHQobmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgICAgIHdpbGxSZWNlaXZlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRGlzdGluZ3Vpc2ggYmV0d2VlbiBhIHByb3BzIHVwZGF0ZSB2ZXJzdXMgYSBzaW1wbGUgc3RhdGUgdXBkYXRlXG4gICAgICBpZiAocHJldkVsZW1lbnQgPT09IG5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFNraXAgY2hlY2tpbmcgcHJvcCB0eXBlcyBhZ2FpbiAtLSB3ZSBkb24ndCByZWFkIGNvbXBvbmVudC5wcm9wcyB0byBhdm9pZFxuICAgICAgICAvLyB3YXJuaW5nIGZvciBET00gY29tcG9uZW50IHByb3BzIGluIHRoaXMgdXBncmFkZVxuICAgICAgICBuZXh0UHJvcHMgPSBuZXh0RWxlbWVudC5wcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRQcm9wcyA9IG5leHRFbGVtZW50LnByb3BzO1xuICAgICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBoYXNSZWNlaXZlZCA9IHdpbGxSZWNlaXZlICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM7XG5cbiAgICAgIGlmIChoYXNSZWNlaXZlZCkge1xuICAgICAgICAvLyBDYWxsaW5nIHRoaXMuc2V0U3RhdGUoKSB3aXRoaW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB3aWxsIG5vdCB0cmlnZ2VyIGFuIGFkZGl0aW9uYWwgcmVuZGVyLlxuICAgICAgICB0aGlzLl9wZW5kaW5nU3RhdGUgPSB0cnVlO1xuICAgICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgICB9LCBpbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgX3JlZjIuZGVmYXVsdC51cGRhdGUocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCB0aGlzKTtcblxuICAgICAgLy8gU2hvdWQgdXBkYXRlIGFsd2F5cyBkZWZhdWx0XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIHZhciBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgICAgIC8vIFRPRE86IGNvdWxkIGRlbGF5IGV4ZWN1dGlvbiBwcm9jZXNzUGVuZGluZ1N0YXRlXG4gICAgICB2YXIgbmV4dFN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcblxuICAgICAgLy8gU2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIG5vdCBjYWxsZWQgd2hlbiBmb3JjZVVwZGF0ZSBpcyB1c2VkXG4gICAgICBpZiAoIXRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgICBpZiAoaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgICAgfSwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmlzUHVyZUNvbXBvbmVudENsYXNzKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gISgwLCBfc2hhbGxvd0VxdWFsMi5kZWZhdWx0KShwcmV2UHJvcHMsIG5leHRQcm9wcykgfHwgISgwLCBfc2hhbGxvd0VxdWFsMi5kZWZhdWx0KShwcmV2U3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgLy8gV2lsbCBzZXQgYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgLlxuICAgICAgICB2YXIgcHJldkNvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuXG4gICAgICAgIC8vIENhbm5vdCB1c2UgdGhpcy5zZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxVcGRhdGUuXG4gICAgICAgIC8vIElmIG5lZWQgdG8gdXBkYXRlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGEgcHJvcCBjaGFuZ2UsIHVzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluc3RlYWQuXG4gICAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBpbnN0YW5jZSk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIG5leHRcbiAgICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IG5leHRVbm1hc2tlZENvbnRleHQ7XG4gICAgICAgIGluc3RhbmNlLnByb3BzID0gbmV4dFByb3BzO1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICAgICAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KG5leHRVbm1hc2tlZENvbnRleHQpO1xuXG4gICAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgcHJldkNvbnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgaW5zdGFuY2UpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCdzIGRldGVybWluZWQgdGhhdCBhIGNvbXBvbmVudCBzaG91bGQgbm90IHVwZGF0ZSwgd2Ugc3RpbGwgd2FudFxuICAgICAgICAvLyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLlxuICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV4dFVubWFza2VkQ29udGV4dDtcbiAgICAgICAgaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEZsdXNoIHNldFN0YXRlIGNhbGxiYWNrcyBzZXQgaW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1xuICAgICAgaWYgKGhhc1JlY2VpdmVkKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICAgICAgX3VwZGF0ZXIyLmRlZmF1bHQucnVuQ2FsbGJhY2tzKGNhbGxiYWNrcywgaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJVcGRhdGVDb21wb25lbnQodGhpcy5fbW91bnRJRCk7XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3JkaW5nbHkuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ191cGRhdGVSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudChjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHByZXZSZW5kZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgICAgdmFyIHByZXZSZW5kZXJlZEVsZW1lbnQgPSBwcmV2UmVuZGVyZWRDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgIHZhciBuZXh0UmVuZGVyZWRFbGVtZW50ID0gdm9pZCAwO1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSB0aGlzO1xuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXh0UmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfSwgX3RoaXMyLl9tb3VudElELCAncmVuZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFJlbmRlcmVkRWxlbWVudCA9IGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LCBpbnN0YW5jZSk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudCA9IG51bGw7XG5cbiAgICAgIGlmICgoMCwgX3Nob3VsZFVwZGF0ZUNvbXBvbmVudDIuZGVmYXVsdCkocHJldlJlbmRlcmVkRWxlbWVudCwgbmV4dFJlbmRlcmVkRWxlbWVudCkpIHtcbiAgICAgICAgcHJldlJlbmRlcmVkQ29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudChwcmV2UmVuZGVyZWRFbGVtZW50LCBuZXh0UmVuZGVyZWRFbGVtZW50LCBwcmV2UmVuZGVyZWRDb21wb25lbnQuX2NvbnRleHQsIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCkpO1xuICAgICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5yZWNvcmRPcGVyYXRpb24oe1xuICAgICAgICAgICAgaW5zdGFuY2VJRDogdGhpcy5fbW91bnRJRCxcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGUgY29tcG9uZW50JyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHt9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvbGRDaGlsZCA9IHByZXZSZW5kZXJlZENvbXBvbmVudC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICAgIHByZXZSZW5kZXJlZENvbXBvbmVudC51bm1vdW50Q29tcG9uZW50KHRydWUpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkobmV4dFJlbmRlcmVkRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50Lm1vdW50Q29tcG9uZW50KHRoaXMuX3BhcmVudCwgaW5zdGFuY2UsIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGZ1bmN0aW9uIChuZXdDaGlsZCwgcGFyZW50KSB7XG4gICAgICAgICAgLy8gVE9ETzogRHVwbGljYXRlIGNvZGUgaW4gbmF0aXZlIGNvbXBvbmVudCBmaWxlXG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgbmV3Q2hpbGQgPSBbbmV3Q2hpbGRdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9sZENoaWxkIG9yIG5ld0NoaWxkIGFsbCBtYXliZSBmcmFnbWVudFxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvbGRDaGlsZCkpIHtcbiAgICAgICAgICAgIG9sZENoaWxkID0gW29sZENoaWxkXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZXdDaGlsZCBjb3VudCBsYXJnZSB0aGVuIG9sZENoaWxkXG4gICAgICAgICAgdmFyIGxhc3ROZXdDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZFtpXTtcbiAgICAgICAgICAgIGlmIChvbGRDaGlsZFtpXSkge1xuICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVwbGFjZUNoaWxkKGNoaWxkLCBvbGRDaGlsZFtpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuaW5zZXJ0QWZ0ZXIoY2hpbGQsIGxhc3ROZXdDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TmV3Q2hpbGQgPSBjaGlsZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZXdDaGlsZCBjb3VudCBsZXNzIHRoZW4gb2xkQ2hpbGRcbiAgICAgICAgICBpZiAobmV3Q2hpbGQubGVuZ3RoIDwgb2xkQ2hpbGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IG5ld0NoaWxkLmxlbmd0aDsgX2kgPCBvbGRDaGlsZC5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKG9sZENoaWxkW19pXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYXRpdmVOb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmF0aXZlTm9kZSgpIHtcbiAgICAgIHZhciByZW5kZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgICAgaWYgKHJlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiByZW5kZXJlZENvbXBvbmVudC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0UHVibGljSW5zdGFuY2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZSgpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgLy8gVGhlIFN0YXRlbGVzcyBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzXG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBfc3RhdGVsZXNzMi5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb21wb3NpdGVDb21wb25lbnQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IENvbXBvc2l0ZUNvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiBTdGF0ZWxlc3MgQ29tcG9uZW50IENsYXNzIFdyYXBwZXJcbiAqL1xudmFyIFN0YXRlbGVzc0NvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RhdGVsZXNzQ29tcG9uZW50KHB1cmVSZW5kZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RhdGVsZXNzQ29tcG9uZW50KTtcblxuICAgIC8vIEEgc3RhdGVsZXNzIGZ1bmN0aW9uXG4gICAgdGhpcy5wdXJlUmVuZGVyID0gcHVyZVJlbmRlcjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTdGF0ZWxlc3NDb21wb25lbnQsIFt7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZVJlbmRlcigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wdXJlUmVuZGVyKHRoaXMucHJvcHMsIHRoaXMuY29udGV4dCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXRlbGVzc0NvbXBvbmVudDtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gU3RhdGVsZXNzQ29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIGVucXVldWVDYWxsYmFjayhpbnRlcm5hbCwgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdmFyIGNhbGxiYWNrUXVldWUgPSBpbnRlcm5hbC5fcGVuZGluZ0NhbGxiYWNrcyB8fCAoaW50ZXJuYWwuX3BlbmRpbmdDYWxsYmFja3MgPSBbXSk7XG4gICAgY2FsbGJhY2tRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGUoaW50ZXJuYWwsIHBhcnRpYWxTdGF0ZSkge1xuICBpZiAocGFydGlhbFN0YXRlKSB7XG4gICAgdmFyIHN0YXRlUXVldWUgPSBpbnRlcm5hbC5fcGVuZGluZ1N0YXRlUXVldWUgfHwgKGludGVybmFsLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtdKTtcbiAgICBzdGF0ZVF1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTtcbiAgfVxufVxuXG52YXIgVXBkYXRlciA9IHtcbiAgc2V0U3RhdGU6IGZ1bmN0aW9uIHNldFN0YXRlKGNvbXBvbmVudCwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAgIHZhciBpbnRlcm5hbCA9IGNvbXBvbmVudC5faW50ZXJuYWw7XG5cbiAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZW5xdWV1ZVN0YXRlKGludGVybmFsLCBwYXJ0aWFsU3RhdGUpO1xuICAgIGVucXVldWVDYWxsYmFjayhpbnRlcm5hbCwgY2FsbGJhY2spO1xuXG4gICAgLy8gcGVuZGluZyBpbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGFuZCBjb21wb25lbnRXaWxsTW91bnRcbiAgICBpZiAoIWludGVybmFsLl9wZW5kaW5nU3RhdGUgJiYgaW50ZXJuYWwuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLnJ1blVwZGF0ZShjb21wb25lbnQpO1xuICAgIH1cbiAgfSxcblxuICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoY29tcG9uZW50LCBjYWxsYmFjaykge1xuICAgIHZhciBpbnRlcm5hbCA9IGNvbXBvbmVudC5faW50ZXJuYWw7XG5cbiAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW50ZXJuYWwuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IHRydWU7XG5cbiAgICBlbnF1ZXVlQ2FsbGJhY2soaW50ZXJuYWwsIGNhbGxiYWNrKTtcbiAgICAvLyBwZW5kaW5nIGluIGNvbXBvbmVudFdpbGxNb3VudFxuICAgIGlmIChpbnRlcm5hbC5fcmVuZGVyZWRDb21wb25lbnQpIHtcbiAgICAgIHRoaXMucnVuVXBkYXRlKGNvbXBvbmVudCk7XG4gICAgfVxuICB9LFxuXG4gIHJ1blVwZGF0ZTogZnVuY3Rpb24gcnVuVXBkYXRlKGNvbXBvbmVudCkge1xuICAgIHZhciBpbnRlcm5hbCA9IGNvbXBvbmVudC5faW50ZXJuYWw7XG5cbiAgICAvLyBJZiB1cGRhdGVDb21wb25lbnQgaGFwcGVucyB0byBlbnF1ZXVlIGFueSBuZXcgdXBkYXRlcywgd2VcbiAgICAvLyBzaG91bGRuJ3QgZXhlY3V0ZSB0aGUgY2FsbGJhY2tzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBoYXBwZW5zLCBzb1xuICAgIC8vIHN0YXNoIHRoZSBjYWxsYmFja3MgZmlyc3RcbiAgICB2YXIgY2FsbGJhY2tzID0gaW50ZXJuYWwuX3BlbmRpbmdDYWxsYmFja3M7XG4gICAgaW50ZXJuYWwuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuXG4gICAgdmFyIHByZXZFbGVtZW50ID0gaW50ZXJuYWwuX2N1cnJlbnRFbGVtZW50O1xuICAgIHZhciBwcmV2VW5tYXNrZWRDb250ZXh0ID0gaW50ZXJuYWwuX2NvbnRleHQ7XG5cbiAgICBpZiAoaW50ZXJuYWwuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IGludGVybmFsLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHtcbiAgICAgIGludGVybmFsLnVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgcHJldkVsZW1lbnQsIHByZXZVbm1hc2tlZENvbnRleHQsIHByZXZVbm1hc2tlZENvbnRleHQpO1xuICAgIH1cblxuICAgIHRoaXMucnVuQ2FsbGJhY2tzKGNhbGxiYWNrcywgY29tcG9uZW50KTtcbiAgfSxcblxuICBydW5DYWxsYmFja3M6IGZ1bmN0aW9uIHJ1bkNhbGxiYWNrcyhjYWxsYmFja3MsIGNvbnRleHQpIHtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFVwZGF0ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDI4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoKHR5cGVvZiBvYmpBID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmpBKSkgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgKHR5cGVvZiBvYmpCID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmpCKSkgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gc2hhbGxvd0VxdWFsO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX25hdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG52YXIgX25hdGl2ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9uYXRpdmUpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbnZhciBfaW5zdGFudGlhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbnRpYXRlQ29tcG9uZW50KTtcblxudmFyIF9nZXRFbGVtZW50S2V5TmFtZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEVsZW1lbnRLZXlOYW1lKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKipcbiAqIEZyYWdtZW50IENvbXBvbmVudFxuICovXG52YXIgRnJhZ21lbnRDb21wb25lbnQgPSBmdW5jdGlvbiAoX05hdGl2ZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRnJhZ21lbnRDb21wb25lbnQsIF9OYXRpdmVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZyYWdtZW50Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJhZ21lbnRDb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGcmFnbWVudENvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZyYWdtZW50Q29tcG9uZW50KSkuY2FsbCh0aGlzLCBlbGVtZW50KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRnJhZ21lbnRDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIHBhcmVudEluc3RhbmNlLCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIC8vIFBhcmVudCBuYXRpdmUgZWxlbWVudFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgdGhpcy5fcGFyZW50SW5zdGFuY2UgPSBwYXJlbnRJbnN0YW5jZTtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcblxuICAgICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgICBfaW50ZXJuYWw6IHRoaXNcbiAgICAgIH07XG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgICB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgIGNoaWxkTW91bnRlcihmcmFnbWVudCwgcGFyZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpc0ZyYWdtZW50UGFyZW50ID0gQXJyYXkuaXNBcnJheShwYXJlbnQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYWdtZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gZnJhZ21lbnRbaV07XG4gICAgICAgICAgLy8gV2hlbiB0aGUgcGFyZW50IGlzIGFsc28gYSBmcmFnbWVudFxuICAgICAgICAgIGlmIChpc0ZyYWdtZW50UGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQucHVzaChjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChjaGlsZCwgcGFyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0ge307XG4gICAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLmdldE5hdGl2ZU5vZGUoKTtcblxuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW5JbWFnZSA9IGNoaWxkcmVuLm1hcChmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHJlbmRlcmVkQ2hpbGQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShlbGVtZW50KTtcbiAgICAgICAgdmFyIG5hbWUgPSAoMCwgX2dldEVsZW1lbnRLZXlOYW1lMi5kZWZhdWx0KShyZW5kZXJlZENoaWxkcmVuLCBlbGVtZW50LCBpbmRleCk7XG4gICAgICAgIHJlbmRlcmVkQ2hpbGRyZW5bbmFtZV0gPSByZW5kZXJlZENoaWxkO1xuICAgICAgICByZW5kZXJlZENoaWxkLl9tb3VudEluZGV4ID0gaW5kZXg7XG4gICAgICAgIC8vIE1vdW50XG4gICAgICAgIHZhciBtb3VudEltYWdlID0gcmVuZGVyZWRDaGlsZC5tb3VudENvbXBvbmVudChfdGhpczIuX3BhcmVudCwgX3RoaXMyLl9pbnN0YW5jZSwgY29udGV4dCwgZnVuY3Rpb24gKG5hdGl2ZU5vZGUpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuYXRpdmVOb2RlKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYXRpdmVOb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGZyYWdtZW50LnB1c2gobmF0aXZlTm9kZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyYWdtZW50LnB1c2gobmF0aXZlTm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1hZ2U7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW5JbWFnZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUpIHtcbiAgICAgICAgX2luc3RhbmNlMi5kZWZhdWx0LnJlbW92ZSh0aGlzLl9uYXRpdmVOb2RlKTtcbiAgICAgICAgaWYgKCFub3RSZW1vdmVDaGlsZCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbmF0aXZlTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKHRoaXMuX25hdGl2ZU5vZGVbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgbmVlZCByZW1vdmUgY2hpbGQgd2hlbiB0aGVpciBwYXJlbnQgaXMgcmVtb3ZlZFxuICAgICAgdGhpcy51bm1vdW50Q2hpbGRyZW4odHJ1ZSk7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudEluc3RhbmNlID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCkge1xuICAgICAgLy8gUmVwbGFjZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKHRoaXMuX2N1cnJlbnRFbGVtZW50LCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZU5vZGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0UHVibGljSW5zdGFuY2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hdGl2ZU5vZGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYW1lJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmFtZSgpIHtcbiAgICAgIHJldHVybiAnZnJhZ21lbnQnO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGcmFnbWVudENvbXBvbmVudDtcbn0oX25hdGl2ZTIuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEZyYWdtZW50Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YyID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZjIob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59OyAvKipcbiAgICAqIFdlZXggZHJpdmVyXG4gICAgKi9cblxudmFyIF9zdHlsZVVuaXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxudmFyIF9lbGVtZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xuXG52YXIgX2VsZW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07XG59XG5cbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSUQgPSAnaWQnO1xudmFyIFRFWFQgPSAndGV4dCc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIEVWRU5UX1BSRUZJWF9SRUdFWFAgPSAvXm9uW0EtWl0vO1xudmFyIEFSSUFfUFJFRklYX1JFR0VYUCA9IC9eYXJpYS0vO1xuXG52YXIgbm9kZU1hcHMgPSB7fTtcbi8qIGdsb2JhbCBfX3dlZXhfZG9jdW1lbnRfXyAqL1xudmFyIGRvY3VtZW50ID0gKHR5cGVvZiBfX3dlZXhfZG9jdW1lbnRfXyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoX193ZWV4X2RvY3VtZW50X18pKSA9PT0gJ29iamVjdCcgPyBfX3dlZXhfZG9jdW1lbnRfXyA6ICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICdvYmplY3QnID8gZG9jdW1lbnQgOiBudWxsO1xuXG52YXIgRHJpdmVyID0ge1xuICBkZXZpY2VXaWR0aDogNzUwLFxuICB2aWV3cG9ydFdpZHRoOiA3NTAsXG5cbiAgZ2V0RGV2aWNlV2lkdGg6IGZ1bmN0aW9uIGdldERldmljZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmRldmljZVdpZHRoO1xuICB9LFxuICBzZXREZXZpY2VXaWR0aDogZnVuY3Rpb24gc2V0RGV2aWNlV2lkdGgod2lkdGgpIHtcbiAgICB0aGlzLmRldmljZVdpZHRoID0gd2lkdGg7XG4gIH0sXG4gIGdldFZpZXdwb3J0V2lkdGg6IGZ1bmN0aW9uIGdldFZpZXdwb3J0V2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnRXaWR0aDtcbiAgfSxcbiAgc2V0Vmlld3BvcnRXaWR0aDogZnVuY3Rpb24gc2V0Vmlld3BvcnRXaWR0aCh3aWR0aCkge1xuICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IHdpZHRoO1xuICB9LFxuICBnZXRFbGVtZW50QnlJZDogZnVuY3Rpb24gZ2V0RWxlbWVudEJ5SWQoaWQpIHtcbiAgICByZXR1cm4gbm9kZU1hcHNbaWRdO1xuICB9LFxuICBjcmVhdGVCb2R5OiBmdW5jdGlvbiBjcmVhdGVCb2R5KCkge1xuICAgIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHZhciBib2R5ID0gZG9jdW1lbnQuY3JlYXRlQm9keSgpO1xuICAgIGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChib2R5KTtcblxuICAgIHJldHVybiBib2R5O1xuICB9LFxuICBjcmVhdGVDb21tZW50OiBmdW5jdGlvbiBjcmVhdGVDb21tZW50KGNvbnRlbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChjb250ZW50KTtcbiAgfSxcbiAgY3JlYXRlRW1wdHk6IGZ1bmN0aW9uIGNyZWF0ZUVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbW1lbnQoJyBlbXB0eSAnKTtcbiAgfSxcbiAgY3JlYXRlVGV4dDogZnVuY3Rpb24gY3JlYXRlVGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIERyaXZlci5jcmVhdGVFbGVtZW50KHtcbiAgICAgIHR5cGU6IFRFWFQsXG4gICAgICBwcm9wczoge1xuICAgICAgICB2YWx1ZTogdGV4dFxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICB1cGRhdGVUZXh0OiBmdW5jdGlvbiB1cGRhdGVUZXh0KG5vZGUsIGNvbnRlbnQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShub2RlLCAndmFsdWUnLCBjb250ZW50KTtcbiAgfSxcbiAgY3JlYXRlRWxlbWVudDogZnVuY3Rpb24gY3JlYXRlRWxlbWVudChjb21wb25lbnQpIHtcbiAgICB2YXIgaHRtbEVsZW1lbnQgPSBfZWxlbWVudHMyLmRlZmF1bHRbY29tcG9uZW50LnR5cGVdO1xuICAgIGlmIChodG1sRWxlbWVudCkge1xuICAgICAgY29tcG9uZW50ID0gaHRtbEVsZW1lbnQucGFyc2UoY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG4gICAgdmFyIGV2ZW50cyA9IFtdO1xuICAgIHZhciBzdHlsZSA9IHt9O1xuICAgIHZhciBvcmlnaW5TdHlsZSA9IHByb3BzW1NUWUxFXTtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9yaWdpblN0eWxlKSB7XG4gICAgICBzdHlsZVtwcm9wXSA9ICgwLCBfc3R5bGVVbml0LmNvbnZlcnRVbml0KShvcmlnaW5TdHlsZVtwcm9wXSwgcHJvcCk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50eXBlLCB7XG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TmF0aXZlUHJvcHMobm9kZSwgcHJvcHMsIHRydWUpO1xuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICB9LFxuICByZW1vdmVDaGlsZDogZnVuY3Rpb24gcmVtb3ZlQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICB2YXIgaWQgPSBub2RlLmF0dHIgJiYgbm9kZS5hdHRyW0lEXTtcbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgbm9kZU1hcHNbaWRdID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVwbGFjZUNoaWxkOiBmdW5jdGlvbiByZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQgfHwgb2xkQ2hpbGQucGFyZW50Tm9kZTtcbiAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nO1xuICAgIHZhciBuZXh0U2libGluZyA9IG9sZENoaWxkLm5leHRTaWJsaW5nO1xuICAgIHRoaXMucmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIHBhcmVudCk7XG5cbiAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICB0aGlzLmluc2VydEFmdGVyKG5ld0NoaWxkLCBwcmV2aW91c1NpYmxpbmcsIHBhcmVudCk7XG4gICAgfSBlbHNlIGlmIChuZXh0U2libGluZykge1xuICAgICAgdGhpcy5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG5leHRTaWJsaW5nLCBwYXJlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKG5ld0NoaWxkLCBwYXJlbnQpO1xuICAgIH1cbiAgfSxcbiAgaW5zZXJ0QWZ0ZXI6IGZ1bmN0aW9uIGluc2VydEFmdGVyKG5vZGUsIGFmdGVyLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQgfHwgYWZ0ZXIucGFyZW50Tm9kZTtcbiAgICByZXR1cm4gcGFyZW50Lmluc2VydEFmdGVyKG5vZGUsIGFmdGVyKTtcbiAgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbiBpbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQgfHwgYmVmb3JlLnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlKTtcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlciwgcHJvcHMpIHtcbiAgICB2YXIgcGFyYW1zID0gcHJvcHNbZXZlbnROYW1lICsgJ0V2ZW50UGFyYW1zJ107XG4gICAgcmV0dXJuIG5vZGUuYWRkRXZlbnQoZXZlbnROYW1lLCBldmVudEhhbmRsZXIsIHBhcmFtcyk7XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gbm9kZS5yZW1vdmVFdmVudChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxFdmVudExpc3RlbmVycyhub2RlKSB7XG4gICAgLy8gTm9vcFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG51bGw7XG4gICAgfVxuICAgIC8vIFdlZXggbmF0aXZlIHdpbGwgY3Jhc2ggd2hlbiBwYXNzIG51bGwgdmFsdWVcbiAgICByZXR1cm4gbm9kZS5zZXRBdHRyKHByb3BLZXksIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9LFxuICBzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG5vZGU7XG4gICAgfVxuXG4gICAgLy8gV2VleCBvbmx5IHN1cHBvcnQgYGFyaWFMYWJlbGAgZm9ybWF0LCBjb252ZXJ0IGBhcmlhLWxhYmVsYCBmb3JtYXQgdG8gY2FtZWxjYXNlXG4gICAgaWYgKEFSSUFfUFJFRklYX1JFR0VYUC50ZXN0KHByb3BLZXkpKSB7XG4gICAgICBwcm9wS2V5ID0gcHJvcEtleS5yZXBsYWNlKC9cXC0oXFx3KS8sIGZ1bmN0aW9uIChtLCBwMSkge1xuICAgICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLnNldEF0dHIocHJvcEtleSwgcHJvcFZhbHVlLCBmYWxzZSk7XG4gIH0sXG4gIHNldFN0eWxlczogZnVuY3Rpb24gc2V0U3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICAgIC8vIFRPRE8gaWYgbW9yZSB0aGVuIG9uZSBzdHlsZSB1cGRhdGUsIGNhbGwgc2V0U3R5bGVzIHdpbGwgYmUgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgICAgdmFyIHZhbCA9IHN0eWxlc1trZXldO1xuICAgICAgdmFsID0gKDAsIF9zdHlsZVVuaXQuY29udmVydFVuaXQpKHZhbCwga2V5KTtcbiAgICAgIG5vZGUuc2V0U3R5bGUoa2V5LCB2YWwpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzXG4gICAgZG9jdW1lbnQub3BlbigpO1xuXG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXREZXZpY2VXaWR0aCgpIC8gdGhpcy5nZXRWaWV3cG9ydFdpZHRoKCkpO1xuICB9LFxuICBhZnRlclJlbmRlcjogZnVuY3Rpb24gYWZ0ZXJSZW5kZXIoKSB7XG4gICAgaWYgKGRvY3VtZW50Lmxpc3RlbmVyICYmIGRvY3VtZW50Lmxpc3RlbmVyLmNyZWF0ZUZpbmlzaCkge1xuICAgICAgZG9jdW1lbnQubGlzdGVuZXIuY3JlYXRlRmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gVHVybiBvbiBiYXRjaGVkIHVwZGF0ZXNcbiAgICBkb2N1bWVudC5jbG9zZSgpO1xuICB9LFxuICBzZXROYXRpdmVQcm9wczogZnVuY3Rpb24gc2V0TmF0aXZlUHJvcHMobm9kZSwgcHJvcHMsIHNraXBTZXRTdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSBDSElMRFJFTikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFNUWUxFKSB7XG4gICAgICAgICAgaWYgKHNraXBTZXRTdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0eWxlcyhub2RlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoRVZFTlRfUFJFRklYX1JFR0VYUC50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCB2YWx1ZSwgcHJvcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJpdmVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKTtcblxudmFyIF9pbWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW1nKTtcblxudmFyIF92aWRlbyA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpO1xuXG52YXIgX3ZpZGVvMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZpZGVvKTtcblxudmFyIF90ZXh0YXJlYSA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXG52YXIgX3RleHRhcmVhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RleHRhcmVhKTtcblxudmFyIF9zcGFuID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSk7XG5cbnZhciBfc3BhbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcGFuKTtcblxudmFyIF9wID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cbnZhciBfcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wKTtcblxudmFyIF9idXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3KTtcblxudmFyIF9idXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYnV0dG9uKTtcblxudmFyIF9oZWFkaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOCk7XG5cbnZhciBfaGVhZGluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWFkaW5nKTtcblxudmFyIF9ibG9jayA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpO1xuXG52YXIgX2Jsb2NrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jsb2NrKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgc3BhbjogX3NwYW4yLmRlZmF1bHQsXG4gIHA6IF9wMi5kZWZhdWx0LFxuICBpbWc6IF9pbWcyLmRlZmF1bHQsXG4gIGJ1dHRvbjogX2J1dHRvbjIuZGVmYXVsdCxcbiAgdmlkZW86IF92aWRlbzIuZGVmYXVsdCxcbiAgdGV4dGFyZWE6IF90ZXh0YXJlYTIuZGVmYXVsdCxcbiAgaDE6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBoMjogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGgzOiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgaDQ6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBoNTogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGg2OiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgbmF2OiBfYmxvY2syLmRlZmF1bHQsXG4gIGFydGljbGU6IF9ibG9jazIuZGVmYXVsdCxcbiAgc2VjdGlvbjogX2Jsb2NrMi5kZWZhdWx0LFxuICAvLyBDb25mbGljdCB3aXRoIHdlZXggaGVhZGVyIHRhZ1xuICAvLyBoZWFkZXI6IGJsb2NrLFxuICBmb290ZXI6IF9ibG9jazIuZGVmYXVsdCxcbiAgYXNpZGU6IF9ibG9jazIuZGVmYXVsdCxcbiAgbWFpbjogX2Jsb2NrMi5kZWZhdWx0XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9wYXJzZVByb3BzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcblxuICAvKipcbiAgICogcGFyc2UgdzNjIGF0dHJzIHRvIHdlZXggbW9kdWxlIGF0dHJzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3M2MgY29tcG9uZW50IGRhdGFcbiAgICogQHJldHVybiB7T2JqZWN0fSB3ZWV4IGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgdmFyIHByb3BzID0gY29tcG9uZW50LnByb3BzO1xuXG4gICAgY29tcG9uZW50LnR5cGUgPSAnaW1hZ2UnO1xuXG4gICAgLy8gbW9kaWZ5IHByb3BzXG4gICAgY29tcG9uZW50LnByb3BzID0gKDAsIF9wYXJzZVByb3BzLnRyYW5zZm9ybVByb3BzQXR0cnNUb1N0eWxlKShwcm9wcywgWyd3aWR0aCcsICdoZWlnaHQnXSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9wYXJzZVByb3BzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcblxuICAvKipcbiAgICogcGFyc2UgdzNjIGF0dHJzIHRvIHdlZXggbW9kdWxlIGF0dHJzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3M2MgY29tcG9uZW50IGRhdGFcbiAgICogQHJldHVybiB7T2JqZWN0fSB3ZWV4IGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgdmFyIHByb3BzID0gY29tcG9uZW50LnByb3BzO1xuXG4gICAgLy8gbW9kaWZ5IHByb3BzXG5cbiAgICBjb21wb25lbnQucHJvcHMgPSAoMCwgX3BhcnNlUHJvcHMudHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUpKHByb3BzLCBbJ3dpZHRoJywgJ2hlaWdodCddKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBwYXJzZSB3M2MgYXR0cnMgdG8gd2VleCBtb2R1bGUgYXR0cnNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHczYyBjb21wb25lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHdlZXggY29tcG9uZW50IGRhdGFcbiAgICovXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyAmJiAhcHJvcHMudmFsdWUpIHtcbiAgICAgIHByb3BzLnZhbHVlID0gcHJvcHMuY2hpbGRyZW47XG4gICAgICBwcm9wcy5jaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICd0ZXh0JztcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnICYmICFwcm9wcy52YWx1ZSkge1xuICAgICAgcHJvcHMudmFsdWUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YyID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZjIob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO2ZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9cmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBCQVNFX0ZPTlRfU0laRSA9IDI4O1xuXG52YXIgZGVmYXVsdFBhcmFncmFwaFN0eWxlID0ge1xuICBmb250U2l6ZTogQkFTRV9GT05UX1NJWkUsXG4gIG1hcmdpblRvcDogQkFTRV9GT05UX1NJWkUsXG4gIG1hcmdpbkJvdHRvbTogQkFTRV9GT05UX1NJWkVcbn07XG5cbnZhciBUeXBvZ3JhcGh5RWxlbWVudHMgPSB7XG4gIHU6IHtcbiAgICB0ZXh0RGVjb3JhdGlvbjogJ3VuZGVybGluZSdcbiAgfSxcbiAgczoge1xuICAgIHRleHREZWNvcmF0aW9uOiAnbGluZS10aHJvdWdoJ1xuICB9LFxuICBpOiB7XG4gICAgZm9udFN0eWxlOiAnaXRhbGljJ1xuICB9LFxuICBiOiB7XG4gICAgZm9udFdlaWdodDogJ2JvbGQnXG4gIH0sXG4gIGRlbDoge1xuICAgIHRleHREZWNvcmF0aW9uOiAnbGluZS10aHJvdWdoJ1xuICB9LFxuICBlbToge1xuICAgIGZvbnRTdHlsZTogJ2l0YWxpYydcbiAgfSxcbiAgc3Ryb25nOiB7XG4gICAgZm9udFdlaWdodDogJ2JvbGQnXG4gIH0sXG4gIGJpZzoge1xuICAgIGZvbnRTaXplOiBCQVNFX0ZPTlRfU0laRSAqIDEuMlxuICB9LFxuICBzbWFsbDoge1xuICAgIGZvbnRTaXplOiBCQVNFX0ZPTlRfU0laRSAqIDAuOFxuICB9XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TdHJpbmcoc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3NwYW4nLFxuICAgIGF0dHI6IHtcbiAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybUNoaWxkKGNoaWxkKSB7XG4gIHZhciB0eXBlID0gY2hpbGQudHlwZTtcbiAgdmFyIHByb3BzID0gY2hpbGQucHJvcHM7XG4gIHZhciBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICB2YXIgbmVzdGVkQ2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgLy8gQWxpYXMgaW1nIHRhZ1xuICBpZiAodHlwZSA9PT0gJ2ltZycpIHtcbiAgICB0eXBlID0gJ2ltYWdlJztcbiAgfVxuXG4gIC8vIFRyYW5zZnJvbSB0byBzcGFuXG4gIGlmIChUeXBvZ3JhcGh5RWxlbWVudHNbdHlwZV0pIHtcbiAgICBzdHlsZSA9IF9leHRlbmRzKHt9LCBUeXBvZ3JhcGh5RWxlbWVudHNbdHlwZV0sIHN0eWxlKTtcbiAgICB0eXBlID0gJ3NwYW4nO1xuICB9XG5cbiAgcHJvcHMuc3R5bGUgPSBudWxsO1xuICBwcm9wcy5jaGlsZHJlbiA9IG51bGw7XG5cbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgYXR0cjogcHJvcHMgfHwge31cbiAgfTtcblxuICBpZiAobmVzdGVkQ2hpbGRyZW4pIHtcbiAgICBpZiAodHlwZSA9PT0gJ3NwYW4nICYmIHR5cGVvZiBuZXN0ZWRDaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVsZW1lbnQuYXR0ci52YWx1ZSA9IG5lc3RlZENoaWxkcmVuO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LmNoaWxkcmVuID0gdHJhbnNmb3JtQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1DaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgZWxlbWVudHMucHVzaCh0cmFuc2Zvcm1TdHJpbmcoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKCh0eXBlb2YgY2hpbGQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNoaWxkKSkgPT09ICdvYmplY3QnKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKHRyYW5zZm9ybUNoaWxkKGNoaWxkKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgIGNvbXBvbmVudC50eXBlID0gJ3JpY2h0ZXh0JztcblxuICAgIHByb3BzLnN0eWxlID0gX2V4dGVuZHMoe30sIGRlZmF1bHRQYXJhZ3JhcGhTdHlsZSwgcHJvcHMuc3R5bGUpO1xuXG4gICAgcHJvcHMudmFsdWUgPSB0cmFuc2Zvcm1DaGlsZHJlbihjaGlsZHJlbik7O1xuICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO2ZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9cmV0dXJuIHRhcmdldDtcbn07XG5cbi8qKlxuICogd2VleCBidXR0b25cbiAqXG4gKiBwcm9wczogZGlzYWJsZWQsIHN0eWxlXG4gKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgdmFyIHByb3BzID0gY29tcG9uZW50LnByb3BzO1xuXG4gICAgY29tcG9uZW50LnR5cGUgPSAndGV4dCc7XG5cbiAgICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgIHZhciB0ZXh0U3R5bGUgPSBfZXh0ZW5kcyh7XG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgZm9udFNpemU6IDIyLFxuICAgICAgcGFkZGluZ1RvcDogNCxcbiAgICAgIHBhZGRpbmdSaWdodDogMTIsXG4gICAgICBwYWRkaW5nQm90dG9tOiA2LFxuICAgICAgcGFkZGluZ0xlZnQ6IDEyLFxuICAgICAgYm9yZGVyV2lkdGg6IDQsXG4gICAgICBib3JkZXJTdHlsZTogJ3NvbGlkJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnIzAwMDAwMCcsXG4gICAgICBiYWNrZ3JvdWRDb2xvcjogJyNjMGMwYzAnXG4gICAgfSwgc3R5bGUpO1xuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICBwcm9wcy5vbkNsaWNrID0gbnVsbDtcbiAgICAgIHRleHRTdHlsZSA9IF9leHRlbmRzKHt9LCB0ZXh0U3R5bGUsIHtcbiAgICAgICAgY29sb3I6ICcjN2Y3ZjdmJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICcjN2Y3ZjdmJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3BzLnZhbHVlID0gY2hpbGRyZW47XG4gICAgICBwcm9wcy5jaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1yZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIEJBU0VfRk9OVF9TSVpFID0gMjg7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlSGVhZGluZ1N0eWxlKGJhc2VGb250U2l6ZSwgZm9udE11bHRpcGxpZXIsIG1hcmdpbk11bHRpcGxpZXIpIHtcbiAgcmV0dXJuIHtcbiAgICBmb250U2l6ZTogYmFzZUZvbnRTaXplICogZm9udE11bHRpcGxpZXIsXG4gICAgbWFyZ2luVG9wOiBiYXNlRm9udFNpemUgKiBmb250TXVsdGlwbGllciAqIG1hcmdpbk11bHRpcGxpZXIsXG4gICAgbWFyZ2luQm90dG9tOiBiYXNlRm9udFNpemUgKiBmb250TXVsdGlwbGllciAqIG1hcmdpbk11bHRpcGxpZXIsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnXG4gIH07XG59XG5cbnZhciBIZWFkaW5nRWxlbWVudHMgPSB7XG4gIGgxOiBnZW5lcmF0ZUhlYWRpbmdTdHlsZShCQVNFX0ZPTlRfU0laRSwgMiwgMC42NyksXG4gIGgyOiBnZW5lcmF0ZUhlYWRpbmdTdHlsZShCQVNFX0ZPTlRfU0laRSwgMS41LCAwLjgzKSxcbiAgaDM6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAxLjE3LCAxKSxcbiAgaDQ6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAxLCAxLjMzKSxcbiAgaDU6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAwLjgzLCAxLjY3KSxcbiAgaDY6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAwLjY3LCAyLjMzKVxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgdmFyIHR5cGUgPSBjb21wb25lbnQudHlwZSxcbiAgICAgICAgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICd0ZXh0JztcbiAgICBwcm9wcy5zdHlsZSA9IF9leHRlbmRzKHt9LCBIZWFkaW5nRWxlbWVudHNbdHlwZV0gfHwgSGVhZGluZ0VsZW1lbnRzLmg2LCBwcm9wcy5zdHlsZSk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyAmJiAhcHJvcHMudmFsdWUpIHtcbiAgICAgIHByb3BzLnZhbHVlID0gcHJvcHMuY2hpbGRyZW47XG4gICAgICBwcm9wcy5jaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG5cbiAgLyoqXG4gICAqIHBhcnNlIHczYyBhdHRycyB0byB3ZWV4IG1vZHVsZSBhdHRyc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjIGNvbXBvbmVudCBkYXRhXG4gICAqIEByZXR1cm4ge09iamVjdH0gd2VleCBjb21wb25lbnQgZGF0YVxuICAgKi9cbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC50eXBlID0gJ2Rpdic7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc3R5bGVVbml0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG5cbnZhciBfZmxleGJveCA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXG52YXIgX2ZsZXhib3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmxleGJveCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9O1xufVxuXG4vKipcbiAqIFdlYiBCcm93c2VyIGRyaXZlclxuICoqL1xuXG4vKiBnbG9iYWwgREVWSUNFX1dJRFRILCBWSUVXUE9SVF9XSURUSCAqL1xuXG52YXIgREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgPSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnO1xudmFyIENMQVNTX05BTUUgPSAnY2xhc3NOYW1lJztcbnZhciBDTEFTUyA9ICdjbGFzcyc7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBFVkVOVF9QUkVGSVhfUkVHRVhQID0gL29uW0EtWl0vO1xuXG52YXIgQUREX0VWRU5UID0gJ2FkZEV2ZW50JztcbnZhciBSRU1PVkVfRVZFTlQgPSAncmVtb3ZlRXZlbnQnO1xuXG52YXIgRHJpdmVyID0ge1xuXG4gIGRldmljZVdpZHRoOiB0eXBlb2YgREVWSUNFX1dJRFRIICE9PSAndW5kZWZpbmVkJyAmJiBERVZJQ0VfV0lEVEggfHwgbnVsbCxcbiAgdmlld3BvcnRXaWR0aDogdHlwZW9mIFZJRVdQT1JUX1dJRFRIICE9PSAndW5kZWZpbmVkJyAmJiBWSUVXUE9SVF9XSURUSCB8fCA3NTAsXG4gIGV2ZW50UmVnaXN0cnk6IHt9LFxuXG4gIGdldERldmljZVdpZHRoOiBmdW5jdGlvbiBnZXREZXZpY2VXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIH0sXG4gIHNldERldmljZVdpZHRoOiBmdW5jdGlvbiBzZXREZXZpY2VXaWR0aCh3aWR0aCkge1xuICAgIHRoaXMuZGV2aWNlV2lkdGggPSB3aWR0aDtcbiAgfSxcbiAgZ2V0Vmlld3BvcnRXaWR0aDogZnVuY3Rpb24gZ2V0Vmlld3BvcnRXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydFdpZHRoO1xuICB9LFxuICBzZXRWaWV3cG9ydFdpZHRoOiBmdW5jdGlvbiBzZXRWaWV3cG9ydFdpZHRoKHdpZHRoKSB7XG4gICAgdGhpcy52aWV3cG9ydFdpZHRoID0gd2lkdGg7XG4gIH0sXG4gIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZChpZCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIH0sXG4gIGNyZWF0ZUJvZHk6IGZ1bmN0aW9uIGNyZWF0ZUJvZHkoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gIH0sXG4gIGNyZWF0ZUNvbW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQoY29udGVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGNvbnRlbnQpO1xuICB9LFxuICBjcmVhdGVFbXB0eTogZnVuY3Rpb24gY3JlYXRlRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWVudCgnIGVtcHR5ICcpO1xuICB9LFxuICBjcmVhdGVUZXh0OiBmdW5jdGlvbiBjcmVhdGVUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gIH0sXG4gIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uIHVwZGF0ZVRleHQobm9kZSwgdGV4dCkge1xuICAgIHZhciB0ZXh0Q29udGVudEF0dHIgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50ID8gJ3RleHRDb250ZW50JyA6ICdub2RlVmFsdWUnO1xuICAgIG5vZGVbdGV4dENvbnRlbnRBdHRyXSA9IHRleHQ7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50KSB7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50eXBlKTtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICB0aGlzLnNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzKTtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gTWF5YmUgaGFzIGJlZW4gcmVtb3ZlZCB3aGVuIHJlbW92ZSBjaGlsZFxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIHJlcGxhY2VDaGlsZDogZnVuY3Rpb24gcmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG9sZENoaWxkLnBhcmVudE5vZGU7XG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICB9LFxuICBpbnNlcnRBZnRlcjogZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIobm9kZSwgYWZ0ZXIsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBhZnRlci5wYXJlbnROb2RlO1xuICAgIHZhciBuZXh0U2libGluZyA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGJlZm9yZS5wYXJlbnROb2RlO1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlKTtcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlciwgcHJvcHMpIHtcbiAgICBpZiAodGhpcy5ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50UmVnaXN0cnlbZXZlbnROYW1lXShBRERfRVZFTlQsIG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlciwgcHJvcHMpIHtcbiAgICBpZiAodGhpcy5ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50UmVnaXN0cnlbZXZlbnROYW1lXShSRU1PVkVfRVZFTlQsIG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKG5vZGUpIHtcbiAgICAvLyBub29wXG4gIH0sXG4gIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKG5vZGUsIHByb3BLZXkpIHtcbiAgICBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHJldHVybiBub2RlLmlubmVySFRNTCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IENMQVNTX05BTUUpIHtcbiAgICAgIHByb3BLZXkgPSBDTEFTUztcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSBpbiBub2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBTb21lIG5vZGUgcHJvcGVydHkgaXMgcmVhZG9ubHkgd2hlbiBpbiBzdHJpY3QgbW9kZVxuICAgICAgICBub2RlW3Byb3BLZXldID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcEtleSk7XG4gIH0sXG4gIHNldEF0dHJpYnV0ZTogZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5vZGUsIHByb3BLZXksIHByb3BWYWx1ZSkge1xuICAgIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgcmV0dXJuIG5vZGUuaW5uZXJIVE1MID0gcHJvcFZhbHVlLl9faHRtbDtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0xBU1NfTkFNRSkge1xuICAgICAgcHJvcEtleSA9IENMQVNTO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5IGluIG5vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNvbWUgbm9kZSBwcm9wZXJ0eSBpcyByZWFkb25seSB3aGVuIGluIHN0cmljdCBtb2RlXG4gICAgICAgIG5vZGVbcHJvcEtleV0gPSBwcm9wVmFsdWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgfVxuICB9LFxuICBzZXRTdHlsZXM6IGZ1bmN0aW9uIHNldFN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgICB2YXIgdHJhbmZvcm1lZFN0eWxlcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIHZhciB2YWwgPSBzdHlsZXNbcHJvcF07XG4gICAgICBpZiAoX2ZsZXhib3gyLmRlZmF1bHQuaXNGbGV4UHJvcChwcm9wKSkge1xuICAgICAgICBfZmxleGJveDIuZGVmYXVsdFtwcm9wXSh2YWwsIHRyYW5mb3JtZWRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbmZvcm1lZFN0eWxlc1twcm9wXSA9ICgwLCBfc3R5bGVVbml0LmNvbnZlcnRVbml0KSh2YWwsIHByb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9wcm9wIGluIHRyYW5mb3JtZWRTdHlsZXMpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1WYWx1ZSA9IHRyYW5mb3JtZWRTdHlsZXNbX3Byb3BdO1xuICAgICAgLy8gaGFjayBoYW5kbGUgY29tcGF0aWJpbGl0eSBpc3N1ZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNmb3JtVmFsdWUpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlW2ldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXREZXZpY2VXaWR0aCgpIC8gdGhpcy5nZXRWaWV3cG9ydFdpZHRoKCkpO1xuICB9LFxuICBzZXROYXRpdmVQcm9wczogZnVuY3Rpb24gc2V0TmF0aXZlUHJvcHMobm9kZSwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSBDSElMRFJFTikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFNUWUxFKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdHlsZXMobm9kZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKEVWRU5UX1BSRUZJWF9SRUdFWFAudGVzdChwcm9wKSkge1xuICAgICAgICAgIHZhciBldmVudE5hbWUgPSBwcm9wLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJpdmVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBCT1hfQUxJR04gPSB7XG4gIHN0cmV0Y2g6ICdzdHJldGNoJyxcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJ1xufTtcblxudmFyIEJPWF9PUklFTlQgPSB7XG4gIHJvdzogJ2hvcml6b250YWwnLFxuICBjb2x1bW46ICd2ZXJ0aWNhbCdcbn07XG5cbnZhciBCT1hfUEFDSyA9IHtcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJyxcbiAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeScsXG4gICdzcGFjZS1hcm91bmQnOiAnanVzdGlmeScgLy8gSnVzdCBzYW1lIGFzIGBzcGFjZS1iZXR3ZWVuYFxufTtcblxudmFyIEZMRVhfUFJPUFMgPSB7XG4gIGRpc3BsYXk6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGFsaWduSXRlbXM6IHRydWUsXG4gIGFsaWduU2VsZjogdHJ1ZSxcbiAgZmxleERpcmVjdGlvbjogdHJ1ZSxcbiAganVzdGlmeUNvbnRlbnQ6IHRydWUsXG4gIGZsZXhXcmFwOiB0cnVlXG59O1xuXG52YXIgRmxleGJveCA9IHtcbiAgaXNGbGV4UHJvcDogZnVuY3Rpb24gaXNGbGV4UHJvcChwcm9wKSB7XG4gICAgcmV0dXJuIEZMRVhfUFJPUFNbcHJvcF07XG4gIH0sXG4gIGRpc3BsYXk6IGZ1bmN0aW9uIGRpc3BsYXkodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgaWYgKHZhbHVlID09PSAnZmxleCcpIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBbJy13ZWJraXQtYm94JywgJy13ZWJraXQtZmxleCcsICdmbGV4J107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sXG4gIGZsZXg6IGZ1bmN0aW9uIGZsZXgodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0Qm94RmxleCA9IHZhbHVlO1xuICAgIHN0eWxlLndlYmtpdEZsZXggPSB2YWx1ZTtcbiAgICBzdHlsZS5mbGV4ID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBmbGV4V3JhcDogZnVuY3Rpb24gZmxleFdyYXAodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUuZmxleFdyYXAgPSB2YWx1ZTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sXG4gIGFsaWduSXRlbXM6IGZ1bmN0aW9uIGFsaWduSXRlbXModmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0Qm94QWxpZ24gPSBCT1hfQUxJR05bdmFsdWVdO1xuICAgIHN0eWxlLndlYmtpdEFsaWduSXRlbXMgPSB2YWx1ZTtcbiAgICBzdHlsZS5hbGlnbkl0ZW1zID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBhbGlnblNlbGY6IGZ1bmN0aW9uIGFsaWduU2VsZih2YWx1ZSkge1xuICAgIHZhciBzdHlsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBzdHlsZS53ZWJraXRBbGlnblNlbGYgPSB2YWx1ZTtcbiAgICBzdHlsZS5hbGlnblNlbGYgPSB2YWx1ZTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sXG4gIGZsZXhEaXJlY3Rpb246IGZ1bmN0aW9uIGZsZXhEaXJlY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0Qm94T3JpZW50ID0gQk9YX09SSUVOVFt2YWx1ZV07XG4gICAgc3R5bGUud2Via2l0RmxleERpcmVjdGlvbiA9IHZhbHVlO1xuICAgIHN0eWxlLmZsZXhEaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sXG4gIGp1c3RpZnlDb250ZW50OiBmdW5jdGlvbiBqdXN0aWZ5Q29udGVudCh2YWx1ZSkge1xuICAgIHZhciBzdHlsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBzdHlsZS53ZWJraXRCb3hQYWNrID0gQk9YX1BBQ0tbdmFsdWVdO1xuICAgIHN0eWxlLndlYmtpdEp1c3RpZnlDb250ZW50ID0gdmFsdWU7XG4gICAgc3R5bGUuanVzdGlmeUNvbnRlbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEZsZXhib3g7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA0MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlbmRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG52YXIgX3JlbmRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW5kZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIC8vIEhhbmRsZSBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudFxuICBpZiAoY29udGFpbmVyLmNoaWxkTm9kZXMpIHtcbiAgICAvLyBDbG9uZSBjaGlsZE5vZGVzLCBCZWNhdXNlIHJlbW92ZUNoaWxkIHdpbGwgY2F1c2luZyBjaGFuZ2UgaW4gY2hpbGROb2RlcyBsZW5ndGhcbiAgICB2YXIgY2hpbGROb2RlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY29udGFpbmVyLmNoaWxkTm9kZXMpKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvb3RDaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RDaGlsZE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoMCwgX3JlbmRlcjIuZGVmYXVsdCkoZWxlbWVudCwgY29udGFpbmVyLCBvcHRpb25zLCBjYWxsYmFjayk7O1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBoeWRyYXRlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaW5kQ29tcG9uZW50SW5zdGFuY2Uobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIF9pbnN0YW5jZTIuZGVmYXVsdC5nZXQobm9kZSk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmRDb21wb25lbnRJbnN0YW5jZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQ0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzZXROYXRpdmVQcm9wcztcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX2ZpbmRET01Ob2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cbnZhciBfZmluZERPTU5vZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmluZERPTU5vZGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlID0gKDAsIF9maW5kRE9NTm9kZTIuZGVmYXVsdCkobm9kZSk7XG4gIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA0NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJzAuNC4yMCc7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA0NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2ZsYXR0ZW5DaGlsZHJlbiA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cbnZhciBfZmxhdHRlbkNoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZsYXR0ZW5DaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlblRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgLy8gZmxhdHRlbiBjaGlsZHJlblxuICBjaGlsZHJlbiA9ICgwLCBfZmxhdHRlbkNoaWxkcmVuMi5kZWZhdWx0KShjaGlsZHJlbiwgW10pO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtdLmNvbmNhdChjaGlsZHJlbik7XG59XG5cbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2hpbGRyZW4sIGZuLCBjdHgpIHtcbiAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY2hpbGRyZW4gPSBjb252ZXJ0Q2hpbGRyZW5Ub0FycmF5KGNoaWxkcmVuKTtcbiAgICByZXR1cm4gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGN0eCwgY2hpbGQsIGluZGV4KTtcbiAgICB9KTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjaGlsZHJlbiwgZm4sIGN0eCkge1xuICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjaGlsZHJlbiA9IGNvbnZlcnRDaGlsZHJlblRvQXJyYXkoY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwoY3R4LCBjaGlsZCwgaW5kZXgpO1xuICAgIH0pO1xuICB9LFxuICBjb3VudDogZnVuY3Rpb24gY291bnQoY2hpbGRyZW4pIHtcbiAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGNvbnZlcnRDaGlsZHJlblRvQXJyYXkoY2hpbGRyZW4pLmxlbmd0aDtcbiAgfSxcbiAgb25seTogZnVuY3Rpb24gb25seShjaGlsZHJlbikge1xuICAgIC8vIGBvbmx5YCByZWNlaXZlIHJheCBlbGVtZW50IGNoaWxkXG4gICAgLy8gbnVsbCB2YWx1ZSBpcyBub3QgYWNjZXB0YWJsZVxuICAgIGNoaWxkcmVuID0gQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdDaGlsZHJlbi5vbmx5OiBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIGVsZW1lbnQgY2hpbGQuJyk7XG4gICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICB9LFxuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgICAvLyBgdG9BcnJheWAgZmlsdGVyIG51bGwgdmFsdWVcbiAgICByZXR1cm4gY29udmVydENoaWxkcmVuVG9BcnJheShjaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkICE9PSBudWxsO1xuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDaGlsZHJlbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9Oztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJheC5mYWN0b3J5Lm1hcFxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3J1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMik7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIsIG5ldy1jYXA6IFwib2ZmXCIgKi9cblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICBTeW1ib2xQb2x5ZmlsbCxcbiAgICBIaWRkZW5TeW1ib2wsXG4gICAgZ2xvYmFsU3ltYm9scyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKHgpIHtcbiAgaWYgKCF4KSByZXR1cm4gZmFsc2U7XG4gIGlmICgodHlwZW9mIHggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHgpKSA9PT0gJ3N5bWJvbCcpIHJldHVybiB0cnVlO1xuICBpZiAoIXguY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSAhPT0gJ1N5bWJvbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHhbeC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIGdlbmVyYXRlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNyZWF0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gZnVuY3Rpb24gKGRlc2MpIHtcbiAgICB2YXIgcG9zdGZpeCA9IDAsXG4gICAgICAgIG5hbWU7XG4gICAgd2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pIHtcbiAgICAgICsrcG9zdGZpeDtcbiAgICB9ZGVzYyArPSBwb3N0Zml4IHx8ICcnO1xuICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuICAgIG5hbWUgPSAnQEAnICsgZGVzYztcbiAgICByZXR1cm4gbmFtZTtcbiAgfTtcbn0oKTtcblxuLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgKG5vdCBvbmUgZXhwb3NlZCkgZm9yIGNyZWF0aW5nIFN5bWJvbCBpbnN0YW5jZXMuXG4vLyBUaGlzIG9uZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGBzb21lU3ltYm9sIGluc3RhbmNlb2YgU3ltYm9sYCBhbHdheXMgcmV0dXJuIGZhbHNlXG5IaWRkZW5TeW1ib2wgPSBmdW5jdGlvbiBfU3ltYm9sKGRlc2NyaXB0aW9uKSB7XG4gIGlmICh0aGlzIGluc3RhbmNlb2YgSGlkZGVuU3ltYm9sKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgcmV0dXJuIFN5bWJvbFBvbHlmaWxsKGRlc2NyaXB0aW9uKTtcbn07XG5cbi8vIEV4cG9zZWQgYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIChyZXR1cm5zIGluc3RhbmNlcyBvZiBIaWRkZW5TeW1ib2wpXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFBvbHlmaWxsID0gZnVuY3Rpb24gX1N5bWJvbDIoZGVzY3JpcHRpb24pIHtcbiAgdmFyIHN5bWJvbDtcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBfU3ltYm9sMikgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gIHN5bWJvbCA9IE9iamVjdC5jcmVhdGUoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSk7XG4gIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltYm9sLCB7XG4gICAgX19kZXNjcmlwdGlvbl9fOiB7IHZhbHVlOiBkZXNjcmlwdGlvbiB9LFxuICAgIF9fbmFtZV9fOiB7IHZhbHVlOiBnZW5lcmF0ZU5hbWUoZGVzY3JpcHRpb24pIH1cbiAgfSk7XG59O1xuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbCwge1xuICBmb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKGtleSkge1xuICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSkgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcbiAgICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2xQb2x5ZmlsbChTdHJpbmcoa2V5KSk7XG4gICAgfSB9LFxuICBrZXlGb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHMpIHtcbiAgICAgIHZhciBrZXk7XG4gICAgICB2YWxpZGF0ZVN5bWJvbChzKTtcbiAgICAgIGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIHtcbiAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gcykgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9IH0sXG5cbiAgLy8gVG8gZW5zdXJlIHByb3BlciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbmF0aXZlIGZ1bmN0aW9ucyAoZS5nLiBBcnJheS5mcm9tKVxuICAvLyBmYWxsYmFjayB0byBldmVudHVhbCBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2l2ZW4gc3ltYm9sXG4gIGhhc0luc3RhbmNlOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnaGFzSW5zdGFuY2UnKSB9LFxuICBpc0NvbmNhdFNwcmVhZGFibGU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdpc0NvbmNhdFNwcmVhZGFibGUnKSB9LFxuICBpdGVyYXRvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ2l0ZXJhdG9yJykgfSxcbiAgbWF0Y2g6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdtYXRjaCcpIH0sXG4gIHJlcGxhY2U6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdyZXBsYWNlJykgfSxcbiAgc2VhcmNoOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnc2VhcmNoJykgfSxcbiAgc3BlY2llczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwZWNpZXMnKSB9LFxuICBzcGxpdDogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwbGl0JykgfSxcbiAgdG9QcmltaXRpdmU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCd0b1ByaW1pdGl2ZScpIH0sXG4gIHRvU3RyaW5nVGFnOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgndG9TdHJpbmdUYWcnKSB9LFxuICB1bnNjb3BhYmxlczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3Vuc2NvcGFibGVzJykgfVxufSk7XG5cbi8vIEludGVybmFsIHR3ZWFrcyBmb3IgcmVhbCBzeW1ib2wgcHJvZHVjZXJcbmRlZmluZVByb3BlcnRpZXMoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwgfSxcbiAgdG9TdHJpbmc6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19uYW1lX187XG4gICAgfSB9XG59KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgZXhwb3NlZCBvbiBTeW1ib2wucHJvdG90eXBlXG4vLyBUaGV5IHdvbid0IGJlIGFjY2Vzc2libGUgb24gcHJvZHVjZWQgc3ltYm9sIGluc3RhbmNlcyBhcyB0aGV5IGRlcml2ZSBmcm9tIEhpZGRlblN5bWJvbC5wcm90b3R5cGVcbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCB7XG4gIHRvU3RyaW5nOiB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiAnU3ltYm9sICgnICsgdmFsaWRhdGVTeW1ib2wodGhpcykuX19kZXNjcmlwdGlvbl9fICsgJyknO1xuICAgIH0gfSxcbiAgdmFsdWVPZjogeyB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgfSB9XG59KTtcblxuZGVmaW5lUHJvcGVydHkoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwge1xuICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgdmFyIHN5bWJvbCA9IHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgIGlmICgodHlwZW9mIHN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoc3ltYm9sKSkgPT09ICdzeW1ib2wnKSByZXR1cm4gc3ltYm9sO1xuICAgIHJldHVybiBzeW1ib2wudG9TdHJpbmcoKTtcbiAgfVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnU3ltYm9sJyB9KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0b24gb2YgdG9QcmltaXRpdmUgYW5kIHRvU3RyaW5nVGFnIGZvciByZXR1cm5lZCBzeW1ib2wgaW5zdGFuY2VzXG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnXSB9KTtcblxuLy8gTm90ZTogSXQncyBpbXBvcnRhbnQgdG8gZGVmaW5lIGB0b1ByaW1pdGl2ZWAgYXMgbGFzdCBvbmUsIGFzIHNvbWUgaW1wbGVtZW50YXRpb25zXG4vLyBpbXBsZW1lbnQgYHRvUHJpbWl0aXZlYCBuYXRpdmVseSB3aXRob3V0IGltcGxlbWVudGluZyBgdG9TdHJpbmdUYWdgIChvciBvdGhlciBzcGVjaWZpZWQgc3ltYm9scylcbi8vIEFuZCB0aGF0IG1heSBpbnZva2UgZXJyb3IgaW4gZGVmaW5pdGlvbiBmbG93OlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWVkaWtvby9lczYtc3ltYm9sL2lzc3Vlcy8xMyNpc3N1ZWNvbW1lbnQtMTY0MTQ2MTQ5XG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlXSB9KTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL3VybC1zZWFyY2gtcGFyYW1zXG5cblxudmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgZmluZCA9IC9bISdcXChcXCl+XXwlMjB8JTAwL2c7XG52YXIgcGx1cyA9IC9cXCsvZztcbnZhciByZXBsYWNlID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKycsXG4gICclMDAnOiAnXFx4MDAnXG59O1xudmFyIHJlcGxhY2VyID0gZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgcmV0dXJuIHJlcGxhY2VbbWF0Y2hdO1xufTtcbnZhciBzZWNyZXQgPSAnX19VUkxTZWFyY2hQYXJhbXNfXyc7XG5cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoZmluZCwgcmVwbGFjZXIpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UocGx1cywgJyAnKSk7XG59XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcyhxdWVyeSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVUkxTZWFyY2hQYXJhbXMpO1xuXG4gICAgdGhpc1tzZWNyZXRdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm47XG4gICAgaWYgKHF1ZXJ5LmNoYXJBdCgwKSA9PT0gJz8nKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LnNsaWNlKDEpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbmRleCwgdmFsdWUsIHBhaXJzID0gKHF1ZXJ5IHx8ICcnKS5zcGxpdCgnJicpLCBpID0gMCwgbGVuZ3RoID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gcGFpcnNbaV07XG4gICAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmICgtMSA8IGluZGV4KSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGRlY29kZSh2YWx1ZS5zbGljZSgwLCBpbmRleCkpLCBkZWNvZGUodmFsdWUuc2xpY2UoaW5kZXggKyAxKSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoZGVjb2RlKHZhbHVlKSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVUkxTZWFyY2hQYXJhbXMsIFt7XG4gICAga2V5OiAnYXBwZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIGlmIChuYW1lIGluIGRpY3QpIHtcbiAgICAgICAgZGljdFtuYW1lXS5wdXNoKCcnICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdFtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZWxldGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKG5hbWUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3NlY3JldF1bbmFtZV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICAgIHZhciBkaWN0ID0gdGhpc1tzZWNyZXRdO1xuICAgICAgcmV0dXJuIG5hbWUgaW4gZGljdCA/IGRpY3RbbmFtZV1bMF0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIHJldHVybiBuYW1lIGluIGRpY3QgPyBkaWN0W25hbWVdLnNsaWNlKDApIDogW107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lIGluIHRoaXNbc2VjcmV0XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICAgIHRoaXNbc2VjcmV0XVtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdmb3JFYWNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGRpY3QgPSB0aGlzW3NlY3JldF07XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkaWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGRpY3RbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBuYW1lLCB0aGlzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdrZXlzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHZhciBpdGVtcyA9IFtdO1xuICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpdGVtcy5wdXNoKG5hbWUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKTtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaXRlcmF0b3JbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd2YWx1ZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VudHJpZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XSxcbiAgICAgICAgICBxdWVyeSA9IFtdLFxuICAgICAgICAgIGksXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWU7XG4gICAgICBmb3IgKGtleSBpbiBkaWN0KSB7XG4gICAgICAgIG5hbWUgPSBlbmNvZGUoa2V5KTtcbiAgICAgICAgZm9yIChpID0gMCwgdmFsdWUgPSBkaWN0W2tleV07IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHF1ZXJ5LnB1c2gobmFtZSArICc9JyArIGVuY29kZSh2YWx1ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnkuam9pbignJicpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVUkxTZWFyY2hQYXJhbXM7XG59KCk7XG5cblVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmVudHJpZXM7XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMU2VhcmNoUGFyYW1zO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldCBQcm9taXNlKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuICB9LFxuICBnZXQgU3ltYm9sKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuICB9LFxuICBnZXQgTWFwKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuICB9LFxuICBnZXQgU2V0KCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuICB9LFxuICBnZXQgV2Vha01hcCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbiAgfSxcbiAgZ2V0IFdlYWtTZXQoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oNyk7XG4gIH0sXG4gIGdldCBGb250RmFjZSgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbiAgfSxcbiAgZ2V0IFVSTCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbiAgfSxcbiAgZ2V0IFVSTFNlYXJjaFBhcmFtcygpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbiAgfSxcbiAgZ2V0IG1hdGNoTWVkaWEoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuICB9XG59O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLy8gVXNlIHBvbHlmaWxsIGZvciBzZXRJbW1lZGlhdGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zXG52YXIgYXNhcCA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgJiYgc2V0SW1tZWRpYXRlIHx8IGZ1bmN0aW9uIChmbikge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgb25VbmhhbmRsZWRSZWplY3Rpb24gPSBmdW5jdGlvbiBvblVuaGFuZGxlZFJlamVjdGlvbihlcnIpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlKSB7XG4gICAgY29uc29sZS5sb2coJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgfVxufTtcblxuLy8gUG9seWZpbGwgZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG5mdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvbWlzZShmbikge1xuICBpZiAoX3R5cGVvZih0aGlzKSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIHJlc29sdmVyIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMuX3N0YXRlID0gMDtcbiAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlKHNlbGYsIGRlZmVycmVkKSB7XG4gIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykge1xuICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgfVxuICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX2hhbmRsZWQgPSB0cnVlO1xuICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCByZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICB0cnkge1xuICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpO1xuICAgIGlmIChuZXdWYWx1ZSAmJiAoKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV3VmFsdWUpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBzZWxmLl9zdGF0ZSA9IDM7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuX3N0YXRlID0gMTtcbiAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGZpbmFsZShzZWxmKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChzZWxmLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgc2VsZi5fc3RhdGUgPSAyO1xuICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgb25VbmhhbmRsZWRSZWplY3Rpb24oc2VsZi5fdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGhhbmRsZShzZWxmLCBzZWxmLl9kZWZlcnJlZHNbaV0pO1xuICB9XG4gIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICogb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgYXJlIG9ubHkgY2FsbGVkIG9uY2UuXG4gKlxuICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICovXG5mdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlamVjdChzZWxmLCByZWFzb24pO1xuICAgIH0pO1xuICB9IGNhdGNoIChleCkge1xuICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgZG9uZSA9IHRydWU7XG4gICAgcmVqZWN0KHNlbGYsIGV4KTtcbiAgfVxufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIHZhciBwcm9tID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaGFuZGxlKHRoaXMsIG5ldyBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9tKSk7XG4gIHJldHVybiBwcm9tO1xufTtcblxuUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc29sdmUoW10pO1xuICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcblxuICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWwgJiYgKCh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHZhbCwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICByZXMoaSwgdmFsKTtcbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3NbaV0gPSB2YWw7XG4gICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHJlamVjdChleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgfVxuICB9KTtcbn07XG5cblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodmFsdWUpKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSk7XG59O1xuXG5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBpbW1lZGlhdGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBjYWxsYmFja3NcbiAqIEBwYXJhbSBmbiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwcml2YXRlXG4gKi9cblByb21pc2UuX3NldEltbWVkaWF0ZUZuID0gZnVuY3Rpb24gX3NldEltbWVkaWF0ZUZuKGZuKSB7XG4gIGFzYXAgPSBmbjtcbn07XG5cblByb21pc2UuX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuKGZuKSB7XG4gIG9uVW5oYW5kbGVkUmVqZWN0aW9uID0gZm47XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcbi8vIE5hTiBjYW5ub3QgYmUgZm91bmQgaW4gYW4gYXJyYXkgdXNpbmcgaW5kZXhPZiwgc28gd2UgZW5jb2RlIE5hTnMgdXNpbmcgYSBwcml2YXRlIHN5bWJvbC5cbi8qIGVzbGludCBuby1leHRlbmQtbmF0aXZlOiBcIm9mZlwiICovXG52YXIgTmFOTWFya2VyID0gKDAsIF9zeW1ib2wyLmRlZmF1bHQpKCdOYU4nKTtcbnZhciBBQ0NFU1NPUl9TVVBQT1JUID0gdHJ1ZTtcblxuZnVuY3Rpb24gZW5jb2RlS2V5KGtleSkge1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGtleSkgPyBOYU5NYXJrZXIgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUtleShlbmNvZGVkS2V5KSB7XG4gIHJldHVybiBlbmNvZGVkS2V5ID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkS2V5O1xufVxuXG5mdW5jdGlvbiBtYWtlSXRlcmF0b3IobWFwSW5zdCwgZ2V0dGVyKSB7XG4gIHZhciBuZXh0SWR4ID0gMDtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG5leHRJZHggPT09IG1hcEluc3QuX2tleXMubGVuZ3RoKSBkb25lID0gdHJ1ZTtcbiAgICAgIGlmICghZG9uZSkge1xuICAgICAgICB3aGlsZSAobWFwSW5zdC5fa2V5c1tuZXh0SWR4XSA9PT0gdW5kZWZNYXJrZXIpIHtcbiAgICAgICAgICBuZXh0SWR4Kys7XG4gICAgICAgIH1yZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwobWFwSW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKG1hcEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IG1hcEluc3QuX2tleXMubGVuZ3RoOyBpIDwgczsgaSsrKSB7XG4gICAgaWYgKG1hcEluc3QuX2tleXNbaV0gIT09IHVuZGVmTWFya2VyKSBzaXplKys7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbmZ1bmN0aW9uIGhhc1Byb3RvTWV0aG9kKGluc3RhbmNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnN0YW5jZVttZXRob2RdID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgTWFwID0gZnVuY3Rpb24gTWFwKGRhdGEpIHtcbiAgdGhpcy5fa2V5cyA9IFtdO1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGlmIChkYXRhICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdmb3JFYWNoJykpIHtcbiAgICAvLyBGYXN0cGF0aDogSWYgYGRhdGFgIGlzIGEgTWFwLCBzaG9ydGNpcmN1aXQgYWxsIGZvbGxvd2luZyB0aGUgY2hlY2tzXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICAvLyBJZiBgZGF0YWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1hcCwgaXQgY291bGQgYmUgYmVjYXVzZSB5b3UgaGF2ZSBhIE1hcCBmcm9tIGFuIGlmcmFtZSBvciBhIHdvcmtlciBvciBzb21ldGhpbmcuXG4gICAgLy8gQ2hlY2sgaWYgIGBkYXRhYCBoYXMgYWxsIHRoZSBgTWFwYCBtZXRob2RzIGFuZCBpZiBzbywgYXNzdW1lIGRhdGEgaXMgYW5vdGhlciBNYXBcbiAgICBoYXNQcm90b01ldGhvZChkYXRhLCAnY2xlYXInKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZGVsZXRlJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2VudHJpZXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZm9yRWFjaCcpICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdnZXQnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnaGFzJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2tleXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnc2V0JykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ3ZhbHVlcycpKSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgW2tleSwgdmFsdWVdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgaXRlbSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcbk1hcC5wcm90b3R5cGUgPSB7fTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgTWFwIG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIG1hcCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICByZXR1cm4gaWR4ICE9PSAtMSA/IHRoaXMuX3ZhbHVlc1tpZHhdIDogdW5kZWZpbmVkO1xufTtcbk1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX2tleXMuaW5kZXhPZihlbmNvZGVLZXkoa2V5KSk7XG4gIGlmIChpZHggIT09IC0xKSB7XG4gICAgdGhpcy5fdmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9rZXlzLnB1c2goZW5jb2RlS2V5KGtleSkpO1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbk1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5fa2V5cy5pbmRleE9mKGVuY29kZUtleShrZXkpKSAhPT0gLTE7XG59O1xuTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl9rZXlzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgdGhpcy5fdmFsdWVzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSBjYWxjU2l6ZSh0aGlzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fa2V5cyA9IHRoaXMuX3ZhbHVlcyA9IFtdO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IDA7XG59O1xuTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2ldO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gZGVjb2RlS2V5KHRoaXMuX2tleXNbaV0pO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmVudHJpZXMgPSBNYXAucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVLZXkodGhpcy5fa2V5c1tpXSksIHRoaXMuX3ZhbHVlc1tpXV07XG4gIH0pO1xufTtcbk1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFja0ZuLCB0aGlzQXJnKSB7XG4gIHRoaXNBcmcgPSB0aGlzQXJnIHx8IGdsb2JhbDtcbiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5lbnRyaWVzKCk7XG4gIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIHdoaWxlIChyZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBjYWxsYmFja0ZuLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlWzFdLCByZXN1bHQudmFsdWVbMF0sIHRoaXMpO1xuICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufTtcblxuTWFwLnByb3RvdHlwZVtfc3ltYm9sMi5kZWZhdWx0LnNwZWNpZXNdID0gTWFwO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnY29uc3RydWN0b3InLCB7XG4gIHZhbHVlOiBNYXBcbn0pO1xuXG50cnkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwXG4gIH0pO1xufSBjYXRjaCAoZSkge31cblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcblxuLy8gTmFOIGNhbm5vdCBiZSBmb3VuZCBpbiBhbiBhcnJheSB1c2luZyBpbmRleE9mLCBzbyB3ZSBlbmNvZGUgTmFOcyB1c2luZyBhIHByaXZhdGUgc3ltYm9sLlxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cbnZhciBOYU5NYXJrZXIgPSAoMCwgX3N5bWJvbDIuZGVmYXVsdCkoJ05hTicpO1xuXG52YXIgQUNDRVNTT1JfU1VQUE9SVCA9IHRydWU7XG5cbmZ1bmN0aW9uIGVuY29kZVZhbChkYXRhKSB7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0YSkgPyBOYU5NYXJrZXIgOiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVWYWwoZW5jb2RlZERhdGEpIHtcbiAgcmV0dXJuIGVuY29kZWREYXRhID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkRGF0YTtcbn1cblxuZnVuY3Rpb24gbWFrZUl0ZXJhdG9yKHNldEluc3QsIGdldHRlcikge1xuICB2YXIgbmV4dElkeCA9IDA7XG4gIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChzZXRJbnN0Ll92YWx1ZXNbbmV4dElkeF0gPT09IHVuZGVmTWFya2VyKSB7XG4gICAgICAgIG5leHRJZHgrKztcbiAgICAgIH1pZiAobmV4dElkeCA9PT0gc2V0SW5zdC5fdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwoc2V0SW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKHNldEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IHNldEluc3QuX3ZhbHVlcy5sZW5ndGg7IGkgPCBzOyBpKyspIHtcbiAgICBpZiAoc2V0SW5zdC5fdmFsdWVzW2ldICE9PSB1bmRlZk1hcmtlcikgc2l6ZSsrO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG52YXIgU2V0ID0gZnVuY3Rpb24gU2V0KGRhdGEpIHtcbiAgdGhpcy5fdmFsdWVzID0gW107XG5cbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgc2V0XG4gIGRhdGEgJiYgdHlwZW9mIGRhdGEuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJyAmJiBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB0aGlzLmFkZC5jYWxsKHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgU2V0IG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIHNldCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFsdWUgPSBlbmNvZGVWYWwodmFsdWUpO1xuICBpZiAodGhpcy5fdmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl92YWx1ZXMuaW5kZXhPZihlbmNvZGVWYWwodmFsdWUpKSAhPT0gLTE7XG59O1xuU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX3ZhbHVlcy5pbmRleE9mKGVuY29kZVZhbCh2YWx1ZSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl92YWx1ZXNbaWR4XSA9IHVuZGVmTWFya2VyO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5TZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSAwO1xufTtcblNldC5wcm90b3R5cGUudmFsdWVzID0gU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGRlY29kZVZhbCh0aGlzLl92YWx1ZXNbaV0pO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmVudHJpZXMgPSBTZXQucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVWYWwodGhpcy5fdmFsdWVzW2ldKSwgZGVjb2RlVmFsKHRoaXMuX3ZhbHVlc1tpXSldO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2tGbiwgdGhpc0FyZykge1xuICB0aGlzQXJnID0gdGhpc0FyZyB8fCBnbG9iYWw7XG4gIHZhciBpdGVyYXRvciA9IHRoaXMuZW50cmllcygpO1xuICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICB3aGlsZSAocmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG4gICAgY2FsbGJhY2tGbi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZVsxXSwgcmVzdWx0LnZhbHVlWzBdLCB0aGlzKTtcbiAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn07XG5cblNldC5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5zcGVjaWVzXSA9IFNldDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2NvbnN0cnVjdG9yJywge1xuICB2YWx1ZTogU2V0XG59KTtcblxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMFxuICB9KTtcbn0gY2F0Y2ggKGUpIHt9XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY291bnRlciA9IERhdGUubm93KCkgJSAxZTk7XG5cbnZhciBXZWFrTWFwID0gZnVuY3Rpb24gV2Vha01hcChkYXRhKSB7XG4gIHRoaXMubmFtZSA9ICdfX3N0JyArIChNYXRoLnJhbmRvbSgpICogMWU5ID4+PiAwKSArIChjb3VudGVyKysgKyAnX18nKTtcblxuICAvLyBJZiBkYXRhIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRoaXMuc2V0LmFwcGx5KHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcbn07XG5cbldlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIGlmICgodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoa2V5KSkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcblxuICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTtcbiAgaWYgKGVudHJ5ICYmIGVudHJ5WzBdID09PSBrZXkpIGVudHJ5WzFdID0gdmFsdWU7ZWxzZSBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMubmFtZSwgeyB2YWx1ZTogW2tleSwgdmFsdWVdLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeTtcbiAgcmV0dXJuIChlbnRyeSA9IGtleVt0aGlzLm5hbWVdKSAmJiBlbnRyeVswXSA9PT0ga2V5ID8gZW50cnlbMV0gOiB1bmRlZmluZWQ7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5IHx8IGVudHJ5WzBdICE9PSBrZXkpIHJldHVybiBmYWxzZTtcbiAgZW50cnlbMF0gPSBlbnRyeVsxXSA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnRyeVswXSA9PT0ga2V5O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cblxudmFyIGNvdW50ZXIgPSBEYXRlLm5vdygpICUgMWU5O1xuXG52YXIgV2Vha1NldCA9IGZ1bmN0aW9uIFdlYWtTZXQoZGF0YSkge1xuICB0aGlzLm5hbWUgPSAnX19zdCcgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSA+Pj4gMCkgKyAoY291bnRlcisrICsgJ19fJyk7XG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaCh0aGlzLmFkZCwgdGhpcyk7XG59O1xuXG5XZWFrU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICBpZiAoIW9ialtuYW1lXSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbmFtZSwgeyB2YWx1ZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAoIW9ialt0aGlzLm5hbWVdKSByZXR1cm4gZmFsc2U7XG4gIG9ialt0aGlzLm5hbWVdID0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbldlYWtTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuICEhb2JqW3RoaXMubmFtZV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtTZXQ7XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgRm9udEZhY2UgPSBmdW5jdGlvbiBGb250RmFjZShmYW1pbHksIHNvdXJjZSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9udEZhY2UpO1xuXG4gIHRoaXMuZmFtaWx5ID0gZmFtaWx5O1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRm9udEZhY2U7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9VUkxcblxudmFyIFVSTFNlYXJjaFBhcmFtcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciByZWxhdGl2ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5yZWxhdGl2ZS5mdHAgPSAyMTtcbnJlbGF0aXZlLmZpbGUgPSAwO1xucmVsYXRpdmUuZ29waGVyID0gNzA7XG5yZWxhdGl2ZS5odHRwID0gODA7XG5yZWxhdGl2ZS5odHRwcyA9IDQ0MztcbnJlbGF0aXZlLndzID0gODA7XG5yZWxhdGl2ZS53c3MgPSA0NDM7XG5cbnZhciByZWxhdGl2ZVBhdGhEb3RNYXBwaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZSddID0gJy4nO1xucmVsYXRpdmVQYXRoRG90TWFwcGluZ1snLiUyZSddID0gJy4uJztcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZS4nXSA9ICcuLic7XG5yZWxhdGl2ZVBhdGhEb3RNYXBwaW5nWyclMmUlMmUnXSA9ICcuLic7XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVTY2hlbWUoc2NoZW1lKSB7XG4gIHJldHVybiByZWxhdGl2ZVtzY2hlbWVdICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGludmFsaWQoKSB7XG4gIGNsZWFyLmNhbGwodGhpcyk7XG4gIHRoaXMuX2lzSW52YWxpZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIElETkFUb0FTQ0lJKGgpIHtcbiAgaWYgKCcnID09IGgpIHtcbiAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gIH1cbiAgLy8gWFhYXG4gIHJldHVybiBoLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGUoYykge1xuICB2YXIgdW5pY29kZSA9IGMuY2hhckNvZGVBdCgwKTtcbiAgaWYgKHVuaWNvZGUgPiAweDIwICYmIHVuaWNvZGUgPCAweDdGICYmXG4gIC8vIFwiICMgPCA+ID8gYFxuICBbMHgyMiwgMHgyMywgMHgzQywgMHgzRSwgMHgzRiwgMHg2MF0uaW5kZXhPZih1bmljb2RlKSA9PSAtMSkge1xuICAgIHJldHVybiBjO1xuICB9XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYyk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGVRdWVyeShjKSB7XG4gIC8vIFhYWCBUaGlzIGFjdHVhbGx5IG5lZWRzIHRvIGVuY29kZSBjIHVzaW5nIGVuY29kaW5nIGFuZCB0aGVuXG4gIC8vIGNvbnZlcnQgdGhlIGJ5dGVzIG9uZS1ieS1vbmUuXG5cbiAgdmFyIHVuaWNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gIGlmICh1bmljb2RlID4gMHgyMCAmJiB1bmljb2RlIDwgMHg3RiAmJlxuICAvLyBcIiAjIDwgPiBgIChkbyBub3QgZXNjYXBlICc/JylcbiAgWzB4MjIsIDB4MjMsIDB4M0MsIDB4M0UsIDB4NjBdLmluZGV4T2YodW5pY29kZSkgPT0gLTEpIHtcbiAgICByZXR1cm4gYztcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGMpO1xufVxuXG52YXIgRU9GID0gdW5kZWZpbmVkLFxuICAgIEFMUEhBID0gL1thLXpBLVpdLyxcbiAgICBBTFBIQU5VTUVSSUMgPSAvW2EtekEtWjAtOVxcK1xcLVxcLl0vO1xuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgc3RhdGVPdmVycmlkZSwgYmFzZSkge1xuICBmdW5jdGlvbiBlcnIobWVzc2FnZSkge1xuICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCAnc2NoZW1lIHN0YXJ0JyxcbiAgICAgIGN1cnNvciA9IDAsXG4gICAgICBidWZmZXIgPSAnJyxcbiAgICAgIHNlZW5BdCA9IGZhbHNlLFxuICAgICAgc2VlbkJyYWNrZXQgPSBmYWxzZSxcbiAgICAgIGVycm9ycyA9IFtdO1xuXG4gIGxvb3A6IHdoaWxlICgoaW5wdXRbY3Vyc29yIC0gMV0gIT0gRU9GIHx8IGN1cnNvciA9PSAwKSAmJiAhdGhpcy5faXNJbnZhbGlkKSB7XG4gICAgdmFyIGMgPSBpbnB1dFtjdXJzb3JdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3NjaGVtZSBzdGFydCc6XG4gICAgICAgIGlmIChjICYmIEFMUEhBLnRlc3QoYykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gYy50b0xvd2VyQ2FzZSgpOyAvLyBBU0NJSS1zYWZlXG4gICAgICAgICAgc3RhdGUgPSAnc2NoZW1lJztcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHNjaGVtZS4nKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgICBpZiAoYyAmJiBBTFBIQU5VTUVSSUMudGVzdChjKSkge1xuICAgICAgICAgIGJ1ZmZlciArPSBjLnRvTG93ZXJDYXNlKCk7IC8vIEFTQ0lJLXNhZmVcbiAgICAgICAgfSBlbHNlIGlmICgnOicgPT0gYykge1xuICAgICAgICAgIHRoaXMuX3NjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUmVsYXRpdmVTY2hlbWUodGhpcy5fc2NoZW1lKSkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWxhdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc1JlbGF0aXZlICYmIGJhc2UgJiYgYmFzZS5fc2NoZW1lID09IHRoaXMuX3NjaGVtZSkge1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgb3IgYXV0aG9yaXR5JztcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBmaXJzdCBzbGFzaCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3NjaGVtZSBkYXRhJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMpIHtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycignQ29kZSBwb2ludCBub3QgYWxsb3dlZCBpbiBzY2hlbWU6ICcgKyBjKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUgZGF0YSc6XG4gICAgICAgIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBYWFggZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVtZURhdGEgKz0gcGVyY2VudEVzY2FwZShjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ25vIHNjaGVtZSc6XG4gICAgICAgIGlmICghYmFzZSB8fCAhaXNSZWxhdGl2ZVNjaGVtZShiYXNlLl9zY2hlbWUpKSB7XG4gICAgICAgICAgZXJyKCdNaXNzaW5nIHNjaGVtZS4nKTtcbiAgICAgICAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBvciBhdXRob3JpdHknOlxuICAgICAgICBpZiAoJy8nID09IGMgJiYgJy8nID09IGlucHV0W2N1cnNvciArIDFdKSB7XG4gICAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0V4cGVjdGVkIC8sIGdvdDogJyArIGMpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgICB0aGlzLl9pc1JlbGF0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCdmaWxlJyAhPSB0aGlzLl9zY2hlbWUpIHRoaXMuX3NjaGVtZSA9IGJhc2UuX3NjaGVtZTtcbiAgICAgICAgaWYgKEVPRiA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IGJhc2UuX3BvcnQ7XG4gICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICB0aGlzLl9xdWVyeSA9IGJhc2UuX3F1ZXJ5O1xuICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSBiYXNlLl9wYXNzd29yZDtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2UgaWYgKCcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKCdcXFxcJyA9PSBjKSBlcnIoJ1xcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LicpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSAnPyc7XG4gICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSBiYXNlLl9xdWVyeTtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCA9ICcjJztcbiAgICAgICAgICB0aGlzLl91c2VybmFtZSA9IGJhc2UuX3VzZXJuYW1lO1xuICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXh0QyA9IGlucHV0W2N1cnNvciArIDFdO1xuICAgICAgICAgIHZhciBuZXh0TmV4dEMgPSBpbnB1dFtjdXJzb3IgKyAyXTtcbiAgICAgICAgICBpZiAoJ2ZpbGUnICE9IHRoaXMuX3NjaGVtZSB8fCAhQUxQSEEudGVzdChjKSB8fCBuZXh0QyAhPSAnOicgJiYgbmV4dEMgIT0gJ3wnIHx8IEVPRiAhPSBuZXh0TmV4dEMgJiYgJy8nICE9IG5leHROZXh0QyAmJiAnXFxcXCcgIT0gbmV4dE5leHRDICYmICc/JyAhPSBuZXh0TmV4dEMgJiYgJyMnICE9IG5leHROZXh0Qykge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgICB0aGlzLl9wb3J0ID0gYmFzZS5fcG9ydDtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhdGgucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBzbGFzaCc6XG4gICAgICAgIGlmICgnLycgPT0gYyB8fCAnXFxcXCcgPT0gYykge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdmaWxlJyA9PSB0aGlzLl9zY2hlbWUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2ZpbGUgaG9zdCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgnZmlsZScgIT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0ID0gYmFzZS5faG9zdDtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgZmlyc3Qgc2xhc2gnOlxuICAgICAgICBpZiAoJy8nID09IGMpIHtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoXCJFeHBlY3RlZCAnLycsIGdvdDogXCIgKyBjKTtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJzpcbiAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgaWYgKCcvJyAhPSBjKSB7XG4gICAgICAgICAgZXJyKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiICsgYyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc6XG4gICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdFeHBlY3RlZCBhdXRob3JpdHksIGdvdDogJyArIGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHknOlxuICAgICAgICBpZiAoJ0AnID09IGMpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSB7XG4gICAgICAgICAgICBlcnIoJ0AgYWxyZWFkeSBzZWVuLicpO1xuICAgICAgICAgICAgYnVmZmVyICs9ICclNDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY3AgPSBidWZmZXJbaV07XG4gICAgICAgICAgICBpZiAoJ1xcdCcgPT0gY3AgfHwgJ1xcbicgPT0gY3AgfHwgJ1xccicgPT0gY3ApIHtcbiAgICAgICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gYXV0aG9yaXR5LicpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFhYWCBjaGVjayBVUkwgY29kZSBwb2ludHNcbiAgICAgICAgICAgIGlmICgnOicgPT0gY3AgJiYgbnVsbCA9PT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGVtcEMgPSBwZXJjZW50RXNjYXBlKGNwKTtcbiAgICAgICAgICAgIG51bGwgIT09IHRoaXMuX3Bhc3N3b3JkID8gdGhpcy5fcGFzc3dvcmQgKz0gdGVtcEMgOiB0aGlzLl91c2VybmFtZSArPSB0ZW1wQztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMpIHtcbiAgICAgICAgICBjdXJzb3IgLT0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdob3N0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmlsZSBob3N0JzpcbiAgICAgICAgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KGJ1ZmZlclswXSkgJiYgKGJ1ZmZlclsxXSA9PSAnOicgfHwgYnVmZmVyWzFdID09ICd8JykpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgcGF0aCBzdGFydCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdob3N0JzpcbiAgICAgIGNhc2UgJ2hvc3RuYW1lJzpcbiAgICAgICAgaWYgKCc6JyA9PSBjICYmICFzZWVuQnJhY2tldCkge1xuICAgICAgICAgIC8vIFhYWCBob3N0IHBhcnNpbmdcbiAgICAgICAgICB0aGlzLl9ob3N0ID0gSUROQVRvQVNDSUkuY2FsbCh0aGlzLCBidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ3BvcnQnO1xuICAgICAgICAgIGlmICgnaG9zdG5hbWUnID09IHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICBpZiAoJ1snID09IGMpIHtcbiAgICAgICAgICAgIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCddJyA9PSBjKSB7XG4gICAgICAgICAgICBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0ludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiAnICsgYyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3BvcnQnOlxuICAgICAgICBpZiAoL1swLTldLy50ZXN0KGMpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMgfHwgc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGlmICgnJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICBpZiAodGVtcCAhPSByZWxhdGl2ZVt0aGlzLl9zY2hlbWVdKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB0ZW1wICsgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGggc3RhcnQnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogJyArIGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludmFsaWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUgcGF0aCBzdGFydCc6XG4gICAgICAgIGlmICgnXFxcXCcgPT0gYykgZXJyKFwiJ1xcXFwnIG5vdCBhbGxvd2VkIGluIHBhdGguXCIpO1xuICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoJztcbiAgICAgICAgaWYgKCcvJyAhPSBjICYmICdcXFxcJyAhPSBjKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlbGF0aXZlIHBhdGgnOlxuICAgICAgICBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgIXN0YXRlT3ZlcnJpZGUgJiYgKCc/JyA9PSBjIHx8ICcjJyA9PSBjKSkge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIG5vdCBhbGxvd2VkIGluIHJlbGF0aXZlIHBhdGguJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0bXA7XG4gICAgICAgICAgaWYgKHRtcCA9IHJlbGF0aXZlUGF0aERvdE1hcHBpbmdbYnVmZmVyLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB0bXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnLi4nID09IGJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgICB0aGlzLl9wYXRoLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJy4nID09IGJ1ZmZlciAmJiAnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCcuJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lICYmIHRoaXMuX3BhdGgubGVuZ3RoID09IDAgJiYgYnVmZmVyLmxlbmd0aCA9PSAyICYmIEFMUEhBLnRlc3QoYnVmZmVyWzBdKSAmJiBidWZmZXJbMV0gPT0gJ3wnKSB7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlclswXSArICc6JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhdGgucHVzaChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoJz8nID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gJz8nO1xuICAgICAgICAgICAgc3RhdGUgPSAncXVlcnknO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJyMnID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RXNjYXBlKGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdxdWVyeSc6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiAnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChFT0YgIT0gYyAmJiAnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIHRoaXMuX3F1ZXJ5ICs9IHBlcmNlbnRFc2NhcGVRdWVyeShjKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZnJhZ21lbnQnOlxuICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGN1cnNvcisrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICB0aGlzLl9zY2hlbWUgPSAnJztcbiAgdGhpcy5fc2NoZW1lRGF0YSA9ICcnO1xuICB0aGlzLl91c2VybmFtZSA9ICcnO1xuICB0aGlzLl9wYXNzd29yZCA9IG51bGw7XG4gIHRoaXMuX2hvc3QgPSAnJztcbiAgdGhpcy5fcG9ydCA9ICcnO1xuICB0aGlzLl9wYXRoID0gW107XG4gIHRoaXMuX3F1ZXJ5ID0gJyc7XG4gIHRoaXMuX2ZyYWdtZW50ID0gJyc7XG4gIHRoaXMuX2lzSW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLl9pc1JlbGF0aXZlID0gZmFsc2U7XG59XG5cbi8vIERvZXMgbm90IHByb2Nlc3MgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy5cbi8vIERvZXMgbm90IGhhbmRsZSBlbmNvZGluZyBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlci5cbmZ1bmN0aW9uIFVSTCh1cmwsIGJhc2UgLyogLCBlbmNvZGluZyAqLykge1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkICYmICEoYmFzZSBpbnN0YW5jZW9mIFVSTCkpIGJhc2UgPSBuZXcgVVJMKFN0cmluZyhiYXNlKSk7XG5cbiAgdGhpcy5fdXJsID0gdXJsO1xuICBjbGVhci5jYWxsKHRoaXMpO1xuXG4gIHZhciBpbnB1dCA9IHVybC5yZXBsYWNlKC9eWyBcXHRcXHJcXG5cXGZdK3xbIFxcdFxcclxcblxcZl0rJC9nLCAnJyk7XG4gIC8vIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04J1xuXG4gIHBhcnNlLmNhbGwodGhpcywgaW5wdXQsIG51bGwsIGJhc2UpO1xufVxuXG5VUkwucHJvdG90eXBlID0ge1xuICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHJlZjtcbiAgfSxcbiAgZ2V0IGhyZWYoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuIHRoaXMuX3VybDtcblxuICAgIHZhciBhdXRob3JpdHkgPSAnJztcbiAgICBpZiAoJycgIT0gdGhpcy5fdXNlcm5hbWUgfHwgbnVsbCAhPSB0aGlzLl9wYXNzd29yZCkge1xuICAgICAgYXV0aG9yaXR5ID0gdGhpcy5fdXNlcm5hbWUgKyAobnVsbCAhPSB0aGlzLl9wYXNzd29yZCA/ICc6JyArIHRoaXMuX3Bhc3N3b3JkIDogJycpICsgJ0AnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sICsgKHRoaXMuX2lzUmVsYXRpdmUgPyAnLy8nICsgYXV0aG9yaXR5ICsgdGhpcy5ob3N0IDogJycpICsgdGhpcy5wYXRobmFtZSArIHRoaXMuX3F1ZXJ5ICsgdGhpcy5fZnJhZ21lbnQ7XG4gIH0sXG4gIHNldCBocmVmKGhyZWYpIHtcbiAgICBjbGVhci5jYWxsKHRoaXMpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgaHJlZik7XG4gIH0sXG5cbiAgZ2V0IHByb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOic7XG4gIH0sXG4gIHNldCBwcm90b2NvbChwcm90b2NvbCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIHByb3RvY29sICsgJzonLCAnc2NoZW1lIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSW52YWxpZCA/ICcnIDogdGhpcy5fcG9ydCA/IHRoaXMuX2hvc3QgKyAnOicgKyB0aGlzLl9wb3J0IDogdGhpcy5faG9zdDtcbiAgfSxcbiAgc2V0IGhvc3QoaG9zdCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIGhvc3QsICdob3N0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3RuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICB9LFxuICBzZXQgaG9zdG5hbWUoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBob3N0bmFtZSwgJ2hvc3RuYW1lJyk7XG4gIH0sXG5cbiAgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH0sXG4gIHNldCBwb3J0KHBvcnQpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBwb3J0LCAncG9ydCcpO1xuICB9LFxuXG4gIGdldCBwYXRobmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkID8gJycgOiB0aGlzLl9pc1JlbGF0aXZlID8gJy8nICsgdGhpcy5fcGF0aC5qb2luKCcvJykgOiB0aGlzLl9zY2hlbWVEYXRhO1xuICB9LFxuICBzZXQgcGF0aG5hbWUocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgdGhpcy5fcGF0aCA9IFtdO1xuICAgIHBhcnNlLmNhbGwodGhpcywgcGF0aG5hbWUsICdyZWxhdGl2ZSBwYXRoIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IHNlYXJjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9xdWVyeSB8fCAnPycgPT0gdGhpcy5fcXVlcnkgPyAnJyA6IHRoaXMuX3F1ZXJ5O1xuICB9LFxuICBzZXQgc2VhcmNoKHNlYXJjaCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICB0aGlzLl9xdWVyeSA9ICc/JztcbiAgICBpZiAoJz8nID09IHNlYXJjaFswXSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgc2VhcmNoLCAncXVlcnknKTtcbiAgfSxcblxuICBnZXQgc2VhcmNoUGFyYW1zKCkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuc2VhcmNoKTtcbiAgfSxcblxuICBnZXQgaGFzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9mcmFnbWVudCB8fCAnIycgPT0gdGhpcy5fZnJhZ21lbnQgPyAnJyA6IHRoaXMuX2ZyYWdtZW50O1xuICB9LFxuICBzZXQgaGFzaChoYXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuO1xuICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgIGlmICgnIycgPT0gaGFzaFswXSkgaGFzaCA9IGhhc2guc2xpY2UoMSk7XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBoYXNoLCAnZnJhZ21lbnQnKTtcbiAgfSxcblxuICBnZXQgb3JpZ2luKCkge1xuICAgIHZhciBob3N0O1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX3NjaGVtZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBqYXZhc2NyaXB0OiBHZWNrbyByZXR1cm5zIFN0cmluZyhcIlwiKSwgV2ViS2l0L0JsaW5rIFN0cmluZyhcIm51bGxcIilcbiAgICAvLyBHZWNrbyB0aHJvd3MgZXJyb3IgZm9yIFwiZGF0YTovL1wiXG4gICAgLy8gZGF0YTogR2Vja28gcmV0dXJucyBcIlwiLCBCbGluayByZXR1cm5zIFwiZGF0YTovL1wiLCBXZWJLaXQgcmV0dXJucyBcIm51bGxcIlxuICAgIC8vIEdlY2tvIHJldHVybnMgU3RyaW5nKFwiXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgLy8gV2ViS2l0L0JsaW5rIHJldHVybnMgU3RyaW5nKFwiU0NIRU1FOi8vXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgc3dpdGNoICh0aGlzLl9zY2hlbWUpIHtcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICBjYXNlICdqYXZhc2NyaXB0JzpcbiAgICAgIGNhc2UgJ21haWx0byc6XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOi8vJyArIGhvc3Q7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lcmljZi9jc3MtbWVkaWFxdWVyeVxuXG52YXIgUkVfTUVESUFfUVVFUlkgPSAvXig/Oihvbmx5fG5vdCk/XFxzKihbX2Etel1bX2EtejAtOS1dKil8KFxcKFteXFwpXStcXCkpKSg/OlxccyphbmRcXHMqKC4qKSk/JC9pLFxuICAgIFJFX01RX0VYUFJFU1NJT04gPSAvXlxcKFxccyooW19hLXotXVtfYS16MC05LV0qKVxccyooPzpcXDpcXHMqKFteXFwpXSspKT9cXHMqXFwpJC8sXG4gICAgUkVfTVFfRkVBVFVSRSA9IC9eKD86KG1pbnxtYXgpLSk/KC4rKS87XG5cbmZ1bmN0aW9uIF9tYXRjaGVzKG1lZGlhLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIF9wYXJzZVF1ZXJ5KG1lZGlhKS5zb21lKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHZhciBpbnZlcnNlID0gcXVlcnkuaW52ZXJzZTtcblxuICAgIHZhciB0eXBlTWF0Y2ggPSBxdWVyeS50eXBlID09PSAnYWxsJyB8fCB2YWx1ZXMudHlwZSA9PT0gcXVlcnkudHlwZTtcblxuICAgIGlmICh0eXBlTWF0Y2ggJiYgaW52ZXJzZSB8fCAhKHR5cGVNYXRjaCB8fCBpbnZlcnNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBleHByZXNzaW9uc01hdGNoID0gcXVlcnkuZXhwcmVzc2lvbnMuZXZlcnkoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBmZWF0dXJlID0gZXhwcmVzc2lvbi5mZWF0dXJlLFxuICAgICAgICAgIG1vZGlmaWVyID0gZXhwcmVzc2lvbi5tb2RpZmllcixcbiAgICAgICAgICBleHBWYWx1ZSA9IGV4cHJlc3Npb24udmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZmVhdHVyZV07XG5cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjYXNlICdoZWlnaHQnOlxuICAgICAgICAgIGV4cFZhbHVlID0gcGFyc2VGbG9hdChleHBWYWx1ZSk7XG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBleHBWYWx1ZTtcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPD0gZXhwVmFsdWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBleHBWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBleHByZXNzaW9uc01hdGNoICYmICFpbnZlcnNlIHx8ICFleHByZXNzaW9uc01hdGNoICYmIGludmVyc2U7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gX3BhcnNlUXVlcnkobWVkaWEpIHtcbiAgcmV0dXJuIG1lZGlhLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkudHJpbSgpO1xuXG4gICAgdmFyIGNhcHR1cmVzID0gcXVlcnkubWF0Y2goUkVfTUVESUFfUVVFUlkpO1xuXG4gICAgaWYgKCFjYXB0dXJlcykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kaWZpZXIgPSBjYXB0dXJlc1sxXSxcbiAgICAgICAgdHlwZSA9IGNhcHR1cmVzWzJdLFxuICAgICAgICBleHByZXNzaW9ucyA9ICgoY2FwdHVyZXNbM10gfHwgJycpICsgKGNhcHR1cmVzWzRdIHx8ICcnKSkudHJpbSgpLFxuICAgICAgICBwYXJzZWQgPSB7fTtcblxuICAgIHBhcnNlZC5pbnZlcnNlID0gISFtb2RpZmllciAmJiBtb2RpZmllci50b0xvd2VyQ2FzZSgpID09PSAnbm90JztcbiAgICBwYXJzZWQudHlwZSA9IHR5cGUgPyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAnYWxsJztcblxuICAgIGlmICghZXhwcmVzc2lvbnMpIHtcbiAgICAgIHBhcnNlZC5leHByZXNzaW9ucyA9IFtdO1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICBleHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hdGNoKC9cXChbXlxcKV0rXFwpL2cpO1xuXG4gICAgaWYgKCFleHByZXNzaW9ucykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICBwYXJzZWQuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBjYXB0dXJlcyA9IGV4cHJlc3Npb24ubWF0Y2goUkVfTVFfRVhQUkVTU0lPTik7XG5cbiAgICAgIGlmICghY2FwdHVyZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZlYXR1cmUgPSBjYXB0dXJlc1sxXS50b0xvd2VyQ2FzZSgpLm1hdGNoKFJFX01RX0ZFQVRVUkUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RpZmllcjogZmVhdHVyZVsxXSxcbiAgICAgICAgZmVhdHVyZTogZmVhdHVyZVsyXSxcbiAgICAgICAgdmFsdWU6IGNhcHR1cmVzWzJdXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBtYXRjaE1lZGlhKG1lZGlhKSB7XG4gIHZhciBtcWwgPSB7XG4gICAgbWF0Y2hlczogZmFsc2UsXG4gICAgbWVkaWE6IG1lZGlhXG4gIH07XG5cbiAgaWYgKG1lZGlhID09PSAnJykge1xuICAgIG1xbC5tYXRjaGVzID0gdHJ1ZTtcbiAgICByZXR1cm4gbXFsO1xuICB9XG5cbiAgbXFsLm1hdGNoZXMgPSBfbWF0Y2hlcyhtZWRpYSwge1xuICAgIHR5cGU6ICdzY3JlZW4nLFxuICAgIHdpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLFxuICAgIGhlaWdodDogd2luZG93LnNjcmVlbi5oZWlnaHRcbiAgfSk7XG5cbiAgcmV0dXJuIG1xbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaE1lZGlhO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9OztcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZGVmaW5lLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIGRlZmluZShuYW1lLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgaWYgKGRlcHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICBkZXBzID0gW107XG4gICAgfVxuXG4gICAgbW9kdWxlc1tuYW1lXSA9IHtcbiAgICAgIGZhY3Rvcnk6IGZhY3RvcnksXG4gICAgICBkZXBzOiBkZXBzLFxuICAgICAgbW9kdWxlOiB7IGV4cG9ydHM6IHt9IH0sXG4gICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZGVmaW5lO1xufTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL3JlcXVpcmUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIHJlcXVpcmUobmFtZSkge1xuICAgIHZhciBtb2QgPSBtb2R1bGVzW25hbWVdO1xuXG4gICAgaWYgKG1vZCAmJiBtb2QuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIG1vZC5tb2R1bGUuZXhwb3J0cztcbiAgICB9XG5cbiAgICBpZiAoIW1vZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJpbmcgdW5rbm93biBtb2R1bGUgXCInICsgbmFtZSArICdcIicpO1xuICAgIH1cblxuICAgIGlmIChtb2QuaGFzRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyaW5nIG1vZHVsZSBcIicgKyBuYW1lICsgJ1wiIHdoaWNoIHRocmV3IGFuIGV4Y2VwdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBtb2QuZmFjdG9yeShyZXF1aXJlLCBtb2QubW9kdWxlLmV4cG9ydHMsIG1vZC5tb2R1bGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG1vZC5oYXNFcnJvciA9IHRydWU7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kLm1vZHVsZS5leHBvcnRzO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVpcmU7XG59O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9kb3duZ3JhZGUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfc2VtdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zZW12ZXIgKi8gMTApO1xuXG52YXIgX3NlbXZlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZW12ZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJzaW9uKHYpIHtcbiAgaWYgKHYgPT0gJyonKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cbiAgdiA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAnJztcbiAgdmFyIHNwbGl0ID0gdi5zcGxpdCgnLicpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoaSA8IDMpIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBzcGxpdFtpXSA9PT0gJ3N0cmluZycgJiYgc3BsaXRbaV0gPyBzcGxpdFtpXSA6ICcwJztcbiAgICByZXN1bHQucHVzaChzKTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJy4nKTtcbn0gLyogZ2xvYmFsIFdYRW52aXJvbm1lbnQgKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3Ioa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IHRydWUsXG4gICAgZXJyb3JUeXBlOiAxLFxuICAgIGNvZGU6IDEwMDBcbiAgfTtcbiAgdmFyIGdldE1zZyA9IGZ1bmN0aW9uIGdldE1zZyhrZXksIHZhbCwgY3JpdGVyaWEpIHtcbiAgICByZXR1cm4gJ0Rvd25ncmFkZVsnICsga2V5ICsgJ10gOjogZGV2aWNlSW5mbyAnICsgdmFsICsgJyBtYXRjaGVkIGNyaXRlcmlhICcgKyBjcml0ZXJpYTtcbiAgfTtcbiAgdmFyIF9rZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoX2tleS5pbmRleE9mKCdvc3ZlcnNpb24nKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDAxO1xuICB9IGVsc2UgaWYgKF9rZXkuaW5kZXhPZignYXBwdmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDI7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCd3ZWV4dmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDM7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDQ7XG4gIH1cblxuICByZXN1bHQuZXJyb3JNZXNzYWdlID0gZ2V0TXNnKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogY29uZmlnXG4gKlxuICoge1xuICogICBpb3M6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgb3NWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBhcHBWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICB3ZWV4VmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgZGV2aWNlTW9kZWw6IFsnbW9kZWxBJywgJ21vZGVsQicsIC4uLl1cbiAqICAgfVxuICogfVxuICpcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uZmlnKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IGZhbHNlXG4gIH07XG5cbiAgdmFyIGRldmljZUluZm8gPSBXWEVudmlyb25tZW50O1xuXG4gIHZhciBwbGF0Zm9ybSA9IGRldmljZUluZm8ucGxhdGZvcm0gfHwgJ3Vua25vdyc7XG4gIHZhciBkUGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgY09iaiA9IGNvbmZpZ1tkUGxhdGZvcm1dIHx8IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gZGV2aWNlSW5mbykge1xuICAgIHZhciBrZXkgPSBpO1xuICAgIHZhciBrZXlMb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciB2YWwgPSBkZXZpY2VJbmZvW2ldO1xuICAgIHZhciBpc1ZlcnNpb24gPSBrZXlMb3dlci5pbmRleE9mKCd2ZXJzaW9uJykgPj0gMDtcbiAgICB2YXIgaXNEZXZpY2VNb2RlbCA9IGtleUxvd2VyLmluZGV4T2YoJ2RldmljZW1vZGVsJykgPj0gMDtcbiAgICB2YXIgY3JpdGVyaWEgPSBjT2JqW2ldO1xuXG4gICAgaWYgKGNyaXRlcmlhICYmIGlzVmVyc2lvbikge1xuICAgICAgdmFyIGMgPSBub3JtYWxpemVWZXJzaW9uKGNyaXRlcmlhKTtcbiAgICAgIHZhciBkID0gbm9ybWFsaXplVmVyc2lvbihkZXZpY2VJbmZvW2ldKTtcblxuICAgICAgaWYgKF9zZW12ZXIyLmRlZmF1bHQuc2F0aXNmaWVzKGQsIGMpKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEZXZpY2VNb2RlbCkge1xuICAgICAgdmFyIF9jcml0ZXJpYSA9IEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpID8gY3JpdGVyaWEgOiBbY3JpdGVyaWFdO1xuXG4gICAgICBpZiAoX2NyaXRlcmlhLmluZGV4T2YodmFsKSA+PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9fd2VleF9yZXF1aXJlX18pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgbmF0aXZlSW5zdGFuY2VXcmFwID0gX193ZWV4X3JlcXVpcmVfXygnQHdlZXgtbW9kdWxlL2luc3RhbmNlV3JhcCcpO1xuICAgIHZhciByZXN1bHQgPSBjaGVjayhjb25maWcpO1xuICAgIGlmIChyZXN1bHQuaXNEb3duZ3JhZGUpIHtcbiAgICAgIG5hdGl2ZUluc3RhbmNlV3JhcC5lcnJvcihyZXN1bHQuZXJyb3JUeXBlLCByZXN1bHQuY29kZSwgcmVzdWx0LmVycm9yTWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9zZW12ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHNhdGlzZmllczogZnVuY3Rpb24gc2F0aXNmaWVzKGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIHJlZ2V4ID0gLyhcXFcrKT8oW1xcZHwuXSspLztcblxuICAgIGlmICgodHlwZW9mIGxlZnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxlZnQpKSArICh0eXBlb2YgcmlnaHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHJpZ2h0KSkgIT0gJ3N0cmluZ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyaWdodCA9PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBhcnIgPSByaWdodC5tYXRjaChyZWdleCk7XG4gICAgdmFyIGEgPSBsZWZ0LnNwbGl0KCcuJyksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBiID0gYXJyWzJdLnNwbGl0KCcuJyksXG4gICAgICAgIGxlbiA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cbiAgICB2YXIgZmxhZyA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgaWYgKGFbX2ldICYmICFiW19pXSAmJiBwYXJzZUludChhW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA+IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGJbX2ldICYmICFhW19pXSAmJiBwYXJzZUludChiW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA8IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYXJyWzFdKSB7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc8PSc6XG4gICAgICAgIGlmIChmbGFnICE9PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgaWYgKGZsYWcgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZG9jdW1lbnQud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbWl0dGVyICovIDEpO1xuXG52YXIgX2VtaXR0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW1pdHRlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBET01fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9kb20nO1xudmFyIFZJU0lCTEUgPSAndmlzaWJsZSc7XG52YXIgSElEREVOID0gJ2hpZGRlbic7XG52YXIgVklTSUJJTElUWV9DSEFOR0VfRVZFTlQgPSAndmlzaWJpbGl0eWNoYW5nZSc7XG5cbmZ1bmN0aW9uIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCkge1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50KCd2aWV3YXBwZWFyJywgZnVuY3Rpb24gKGUpIHtcbiAgICBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPSBWSVNJQkxFO1xuICAgIGUudHlwZSA9IFZJU0lCSUxJVFlfQ0hBTkdFX0VWRU5UO1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnQoJ3ZpZXdkaXNhcHBlYXInLCBmdW5jdGlvbiAoZSkge1xuICAgIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9IEhJRERFTjtcbiAgICBlLnR5cGUgPSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVDtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9keUFwcGVhckxpc3RlbmVyKGRvY3VtZW50KSB7XG4gIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudCgndmlld2FwcGVhcicpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnQoJ3ZpZXdkaXNhcHBlYXInKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCkge1xuICAvLyBBZGQgdzNjIGV2ZW50c1xuICB2YXIgZG9jdW1lbnRFbWl0dGVyID0gbmV3IF9lbWl0dGVyMi5kZWZhdWx0KCk7XG4gIHZhciBoYXNWaXNpYmlsaXR5RXZlbnRQZW5kaW5nID0gZmFsc2U7XG5cbiAgLy8gV2VleCBmcmVlemVkIHRoZSBkb2N1bWVudCBtYXliZSB0aHJvdyBlcnJvclxuICB0cnkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVmlzaWJpbGl0eUV2ZW50UGVuZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50RW1pdHRlci5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICByZW1vdmVCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnRFbWl0dGVyLm9mZih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZG9jdW1lbnRFbWl0dGVyLmVtaXQoZS50eXBlLCBlKTtcbiAgICB9O1xuXG4gICAgLy8gRm9udEZhY2VcbiAgICBkb2N1bWVudC5mb250cyA9IHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKGZvbnRGYWNlKSB7XG4gICAgICAgIHZhciBkb21Nb2R1bGUgPSBfX3dlZXhfcmVxdWlyZV9fKERPTV9NT0RVTEUpO1xuICAgICAgICBkb21Nb2R1bGUuYWRkUnVsZSgnZm9udEZhY2UnLCB7XG4gICAgICAgICAgZm9udEZhbWlseTogZm9udEZhY2UuZmFtaWx5LFxuICAgICAgICAgIHNyYzogZm9udEZhY2Uuc291cmNlIC8vIHVybCgndXJpJykgOiBzaW5nbGUgcXVvdGVzIGFyZSByZXF1aXJlZCBhcm91bmQgdXJpLCBhbmQgZG91YmxlIHF1b3RlcyBjYW4gbm90IHdvcmsgaW4gd2VleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB2aXNpYmlsaXR5IHN0YXRlXG4gICAgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID0gVklTSUJMRTtcblxuICAgIC8vIEhpamFjayB0aGUgb3JpZ2luIGNyZWF0ZUJvZHlcbiAgICB2YXIgb3JpZ2luQ3JlYXRlQm9keSA9IGRvY3VtZW50LmNyZWF0ZUJvZHk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjcmVhdGVCb2R5Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICB2YXIgYm9keSA9IG9yaWdpbkNyZWF0ZUJvZHkuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKGhhc1Zpc2liaWxpdHlFdmVudFBlbmRpbmcpIHtcbiAgICAgICAgICBhZGRCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib2R5O1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9sb2NhdGlvbi53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE9DQVRJT05fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9sb2NhdGlvbic7XG52YXIgTkFWSUdBVE9SX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvbmF2aWdhdG9yJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXywgbG9jYXRpb24pIHtcbiAgbG9jYXRpb24uYXNzaWduID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICB3ZWV4TmF2aWdhdG9yLnB1c2goe1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBhbmltYXRlZDogJ3RydWUnXG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9KTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZXBsYWNlID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TG9jYXRpb24gPSBfX3dlZXhfcmVxdWlyZV9fKExPQ0FUSU9OX01PRFVMRSk7XG4gICAgd2VleExvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZWxvYWQgPSBmdW5jdGlvbiAoZm9yY2VSZWxvYWQpIHtcbiAgICB2YXIgd2VleExvY2F0aW9uID0gX193ZWV4X3JlcXVpcmVfXyhMT0NBVElPTl9NT0RVTEUpO1xuICAgIHdlZXhMb2NhdGlvbi5yZWxvYWQoZm9yY2VSZWxvYWQpO1xuICB9O1xuXG4gIHJldHVybiBsb2NhdGlvbjtcbn07XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2ZldGNoLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBTVFJFQU1fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9zdHJlYW0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBQcm9taXNlKSB7XG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgfVxuICAgIC8vIEZJWE1FOiBJbiBzcGR5IHRoZSByZXNwb25zZSBoZWFkZXIgaGFzIG5hbWUgbGlrZSBcIjp2ZXJzaW9uXCIgdGhhdCBpcyBpbnZhbGlkXG4gICAgLy8gaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXFxeX2B8fl0vaS50ZXN0KG5hbWUpKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZScpO1xuICAgIC8vIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICB0aGlzLm9yaWdpbkhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMubWFwID0ge307XG5cbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV07XG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywnICsgdmFsdWUgOiB2YWx1ZTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbDtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IFtub3JtYWxpemVWYWx1ZSh2YWx1ZSldO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKTtcbiAgICB9XG4gICAgYm9keS5ib2R5VXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24gKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keTtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmICghYm9keSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBCb2R5SW5pdCB0eXBlJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgcmV0dXJuIHJlamVjdGVkID8gcmVqZWN0ZWQgOiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpO1xuICAgIH07XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbiAgdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ107XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICAgIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICBpZiAoUmVxdWVzdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihpbnB1dCkpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gaW5wdXQudXJsO1xuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdDtcbiAgICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IGlucHV0O1xuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ29taXQnO1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpO1xuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbDtcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbDtcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJyk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRCb2R5KGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhlYWRlcnMoeGhyKSB7XG4gICAgdmFyIGhlYWQgPSBuZXcgSGVhZGVycygpO1xuICAgIHZhciBwYWlycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHNwbGl0ID0gaGVhZGVyLnRyaW0oKS5zcGxpdCgnOicpO1xuICAgICAgdmFyIGtleSA9IHNwbGl0LnNoaWZ0KCkudHJpbSgpO1xuICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignOicpLnRyaW0oKTtcbiAgICAgIGhlYWQuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBoZWFkO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKTtcblxuICBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnN0YXR1cyA9ICdzdGF0dXMnIGluIG9wdGlvbnMgPyBvcHRpb25zLnN0YXR1cyA6IDIwMDtcbiAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJztcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJyc7XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbiAgUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pO1xuICB9O1xuXG4gIFJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMCwgc3RhdHVzVGV4dDogJycgfSk7XG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcic7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9O1xuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XTtcblxuICBSZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uICh1cmwsIHN0YXR1cykge1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7IGxvY2F0aW9uOiB1cmwgfSB9KTtcbiAgfTtcblxuICB2YXIgZmV0Y2ggPSBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVxdWVzdDtcbiAgICAgIGlmIChSZXF1ZXN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGlucHV0KSAmJiAhaW5pdCkge1xuICAgICAgICByZXF1ZXN0ID0gaW5wdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgJiYgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbkhlYWRlcnNcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBhcmFtcy5ib2R5ID0gcmVxdWVzdC5fYm9keUluaXQ7XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcy50eXBlID0gaW5pdCAmJiBpbml0LmRhdGFUeXBlID8gaW5pdC5kYXRhVHlwZSA6ICd0ZXh0JztcblxuICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcbiAgICAgIG5hdGl2ZUZldGNoKHBhcmFtcywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG4gICAgICAgICAgdmFyIGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycgPyByZXNwb25zZS5kYXRhIDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKGRhdGEsIHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7fSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmZXRjaDogZmV0Y2gsXG4gICAgSGVhZGVyczogSGVhZGVycyxcbiAgICBSZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIFJlc3BvbnNlOiBSZXNwb25zZVxuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMveG1saHR0cHJlcXVlc3Qud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgU1RSRUFNX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvc3RyZWFtJztcbnZhciBldmVudFRhcmdldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGV2ZW50LXRhcmdldC1zaGltICovIDIpO1xuXG52YXIgVU5TRU5UID0gMDtcbnZhciBPUEVORUQgPSAxO1xudmFyIEhFQURFUlNfUkVDRUlWRUQgPSAyO1xudmFyIExPQURJTkcgPSAzO1xudmFyIERPTkUgPSA0O1xuXG52YXIgWEhSX0VWRU5UUyA9IFsnYWJvcnQnLCAnZXJyb3InLCAnbG9hZCcsICdsb2Fkc3RhcnQnLCAncHJvZ3Jlc3MnLCAndGltZW91dCcsICdsb2FkZW5kJywgJ3JlYWR5c3RhdGVjaGFuZ2UnXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXykge1xuICB2YXIgWE1MSHR0cFJlcXVlc3QgPSBmdW5jdGlvbiAoX2V2ZW50VGFyZ2V0KSB7XG4gICAgX2luaGVyaXRzKFhNTEh0dHBSZXF1ZXN0LCBfZXZlbnRUYXJnZXQpO1xuXG4gICAgLy8gRXZlbnRUYXJnZXQgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGVzZSB0byBgbnVsbGAuXG4gICAgZnVuY3Rpb24gWE1MSHR0cFJlcXVlc3QoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWE1MSHR0cFJlcXVlc3QpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoWE1MSHR0cFJlcXVlc3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihYTUxIdHRwUmVxdWVzdCkpLmNhbGwodGhpcykpO1xuXG4gICAgICBfdGhpcy5VTlNFTlQgPSBVTlNFTlQ7XG4gICAgICBfdGhpcy5PUEVORUQgPSBPUEVORUQ7XG4gICAgICBfdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gSEVBREVSU19SRUNFSVZFRDtcbiAgICAgIF90aGlzLkxPQURJTkcgPSBMT0FESU5HO1xuICAgICAgX3RoaXMuRE9ORSA9IERPTkU7XG4gICAgICBfdGhpcy5yZWFkeVN0YXRlID0gVU5TRU5UO1xuICAgICAgX3RoaXMuc3RhdHVzID0gMDtcbiAgICAgIF90aGlzLnN0YXR1c1RleHQgPSAnJztcbiAgICAgIF90aGlzLnRpbWVvdXQgPSAwO1xuICAgICAgX3RoaXMuX2Fib3J0ZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgX3RoaXMuX21ldGhvZCA9IG51bGw7XG4gICAgICBfdGhpcy5fcmVzcG9uc2UgPSAnJztcbiAgICAgIF90aGlzLl91cmwgPSBudWxsO1xuICAgICAgX3RoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG5cbiAgICAgIF90aGlzLl9yZXNldCgpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhYTUxIdHRwUmVxdWVzdCwgW3tcbiAgICAgIGtleTogJ19yZXNldCcsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0KCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLlVOU0VOVDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gMDtcblxuICAgICAgICB0aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9oZWFkZXJzID0ge307XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlID0gJyc7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9ICcnO1xuICAgICAgICB0aGlzLl9zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHJldHVybiBudWxsIGlmIG5vIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLm1hcChmdW5jdGlvbiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJldHVybiBoZWFkZXJOYW1lICsgJzogJyArIGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgIH0pLmpvaW4oJ1xcclxcbicpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2dldFJlc3BvbnNlSGVhZGVyJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fbG93ZXJDYXNlUmVzcG9uc2VIZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnc2V0UmVxdWVzdEhlYWRlcicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT09IHRoaXMuT1BFTkVEKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBub3QgYmVlbiBvcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnb3BlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihtZXRob2QsIHVybCwgYXN5bmMpIHtcbiAgICAgICAgLyogT3RoZXIgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCAqL1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLlVOU0VOVCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG9wZW4sIGFscmVhZHkgc2VuZGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc3luYyAhPT0gdW5kZWZpbmVkICYmICFhc3luYykge1xuICAgICAgICAgIC8vIGFzeW5jIGlzIGRlZmF1bHRcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIGh0dHAgcmVxdWVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgYW4gZW1wdHkgdXJsJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFJlYWR5U3RhdGUodGhpcy5PUEVORUQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3NlbmQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLk9QRU5FRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdCBoYXMgbm90IGJlZW4gb3BlbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBzZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VudCA9IHRydWU7XG5cbiAgICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcblxuICAgICAgICBuYXRpdmVGZXRjaCh7XG4gICAgICAgICAgbWV0aG9kOiB0aGlzLl9tZXRob2QsXG4gICAgICAgICAgdXJsOiB0aGlzLl91cmwsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5faGVhZGVycyxcbiAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG5cbiAgICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICBfdGhpczIuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICBfdGhpczIuc2V0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgX3RoaXMyLl9yZXNwb25zZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoX3RoaXMyLl9yZXNwb25zZVR5cGUgPT09ICcnIHx8IF90aGlzMi5fcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuX3Jlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfdGhpczIuX2hhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgICAgICAgICBfdGhpczIuc2V0UmVhZHlTdGF0ZShfdGhpczIuRE9ORSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChwcm9ncmVzcykge1xuICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSBwcm9ncmVzcy5zdGF0dXM7XG4gICAgICAgICAgX3RoaXMyLnN0YXR1c1RleHQgPSBwcm9ncmVzcy5zdGF0dXNUZXh0O1xuICAgICAgICAgIF90aGlzMi5zZXRSZXNwb25zZUhlYWRlcnMocHJvZ3Jlc3MuaGVhZGVycyk7XG4gICAgICAgICAgX3RoaXMyLnNldFJlYWR5U3RhdGUocHJvZ3Jlc3MucmVhZHlTdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2Fib3J0JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gVE9ETzogV2VleCBuYXRpdmUgbm90IHN1cHBvcnQgYWJvcnQgbm93XG5cbiAgICAgICAgLy8gb25seSBjYWxsIG9ucmVhZHlzdGF0ZWNoYW5nZSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYWJvcnQsXG4gICAgICAgIC8vIGJlbG93IGxvZ2ljIGlzIHBlciBzcGVjXG4gICAgICAgIGlmICghKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5VTlNFTlQgfHwgdGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLk9QRU5FRCAmJiAhdGhpcy5fc2VudCB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkpIHtcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgICAgIHRoaXMuc2V0UmVhZHlTdGF0ZSh0aGlzLkRPTkUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGFnYWluIGFmdGVyLCBpbiBjYXNlIG1vZGlmaWVkIGluIGhhbmRsZXJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZXNwb25zZUhlYWRlcnMnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbDtcbiAgICAgICAgdmFyIGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwge307XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAobGNhc2VIZWFkZXJzLCBoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgbGNhc2VIZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgIHJldHVybiBsY2FzZUhlYWRlcnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZWFkeVN0YXRlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZWFkeVN0YXRlKG5ld1N0YXRlKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAncmVhZHlzdGF0ZWNoYW5nZScgfSk7XG4gICAgICAgIGlmIChuZXdTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdhYm9ydCcgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVkT3V0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICd0aW1lb3V0JyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdsb2FkJyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsgdHlwZTogJ2xvYWRlbmQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAncmVzcG9uc2VUeXBlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fc2VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldCB0aGUgXFwncmVzcG9uc2VUeXBlXFwnIHByb3BlcnR5IG9uIFxcJ1hNTEh0dHBSZXF1ZXN0XFwnOiBUaGUgJyArICdyZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdyZXNwb25zZVRleHQnLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXNwb25zZVR5cGUgIT09ICcnICYmIHRoaXMuX3Jlc3BvbnNlVHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGlzIG9ubHkgYXZhaWxhYmxlIGlmICdyZXNwb25zZVR5cGUnIFwiICsgKCdpcyBzZXQgdG8gXFwnXFwnIG9yIFxcJ3RleHRcXCcsIGJ1dCBpdCBpcyBcXCcnICsgdGhpcy5fcmVzcG9uc2VUeXBlICsgJ1xcJy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA8IExPQURJTkcpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3Jlc3BvbnNlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgcmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeVN0YXRlIDwgTE9BRElORyB8fCB0aGlzLl9oYXNFcnJvciA/ICcnIDogdGhpcy5fcmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBET05FKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gWE1MSHR0cFJlcXVlc3Q7XG4gIH0oZXZlbnRUYXJnZXQuYXBwbHkodW5kZWZpbmVkLCBYSFJfRVZFTlRTKSk7XG5cbiAgWE1MSHR0cFJlcXVlc3QuVU5TRU5UID0gVU5TRU5UO1xuICBYTUxIdHRwUmVxdWVzdC5PUEVORUQgPSBPUEVORUQ7XG4gIFhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQgPSBIRUFERVJTX1JFQ0VJVkVEO1xuICBYTUxIdHRwUmVxdWVzdC5MT0FESU5HID0gTE9BRElORztcbiAgWE1MSHR0cFJlcXVlc3QuRE9ORSA9IERPTkU7XG5cblxuICByZXR1cm4gWE1MSHR0cFJlcXVlc3Q7XG59O1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9ub2RlX21vZHVsZXMvLm5wbWluc3RhbGwvZXZlbnQtdGFyZ2V0LXNoaW0vMi4wLjAvZXZlbnQtdGFyZ2V0LXNoaW0vbGliL2N1c3RvbS1ldmVudC10YXJnZXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYVxuICogQGNvcHlyaWdodCAyMDE1IFRvcnUgTmFnYXNoaW1hLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBDb21tb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb21tb25zICovIDApXG52YXIgTElTVEVORVJTID0gQ29tbW9ucy5MSVNURU5FUlNcbnZhciBBVFRSSUJVVEUgPSBDb21tb25zLkFUVFJJQlVURVxudmFyIG5ld05vZGUgPSBDb21tb25zLm5ld05vZGVcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdldHMgYSBzcGVjaWZpZWQgYXR0cmlidXRlIGxpc3RlbmVyIGZyb20gYSBnaXZlbiBFdmVudFRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSBBbiBFdmVudFRhcmdldCBvYmplY3QgdG8gZ2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBbiBldmVudCB0eXBlIHRvIGdldC5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbnxudWxsfSBUaGUgZm91bmQgYXR0cmlidXRlIGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVMaXN0ZW5lcihldmVudFRhcmdldCwgdHlwZSkge1xuICAgIHZhciBub2RlID0gZXZlbnRUYXJnZXRbTElTVEVORVJTXVt0eXBlXVxuICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5saXN0ZW5lclxuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBTZXRzIGEgc3BlY2lmaWVkIGF0dHJpYnV0ZSBsaXN0ZW5lciB0byBhIGdpdmVuIEV2ZW50VGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIEFuIEV2ZW50VGFyZ2V0IG9iamVjdCB0byBzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEFuIGV2ZW50IHR5cGUgdG8gc2V0LlxuICogQHBhcmFtIHtmdW5jdGlvbnxudWxsfSBsaXN0ZW5lciAtIEEgbGlzdGVuZXIgdG8gYmUgc2V0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZUxpc3RlbmVyKGV2ZW50VGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbGlzdGVuZXIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbGlzdGVuZXIgPSBudWxsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB9XG5cbiAgICB2YXIgcHJldiA9IG51bGxcbiAgICB2YXIgbm9kZSA9IGV2ZW50VGFyZ2V0W0xJU1RFTkVSU11bdHlwZV1cbiAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLmtpbmQgPT09IEFUVFJJQlVURSkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBldmVudFRhcmdldFtMSVNURU5FUlNdW3R5cGVdID0gbm9kZS5uZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXYgPSBub2RlXG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5uZXh0XG4gICAgfVxuXG4gICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudFRhcmdldFtMSVNURU5FUlNdW3R5cGVdID0gbmV3Tm9kZShsaXN0ZW5lciwgQVRUUklCVVRFKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZShsaXN0ZW5lciwgQVRUUklCVVRFKVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgSW50ZXJmYWNlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRGVmaW5lcyBhbiBgRXZlbnRUYXJnZXRgIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhcyBgb25mb29iYXJgIGF0dHJpYnV0ZXMuXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gRXZlbnRUYXJnZXRCYXNlIC0gQSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIEV2ZW50VGFyZ2V0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdHlwZXMgLSBBIGxpc3Qgb2YgZXZlbnQgdHlwZXMgd2hpY2ggYXJlIGRlZmluZWQgYXMgYXR0cmlidXRlIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudFRhcmdldH0gVGhlIGRlZmluZWQgYEV2ZW50VGFyZ2V0YCBpbXBsZW1lbnRhdGlvbiB3aGljaCBoYXMgYXR0cmlidXRlIGxpc3RlbmVycy5cbiAqL1xubW9kdWxlLmV4cG9ydHMuZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQgPSBmdW5jdGlvbihFdmVudFRhcmdldEJhc2UsIHR5cGVzKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIGN1c3RvbSBldmVudCB0YXJnZXQuXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gRXZlbnRUYXJnZXQoKSB7XG4gICAgICAgIEV2ZW50VGFyZ2V0QmFzZS5jYWxsKHRoaXMpXG4gICAgfVxuXG4gICAgdmFyIGRlc2NyaXB0ZXIgPSB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9XG5cbiAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgZGVzY3JpcHRlcltcIm9uXCIgKyB0eXBlXSA9IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZUxpc3RlbmVyKHRoaXMsIHR5cGUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZUxpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudFRhcmdldEJhc2UucHJvdG90eXBlLCBkZXNjcmlwdGVyKVxuXG4gICAgcmV0dXJuIEV2ZW50VGFyZ2V0XG59XG5cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvbm9kZV9tb2R1bGVzLy5ucG1pbnN0YWxsL2V2ZW50LXRhcmdldC1zaGltLzIuMC4wL2V2ZW50LXRhcmdldC1zaGltL2xpYi9ldmVudC13cmFwcGVyLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIEBhdXRob3IgVG9ydSBOYWdhc2hpbWFcbiAqIEBjb3B5cmlnaHQgMjAxNSBUb3J1IE5hZ2FzaGltYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlcXVpcmVtZW50c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgY3JlYXRlVW5pcXVlS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb21tb25zICovIDApLmNyZWF0ZVVuaXF1ZUtleVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdHNudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUga2V5IG9mIHRoZSBmbGFnIHdoaWNoIGlzIHR1cm5lZCBvbiBieSBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCBtZXRob2QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgU1RPUF9JTU1FRElBVEVfUFJPUEFHQVRJT05fRkxBRyA9XG4gICAgY3JlYXRlVW5pcXVlS2V5KFwic3RvcF9pbW1lZGlhdGVfcHJvcGFnYXRpb25fZmxhZ1wiKVxuXG4vKipcbiAqIFRoZSBrZXkgb2YgdGhlIGZsYWcgd2hpY2ggaXMgdHVybmVkIG9uIGJ5IGBwcmV2ZW50RGVmYXVsdGAgbWV0aG9kLlxuICpcbiAqIEB0eXBlIHtzeW1ib2x8c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xudmFyIENBTkNFTEVEX0ZMQUcgPSBjcmVhdGVVbmlxdWVLZXkoXCJjYW5jZWxlZF9mbGFnXCIpXG5cbi8qKlxuICogVGhlIGtleSBvZiB0aGUgZmxhZyB0aGF0IGl0IGNhbm5vdCB1c2UgYHByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgUEFTU0lWRV9MSVNURU5FUl9GTEFHID0gY3JlYXRlVW5pcXVlS2V5KFwicGFzc2l2ZV9saXN0ZW5lcl9mbGFnXCIpXG5cbi8qKlxuICogVGhlIGtleSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICpcbiAqIEB0eXBlIHtzeW1ib2x8c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xudmFyIE9SSUdJTkFMX0VWRU5UID0gY3JlYXRlVW5pcXVlS2V5KFwib3JpZ2luYWxfZXZlbnRcIilcblxuLyoqXG4gKiBNZXRob2QgZGVmaW5pdGlvbnMgZm9yIHRoZSBldmVudCB3cmFwcGVyLlxuICpcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgd3JhcHBlclByb3RvdHlwZURlZmluaXRpb24gPSBPYmplY3QuZnJlZXplKHtcbiAgICBzdG9wUHJvcGFnYXRpb246IE9iamVjdC5mcmVlemUoe1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGUgPSB0aGlzW09SSUdJTkFMX0VWRU5UXVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pLFxuXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXNbU1RPUF9JTU1FRElBVEVfUFJPUEFHQVRJT05fRkxBR10gPSB0cnVlXG5cbiAgICAgICAgICAgIHZhciBlID0gdGhpc1tPUklHSU5BTF9FVkVOVF1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIHByZXZlbnREZWZhdWx0OiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbUEFTU0lWRV9MSVNURU5FUl9GTEFHXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuY2VsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXNbQ0FOQ0VMRURfRkxBR10gPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBlID0gdGhpc1tPUklHSU5BTF9FVkVOVF1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZS5wcmV2ZW50RGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSksXG5cbiAgICBkZWZhdWx0UHJldmVudGVkOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBkZWZhdWx0UHJldmVudGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbQ0FOQ0VMRURfRkxBR11cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pLFxufSlcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIEludGVyZmFjZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cy5TVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID0gU1RPUF9JTU1FRElBVEVfUFJPUEFHQVRJT05fRkxBR1xubW9kdWxlLmV4cG9ydHMuUEFTU0lWRV9MSVNURU5FUl9GTEFHID0gUEFTU0lWRV9MSVNURU5FUl9GTEFHXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBldmVudCB3cmFwcGVyLlxuICpcbiAqIFdlIGNhbm5vdCBtb2RpZnkgc2V2ZXJhbCBwcm9wZXJ0aWVzIG9mIGBFdmVudGAgb2JqZWN0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgd3JhcHBlci5cbiAqIFBsdXMsIHRoaXMgd3JhcHBlciBzdXBwb3J0cyBub24gYEV2ZW50YCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6IHN0cmluZ319IGV2ZW50IC0gQW4gb3JpZ2luYWwgZXZlbnQgdG8gY3JlYXRlIHRoZSB3cmFwcGVyLlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgLSBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoZSBldmVudC5cbiAqIEByZXR1cm5zIHtFdmVudH0gVGhlIGNyZWF0ZWQgd3JhcHBlci4gVGhpcyBvYmplY3QgaXMgaW1wbGVtZW50ZWQgYEV2ZW50YCBpbnRlcmZhY2UuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVFdmVudFdyYXBwZXIgPSBmdW5jdGlvbiBjcmVhdGVFdmVudFdyYXBwZXIoZXZlbnQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIHRpbWVTdGFtcCA9IChcbiAgICAgICAgdHlwZW9mIGV2ZW50LnRpbWVTdGFtcCA9PT0gXCJudW1iZXJcIiA/IGV2ZW50LnRpbWVTdGFtcCA6IERhdGUubm93KClcbiAgICApXG4gICAgdmFyIHByb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgICAgICAgdHlwZToge3ZhbHVlOiBldmVudC50eXBlLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgdGFyZ2V0OiB7dmFsdWU6IGV2ZW50VGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgY3VycmVudFRhcmdldDoge3ZhbHVlOiBldmVudFRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIGV2ZW50UGhhc2U6IHt2YWx1ZTogMiwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIGJ1YmJsZXM6IHt2YWx1ZTogQm9vbGVhbihldmVudC5idWJibGVzKSwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIGNhbmNlbGFibGU6IHt2YWx1ZTogQm9vbGVhbihldmVudC5jYW5jZWxhYmxlKSwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIHRpbWVTdGFtcDoge3ZhbHVlOiB0aW1lU3RhbXAsIGVudW1lcmFibGU6IHRydWV9LFxuICAgICAgICBpc1RydXN0ZWQ6IHt2YWx1ZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LFxuICAgIH1cbiAgICBwcm9wZXJ0eURlZmluaXRpb25bU1RPUF9JTU1FRElBVEVfUFJPUEFHQVRJT05fRkxBR10gPSB7dmFsdWU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZX1cbiAgICBwcm9wZXJ0eURlZmluaXRpb25bQ0FOQ0VMRURfRkxBR10gPSB7dmFsdWU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZX1cbiAgICBwcm9wZXJ0eURlZmluaXRpb25bUEFTU0lWRV9MSVNURU5FUl9GTEFHXSA9IHt2YWx1ZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltPUklHSU5BTF9FVkVOVF0gPSB7dmFsdWU6IGV2ZW50fVxuXG4gICAgLy8gRm9yIEN1c3RvbUV2ZW50LlxuICAgIGlmICh0eXBlb2YgZXZlbnQuZGV0YWlsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbi5kZXRhaWwgPSB7dmFsdWU6IGV2ZW50LmRldGFpbCwgZW51bWVyYWJsZTogdHJ1ZX1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgT2JqZWN0LmNyZWF0ZShldmVudCwgd3JhcHBlclByb3RvdHlwZURlZmluaXRpb24pLFxuICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25cbiAgICApXG59XG5cblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL3dlYnNvY2tldC53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgZXZlbnRUYXJnZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBldmVudC10YXJnZXQtc2hpbSAqLyAyKTtcblxudmFyIFdFQl9TT0NLRVRfTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS93ZWJTb2NrZXQnO1xuXG52YXIgQ09OTkVDVElORyA9IDA7XG52YXIgT1BFTiA9IDE7XG52YXIgQ0xPU0lORyA9IDI7XG52YXIgQ0xPU0VEID0gMztcblxudmFyIENMT1NFX05PUk1BTCA9IDEwMDA7XG5cbnZhciBXRUJTT0NLRVRfRVZFTlRTID0gWydjbG9zZScsICdlcnJvcicsICdtZXNzYWdlJywgJ29wZW4nXTtcblxuLyoqXG4gKiBFdmVudCBvYmplY3QgcGFzc2VkIHRvIHRoZSBgb25vcGVuYCwgYG9uY2xvc2VgLCBgb25tZXNzYWdlYCwgYG9uZXJyb3JgXG4gKiBjYWxsYmFja3Mgb2YgYFdlYlNvY2tldGAuXG4gKlxuICogVGhlIGB0eXBlYCBwcm9wZXJ0eSBpcyBcIm9wZW5cIiwgXCJjbG9zZVwiLCBcIm1lc3NhZ2VcIiwgXCJlcnJvclwiIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBJbiBjYXNlIG9mIFwibWVzc2FnZVwiLCB0aGUgYGRhdGFgIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBpbmNvbWluZyBkYXRhLlxuICovXG5cbnZhciBXZWJTb2NrZXRFdmVudCA9IGZ1bmN0aW9uIFdlYlNvY2tldEV2ZW50KHR5cGUsIGV2ZW50SW5pdERpY3QpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdlYlNvY2tldEV2ZW50KTtcblxuICB0aGlzLnR5cGUgPSB0eXBlLnRvU3RyaW5nKCk7XG4gIE9iamVjdC5hc3NpZ24odGhpcywgZXZlbnRJbml0RGljdCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fKSB7XG4gIC8qKlxuICAgKiBCcm93c2VyLWNvbXBhdGlibGUgV2ViU29ja2V0cyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJTb2NrZXRcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzXG4gICAqL1xuICB2YXIgV2ViU29ja2V0ID0gZnVuY3Rpb24gKF9ldmVudFRhcmdldCkge1xuICAgIF9pbmhlcml0cyhXZWJTb2NrZXQsIF9ldmVudFRhcmdldCk7XG5cbiAgICBmdW5jdGlvbiBXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJTb2NrZXQpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoV2ViU29ja2V0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoV2ViU29ja2V0KSkuY2FsbCh0aGlzKSk7XG5cbiAgICAgIHZhciB3ZWJzb2NrZXQgPSBfX3dlZXhfcmVxdWlyZV9fKFdFQl9TT0NLRVRfTU9EVUxFKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICB3ZWJzb2NrZXQuV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzKTtcbiAgICAgIF90aGlzLnJlYWR5U3RhdGUgPSBDT05ORUNUSU5HO1xuICAgICAgX3RoaXMud2Vic29ja2V0ID0gd2Vic29ja2V0O1xuXG4gICAgICB3ZWJzb2NrZXQub25tZXNzYWdlKGZ1bmN0aW9uIChldikge1xuICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBXZWJTb2NrZXRFdmVudCgnbWVzc2FnZScsIGV2KSk7XG4gICAgICB9KTtcblxuICAgICAgd2Vic29ja2V0Lm9ub3BlbihmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgX3RoaXMucmVhZHlTdGF0ZSA9IE9QRU47XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdvcGVuJykpO1xuICAgICAgfSk7XG5cbiAgICAgIHdlYnNvY2tldC5vbmNsb3NlKGZ1bmN0aW9uIChldikge1xuICAgICAgICBfdGhpcy5yZWFkeVN0YXRlID0gQ0xPU0VEO1xuICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBXZWJTb2NrZXRFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgY29kZTogZXYuY29kZSxcbiAgICAgICAgICByZWFzb246IGV2LnJlYXNvblxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgd2Vic29ja2V0Lm9uZXJyb3IoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdlcnJvcicsIGV2KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoV2ViU29ja2V0LCBbe1xuICAgICAga2V5OiAnY2xvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGNvZGUsIHJlYXNvbikge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBDTE9TSU5HIHx8IHRoaXMucmVhZHlTdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gQ0xPU0lORztcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZW5kJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZW5kKGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gV2ViU29ja2V0O1xuICB9KGV2ZW50VGFyZ2V0KFdFQlNPQ0tFVF9FVkVOVFMpKTtcblxuICBXZWJTb2NrZXQuQ09OTkVDVElORyA9IENPTk5FQ1RJTkc7XG4gIFdlYlNvY2tldC5PUEVOID0gT1BFTjtcbiAgV2ViU29ja2V0LkNMT1NJTkcgPSBDTE9TSU5HO1xuICBXZWJTb2NrZXQuQ0xPU0VEID0gQ0xPU0VEO1xuXG5cbiAgcmV0dXJuIFdlYlNvY2tldDtcbn07XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL3RpbWVyLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBUSU1FUl9NT0RVTEUgPSAnQHdlZXgtbW9kdWxlL3RpbWVyJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXywgZG9jdW1lbnQpIHtcbiAgdmFyIHNldFRpbWVvdXQgPSBmdW5jdGlvbiBzZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWUpIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgdGltZXIuc2V0VGltZW91dChoYW5kbGVyLCB0aW1lKTtcbiAgICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKTtcbiAgfTtcblxuICB2YXIgc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiBzZXRJbnRlcnZhbChoYW5kbGVyLCB0aW1lKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHRpbWVyLnNldEludGVydmFsKGhhbmRsZXIsIHRpbWUpO1xuICAgIHJldHVybiBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpO1xuICB9O1xuXG4gIHZhciBjbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBjbGVhclRpbWVvdXQobikge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5jbGVhclRpbWVvdXQobik7XG4gIH07XG5cbiAgdmFyIGNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbiBjbGVhckludGVydmFsKG4pIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgdGltZXIuY2xlYXJJbnRlcnZhbChuKTtcbiAgfTtcblxuICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHJldHVybiB0aW1lci5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxNik7XG4gIH07XG5cbiAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUobikge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5jbGVhclRpbWVvdXQobik7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzZXRUaW1lb3V0OiBzZXRUaW1lb3V0LFxuICAgIGNsZWFyVGltZW91dDogY2xlYXJUaW1lb3V0LFxuICAgIHNldEludGVydmFsOiBzZXRJbnRlcnZhbCxcbiAgICBjbGVhckludGVydmFsOiBjbGVhckludGVydmFsLFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZTogcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBjYW5jZWxBbmltYXRpb25GcmFtZVxuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2Jhc2U2NC53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBiYXNlNjQgPSB7fTtcbiAgdmFyIGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JztcblxuICAvLyBlbmNvZGVyXG4gIC8vIFtodHRwczovL2dpc3QuZ2l0aHViLmNvbS85OTkxNjZdIGJ5IFtodHRwczovL2dpdGh1Yi5jb20vbmlnbmFnXVxuICBiYXNlNjQuYnRvYSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciBzdHIgPSBTdHJpbmcoaW5wdXQpO1xuICAgIGZvciAoXG4gICAgLy8gaW5pdGlhbGl6ZSByZXN1bHQgYW5kIGNvdW50ZXJcbiAgICB2YXIgYmxvY2ssIGNoYXJDb2RlLCBpZHggPSAwLCBtYXAgPSBjaGFycywgb3V0cHV0ID0gJyc7XG4gICAgLy8gaWYgdGhlIG5leHQgc3RyIGluZGV4IGRvZXMgbm90IGV4aXN0OlxuICAgIC8vICAgY2hhbmdlIHRoZSBtYXBwaW5nIHRhYmxlIHRvIFwiPVwiXG4gICAgLy8gICBjaGVjayBpZiBkIGhhcyBubyBmcmFjdGlvbmFsIGRpZ2l0c1xuICAgIHN0ci5jaGFyQXQoaWR4IHwgMCkgfHwgKG1hcCA9ICc9JywgaWR4ICUgMSk7XG4gICAgLy8gXCI4IC0gaWR4ICUgMSAqIDhcIiBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlIDIsIDQsIDYsIDhcbiAgICBvdXRwdXQgKz0gbWFwLmNoYXJBdCg2MyAmIGJsb2NrID4+IDggLSBpZHggJSAxICogOCkpIHtcbiAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaWR4ICs9IDMgLyA0KTtcbiAgICAgIGlmIChjaGFyQ29kZSA+IDB4RkYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2J0b2EnIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGUgTGF0aW4xIHJhbmdlLlwiKTtcbiAgICAgIH1cbiAgICAgIGJsb2NrID0gYmxvY2sgPDwgOCB8IGNoYXJDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIC8vIGRlY29kZXJcbiAgLy8gW2h0dHBzOi8vZ2lzdC5naXRodWIuY29tLzEwMjAzOTZdIGJ5IFtodHRwczovL2dpdGh1Yi5jb20vYXRrXVxuICBiYXNlNjQuYXRvYiA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciBzdHIgPSBTdHJpbmcoaW5wdXQpLnJlcGxhY2UoLz0rJC8sICcnKTtcbiAgICBpZiAoc3RyLmxlbmd0aCAlIDQgPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7XG4gICAgfVxuICAgIGZvciAoXG4gICAgLy8gaW5pdGlhbGl6ZSByZXN1bHQgYW5kIGNvdW50ZXJzXG4gICAgdmFyIGJjID0gMCwgYnMsIGJ1ZmZlciwgaWR4ID0gMCwgb3V0cHV0ID0gJyc7XG4gICAgLy8gZ2V0IG5leHQgY2hhcmFjdGVyXG4gICAgYnVmZmVyID0gc3RyLmNoYXJBdChpZHgrKyk7XG4gICAgLy8gY2hhcmFjdGVyIGZvdW5kIGluIHRhYmxlPyBpbml0aWFsaXplIGJpdCBzdG9yYWdlIGFuZCBhZGQgaXRzIGFzY2lpIHZhbHVlO1xuICAgIH5idWZmZXIgJiYgKGJzID0gYmMgJSA0ID8gYnMgKiA2NCArIGJ1ZmZlciA6IGJ1ZmZlcixcbiAgICAvLyBhbmQgaWYgbm90IGZpcnN0IG9mIGVhY2ggNCBjaGFyYWN0ZXJzLFxuICAgIC8vIGNvbnZlcnQgdGhlIGZpcnN0IDggYml0cyB0byBvbmUgYXNjaWkgY2hhcmFjdGVyXG4gICAgYmMrKyAlIDQpID8gb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1ICYgYnMgPj4gKC0yICogYmMgJiA2KSkgOiAwKSB7XG4gICAgICAvLyB0cnkgdG8gZmluZCBjaGFyYWN0ZXIgaW4gdGFibGUgKDAtNjMsIG5vdCBmb3VuZCA9PiAtMSlcbiAgICAgIGJ1ZmZlciA9IGNoYXJzLmluZGV4T2YoYnVmZmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gYmFzZTY0O1xufTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvcGVyZm9ybWFuY2Uud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVzcG9uc2VFbmQpIHtcbiAgdmFyIF9wZXJmb3JtYW5jZSR0aW1pbmc7XG5cbiAgdmFyIHBlcmZvcm1hbmNlID0ge307XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIG5vdCBnZXQgbmF2aWdhdGlvblN0YXJ0IHRpbWVcbiAgcGVyZm9ybWFuY2UudGltaW5nID0gKF9wZXJmb3JtYW5jZSR0aW1pbmcgPSB7XG4gICAgdW5sb2FkRXZlbnRTdGFydDogMCxcbiAgICB1bmxvYWRFdmVudEVuZDogMCxcbiAgICBuYXZpZ2F0aW9uU3RhcnQ6IHJlc3BvbnNlRW5kLFxuICAgIHJlZGlyZWN0U3RhcnQ6IDAsXG4gICAgcmVkaXJlY3RFbmQ6IDAsXG4gICAgZmV0Y2hTdGFydDogcmVzcG9uc2VFbmQsXG4gICAgZG9tYWluTG9va3VwU3RhcnQ6IHJlc3BvbnNlRW5kLFxuICAgIGRvbWFpbkxvb2t1cEVuZDogcmVzcG9uc2VFbmQsXG4gICAgY29ubmVjdFN0YXJ0OiByZXNwb25zZUVuZCxcbiAgICBzZWN1cmVDb25uZWN0aW9uU3RhcnQ6IHJlc3BvbnNlRW5kXG4gIH0sIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImNvbm5lY3RTdGFydFwiLCByZXNwb25zZUVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcInJlcXVlc3RTdGFydFwiLCByZXNwb25zZUVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcInJlc3BvbnNlU3RhcnRcIiwgcmVzcG9uc2VFbmQpLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJyZXNwb25zZUVuZFwiLCByZXNwb25zZUVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImRvbUxvYWRpbmdcIiwgMCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImRvbUludGVyYWN0aXZlXCIsIDApLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJkb21Db21wbGV0ZVwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnRcIiwgMCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZFwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwibG9hZEV2ZW50U3RhcnRcIiwgMCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImxvYWRFdmVudEVuZFwiLCAwKSwgX3BlcmZvcm1hbmNlJHRpbWluZyk7XG4gIHBlcmZvcm1hbmNlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7XG4gIH07XG5cbiAgcmV0dXJuIHBlcmZvcm1hbmNlO1xufTtcblxuLyoqKi8gfSksXG4vKiAyMSAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZXZlbnQud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEV2ZW50ID0gZnVuY3Rpb24gRXZlbnQodHlwZSkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50KTtcblxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5idWJibGVzID0gQm9vbGVhbihwYXJhbXMuYnViYmxlcyk7XG4gICAgdGhpcy5jYW5jZWxhYmxlID0gQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSk7XG4gIH07XG5cbiAgdmFyIEN1c3RvbUV2ZW50ID0gZnVuY3Rpb24gKF9FdmVudCkge1xuICAgIF9pbmhlcml0cyhDdXN0b21FdmVudCwgX0V2ZW50KTtcblxuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KHR5cGUpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3VzdG9tRXZlbnQpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoQ3VzdG9tRXZlbnQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDdXN0b21FdmVudCkpLmNhbGwodGhpcywgdHlwZSwgcGFyYW1zKSk7XG5cbiAgICAgIF90aGlzLmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9KEV2ZW50KTtcblxuICByZXR1cm4ge1xuICAgIEV2ZW50OiBFdmVudCxcbiAgICBDdXN0b21FdmVudDogQ3VzdG9tRXZlbnRcbiAgfTtcbn07XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTs7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcmFtZXdvcmsud2VleC5tYXAiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCAqIGFzIFZhbmlsbGEgZnJvbSAnLi92YW5pbGxhL2luZGV4J1xuaW1wb3J0ICogYXMgVnVlIGZyb20gJ3dlZXgtdnVlLWZyYW1ld29yaydcbmltcG9ydCAqIGFzIFdlZXggZnJvbSAnLi9sZWdhY3kvaW5kZXgnXG5pbXBvcnQgUmF4IGZyb20gJ3dlZXgtcmF4LWZyYW1ld29yaydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBWYW5pbGxhLFxuICBWdWUsXG4gIFJheCxcbiAgV2VleFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgc2V0dXAgZnJvbSAnLi9zZXR1cCdcbmltcG9ydCBmcmFtZXdvcmtzIGZyb20gJy4uLy4uL2ZyYW1ld29ya3MvaW5kZXgnXG5cbnNldHVwKGZyYW1ld29ya3MpXG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsImlzT2JqZWN0IiwicmVxdWlyZSQkMSIsImRvY3VtZW50IiwicmVxdWlyZSQkMiIsInJlcXVpcmUkJDMiLCJkUCIsInJlcXVpcmUkJDQiLCJnbG9iYWwiLCIkZXhwb3J0IiwidG9TdHJpbmciLCJJT2JqZWN0IiwidG9JbnRlZ2VyIiwibWluIiwidG9JT2JqZWN0IiwiaGFzIiwiZGVmaW5lZCIsInJlcXVpcmUkJDUiLCJhcmd1bWVudHMiLCJXWEVudmlyb25tZW50IiwiY29mIiwiYW5PYmplY3QiLCJnZXRLZXlzIiwiZW51bUJ1Z0tleXMiLCJJRV9QUk9UTyIsIlBST1RPVFlQRSIsIlRBRyIsImNyZWF0ZSIsInNldFRvU3RyaW5nVGFnIiwidG9PYmplY3QiLCJyZXF1aXJlJCQ5IiwicmVxdWlyZSQkOCIsInJlZGVmaW5lIiwicmVxdWlyZSQkNyIsImhpZGUiLCJyZXF1aXJlJCQ2IiwiSXRlcmF0b3JzIiwiSVRFUkFUT1IiLCJBcnJheVByb3RvIiwiY2xhc3NvZiIsImFGdW5jdGlvbiIsImN0eCIsInByb2Nlc3MiLCJNZXNzYWdlQ2hhbm5lbCIsInJ1biIsIlByb21pc2UiLCJpc05vZGUiLCJuZXdQcm9taXNlQ2FwYWJpbGl0eSIsIlNQRUNJRVMiLCJMSUJSQVJZIiwicmVxdWlyZSQkMjAiLCJyZXF1aXJlJCQxOSIsInJlcXVpcmUkJDE4IiwicmVxdWlyZSQkMTciLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE1IiwicmVxdWlyZSQkMTQiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDEyIiwicmVxdWlyZSQkMTEiLCJyZXF1aXJlJCQxMCIsIlR5cGVFcnJvciIsIm5vdGlmeSIsImNvbnN0IiwibGV0IiwiZnJlZXplUHJvdG90eXBlIiwiaXNFbXB0eSIsIkVsZW1lbnQiLCJzdXBlciIsInRhc2tDZW50ZXIiLCJwdXJlQmVmb3JlIiwiaW5kZXgiLCJ0aGlzIiwiaW5pdCIsImZpcmVFdmVudCIsImNhbGxiYWNrIiwicmVnaXN0ZXIiLCJuYW1lIiwibW9kdWxlR2V0dGVyIiwibW9kdWxlU2V0dGVyIiwic2VydmljZXMiLCJpbml0VGFza0hhbmRsZXIiLCJzaGFyZWQuZnJlZXplUHJvdG90eXBlIiwic2hhcmVkLnNldE5hdGl2ZUNvbnNvbGUiLCJzaGFyZWQucmVzZXROYXRpdmVDb25zb2xlIiwic2hhcmVkLnNldE5hdGl2ZVRpbWVyIiwic2hhcmVkLnJlc2V0TmF0aXZlVGltZXIiLCJCcm9hZGNhc3RDaGFubmVsIiwiY29uZmlnIiwiY3JlYXRlSW5zdGFuY2UiLCJnZXRSb290IiwicmVjZWl2ZVRhc2tzIiwiZGVmIiwicmVtb3ZlIiwiaGFzT3duUHJvcGVydHkiLCJ0eXBvZiIsInVpZCIsIk9ic2VydmVyIiwic2V0Iiwic2V0SWQiLCJzZXRBdHRyIiwic2V0U3R5bGUiLCJzZXRDbGFzc1N0eWxlIiwiaSIsImNyZWF0ZUJvZHkiLCJjcmVhdGVFbGVtZW50IiwibW92ZUVsZW1lbnQiLCJyZW1vdmVFbGVtZW50IiwidHlwZSIsImluaXRNZXRob2RzIiwicmVxdWlyZU1vZHVsZSIsImRvd25ncmFkZS5jaGVjayIsImNsZWFuTmFtZSIsImRlc3Ryb3kiLCJBcHAiLCJyZW5kZXJlciIsImluc3RhbmNlTWFwIiwiaW5pdEFwcCIsInJlZnJlc2hJbnN0YW5jZSIsImRlc3Ryb3lJbnN0YW5jZSIsIm5hdGl2ZUNvbXBvbmVudE1hcCIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyTW9kdWxlcyIsIm1ldGhvZHMiLCJmcmFtZXdvcmtzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtFQUNmLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXO0lBQ3ZCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3RDLElBQUksVUFBVSxHQUFHLFNBQVMsRUFBRSxFQUFFO01BQzVCLE9BQU8sT0FBTyxFQUFFLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssbUJBQW1CLENBQUM7S0FDM0UsQ0FBQztJQUNGLElBQUksU0FBUyxHQUFHLFNBQVMsS0FBSyxFQUFFO01BQzlCLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztNQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNqQixPQUFPLENBQUMsQ0FBQztPQUNWO01BQ0QsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO09BQ2Y7TUFDRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FB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QUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQzlDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyQyxJQUFJLEdBQUcsQ0FBQzs7SUFFUixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDUixFQUFBLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQTtTQUNOLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNiLEVBQUEsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFBO1NBQzNDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQzs7TUFFYixFQUFBLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUE7U0FDM0QsSUFBSSxFQUFFLEVBQUU7TUFDWCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7TUFDN0IsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFDdEIsRUFBQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFBO01BQ2hCLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN4Qzs7TUFFQyxFQUFBLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FB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LEVBQUUsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFBLE1BQU0sRUFBQSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFBLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQSxNQUFNLEVBQUUsQ0FBQyxFQUFBLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFeHBCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxNQUFN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T0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxFQUFFOztBQUV6SixTQUFTLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFOztBQUVoUCxTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUEsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxF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