Skip to content

Instantly share code, notes, and snippets.

@Hypercubed
Last active September 25, 2016 15:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hypercubed/b856176903ff0195f62a8e059cb42eb0 to your computer and use it in GitHub Desktop.
Save Hypercubed/b856176903ff0195f62a8e059cb42eb0 to your computer and use it in GitHub Desktop.
requirebin sketch
const mobx = require('mobx');
// Pattern 1, state is updated in autorun (or action)
const state = mobx.observable({
name: 'state1',
isBoolean: false,
isString: false,
input: 1
});
mobx.autorun(() => {
console.log('state someReallyExpensiveTest');
const r = someReallyExpensiveTest(state.input);
state.isBoolean = r.isBoolean;
state.isString = r.isString;
});
state.input = true;
console.log(state.name, state.isBoolean, state.isString);
state.input = 'string';
console.log(state.name, state.isBoolean, state.isString);
// Pattern 2, properties are computed and chained
const state2 = mobx.observable({
name: 'state2',
input: 2,
__result__ () {
console.log('state2 someReallyExpensiveTest');
return someReallyExpensiveTest(this.input);
},
isBoolean () {
return this.__result__.isBoolean;
},
isString () {
return this.__result__.isString;
}
});
state2.input = 'string';
console.log(state2.name, state2.isBoolean, state2.isString);
state2.input = true;
console.log(state2.name, state2.isBoolean, state2.isString);
function someReallyExpensiveTest(input) {
return {
isBoolean: typeof input === 'boolean',
isString: typeof input === 'string'
}
}
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"mobx":[function(require,module,exports){
(function (global){
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
registerGlobals();
exports.extras = {
allowStateChanges: allowStateChanges,
getAtom: getAtom,
getDebugName: getDebugName,
getDependencyTree: getDependencyTree,
getObserverTree: getObserverTree,
isComputingDerivation: isComputingDerivation,
isSpyEnabled: isSpyEnabled,
resetGlobalState: resetGlobalState,
spyReport: spyReport,
spyReportEnd: spyReportEnd,
spyReportStart: spyReportStart,
trackTransitions: trackTransitions
};
exports._ = {
getAdministration: getAdministration,
resetGlobalState: resetGlobalState
};
if (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === 'object') {
__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx(module.exports);
}
var actionFieldDecorator = createClassPropertyDecorator(function (target, key, value, args, originalDescriptor) {
var actionName = (args && args.length === 1) ? args[0] : (value.name || key || "<unnamed action>");
var wrappedAction = action(actionName, value);
addHiddenProp(target, key, wrappedAction);
}, function (key) {
return this[key];
}, function () {
invariant(false, "It is not allowed to assign new values to @action fields");
}, false, true);
function action(arg1, arg2, arg3, arg4) {
if (arguments.length === 1 && typeof arg1 === "function")
return createAction(arg1.name || "<unnamed action>", arg1);
if (arguments.length === 2 && typeof arg2 === "function")
return createAction(arg1, arg2);
if (arguments.length === 1 && typeof arg1 === "string")
return namedActionDecorator(arg1);
return namedActionDecorator(arg2).apply(null, arguments);
}
exports.action = action;
function namedActionDecorator(name) {
return function (target, prop, descriptor) {
if (descriptor && typeof descriptor.value === "function") {
descriptor.value = createAction(name, descriptor.value);
descriptor.enumerable = false;
descriptor.configurable = true;
return descriptor;
}
return actionFieldDecorator(name).apply(this, arguments);
};
}
function runInAction(arg1, arg2, arg3) {
var actionName = typeof arg1 === "string" ? arg1 : arg1.name || "<unnamed action>";
var fn = typeof arg1 === "function" ? arg1 : arg2;
var scope = typeof arg1 === "function" ? arg2 : arg3;
invariant(typeof fn === "function", "`runInAction` expects a function");
invariant(fn.length === 0, "`runInAction` expects a function without arguments");
invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
return executeAction(actionName, fn, scope, undefined);
}
exports.runInAction = runInAction;
function isAction(thing) {
return typeof thing === "function" && thing.isMobxAction === true;
}
exports.isAction = isAction;
function autorun(arg1, arg2, arg3) {
var name, view, scope;
if (typeof arg1 === "string") {
name = arg1;
view = arg2;
scope = arg3;
}
else if (typeof arg1 === "function") {
name = arg1.name || ("Autorun@" + getNextId());
view = arg1;
scope = arg2;
}
assertUnwrapped(view, "autorun methods cannot have modifiers");
invariant(typeof view === "function", "autorun expects a function");
if (scope)
view = view.bind(scope);
var reaction = new Reaction(name, function () {
this.track(reactionRunner);
});
function reactionRunner() {
view(reaction);
}
reaction.schedule();
return reaction.getDisposer();
}
exports.autorun = autorun;
function when(arg1, arg2, arg3, arg4) {
var name, predicate, effect, scope;
if (typeof arg1 === "string") {
name = arg1;
predicate = arg2;
effect = arg3;
scope = arg4;
}
else if (typeof arg1 === "function") {
name = ("When@" + getNextId());
predicate = arg1;
effect = arg2;
scope = arg3;
}
var disposer = autorun(name, function (r) {
if (predicate.call(scope)) {
r.dispose();
var prevUntracked = untrackedStart();
effect.call(scope);
untrackedEnd(prevUntracked);
}
});
return disposer;
}
exports.when = when;
function autorunUntil(predicate, effect, scope) {
deprecated("`autorunUntil` is deprecated, please use `when`.");
return when.apply(null, arguments);
}
exports.autorunUntil = autorunUntil;
function autorunAsync(arg1, arg2, arg3, arg4) {
var name, func, delay, scope;
if (typeof arg1 === "string") {
name = arg1;
func = arg2;
delay = arg3;
scope = arg4;
}
else if (typeof arg1 === "function") {
name = arg1.name || ("AutorunAsync@" + getNextId());
func = arg1;
delay = arg2;
scope = arg3;
}
if (delay === void 0)
delay = 1;
if (scope)
func = func.bind(scope);
var isScheduled = false;
var r = new Reaction(name, function () {
if (!isScheduled) {
isScheduled = true;
setTimeout(function () {
isScheduled = false;
if (!r.isDisposed)
r.track(reactionRunner);
}, delay);
}
});
function reactionRunner() { func(r); }
r.schedule();
return r.getDisposer();
}
exports.autorunAsync = autorunAsync;
function reaction(arg1, arg2, arg3, arg4, arg5, arg6) {
var name, expression, effect, fireImmediately, delay, scope;
if (typeof arg1 === "string") {
name = arg1;
expression = arg2;
effect = arg3;
fireImmediately = arg4;
delay = arg5;
scope = arg6;
}
else {
name = arg1.name || arg2.name || ("Reaction@" + getNextId());
expression = arg1;
effect = arg2;
fireImmediately = arg3;
delay = arg4;
scope = arg5;
}
if (fireImmediately === void 0)
fireImmediately = false;
if (delay === void 0)
delay = 0;
var _a = getValueModeFromValue(expression, ValueMode.Reference), valueMode = _a[0], unwrappedExpression = _a[1];
var compareStructural = valueMode === ValueMode.Structure;
if (scope) {
unwrappedExpression = unwrappedExpression.bind(scope);
effect = action(name, effect.bind(scope));
}
var firstTime = true;
var isScheduled = false;
var nextValue = undefined;
var r = new Reaction(name, function () {
if (delay < 1) {
reactionRunner();
}
else if (!isScheduled) {
isScheduled = true;
setTimeout(function () {
isScheduled = false;
reactionRunner();
}, delay);
}
});
function reactionRunner() {
if (r.isDisposed)
return;
var changed = false;
r.track(function () {
var v = unwrappedExpression(r);
changed = valueDidChange(compareStructural, nextValue, v);
nextValue = v;
});
if (firstTime && fireImmediately)
effect(nextValue, r);
if (!firstTime && changed === true)
effect(nextValue, r);
if (firstTime)
firstTime = false;
}
r.schedule();
return r.getDisposer();
}
exports.reaction = reaction;
var computedDecorator = createClassPropertyDecorator(function (target, name, _, decoratorArgs, originalDescriptor) {
invariant(typeof originalDescriptor !== "undefined", "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'. It looks like it was used on a property.");
var baseValue = originalDescriptor.get;
var setter = originalDescriptor.set;
invariant(typeof baseValue === "function", "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'");
var compareStructural = false;
if (decoratorArgs && decoratorArgs.length === 1 && decoratorArgs[0].asStructure === true)
compareStructural = true;
var adm = asObservableObject(target, undefined, ValueMode.Recursive);
defineObservableProperty(adm, name, compareStructural ? asStructure(baseValue) : baseValue, false, setter);
}, function (name) {
var observable = this.$mobx.values[name];
if (observable === undefined)
return undefined;
return observable.get();
}, function (name, value) {
this.$mobx.values[name].set(value);
}, false, true);
function computed(targetOrExpr, keyOrScopeOrSetter, baseDescriptor, options) {
if (typeof targetOrExpr === "function" && arguments.length < 3) {
if (typeof keyOrScopeOrSetter === "function")
return computedExpr(targetOrExpr, keyOrScopeOrSetter, undefined);
else
return computedExpr(targetOrExpr, undefined, keyOrScopeOrSetter);
}
return computedDecorator.apply(null, arguments);
}
exports.computed = computed;
function computedExpr(expr, setter, scope) {
var _a = getValueModeFromValue(expr, ValueMode.Recursive), mode = _a[0], value = _a[1];
return new ComputedValue(value, scope, mode === ValueMode.Structure, value.name, setter);
}
function createTransformer(transformer, onCleanup) {
invariant(typeof transformer === "function" && transformer.length === 1, "createTransformer expects a function that accepts one argument");
var objectCache = {};
var resetId = globalState.resetId;
var Transformer = (function (_super) {
__extends(Transformer, _super);
function Transformer(sourceIdentifier, sourceObject) {
_super.call(this, function () { return transformer(sourceObject); }, null, false, "Transformer-" + transformer.name + "-" + sourceIdentifier, undefined);
this.sourceIdentifier = sourceIdentifier;
this.sourceObject = sourceObject;
}
Transformer.prototype.onBecomeUnobserved = function () {
var lastValue = this.value;
_super.prototype.onBecomeUnobserved.call(this);
delete objectCache[this.sourceIdentifier];
if (onCleanup)
onCleanup(lastValue, this.sourceObject);
};
return Transformer;
}(ComputedValue));
return function (object) {
if (resetId !== globalState.resetId) {
objectCache = {};
resetId = globalState.resetId;
}
var identifier = getMemoizationId(object);
var reactiveTransformer = objectCache[identifier];
if (reactiveTransformer)
return reactiveTransformer.get();
reactiveTransformer = objectCache[identifier] = new Transformer(identifier, object);
return reactiveTransformer.get();
};
}
exports.createTransformer = createTransformer;
function getMemoizationId(object) {
if (object === null || typeof object !== "object")
throw new Error("[mobx] transform expected some kind of object, got: " + object);
var tid = object.$transformId;
if (tid === undefined) {
tid = getNextId();
addHiddenProp(object, "$transformId", tid);
}
return tid;
}
function expr(expr, scope) {
if (!isComputingDerivation())
console.warn("[mobx.expr] 'expr' should only be used inside other reactive functions.");
return computed(expr, scope).get();
}
exports.expr = expr;
function extendObservable(target) {
var properties = [];
for (var _i = 1; _i < arguments.length; _i++) {
properties[_i - 1] = arguments[_i];
}
invariant(arguments.length >= 2, "extendObservable expected 2 or more arguments");
invariant(typeof target === "object", "extendObservable expects an object as first argument");
invariant(!(target instanceof ObservableMap), "extendObservable should not be used on maps, use map.merge instead");
properties.forEach(function (propSet) {
invariant(typeof propSet === "object", "all arguments of extendObservable should be objects");
extendObservableHelper(target, propSet, ValueMode.Recursive, null);
});
return target;
}
exports.extendObservable = extendObservable;
function extendObservableHelper(target, properties, mode, name) {
var adm = asObservableObject(target, name, mode);
for (var key in properties)
if (hasOwnProperty(properties, key)) {
if (target === properties && !isPropertyConfigurable(target, key))
continue;
setObservableObjectInstanceProperty(adm, key, properties[key]);
}
return target;
}
function getDependencyTree(thing, property) {
return nodeToDependencyTree(getAtom(thing, property));
}
function nodeToDependencyTree(node) {
var result = {
name: node.name
};
if (node.observing && node.observing.length > 0)
result.dependencies = unique(node.observing).map(nodeToDependencyTree);
return result;
}
function getObserverTree(thing, property) {
return nodeToObserverTree(getAtom(thing, property));
}
function nodeToObserverTree(node) {
var result = {
name: node.name
};
if (hasObservers(node))
result.observers = getObservers(node).map(nodeToObserverTree);
return result;
}
function intercept(thing, propOrHandler, handler) {
if (typeof handler === "function")
return interceptProperty(thing, propOrHandler, handler);
else
return interceptInterceptable(thing, propOrHandler);
}
exports.intercept = intercept;
function interceptInterceptable(thing, handler) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
return getAdministration(observable(thing)).intercept(handler);
}
return getAdministration(thing).intercept(handler);
}
function interceptProperty(thing, property, handler) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
extendObservable(thing, {
property: thing[property]
});
return interceptProperty(thing, property, handler);
}
return getAdministration(thing, property).intercept(handler);
}
function isObservable(value, property) {
if (value === null || value === undefined)
return false;
if (property !== undefined) {
if (value instanceof ObservableMap || value instanceof ObservableArray)
throw new Error("[mobx.isObservable] isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.");
else if (isObservableObject(value)) {
var o = value.$mobx;
return o.values && !!o.values[property];
}
return false;
}
return !!value.$mobx || value instanceof BaseAtom || value instanceof Reaction || value instanceof ComputedValue;
}
exports.isObservable = isObservable;
var decoratorImpl = createClassPropertyDecorator(function (target, name, baseValue) {
var prevA = allowStateChangesStart(true);
if (typeof baseValue === "function")
baseValue = asReference(baseValue);
var adm = asObservableObject(target, undefined, ValueMode.Recursive);
defineObservableProperty(adm, name, baseValue, true, undefined);
allowStateChangesEnd(prevA);
}, function (name) {
var observable = this.$mobx.values[name];
if (observable === undefined)
return undefined;
return observable.get();
}, function (name, value) {
setPropertyValue(this, name, value);
}, true, false);
function observableDecorator(target, key, baseDescriptor) {
invariant(arguments.length >= 2 && arguments.length <= 3, "Illegal decorator config", key);
assertPropertyConfigurable(target, key);
invariant(!baseDescriptor || !baseDescriptor.get, "@observable can not be used on getters, use @computed instead");
return decoratorImpl.apply(null, arguments);
}
function observable(v, keyOrScope) {
if (v === void 0) { v = undefined; }
if (typeof arguments[1] === "string")
return observableDecorator.apply(null, arguments);
invariant(arguments.length < 3, "observable expects zero, one or two arguments");
if (isObservable(v))
return v;
var _a = getValueModeFromValue(v, ValueMode.Recursive), mode = _a[0], value = _a[1];
var sourceType = mode === ValueMode.Reference ? ValueType.Reference : getTypeOfValue(value);
switch (sourceType) {
case ValueType.Array:
case ValueType.PlainObject:
return makeChildObservable(value, mode);
case ValueType.Reference:
case ValueType.ComplexObject:
return new ObservableValue(value, mode);
case ValueType.ComplexFunction:
throw new Error("[mobx.observable] To be able to make a function reactive it should not have arguments. If you need an observable reference to a function, use `observable(asReference(f))`");
case ValueType.ViewFunction:
deprecated("Use `computed(expr)` instead of `observable(expr)`");
return computed(v, keyOrScope);
}
invariant(false, "Illegal State");
}
exports.observable = observable;
var ValueType;
(function (ValueType) {
ValueType[ValueType["Reference"] = 0] = "Reference";
ValueType[ValueType["PlainObject"] = 1] = "PlainObject";
ValueType[ValueType["ComplexObject"] = 2] = "ComplexObject";
ValueType[ValueType["Array"] = 3] = "Array";
ValueType[ValueType["ViewFunction"] = 4] = "ViewFunction";
ValueType[ValueType["ComplexFunction"] = 5] = "ComplexFunction";
})(ValueType || (ValueType = {}));
function getTypeOfValue(value) {
if (value === null || value === undefined)
return ValueType.Reference;
if (typeof value === "function")
return value.length ? ValueType.ComplexFunction : ValueType.ViewFunction;
if (Array.isArray(value) || value instanceof ObservableArray)
return ValueType.Array;
if (typeof value === "object")
return isPlainObject(value) ? ValueType.PlainObject : ValueType.ComplexObject;
return ValueType.Reference;
}
function observe(thing, propOrCb, cbOrFire, fireImmediately) {
if (typeof cbOrFire === "function")
return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);
else
return observeObservable(thing, propOrCb, cbOrFire);
}
exports.observe = observe;
function observeObservable(thing, listener, fireImmediately) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
return getAdministration(observable(thing)).observe(listener, fireImmediately);
}
return getAdministration(thing).observe(listener, fireImmediately);
}
function observeObservableProperty(thing, property, listener, fireImmediately) {
if (isPlainObject(thing) && !isObservableObject(thing)) {
deprecated("Passing plain objects to intercept / observe is deprecated and will be removed in 3.0");
extendObservable(thing, {
property: thing[property]
});
return observeObservableProperty(thing, property, listener, fireImmediately);
}
return getAdministration(thing, property).observe(listener, fireImmediately);
}
function toJS(source, detectCycles, __alreadySeen) {
if (detectCycles === void 0) { detectCycles = true; }
if (__alreadySeen === void 0) { __alreadySeen = null; }
function cache(value) {
if (detectCycles)
__alreadySeen.push([source, value]);
return value;
}
if (source instanceof Date || source instanceof RegExp)
return source;
if (detectCycles && __alreadySeen === null)
__alreadySeen = [];
if (detectCycles && source !== null && typeof source === "object") {
for (var i = 0, l = __alreadySeen.length; i < l; i++)
if (__alreadySeen[i][0] === source)
return __alreadySeen[i][1];
}
if (!source)
return source;
if (Array.isArray(source) || source instanceof ObservableArray) {
var res = cache([]);
var toAdd = source.map(function (value) { return toJS(value, detectCycles, __alreadySeen); });
res.length = toAdd.length;
for (var i = 0, l = toAdd.length; i < l; i++)
res[i] = toAdd[i];
return res;
}
if (source instanceof ObservableMap) {
var res_1 = cache({});
source.forEach(function (value, key) { return res_1[key] = toJS(value, detectCycles, __alreadySeen); });
return res_1;
}
if (isObservable(source) && source.$mobx instanceof ObservableValue)
return toJS(source(), detectCycles, __alreadySeen);
if (source instanceof ObservableValue)
return toJS(source.get(), detectCycles, __alreadySeen);
if (typeof source === "object") {
var res = cache({});
for (var key in source)
res[key] = toJS(source[key], detectCycles, __alreadySeen);
return res;
}
return source;
}
exports.toJS = toJS;
function toJSON(source, detectCycles, __alreadySeen) {
if (detectCycles === void 0) { detectCycles = true; }
if (__alreadySeen === void 0) { __alreadySeen = null; }
deprecated("toJSON is deprecated. Use toJS instead");
return toJS.apply(null, arguments);
}
exports.toJSON = toJSON;
function log(msg) {
console.log(msg);
return msg;
}
function whyRun(thing, prop) {
switch (arguments.length) {
case 0:
thing = globalState.trackingDerivation;
if (!thing)
return log("whyRun() can only be used if a derivation is active, or by passing an computed value / reaction explicitly. If you invoked whyRun from inside a computation; the computation is currently suspended but re-evaluating because somebody requested it's value.");
break;
case 2:
thing = getAtom(thing, prop);
break;
}
thing = getAtom(thing);
if (thing instanceof ComputedValue)
return log(thing.whyRun());
else if (thing instanceof Reaction)
return log(thing.whyRun());
else
invariant(false, "whyRun can only be used on reactions and computed values");
}
exports.whyRun = whyRun;
function createAction(actionName, fn) {
invariant(typeof fn === "function", "`action` can only be invoked on functions");
invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
var res = function () {
return executeAction(actionName, fn, this, arguments);
};
res.isMobxAction = true;
return res;
}
function executeAction(actionName, fn, scope, args) {
invariant(!(globalState.trackingDerivation instanceof ComputedValue), "Computed values or transformers should not invoke actions or trigger other side effects");
var notifySpy = isSpyEnabled();
var startTime;
if (notifySpy) {
startTime = Date.now();
var l = (args && args.length) || 0;
var flattendArgs = new Array(l);
if (l > 0)
for (var i = 0; i < l; i++)
flattendArgs[i] = args[i];
spyReportStart({
type: "action",
name: actionName,
fn: fn,
target: scope,
arguments: flattendArgs
});
}
var prevUntracked = untrackedStart();
transactionStart(actionName, scope, false);
var prevAllowStateChanges = allowStateChangesStart(true);
try {
return fn.apply(scope, args);
}
finally {
allowStateChangesEnd(prevAllowStateChanges);
transactionEnd(false);
untrackedEnd(prevUntracked);
if (notifySpy)
spyReportEnd({ time: Date.now() - startTime });
}
}
function useStrict(strict) {
if (arguments.length === 0) {
deprecated("`useStrict` without arguments is deprecated, use `isStrictModeEnabled()` instead");
return globalState.strictMode;
}
else {
invariant(globalState.trackingDerivation === null, "It is not allowed to set `useStrict` when a derivation is running");
globalState.strictMode = strict;
globalState.allowStateChanges = !strict;
}
}
exports.useStrict = useStrict;
function isStrictModeEnabled() {
return globalState.strictMode;
}
exports.isStrictModeEnabled = isStrictModeEnabled;
function allowStateChanges(allowStateChanges, func) {
var prev = allowStateChangesStart(allowStateChanges);
var res = func();
allowStateChangesEnd(prev);
return res;
}
function allowStateChangesStart(allowStateChanges) {
var prev = globalState.allowStateChanges;
globalState.allowStateChanges = allowStateChanges;
return prev;
}
function allowStateChangesEnd(prev) {
globalState.allowStateChanges = prev;
}
var BaseAtom = (function () {
function BaseAtom(name) {
if (name === void 0) { name = "Atom@" + getNextId(); }
this.name = name;
this.isPendingUnobservation = true;
this.observers = [];
this.observersIndexes = {};
this.diffValue = 0;
this.lastAccessedBy = 0;
this.lowestObserverState = IDerivationState.NOT_TRACKING;
}
BaseAtom.prototype.onBecomeUnobserved = function () {
};
BaseAtom.prototype.reportObserved = function () {
reportObserved(this);
};
BaseAtom.prototype.reportChanged = function () {
transactionStart("propagatingAtomChange", null, false);
propagateChanged(this);
transactionEnd(false);
};
BaseAtom.prototype.toString = function () {
return this.name;
};
return BaseAtom;
}());
exports.BaseAtom = BaseAtom;
var Atom = (function (_super) {
__extends(Atom, _super);
function Atom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) {
if (name === void 0) { name = "Atom@" + getNextId(); }
if (onBecomeObservedHandler === void 0) { onBecomeObservedHandler = noop; }
if (onBecomeUnobservedHandler === void 0) { onBecomeUnobservedHandler = noop; }
_super.call(this, name);
this.name = name;
this.onBecomeObservedHandler = onBecomeObservedHandler;
this.onBecomeUnobservedHandler = onBecomeUnobservedHandler;
this.isPendingUnobservation = false;
this.isBeingTracked = false;
}
Atom.prototype.reportObserved = function () {
startBatch();
_super.prototype.reportObserved.call(this);
if (!this.isBeingTracked) {
this.isBeingTracked = true;
this.onBecomeObservedHandler();
}
endBatch();
return !!globalState.trackingDerivation;
};
Atom.prototype.onBecomeUnobserved = function () {
this.isBeingTracked = false;
this.onBecomeUnobservedHandler();
};
return Atom;
}(BaseAtom));
exports.Atom = Atom;
var ComputedValue = (function () {
function ComputedValue(derivation, scope, compareStructural, name, setter) {
this.derivation = derivation;
this.scope = scope;
this.compareStructural = compareStructural;
this.dependenciesState = IDerivationState.NOT_TRACKING;
this.observing = [];
this.newObserving = null;
this.isPendingUnobservation = false;
this.observers = [];
this.observersIndexes = {};
this.diffValue = 0;
this.runId = 0;
this.lastAccessedBy = 0;
this.lowestObserverState = IDerivationState.UP_TO_DATE;
this.unboundDepsCount = 0;
this.__mapid = "#" + getNextId();
this.value = undefined;
this.isComputing = false;
this.name = name || "ComputedValue@" + getNextId();
if (setter)
this.setter = createAction(name + "-setter", setter);
}
ComputedValue.prototype.peek = function () {
this.isComputing = true;
var prevAllowStateChanges = allowStateChangesStart(false);
var res = this.derivation.call(this.scope);
allowStateChangesEnd(prevAllowStateChanges);
this.isComputing = false;
return res;
};
;
ComputedValue.prototype.peekUntracked = function () {
var hasError = true;
try {
var res = this.peek();
hasError = false;
return res;
}
finally {
if (hasError)
handleExceptionInDerivation(this);
}
};
ComputedValue.prototype.onBecomeStale = function () {
propagateMaybeChanged(this);
};
ComputedValue.prototype.onBecomeUnobserved = function () {
invariant(this.dependenciesState !== IDerivationState.NOT_TRACKING, "INTERNAL ERROR only onBecomeUnobserved shouldn't be called twice in a row");
clearObserving(this);
this.value = undefined;
};
ComputedValue.prototype.get = function () {
invariant(!this.isComputing, "Cycle detected in computation " + this.name, this.derivation);
startBatch();
if (globalState.inBatch === 1) {
if (shouldCompute(this))
this.value = this.peekUntracked();
}
else {
reportObserved(this);
if (shouldCompute(this))
if (this.trackAndCompute())
propagateChangeConfirmed(this);
}
var result = this.value;
endBatch();
return result;
};
ComputedValue.prototype.recoverFromError = function () {
this.isComputing = false;
};
ComputedValue.prototype.set = function (value) {
if (this.setter)
this.setter.call(this.scope, value);
else
throw new Error("[ComputedValue '" + this.name + "'] It is not possible to assign a new value to a computed value.");
};
ComputedValue.prototype.trackAndCompute = function () {
if (isSpyEnabled()) {
spyReport({
object: this,
type: "compute",
fn: this.derivation,
target: this.scope
});
}
var oldValue = this.value;
var newValue = this.value = trackDerivedFunction(this, this.peek);
return valueDidChange(this.compareStructural, newValue, oldValue);
};
ComputedValue.prototype.observe = function (listener, fireImmediately) {
var _this = this;
var firstTime = true;
var prevValue = undefined;
return autorun(function () {
var newValue = _this.get();
if (!firstTime || fireImmediately) {
var prevU = untrackedStart();
listener(newValue, prevValue);
untrackedEnd(prevU);
}
firstTime = false;
prevValue = newValue;
});
};
ComputedValue.prototype.toJSON = function () {
return this.get();
};
ComputedValue.prototype.toString = function () {
return this.name + "[" + this.derivation.toString() + "]";
};
ComputedValue.prototype.whyRun = function () {
var isTracking = Boolean(globalState.trackingDerivation);
var observing = unique(this.isComputing ? this.newObserving : this.observing).map(function (dep) { return dep.name; });
var observers = unique(getObservers(this).map(function (dep) { return dep.name; }));
return (("\nWhyRun? computation '" + this.name + "':\n * Running because: " + (isTracking ? "[active] the value of this computation is needed by a reaction" : this.isComputing ? "[get] The value of this computed was requested outside a reaction" : "[idle] not running at the moment") + "\n") +
(this.dependenciesState === IDerivationState.NOT_TRACKING
?
" * This computation is suspended (not in use by any reaction) and won't run automatically.\n\tDidn't expect this computation to be suspended at this point?\n\t 1. Make sure this computation is used by a reaction (reaction, autorun, observer).\n\t 2. Check whether you are using this computation synchronously (in the same stack as they reaction that needs it).\n"
:
" * This computation will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + ((this.isComputing && isTracking) ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\tMissing items in this list?\n\t 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n\t 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n * If the outcome of this computation changes, the following observers will be re-run:\n " + joinStrings(observers) + "\n"));
};
return ComputedValue;
}());
var IDerivationState;
(function (IDerivationState) {
IDerivationState[IDerivationState["NOT_TRACKING"] = -1] = "NOT_TRACKING";
IDerivationState[IDerivationState["UP_TO_DATE"] = 0] = "UP_TO_DATE";
IDerivationState[IDerivationState["POSSIBLY_STALE"] = 1] = "POSSIBLY_STALE";
IDerivationState[IDerivationState["STALE"] = 2] = "STALE";
})(IDerivationState || (IDerivationState = {}));
exports.IDerivationState = IDerivationState;
function shouldCompute(derivation) {
switch (derivation.dependenciesState) {
case IDerivationState.UP_TO_DATE: return false;
case IDerivationState.NOT_TRACKING:
case IDerivationState.STALE: return true;
case IDerivationState.POSSIBLY_STALE: {
var hasError = true;
var prevUntracked = untrackedStart();
try {
var obs = derivation.observing, l = obs.length;
for (var i = 0; i < l; i++) {
var obj = obs[i];
if (obj instanceof ComputedValue) {
obj.get();
if (derivation.dependenciesState === IDerivationState.STALE) {
hasError = false;
untrackedEnd(prevUntracked);
return true;
}
}
}
hasError = false;
changeDependenciesStateTo0(derivation);
untrackedEnd(prevUntracked);
return false;
}
finally {
if (hasError) {
changeDependenciesStateTo0(derivation);
}
}
}
}
}
function isComputingDerivation() {
return globalState.trackingDerivation !== null;
}
function checkIfStateModificationsAreAllowed() {
if (!globalState.allowStateChanges) {
invariant(false, globalState.strictMode
? "It is not allowed to create or change state outside an `action` when MobX is in strict mode. Wrap the current method in `action` if this state change is intended"
: "It is not allowed to change the state when a computed value or transformer is being evaluated. Use 'autorun' to create reactive functions with side-effects.");
}
}
function trackDerivedFunction(derivation, f) {
changeDependenciesStateTo0(derivation);
derivation.newObserving = new Array(derivation.observing.length + 100);
derivation.unboundDepsCount = 0;
derivation.runId = ++globalState.runId;
var prevTracking = globalState.trackingDerivation;
globalState.trackingDerivation = derivation;
var hasException = true;
var result;
try {
result = f.call(derivation);
hasException = false;
}
finally {
if (hasException) {
handleExceptionInDerivation(derivation);
}
else {
globalState.trackingDerivation = prevTracking;
bindDependencies(derivation);
}
}
return result;
}
function handleExceptionInDerivation(derivation) {
var message = ("[mobx] An uncaught exception occurred while calculating your computed value, autorun or transformer. Or inside the render() method of an observer based React component. " +
"These functions should never throw exceptions as MobX will not always be able to recover from them. " +
("Please fix the error reported after this message or enable 'Pause on (caught) exceptions' in your debugger to find the root cause. In: '" + derivation.name + "'. ") +
"For more details see https://github.com/mobxjs/mobx/issues/462");
if (isSpyEnabled()) {
spyReport({
type: "error",
message: message
});
}
console.warn(message);
changeDependenciesStateTo0(derivation);
derivation.newObserving = null;
derivation.unboundDepsCount = 0;
derivation.recoverFromError();
endBatch();
resetGlobalState();
}
function bindDependencies(derivation) {
var prevObserving = derivation.observing;
var observing = derivation.observing = derivation.newObserving;
derivation.newObserving = null;
var i0 = 0, l = derivation.unboundDepsCount;
for (var i = 0; i < l; i++) {
var dep = observing[i];
if (dep.diffValue === 0) {
dep.diffValue = 1;
if (i0 !== i)
observing[i0] = dep;
i0++;
}
}
observing.length = i0;
l = prevObserving.length;
while (l--) {
var dep = prevObserving[l];
if (dep.diffValue === 0) {
removeObserver(dep, derivation);
}
dep.diffValue = 0;
}
while (i0--) {
var dep = observing[i0];
if (dep.diffValue === 1) {
dep.diffValue = 0;
addObserver(dep, derivation);
}
}
}
function clearObserving(derivation) {
var obs = derivation.observing;
var i = obs.length;
while (i--)
removeObserver(obs[i], derivation);
derivation.dependenciesState = IDerivationState.NOT_TRACKING;
obs.length = 0;
}
function untracked(action) {
var prev = untrackedStart();
var res = action();
untrackedEnd(prev);
return res;
}
exports.untracked = untracked;
function untrackedStart() {
var prev = globalState.trackingDerivation;
globalState.trackingDerivation = null;
return prev;
}
function untrackedEnd(prev) {
globalState.trackingDerivation = prev;
}
function changeDependenciesStateTo0(derivation) {
if (derivation.dependenciesState === IDerivationState.UP_TO_DATE)
return;
derivation.dependenciesState = IDerivationState.UP_TO_DATE;
var obs = derivation.observing;
var i = obs.length;
while (i--)
obs[i].lowestObserverState = IDerivationState.UP_TO_DATE;
}
var persistentKeys = ["mobxGuid", "resetId", "spyListeners", "strictMode", "runId"];
var MobXGlobals = (function () {
function MobXGlobals() {
this.version = 4;
this.trackingDerivation = null;
this.runId = 0;
this.mobxGuid = 0;
this.inTransaction = 0;
this.isRunningReactions = false;
this.inBatch = 0;
this.pendingUnobservations = [];
this.pendingReactions = [];
this.allowStateChanges = true;
this.strictMode = false;
this.resetId = 0;
this.spyListeners = [];
}
return MobXGlobals;
}());
var globalState = (function () {
var res = new MobXGlobals();
if (global.__mobservableTrackingStack || global.__mobservableViewStack)
throw new Error("[mobx] An incompatible version of mobservable is already loaded.");
if (global.__mobxGlobal && global.__mobxGlobal.version !== res.version)
throw new Error("[mobx] An incompatible version of mobx is already loaded.");
if (global.__mobxGlobal)
return global.__mobxGlobal;
return global.__mobxGlobal = res;
})();
function registerGlobals() {
}
function resetGlobalState() {
globalState.resetId++;
var defaultGlobals = new MobXGlobals();
for (var key in defaultGlobals)
if (persistentKeys.indexOf(key) === -1)
globalState[key] = defaultGlobals[key];
globalState.allowStateChanges = !globalState.strictMode;
}
function hasObservers(observable) {
return observable.observers && observable.observers.length > 0;
}
function getObservers(observable) {
return observable.observers;
}
function invariantObservers(observable) {
var list = observable.observers;
var map = observable.observersIndexes;
var l = list.length;
for (var i = 0; i < l; i++) {
var id = list[i].__mapid;
if (i) {
invariant(map[id] === i, "INTERNAL ERROR maps derivation.__mapid to index in list");
}
else {
invariant(!(id in map), "INTERNAL ERROR observer on index 0 shouldnt be held in map.");
}
}
invariant(list.length === 0 || Object.keys(map).length === list.length - 1, "INTERNAL ERROR there is no junk in map");
}
function addObserver(observable, node) {
var l = observable.observers.length;
if (l) {
observable.observersIndexes[node.__mapid] = l;
}
observable.observers[l] = node;
if (observable.lowestObserverState > node.dependenciesState)
observable.lowestObserverState = node.dependenciesState;
}
function removeObserver(observable, node) {
if (observable.observers.length === 1) {
observable.observers.length = 0;
queueForUnobservation(observable);
}
else {
var list = observable.observers;
var map_1 = observable.observersIndexes;
var filler = list.pop();
if (filler !== node) {
var index = map_1[node.__mapid] || 0;
if (index) {
map_1[filler.__mapid] = index;
}
else {
delete map_1[filler.__mapid];
}
list[index] = filler;
}
delete map_1[node.__mapid];
}
}
function queueForUnobservation(observable) {
if (!observable.isPendingUnobservation) {
observable.isPendingUnobservation = true;
globalState.pendingUnobservations.push(observable);
}
}
function startBatch() {
globalState.inBatch++;
}
function endBatch() {
if (globalState.inBatch === 1) {
var list = globalState.pendingUnobservations;
for (var i = 0; i < list.length; i++) {
var observable_1 = list[i];
observable_1.isPendingUnobservation = false;
if (observable_1.observers.length === 0) {
observable_1.onBecomeUnobserved();
}
}
globalState.pendingUnobservations = [];
}
globalState.inBatch--;
}
function reportObserved(observable) {
var derivation = globalState.trackingDerivation;
if (derivation !== null) {
if (derivation.runId !== observable.lastAccessedBy) {
observable.lastAccessedBy = derivation.runId;
derivation.newObserving[derivation.unboundDepsCount++] = observable;
}
}
else if (observable.observers.length === 0) {
queueForUnobservation(observable);
}
}
function invariantLOS(observable, msg) {
var min = getObservers(observable).reduce(function (a, b) { return Math.min(a, b.dependenciesState); }, 2);
if (min >= observable.lowestObserverState)
return;
throw new Error("lowestObserverState is wrong for " + msg + " because " + min + " < " + observable.lowestObserverState);
}
function propagateChanged(observable) {
if (observable.lowestObserverState === IDerivationState.STALE)
return;
observable.lowestObserverState = IDerivationState.STALE;
var observers = observable.observers;
var i = observers.length;
while (i--) {
var d = observers[i];
if (d.dependenciesState === IDerivationState.UP_TO_DATE)
d.onBecomeStale();
d.dependenciesState = IDerivationState.STALE;
}
}
function propagateChangeConfirmed(observable) {
if (observable.lowestObserverState === IDerivationState.STALE)
return;
observable.lowestObserverState = IDerivationState.STALE;
var observers = observable.observers;
var i = observers.length;
while (i--) {
var d = observers[i];
if (d.dependenciesState === IDerivationState.POSSIBLY_STALE)
d.dependenciesState = IDerivationState.STALE;
else if (d.dependenciesState === IDerivationState.UP_TO_DATE)
observable.lowestObserverState = IDerivationState.UP_TO_DATE;
}
}
function propagateMaybeChanged(observable) {
if (observable.lowestObserverState !== IDerivationState.UP_TO_DATE)
return;
observable.lowestObserverState = IDerivationState.POSSIBLY_STALE;
var observers = observable.observers;
var i = observers.length;
while (i--) {
var d = observers[i];
if (d.dependenciesState === IDerivationState.UP_TO_DATE) {
d.dependenciesState = IDerivationState.POSSIBLY_STALE;
d.onBecomeStale();
}
}
}
var Reaction = (function () {
function Reaction(name, onInvalidate) {
if (name === void 0) { name = "Reaction@" + getNextId(); }
this.name = name;
this.onInvalidate = onInvalidate;
this.observing = [];
this.newObserving = [];
this.dependenciesState = IDerivationState.NOT_TRACKING;
this.diffValue = 0;
this.runId = 0;
this.unboundDepsCount = 0;
this.__mapid = "#" + getNextId();
this.isDisposed = false;
this._isScheduled = false;
this._isTrackPending = false;
this._isRunning = false;
}
Reaction.prototype.onBecomeStale = function () {
this.schedule();
};
Reaction.prototype.schedule = function () {
if (!this._isScheduled) {
this._isScheduled = true;
globalState.pendingReactions.push(this);
startBatch();
runReactions();
endBatch();
}
};
Reaction.prototype.isScheduled = function () {
return this._isScheduled;
};
Reaction.prototype.runReaction = function () {
if (!this.isDisposed) {
this._isScheduled = false;
if (shouldCompute(this)) {
this._isTrackPending = true;
this.onInvalidate();
if (this._isTrackPending && isSpyEnabled()) {
spyReport({
object: this,
type: "scheduled-reaction"
});
}
}
}
};
Reaction.prototype.track = function (fn) {
startBatch();
var notify = isSpyEnabled();
var startTime;
if (notify) {
startTime = Date.now();
spyReportStart({
object: this,
type: "reaction",
fn: fn
});
}
this._isRunning = true;
trackDerivedFunction(this, fn);
this._isRunning = false;
this._isTrackPending = false;
if (this.isDisposed) {
clearObserving(this);
}
if (notify) {
spyReportEnd({
time: Date.now() - startTime
});
}
endBatch();
};
Reaction.prototype.recoverFromError = function () {
this._isRunning = false;
this._isTrackPending = false;
};
Reaction.prototype.dispose = function () {
if (!this.isDisposed) {
this.isDisposed = true;
if (!this._isRunning) {
startBatch();
clearObserving(this);
endBatch();
}
}
};
Reaction.prototype.getDisposer = function () {
var r = this.dispose.bind(this);
r.$mobx = this;
return r;
};
Reaction.prototype.toString = function () {
return "Reaction[" + this.name + "]";
};
Reaction.prototype.whyRun = function () {
var observing = unique(this._isRunning ? this.newObserving : this.observing).map(function (dep) { return dep.name; });
return ("\nWhyRun? reaction '" + this.name + "':\n * Status: [" + (this.isDisposed ? "stopped" : this._isRunning ? "running" : this.isScheduled() ? "scheduled" : "idle") + "]\n * This reaction will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + ((this._isRunning) ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\tMissing items in this list?\n\t 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n\t 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n");
};
return Reaction;
}());
exports.Reaction = Reaction;
var MAX_REACTION_ITERATIONS = 100;
function runReactions() {
if (globalState.isRunningReactions === true || globalState.inTransaction > 0)
return;
globalState.isRunningReactions = true;
var allReactions = globalState.pendingReactions;
var iterations = 0;
while (allReactions.length > 0) {
if (++iterations === MAX_REACTION_ITERATIONS) {
resetGlobalState();
throw new Error(("Reaction doesn't converge to a stable state after " + MAX_REACTION_ITERATIONS + " iterations.")
+ (" Probably there is a cycle in the reactive function: " + allReactions[0]));
}
var remainingReactions = allReactions.splice(0);
for (var i = 0, l = remainingReactions.length; i < l; i++)
remainingReactions[i].runReaction();
}
globalState.isRunningReactions = false;
}
var spyEnabled = false;
function isSpyEnabled() {
return spyEnabled;
}
function spyReport(event) {
if (!spyEnabled)
return false;
var listeners = globalState.spyListeners;
for (var i = 0, l = listeners.length; i < l; i++)
listeners[i](event);
}
function spyReportStart(event) {
var change = objectAssign({}, event, { spyReportStart: true });
spyReport(change);
}
var END_EVENT = { spyReportEnd: true };
function spyReportEnd(change) {
if (change)
spyReport(objectAssign({}, change, END_EVENT));
else
spyReport(END_EVENT);
}
function spy(listener) {
globalState.spyListeners.push(listener);
spyEnabled = globalState.spyListeners.length > 0;
return once(function () {
var idx = globalState.spyListeners.indexOf(listener);
if (idx !== -1)
globalState.spyListeners.splice(idx, 1);
spyEnabled = globalState.spyListeners.length > 0;
});
}
exports.spy = spy;
function trackTransitions(onReport) {
deprecated("trackTransitions is deprecated. Use mobx.spy instead");
if (typeof onReport === "boolean") {
deprecated("trackTransitions only takes a single callback function. If you are using the mobx-react-devtools, please update them first");
onReport = arguments[1];
}
if (!onReport) {
deprecated("trackTransitions without callback has been deprecated and is a no-op now. If you are using the mobx-react-devtools, please update them first");
return function () { };
}
return spy(onReport);
}
function transaction(action, thisArg, report) {
if (thisArg === void 0) { thisArg = undefined; }
if (report === void 0) { report = true; }
transactionStart((action.name) || "anonymous transaction", thisArg, report);
var res = action.call(thisArg);
transactionEnd(report);
return res;
}
exports.transaction = transaction;
function transactionStart(name, thisArg, report) {
if (thisArg === void 0) { thisArg = undefined; }
if (report === void 0) { report = true; }
startBatch();
globalState.inTransaction += 1;
if (report && isSpyEnabled()) {
spyReportStart({
type: "transaction",
target: thisArg,
name: name
});
}
}
function transactionEnd(report) {
if (report === void 0) { report = true; }
if (--globalState.inTransaction === 0) {
runReactions();
}
if (report && isSpyEnabled())
spyReportEnd();
endBatch();
}
function hasInterceptors(interceptable) {
return (interceptable.interceptors && interceptable.interceptors.length > 0);
}
function registerInterceptor(interceptable, handler) {
var interceptors = interceptable.interceptors || (interceptable.interceptors = []);
interceptors.push(handler);
return once(function () {
var idx = interceptors.indexOf(handler);
if (idx !== -1)
interceptors.splice(idx, 1);
});
}
function interceptChange(interceptable, change) {
var prevU = untrackedStart();
var interceptors = interceptable.interceptors;
for (var i = 0, l = interceptors.length; i < l; i++) {
change = interceptors[i](change);
invariant(!change || change.type, "Intercept handlers should return nothing or a change object");
if (!change)
return null;
}
untrackedEnd(prevU);
return change;
}
function hasListeners(listenable) {
return listenable.changeListeners && listenable.changeListeners.length > 0;
}
function registerListener(listenable, handler) {
var listeners = listenable.changeListeners || (listenable.changeListeners = []);
listeners.push(handler);
return once(function () {
var idx = listeners.indexOf(handler);
if (idx !== -1)
listeners.splice(idx, 1);
});
}
function notifyListeners(listenable, change) {
var prevU = untrackedStart();
var listeners = listenable.changeListeners;
if (!listeners)
return;
listeners = listeners.slice();
for (var i = 0, l = listeners.length; i < l; i++) {
if (Array.isArray(change)) {
listeners[i].apply(null, change);
}
else {
listeners[i](change);
}
}
untrackedEnd(prevU);
}
var ValueMode;
(function (ValueMode) {
ValueMode[ValueMode["Recursive"] = 0] = "Recursive";
ValueMode[ValueMode["Reference"] = 1] = "Reference";
ValueMode[ValueMode["Structure"] = 2] = "Structure";
ValueMode[ValueMode["Flat"] = 3] = "Flat";
})(ValueMode || (ValueMode = {}));
function asReference(value) {
return new AsReference(value);
}
exports.asReference = asReference;
function asStructure(value) {
return new AsStructure(value);
}
exports.asStructure = asStructure;
function asFlat(value) {
return new AsFlat(value);
}
exports.asFlat = asFlat;
var AsReference = (function () {
function AsReference(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsReference;
}());
var AsStructure = (function () {
function AsStructure(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsStructure;
}());
var AsFlat = (function () {
function AsFlat(value) {
this.value = value;
assertUnwrapped(value, "Modifiers are not allowed to be nested");
}
return AsFlat;
}());
function asMap(data, modifierFunc) {
return map(data, modifierFunc);
}
exports.asMap = asMap;
function getValueModeFromValue(value, defaultMode) {
if (value instanceof AsReference)
return [ValueMode.Reference, value.value];
if (value instanceof AsStructure)
return [ValueMode.Structure, value.value];
if (value instanceof AsFlat)
return [ValueMode.Flat, value.value];
return [defaultMode, value];
}
function getValueModeFromModifierFunc(func) {
if (func === asReference)
return ValueMode.Reference;
else if (func === asStructure)
return ValueMode.Structure;
else if (func === asFlat)
return ValueMode.Flat;
invariant(func === undefined, "Cannot determine value mode from function. Please pass in one of these: mobx.asReference, mobx.asStructure or mobx.asFlat, got: " + func);
return ValueMode.Recursive;
}
function makeChildObservable(value, parentMode, name) {
var childMode;
if (isObservable(value))
return value;
switch (parentMode) {
case ValueMode.Reference:
return value;
case ValueMode.Flat:
assertUnwrapped(value, "Items inside 'asFlat' cannot have modifiers");
childMode = ValueMode.Reference;
break;
case ValueMode.Structure:
assertUnwrapped(value, "Items inside 'asStructure' cannot have modifiers");
childMode = ValueMode.Structure;
break;
case ValueMode.Recursive:
_a = getValueModeFromValue(value, ValueMode.Recursive), childMode = _a[0], value = _a[1];
break;
default:
invariant(false, "Illegal State");
}
if (Array.isArray(value))
return createObservableArray(value, childMode, name);
if (isPlainObject(value) && Object.isExtensible(value))
return extendObservableHelper(value, value, childMode, name);
return value;
var _a;
}
function assertUnwrapped(value, message) {
if (value instanceof AsReference || value instanceof AsStructure || value instanceof AsFlat)
throw new Error("[mobx] asStructure / asReference / asFlat cannot be used here. " + message);
}
var safariPrototypeSetterInheritanceBug = (function () {
var v = false;
var p = {};
Object.defineProperty(p, "0", { set: function () { v = true; } });
Object.create(p)["0"] = 1;
return v === false;
})();
var OBSERVABLE_ARRAY_BUFFER_SIZE = 0;
var StubArray = (function () {
function StubArray() {
}
return StubArray;
}());
StubArray.prototype = [];
var ObservableArrayAdministration = (function () {
function ObservableArrayAdministration(name, mode, array, owned) {
this.mode = mode;
this.array = array;
this.owned = owned;
this.lastKnownLength = 0;
this.interceptors = null;
this.changeListeners = null;
this.atom = new BaseAtom(name || ("ObservableArray@" + getNextId()));
}
ObservableArrayAdministration.prototype.makeReactiveArrayItem = function (value) {
assertUnwrapped(value, "Array values cannot have modifiers");
if (this.mode === ValueMode.Flat || this.mode === ValueMode.Reference)
return value;
return makeChildObservable(value, this.mode, this.atom.name + "[..]");
};
ObservableArrayAdministration.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
ObservableArrayAdministration.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately === void 0) { fireImmediately = false; }
if (fireImmediately) {
listener({
object: this.array,
type: "splice",
index: 0,
added: this.values.slice(),
addedCount: this.values.length,
removed: [],
removedCount: 0
});
}
return registerListener(this, listener);
};
ObservableArrayAdministration.prototype.getArrayLength = function () {
this.atom.reportObserved();
return this.values.length;
};
ObservableArrayAdministration.prototype.setArrayLength = function (newLength) {
if (typeof newLength !== "number" || newLength < 0)
throw new Error("[mobx.array] Out of range: " + newLength);
var currentLength = this.values.length;
if (newLength === currentLength)
return;
else if (newLength > currentLength)
this.spliceWithArray(currentLength, 0, new Array(newLength - currentLength));
else
this.spliceWithArray(newLength, currentLength - newLength);
};
ObservableArrayAdministration.prototype.updateArrayLength = function (oldLength, delta) {
if (oldLength !== this.lastKnownLength)
throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?");
this.lastKnownLength += delta;
if (delta > 0 && oldLength + delta + 1 > OBSERVABLE_ARRAY_BUFFER_SIZE)
reserveArrayBuffer(oldLength + delta + 1);
};
ObservableArrayAdministration.prototype.spliceWithArray = function (index, deleteCount, newItems) {
checkIfStateModificationsAreAllowed();
var length = this.values.length;
if (index === undefined)
index = 0;
else if (index > length)
index = length;
else if (index < 0)
index = Math.max(0, length + index);
if (arguments.length === 1)
deleteCount = length - index;
else if (deleteCount === undefined || deleteCount === null)
deleteCount = 0;
else
deleteCount = Math.max(0, Math.min(deleteCount, length - index));
if (newItems === undefined)
newItems = [];
if (hasInterceptors(this)) {
var change = interceptChange(this, {
object: this.array,
type: "splice",
index: index,
removedCount: deleteCount,
added: newItems
});
if (!change)
return EMPTY_ARRAY;
deleteCount = change.removedCount;
newItems = change.added;
}
newItems = newItems.map(this.makeReactiveArrayItem, this);
var lengthDelta = newItems.length - deleteCount;
this.updateArrayLength(length, lengthDelta);
var res = (_a = this.values).splice.apply(_a, [index, deleteCount].concat(newItems));
if (deleteCount !== 0 || newItems.length !== 0)
this.notifyArraySplice(index, newItems, res);
return res;
var _a;
};
ObservableArrayAdministration.prototype.notifyArrayChildUpdate = function (index, newValue, oldValue) {
var notifySpy = !this.owned && isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
object: this.array,
type: "update",
index: index, newValue: newValue, oldValue: oldValue
} : null;
if (notifySpy)
spyReportStart(change);
this.atom.reportChanged();
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
ObservableArrayAdministration.prototype.notifyArraySplice = function (index, added, removed) {
var notifySpy = !this.owned && isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
object: this.array,
type: "splice",
index: index, removed: removed, added: added,
removedCount: removed.length,
addedCount: added.length
} : null;
if (notifySpy)
spyReportStart(change);
this.atom.reportChanged();
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
return ObservableArrayAdministration;
}());
var ObservableArray = (function (_super) {
__extends(ObservableArray, _super);
function ObservableArray(initialValues, mode, name, owned) {
if (owned === void 0) { owned = false; }
_super.call(this);
var adm = new ObservableArrayAdministration(name, mode, this, owned);
addHiddenFinalProp(this, "$mobx", adm);
if (initialValues && initialValues.length) {
adm.updateArrayLength(0, initialValues.length);
adm.values = initialValues.map(adm.makeReactiveArrayItem, adm);
adm.notifyArraySplice(0, adm.values.slice(), EMPTY_ARRAY);
}
else {
adm.values = [];
}
if (safariPrototypeSetterInheritanceBug) {
Object.defineProperty(adm.array, "0", ENTRY_0);
}
}
ObservableArray.prototype.intercept = function (handler) {
return this.$mobx.intercept(handler);
};
ObservableArray.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately === void 0) { fireImmediately = false; }
return this.$mobx.observe(listener, fireImmediately);
};
ObservableArray.prototype.clear = function () {
return this.splice(0);
};
ObservableArray.prototype.concat = function () {
var arrays = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrays[_i - 0] = arguments[_i];
}
this.$mobx.atom.reportObserved();
return Array.prototype.concat.apply(this.slice(), arrays.map(function (a) { return isObservableArray(a) ? a.slice() : a; }));
};
ObservableArray.prototype.replace = function (newItems) {
return this.$mobx.spliceWithArray(0, this.$mobx.values.length, newItems);
};
ObservableArray.prototype.toJS = function () {
return this.slice();
};
ObservableArray.prototype.toJSON = function () {
return this.toJS();
};
ObservableArray.prototype.peek = function () {
return this.$mobx.values;
};
ObservableArray.prototype.find = function (predicate, thisArg, fromIndex) {
if (fromIndex === void 0) { fromIndex = 0; }
this.$mobx.atom.reportObserved();
var items = this.$mobx.values, l = items.length;
for (var i = fromIndex; i < l; i++)
if (predicate.call(thisArg, items[i], i, this))
return items[i];
return undefined;
};
ObservableArray.prototype.splice = function (index, deleteCount) {
var newItems = [];
for (var _i = 2; _i < arguments.length; _i++) {
newItems[_i - 2] = arguments[_i];
}
switch (arguments.length) {
case 0:
return [];
case 1:
return this.$mobx.spliceWithArray(index);
case 2:
return this.$mobx.spliceWithArray(index, deleteCount);
}
return this.$mobx.spliceWithArray(index, deleteCount, newItems);
};
ObservableArray.prototype.push = function () {
var items = [];
for (var _i = 0; _i < arguments.length; _i++) {
items[_i - 0] = arguments[_i];
}
var adm = this.$mobx;
adm.spliceWithArray(adm.values.length, 0, items);
return adm.values.length;
};
ObservableArray.prototype.pop = function () {
return this.splice(Math.max(this.$mobx.values.length - 1, 0), 1)[0];
};
ObservableArray.prototype.shift = function () {
return this.splice(0, 1)[0];
};
ObservableArray.prototype.unshift = function () {
var items = [];
for (var _i = 0; _i < arguments.length; _i++) {
items[_i - 0] = arguments[_i];
}
var adm = this.$mobx;
adm.spliceWithArray(0, 0, items);
return adm.values.length;
};
ObservableArray.prototype.reverse = function () {
this.$mobx.atom.reportObserved();
var clone = this.slice();
return clone.reverse.apply(clone, arguments);
};
ObservableArray.prototype.sort = function (compareFn) {
this.$mobx.atom.reportObserved();
var clone = this.slice();
return clone.sort.apply(clone, arguments);
};
ObservableArray.prototype.remove = function (value) {
var idx = this.$mobx.values.indexOf(value);
if (idx > -1) {
this.splice(idx, 1);
return true;
}
return false;
};
ObservableArray.prototype.toString = function () {
return "[mobx.array] " + Array.prototype.toString.apply(this.$mobx.values, arguments);
};
ObservableArray.prototype.toLocaleString = function () {
return "[mobx.array] " + Array.prototype.toLocaleString.apply(this.$mobx.values, arguments);
};
return ObservableArray;
}(StubArray));
declareIterator(ObservableArray.prototype, function () {
return arrayAsIterator(this.slice());
});
makeNonEnumerable(ObservableArray.prototype, [
"constructor",
"intercept",
"observe",
"clear",
"concat",
"replace",
"toJS",
"toJSON",
"peek",
"find",
"splice",
"push",
"pop",
"shift",
"unshift",
"reverse",
"sort",
"remove",
"toString",
"toLocaleString"
]);
Object.defineProperty(ObservableArray.prototype, "length", {
enumerable: false,
configurable: true,
get: function () {
return this.$mobx.getArrayLength();
},
set: function (newLength) {
this.$mobx.setArrayLength(newLength);
}
});
[
"every",
"filter",
"forEach",
"indexOf",
"join",
"lastIndexOf",
"map",
"reduce",
"reduceRight",
"slice",
"some"
].forEach(function (funcName) {
var baseFunc = Array.prototype[funcName];
addHiddenProp(ObservableArray.prototype, funcName, function () {
this.$mobx.atom.reportObserved();
return baseFunc.apply(this.$mobx.values, arguments);
});
});
var ENTRY_0 = {
configurable: true,
enumerable: false,
set: createArraySetter(0),
get: createArrayGetter(0)
};
function createArrayBufferItem(index) {
var set = createArraySetter(index);
var get = createArrayGetter(index);
Object.defineProperty(ObservableArray.prototype, "" + index, {
enumerable: false,
configurable: true,
set: set, get: get
});
}
function createArraySetter(index) {
return function (newValue) {
var adm = this.$mobx;
var values = adm.values;
assertUnwrapped(newValue, "Modifiers cannot be used on array values. For non-reactive array values use makeReactive(asFlat(array)).");
if (index < values.length) {
checkIfStateModificationsAreAllowed();
var oldValue = values[index];
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
type: "update",
object: adm.array,
index: index, newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
newValue = adm.makeReactiveArrayItem(newValue);
var changed = (adm.mode === ValueMode.Structure) ? !deepEquals(oldValue, newValue) : oldValue !== newValue;
if (changed) {
values[index] = newValue;
adm.notifyArrayChildUpdate(index, newValue, oldValue);
}
}
else if (index === values.length) {
adm.spliceWithArray(index, 0, [newValue]);
}
else
throw new Error("[mobx.array] Index out of bounds, " + index + " is larger than " + values.length);
};
}
function createArrayGetter(index) {
return function () {
var impl = this.$mobx;
if (impl && index < impl.values.length) {
impl.atom.reportObserved();
return impl.values[index];
}
console.warn("[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + impl.values.length + "). Please check length first. Out of bound indices will not be tracked by MobX");
return undefined;
};
}
function reserveArrayBuffer(max) {
for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++)
createArrayBufferItem(index);
OBSERVABLE_ARRAY_BUFFER_SIZE = max;
}
reserveArrayBuffer(1000);
function createObservableArray(initialValues, mode, name) {
return new ObservableArray(initialValues, mode, name);
}
function fastArray(initialValues) {
deprecated("fastArray is deprecated. Please use `observable(asFlat([]))`");
return createObservableArray(initialValues, ValueMode.Flat, null);
}
exports.fastArray = fastArray;
function isObservableArray(thing) {
return thing instanceof ObservableArray;
}
exports.isObservableArray = isObservableArray;
var ObservableMapMarker = {};
var ObservableMap = (function () {
function ObservableMap(initialData, valueModeFunc) {
var _this = this;
this.$mobx = ObservableMapMarker;
this._data = {};
this._hasMap = {};
this.name = "ObservableMap@" + getNextId();
this._keys = new ObservableArray(null, ValueMode.Reference, this.name + ".keys()", true);
this.interceptors = null;
this.changeListeners = null;
this._valueMode = getValueModeFromModifierFunc(valueModeFunc);
if (this._valueMode === ValueMode.Flat)
this._valueMode = ValueMode.Reference;
allowStateChanges(true, function () {
if (isPlainObject(initialData))
_this.merge(initialData);
else if (Array.isArray(initialData))
initialData.forEach(function (_a) {
var key = _a[0], value = _a[1];
return _this.set(key, value);
});
});
}
ObservableMap.prototype._has = function (key) {
return typeof this._data[key] !== "undefined";
};
ObservableMap.prototype.has = function (key) {
if (!this.isValidKey(key))
return false;
key = "" + key;
if (this._hasMap[key])
return this._hasMap[key].get();
return this._updateHasMapEntry(key, false).get();
};
ObservableMap.prototype.set = function (key, value) {
this.assertValidKey(key);
key = "" + key;
var hasKey = this._has(key);
assertUnwrapped(value, "[mobx.map.set] Expected unwrapped value to be inserted to key '" + key + "'. If you need to use modifiers pass them as second argument to the constructor");
if (hasInterceptors(this)) {
var change = interceptChange(this, {
type: hasKey ? "update" : "add",
object: this,
newValue: value,
name: key
});
if (!change)
return;
value = change.newValue;
}
if (hasKey) {
this._updateValue(key, value);
}
else {
this._addValue(key, value);
}
};
ObservableMap.prototype.delete = function (key) {
var _this = this;
this.assertValidKey(key);
key = "" + key;
if (hasInterceptors(this)) {
var change = interceptChange(this, {
type: "delete",
object: this,
name: key
});
if (!change)
return false;
}
if (this._has(key)) {
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "delete",
object: this,
oldValue: this._data[key].value,
name: key
} : null;
if (notifySpy)
spyReportStart(change);
transaction(function () {
_this._keys.remove(key);
_this._updateHasMapEntry(key, false);
var observable = _this._data[key];
observable.setNewValue(undefined);
_this._data[key] = undefined;
}, undefined, false);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
return true;
}
return false;
};
ObservableMap.prototype._updateHasMapEntry = function (key, value) {
var entry = this._hasMap[key];
if (entry) {
entry.setNewValue(value);
}
else {
entry = this._hasMap[key] = new ObservableValue(value, ValueMode.Reference, this.name + "." + key + "?", false);
}
return entry;
};
ObservableMap.prototype._updateValue = function (name, newValue) {
var observable = this._data[name];
newValue = observable.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "update",
object: this,
oldValue: observable.value,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
observable.setNewValue(newValue);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
}
};
ObservableMap.prototype._addValue = function (name, newValue) {
var _this = this;
transaction(function () {
var observable = _this._data[name] = new ObservableValue(newValue, _this._valueMode, _this.name + "." + name, false);
newValue = observable.value;
_this._updateHasMapEntry(name, true);
_this._keys.push(name);
}, undefined, false);
var notifySpy = isSpyEnabled();
var notify = hasListeners(this);
var change = notify || notifySpy ? {
type: "add",
object: this,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
if (notify)
notifyListeners(this, change);
if (notifySpy)
spyReportEnd();
};
ObservableMap.prototype.get = function (key) {
key = "" + key;
if (this.has(key))
return this._data[key].get();
return undefined;
};
ObservableMap.prototype.keys = function () {
return arrayAsIterator(this._keys.slice());
};
ObservableMap.prototype.values = function () {
return arrayAsIterator(this._keys.map(this.get, this));
};
ObservableMap.prototype.entries = function () {
var _this = this;
return arrayAsIterator(this._keys.map(function (key) { return [key, _this.get(key)]; }));
};
ObservableMap.prototype.forEach = function (callback, thisArg) {
var _this = this;
this.keys().forEach(function (key) { return callback.call(thisArg, _this.get(key), key); });
};
ObservableMap.prototype.merge = function (other) {
var _this = this;
transaction(function () {
if (other instanceof ObservableMap)
other.keys().forEach(function (key) { return _this.set(key, other.get(key)); });
else
Object.keys(other).forEach(function (key) { return _this.set(key, other[key]); });
}, undefined, false);
return this;
};
ObservableMap.prototype.clear = function () {
var _this = this;
transaction(function () {
untracked(function () {
_this.keys().forEach(_this.delete, _this);
});
}, undefined, false);
};
Object.defineProperty(ObservableMap.prototype, "size", {
get: function () {
return this._keys.length;
},
enumerable: true,
configurable: true
});
ObservableMap.prototype.toJS = function () {
var _this = this;
var res = {};
this.keys().forEach(function (key) { return res[key] = _this.get(key); });
return res;
};
ObservableMap.prototype.toJs = function () {
deprecated("toJs is deprecated, use toJS instead");
return this.toJS();
};
ObservableMap.prototype.toJSON = function () {
return this.toJS();
};
ObservableMap.prototype.isValidKey = function (key) {
if (key === null || key === undefined)
return false;
if (typeof key !== "string" && typeof key !== "number" && typeof key !== "boolean")
return false;
return true;
};
ObservableMap.prototype.assertValidKey = function (key) {
if (!this.isValidKey(key))
throw new Error("[mobx.map] Invalid key: '" + key + "'");
};
ObservableMap.prototype.toString = function () {
var _this = this;
return this.name + "[{ " + this.keys().map(function (key) { return (key + ": " + ("" + _this.get(key))); }).join(", ") + " }]";
};
ObservableMap.prototype.observe = function (listener, fireImmediately) {
invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable maps.");
return registerListener(this, listener);
};
ObservableMap.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
return ObservableMap;
}());
exports.ObservableMap = ObservableMap;
declareIterator(ObservableMap.prototype, function () {
return this.entries();
});
function map(initialValues, valueModifier) {
return new ObservableMap(initialValues, valueModifier);
}
exports.map = map;
function isObservableMap(thing) {
return thing instanceof ObservableMap;
}
exports.isObservableMap = isObservableMap;
var ObservableObjectAdministration = (function () {
function ObservableObjectAdministration(target, name, mode) {
this.target = target;
this.name = name;
this.mode = mode;
this.values = {};
this.changeListeners = null;
this.interceptors = null;
}
ObservableObjectAdministration.prototype.observe = function (callback, fireImmediately) {
invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable objects.");
return registerListener(this, callback);
};
ObservableObjectAdministration.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
return ObservableObjectAdministration;
}());
function asObservableObject(target, name, mode) {
if (mode === void 0) { mode = ValueMode.Recursive; }
if (isObservableObject(target))
return target.$mobx;
if (!isPlainObject(target))
name = target.constructor.name + "@" + getNextId();
if (!name)
name = "ObservableObject@" + getNextId();
var adm = new ObservableObjectAdministration(target, name, mode);
addHiddenFinalProp(target, "$mobx", adm);
return adm;
}
function setObservableObjectInstanceProperty(adm, propName, value) {
if (adm.values[propName])
adm.target[propName] = value;
else
defineObservableProperty(adm, propName, value, true, undefined);
}
function defineObservableProperty(adm, propName, newValue, asInstanceProperty, setter) {
if (asInstanceProperty)
assertPropertyConfigurable(adm.target, propName);
var observable;
var name = adm.name + "." + propName;
var isComputed = true;
if (newValue instanceof ObservableValue) {
observable = newValue;
isComputed = false;
}
else if (newValue instanceof ComputedValue) {
observable = newValue;
if (!newValue.scope)
newValue.scope = adm.target;
}
else if (typeof newValue === "function" && newValue.length === 0 && !isAction(newValue)) {
observable = new ComputedValue(newValue, adm.target, false, name, setter);
}
else if (newValue instanceof AsStructure && typeof newValue.value === "function" && newValue.value.length === 0) {
observable = new ComputedValue(newValue.value, adm.target, true, name, setter);
}
else {
isComputed = false;
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
object: adm.target,
name: propName,
type: "add",
newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
observable = new ObservableValue(newValue, adm.mode, name, false);
newValue = observable.value;
}
adm.values[propName] = observable;
if (asInstanceProperty) {
Object.defineProperty(adm.target, propName, isComputed ? generateComputedPropConfig(propName) : generateObservablePropConfig(propName));
}
if (!isComputed)
notifyPropertyAddition(adm, adm.target, propName, newValue);
}
var observablePropertyConfigs = {};
var computedPropertyConfigs = {};
function generateObservablePropConfig(propName) {
var config = observablePropertyConfigs[propName];
if (config)
return config;
return observablePropertyConfigs[propName] = {
configurable: true,
enumerable: true,
get: function () {
return this.$mobx.values[propName].get();
},
set: function (v) {
setPropertyValue(this, propName, v);
}
};
}
function generateComputedPropConfig(propName) {
var config = computedPropertyConfigs[propName];
if (config)
return config;
return computedPropertyConfigs[propName] = {
configurable: true,
enumerable: false,
get: function () {
return this.$mobx.values[propName].get();
},
set: function (v) {
return this.$mobx.values[propName].set(v);
}
};
}
function setPropertyValue(instance, name, newValue) {
var adm = instance.$mobx;
var observable = adm.values[name];
if (hasInterceptors(adm)) {
var change = interceptChange(adm, {
type: "update",
object: instance,
name: name, newValue: newValue
});
if (!change)
return;
newValue = change.newValue;
}
newValue = observable.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notify = hasListeners(adm);
var notifySpy = isSpyEnabled();
var change = notifyListeners || hasListeners ? {
type: "update",
object: instance,
oldValue: observable.value,
name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
observable.setNewValue(newValue);
if (notify)
notifyListeners(adm, change);
if (notifySpy)
spyReportEnd();
}
}
function notifyPropertyAddition(adm, object, name, newValue) {
var notify = hasListeners(adm);
var notifySpy = isSpyEnabled();
var change = notify || notifySpy ? {
type: "add",
object: object, name: name, newValue: newValue
} : null;
if (notifySpy)
spyReportStart(change);
if (notify)
notifyListeners(adm, change);
if (notifySpy)
spyReportEnd();
}
function isObservableObject(thing) {
if (typeof thing === "object" && thing !== null) {
runLazyInitializers(thing);
return thing.$mobx instanceof ObservableObjectAdministration;
}
return false;
}
exports.isObservableObject = isObservableObject;
var UNCHANGED = {};
var ObservableValue = (function (_super) {
__extends(ObservableValue, _super);
function ObservableValue(value, mode, name, notifySpy) {
if (name === void 0) { name = "ObservableValue@" + getNextId(); }
if (notifySpy === void 0) { notifySpy = true; }
_super.call(this, name);
this.mode = mode;
this.hasUnreportedChange = false;
this.value = undefined;
var _a = getValueModeFromValue(value, ValueMode.Recursive), childmode = _a[0], unwrappedValue = _a[1];
if (this.mode === ValueMode.Recursive)
this.mode = childmode;
this.value = makeChildObservable(unwrappedValue, this.mode, this.name);
if (notifySpy && isSpyEnabled()) {
spyReport({ type: "create", object: this, newValue: this.value });
}
}
ObservableValue.prototype.set = function (newValue) {
var oldValue = this.value;
newValue = this.prepareNewValue(newValue);
if (newValue !== UNCHANGED) {
var notifySpy = isSpyEnabled();
if (notifySpy) {
spyReportStart({
type: "update",
object: this,
newValue: newValue, oldValue: oldValue
});
}
this.setNewValue(newValue);
if (notifySpy)
spyReportEnd();
}
};
ObservableValue.prototype.prepareNewValue = function (newValue) {
assertUnwrapped(newValue, "Modifiers cannot be used on non-initial values.");
checkIfStateModificationsAreAllowed();
if (hasInterceptors(this)) {
var change = interceptChange(this, { object: this, type: "update", newValue: newValue });
if (!change)
return UNCHANGED;
newValue = change.newValue;
}
var changed = valueDidChange(this.mode === ValueMode.Structure, this.value, newValue);
if (changed)
return makeChildObservable(newValue, this.mode, this.name);
return UNCHANGED;
};
ObservableValue.prototype.setNewValue = function (newValue) {
var oldValue = this.value;
this.value = newValue;
this.reportChanged();
if (hasListeners(this))
notifyListeners(this, [newValue, oldValue]);
};
ObservableValue.prototype.get = function () {
this.reportObserved();
return this.value;
};
ObservableValue.prototype.intercept = function (handler) {
return registerInterceptor(this, handler);
};
ObservableValue.prototype.observe = function (listener, fireImmediately) {
if (fireImmediately)
listener(this.value, undefined);
return registerListener(this, listener);
};
ObservableValue.prototype.toJSON = function () {
return this.get();
};
ObservableValue.prototype.toString = function () {
return this.name + "[" + this.value + "]";
};
return ObservableValue;
}(BaseAtom));
function getAtom(thing, property) {
if (typeof thing === "object" && thing !== null) {
if (isObservableArray(thing)) {
invariant(property === undefined, "It is not possible to get index atoms from arrays");
return thing.$mobx.atom;
}
if (isObservableMap(thing)) {
if (property === undefined)
return getAtom(thing._keys);
var observable_2 = thing._data[property] || thing._hasMap[property];
invariant(!!observable_2, "the entry '" + property + "' does not exist in the observable map '" + getDebugName(thing) + "'");
return observable_2;
}
runLazyInitializers(thing);
if (isObservableObject(thing)) {
invariant(!!property, "please specify a property");
var observable_3 = thing.$mobx.values[property];
invariant(!!observable_3, "no observable property '" + property + "' found on the observable object '" + getDebugName(thing) + "'");
return observable_3;
}
if (thing instanceof BaseAtom || thing instanceof ComputedValue || thing instanceof Reaction) {
return thing;
}
}
else if (typeof thing === "function") {
if (thing.$mobx instanceof Reaction) {
return thing.$mobx;
}
}
invariant(false, "Cannot obtain atom from " + thing);
}
function getAdministration(thing, property) {
invariant(thing, "Expection some object");
if (property !== undefined)
return getAdministration(getAtom(thing, property));
if (thing instanceof BaseAtom || thing instanceof ComputedValue || thing instanceof Reaction)
return thing;
if (isObservableMap(thing))
return thing;
runLazyInitializers(thing);
if (thing.$mobx)
return thing.$mobx;
invariant(false, "Cannot obtain administration from " + thing);
}
function getDebugName(thing, property) {
var named;
if (property !== undefined)
named = getAtom(thing, property);
else if (isObservableObject(thing) || isObservableMap(thing))
named = getAdministration(thing);
else
named = getAtom(thing);
return named.name;
}
function createClassPropertyDecorator(onInitialize, get, set, enumerable, allowCustomArguments) {
function classPropertyDecorator(target, key, descriptor, customArgs) {
invariant(allowCustomArguments || quacksLikeADecorator(arguments), "This function is a decorator, but it wasn't invoked like a decorator");
if (!descriptor) {
var newDescriptor = {
enumerable: enumerable,
configurable: true,
get: function () {
if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true)
typescriptInitializeProperty(this, key, undefined, onInitialize, customArgs, descriptor);
return get.call(this, key);
},
set: function (v) {
if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) {
typescriptInitializeProperty(this, key, v, onInitialize, customArgs, descriptor);
}
else {
set.call(this, key, v);
}
}
};
if (arguments.length < 3) {
Object.defineProperty(target, key, newDescriptor);
}
return newDescriptor;
}
else {
if (!hasOwnProperty(target, "__mobxLazyInitializers")) {
addHiddenProp(target, "__mobxLazyInitializers", (target.__mobxLazyInitializers && target.__mobxLazyInitializers.slice()) || []);
}
var value_1 = descriptor.value, initializer_1 = descriptor.initializer;
target.__mobxLazyInitializers.push(function (instance) {
onInitialize(instance, key, (initializer_1 ? initializer_1.call(instance) : value_1), customArgs, descriptor);
});
return {
enumerable: enumerable, configurable: true,
get: function () {
if (this.__mobxDidRunLazyInitializers !== true)
runLazyInitializers(this);
return get.call(this, key);
},
set: function (v) {
if (this.__mobxDidRunLazyInitializers !== true)
runLazyInitializers(this);
set.call(this, key, v);
}
};
}
}
if (allowCustomArguments) {
return function () {
if (quacksLikeADecorator(arguments))
return classPropertyDecorator.apply(null, arguments);
var outerArgs = arguments;
return function (target, key, descriptor) { return classPropertyDecorator(target, key, descriptor, outerArgs); };
};
}
return classPropertyDecorator;
}
function typescriptInitializeProperty(instance, key, v, onInitialize, customArgs, baseDescriptor) {
if (!hasOwnProperty(instance, "__mobxInitializedProps"))
addHiddenProp(instance, "__mobxInitializedProps", {});
instance.__mobxInitializedProps[key] = true;
onInitialize(instance, key, v, customArgs, baseDescriptor);
}
function runLazyInitializers(instance) {
if (instance.__mobxDidRunLazyInitializers === true)
return;
if (instance.__mobxLazyInitializers) {
addHiddenProp(instance, "__mobxDidRunLazyInitializers", true);
instance.__mobxDidRunLazyInitializers && instance.__mobxLazyInitializers.forEach(function (initializer) { return initializer(instance); });
}
}
function quacksLikeADecorator(args) {
return (args.length === 2 || args.length === 3) && typeof args[1] === "string";
}
function iteratorSymbol() {
return (typeof Symbol === "function" && Symbol.iterator) || "@@iterator";
}
var IS_ITERATING_MARKER = "__$$iterating";
function arrayAsIterator(array) {
invariant(array[IS_ITERATING_MARKER] !== true, "Illegal state: cannot recycle array as iterator");
addHiddenFinalProp(array, IS_ITERATING_MARKER, true);
var idx = -1;
addHiddenFinalProp(array, "next", function next() {
idx++;
return {
done: idx >= this.length,
value: idx < this.length ? this[idx] : undefined
};
});
return array;
}
function declareIterator(prototType, iteratorFactory) {
addHiddenFinalProp(prototType, iteratorSymbol(), iteratorFactory);
}
var SimpleEventEmitter = (function () {
function SimpleEventEmitter() {
this.listeners = [];
deprecated("extras.SimpleEventEmitter is deprecated and will be removed in the next major release");
}
SimpleEventEmitter.prototype.emit = function () {
var listeners = this.listeners.slice();
for (var i = 0, l = listeners.length; i < l; i++)
listeners[i].apply(null, arguments);
};
SimpleEventEmitter.prototype.on = function (listener) {
var _this = this;
this.listeners.push(listener);
return once(function () {
var idx = _this.listeners.indexOf(listener);
if (idx !== -1)
_this.listeners.splice(idx, 1);
});
};
SimpleEventEmitter.prototype.once = function (listener) {
var subscription = this.on(function () {
subscription();
listener.apply(this, arguments);
});
return subscription;
};
return SimpleEventEmitter;
}());
exports.SimpleEventEmitter = SimpleEventEmitter;
var EMPTY_ARRAY = [];
Object.freeze(EMPTY_ARRAY);
function getNextId() {
return ++globalState.mobxGuid;
}
function invariant(check, message, thing) {
if (!check)
throw new Error("[mobx] Invariant failed: " + message + (thing ? " in '" + thing + "'" : ""));
}
var deprecatedMessages = [];
function deprecated(msg) {
if (deprecatedMessages.indexOf(msg) !== -1)
return;
deprecatedMessages.push(msg);
console.error("[mobx] Deprecated: " + msg);
}
function once(func) {
var invoked = false;
return function () {
if (invoked)
return;
invoked = true;
return func.apply(this, arguments);
};
}
var noop = function () { };
function unique(list) {
var res = [];
list.forEach(function (item) {
if (res.indexOf(item) === -1)
res.push(item);
});
return res;
}
function joinStrings(things, limit, separator) {
if (limit === void 0) { limit = 100; }
if (separator === void 0) { separator = " - "; }
if (!things)
return "";
var sliced = things.slice(0, limit);
return "" + sliced.join(separator) + (things.length > limit ? " (... and " + (things.length - limit) + "more)" : "");
}
function isPlainObject(value) {
if (value === null || typeof value !== "object")
return false;
var proto = Object.getPrototypeOf(value);
return proto === Object.prototype || proto === null;
}
function objectAssign() {
var res = arguments[0];
for (var i = 1, l = arguments.length; i < l; i++) {
var source = arguments[i];
for (var key in source)
if (hasOwnProperty(source, key)) {
res[key] = source[key];
}
}
return res;
}
function valueDidChange(compareStructural, oldValue, newValue) {
return compareStructural
? !deepEquals(oldValue, newValue)
: oldValue !== newValue;
}
var prototypeHasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwnProperty(object, propName) {
return prototypeHasOwnProperty.call(object, propName);
}
function makeNonEnumerable(object, propNames) {
for (var i = 0; i < propNames.length; i++) {
addHiddenProp(object, propNames[i], object[propNames[i]]);
}
}
function addHiddenProp(object, propName, value) {
Object.defineProperty(object, propName, {
enumerable: false,
writable: true,
configurable: true,
value: value
});
}
function addHiddenFinalProp(object, propName, value) {
Object.defineProperty(object, propName, {
enumerable: false,
writable: false,
configurable: true,
value: value
});
}
function isPropertyConfigurable(object, prop) {
var descriptor = Object.getOwnPropertyDescriptor(object, prop);
return !descriptor || (descriptor.configurable !== false && descriptor.writable !== false);
}
function assertPropertyConfigurable(object, prop) {
invariant(isPropertyConfigurable(object, prop), "Cannot make property '" + prop + "' observable, it is not configurable and writable in the target object");
}
function getEnumerableKeys(obj) {
var res = [];
for (var key in obj)
res.push(key);
return res;
}
function deepEquals(a, b) {
if (a === null && b === null)
return true;
if (a === undefined && b === undefined)
return true;
var aIsArray = Array.isArray(a) || isObservableArray(a);
if (aIsArray !== (Array.isArray(b) || isObservableArray(b))) {
return false;
}
else if (aIsArray) {
if (a.length !== b.length)
return false;
for (var i = a.length - 1; i >= 0; i--)
if (!deepEquals(a[i], b[i]))
return false;
return true;
}
else if (typeof a === "object" && typeof b === "object") {
if (a === null || b === null)
return false;
if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length)
return false;
for (var prop in a) {
if (!(prop in b))
return false;
if (!deepEquals(a[prop], b[prop]))
return false;
}
return true;
}
return a === b;
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tb2J4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnJlZ2lzdGVyR2xvYmFscygpO1xuZXhwb3J0cy5leHRyYXMgPSB7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXM6IGFsbG93U3RhdGVDaGFuZ2VzLFxuICAgIGdldEF0b206IGdldEF0b20sXG4gICAgZ2V0RGVidWdOYW1lOiBnZXREZWJ1Z05hbWUsXG4gICAgZ2V0RGVwZW5kZW5jeVRyZWU6IGdldERlcGVuZGVuY3lUcmVlLFxuICAgIGdldE9ic2VydmVyVHJlZTogZ2V0T2JzZXJ2ZXJUcmVlLFxuICAgIGlzQ29tcHV0aW5nRGVyaXZhdGlvbjogaXNDb21wdXRpbmdEZXJpdmF0aW9uLFxuICAgIGlzU3B5RW5hYmxlZDogaXNTcHlFbmFibGVkLFxuICAgIHJlc2V0R2xvYmFsU3RhdGU6IHJlc2V0R2xvYmFsU3RhdGUsXG4gICAgc3B5UmVwb3J0OiBzcHlSZXBvcnQsXG4gICAgc3B5UmVwb3J0RW5kOiBzcHlSZXBvcnRFbmQsXG4gICAgc3B5UmVwb3J0U3RhcnQ6IHNweVJlcG9ydFN0YXJ0LFxuICAgIHRyYWNrVHJhbnNpdGlvbnM6IHRyYWNrVHJhbnNpdGlvbnNcbn07XG5leHBvcnRzLl8gPSB7XG4gICAgZ2V0QWRtaW5pc3RyYXRpb246IGdldEFkbWluaXN0cmF0aW9uLFxuICAgIHJlc2V0R2xvYmFsU3RhdGU6IHJlc2V0R2xvYmFsU3RhdGVcbn07XG5pZiAodHlwZW9mIF9fTU9CWF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAnb2JqZWN0Jykge1xuICAgIF9fTU9CWF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdE1vYngobW9kdWxlLmV4cG9ydHMpO1xufVxudmFyIGFjdGlvbkZpZWxkRGVjb3JhdG9yID0gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBhcmdzLCBvcmlnaW5hbERlc2NyaXB0b3IpIHtcbiAgICB2YXIgYWN0aW9uTmFtZSA9IChhcmdzICYmIGFyZ3MubGVuZ3RoID09PSAxKSA/IGFyZ3NbMF0gOiAodmFsdWUubmFtZSB8fCBrZXkgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIpO1xuICAgIHZhciB3cmFwcGVkQWN0aW9uID0gYWN0aW9uKGFjdGlvbk5hbWUsIHZhbHVlKTtcbiAgICBhZGRIaWRkZW5Qcm9wKHRhcmdldCwga2V5LCB3cmFwcGVkQWN0aW9uKTtcbn0sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gdGhpc1trZXldO1xufSwgZnVuY3Rpb24gKCkge1xuICAgIGludmFyaWFudChmYWxzZSwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBhc3NpZ24gbmV3IHZhbHVlcyB0byBAYWN0aW9uIGZpZWxkc1wiKTtcbn0sIGZhbHNlLCB0cnVlKTtcbmZ1bmN0aW9uIGFjdGlvbihhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFjdGlvbihhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIsIGFyZzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmcyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBjcmVhdGVBY3Rpb24oYXJnMSwgYXJnMik7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBuYW1lZEFjdGlvbkRlY29yYXRvcihhcmcxKTtcbiAgICByZXR1cm4gbmFtZWRBY3Rpb25EZWNvcmF0b3IoYXJnMikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYWN0aW9uID0gYWN0aW9uO1xuZnVuY3Rpb24gbmFtZWRBY3Rpb25EZWNvcmF0b3IobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBjcmVhdGVBY3Rpb24obmFtZSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25GaWVsZERlY29yYXRvcihuYW1lKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5mdW5jdGlvbiBydW5JbkFjdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdmFyIGFjdGlvbk5hbWUgPSB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIiA/IGFyZzEgOiBhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCI7XG4gICAgdmFyIGZuID0gdHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIiA/IGFyZzEgOiBhcmcyO1xuICAgIHZhciBzY29wZSA9IHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIgPyBhcmcyIDogYXJnMztcbiAgICBpbnZhcmlhbnQodHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIsIFwiYHJ1bkluQWN0aW9uYCBleHBlY3RzIGEgZnVuY3Rpb25cIik7XG4gICAgaW52YXJpYW50KGZuLmxlbmd0aCA9PT0gMCwgXCJgcnVuSW5BY3Rpb25gIGV4cGVjdHMgYSBmdW5jdGlvbiB3aXRob3V0IGFyZ3VtZW50c1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGFjdGlvbk5hbWUgPT09IFwic3RyaW5nXCIgJiYgYWN0aW9uTmFtZS5sZW5ndGggPiAwLCBcImFjdGlvbnMgc2hvdWxkIGhhdmUgdmFsaWQgbmFtZXMsIGdvdDogJ1wiICsgYWN0aW9uTmFtZSArIFwiJ1wiKTtcbiAgICByZXR1cm4gZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIHVuZGVmaW5lZCk7XG59XG5leHBvcnRzLnJ1bkluQWN0aW9uID0gcnVuSW5BY3Rpb247XG5mdW5jdGlvbiBpc0FjdGlvbih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0aGluZy5pc01vYnhBY3Rpb24gPT09IHRydWU7XG59XG5leHBvcnRzLmlzQWN0aW9uID0gaXNBY3Rpb247XG5mdW5jdGlvbiBhdXRvcnVuKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICB2YXIgbmFtZSwgdmlldywgc2NvcGU7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxO1xuICAgICAgICB2aWV3ID0gYXJnMjtcbiAgICAgICAgc2NvcGUgPSBhcmczO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkBcIiArIGdldE5leHRJZCgpKTtcbiAgICAgICAgdmlldyA9IGFyZzE7XG4gICAgICAgIHNjb3BlID0gYXJnMjtcbiAgICB9XG4gICAgYXNzZXJ0VW53cmFwcGVkKHZpZXcsIFwiYXV0b3J1biBtZXRob2RzIGNhbm5vdCBoYXZlIG1vZGlmaWVyc1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHZpZXcgPT09IFwiZnVuY3Rpb25cIiwgXCJhdXRvcnVuIGV4cGVjdHMgYSBmdW5jdGlvblwiKTtcbiAgICBpZiAoc2NvcGUpXG4gICAgICAgIHZpZXcgPSB2aWV3LmJpbmQoc2NvcGUpO1xuICAgIHZhciByZWFjdGlvbiA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudHJhY2socmVhY3Rpb25SdW5uZXIpO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIHJlYWN0aW9uUnVubmVyKCkge1xuICAgICAgICB2aWV3KHJlYWN0aW9uKTtcbiAgICB9XG4gICAgcmVhY3Rpb24uc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gcmVhY3Rpb24uZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1biA9IGF1dG9ydW47XG5mdW5jdGlvbiB3aGVuKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgcHJlZGljYXRlLCBlZmZlY3QsIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgcHJlZGljYXRlID0gYXJnMjtcbiAgICAgICAgZWZmZWN0ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSAoXCJXaGVuQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBwcmVkaWNhdGUgPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIHZhciBkaXNwb3NlciA9IGF1dG9ydW4obmFtZSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHNjb3BlKSkge1xuICAgICAgICAgICAgci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB2YXIgcHJldlVudHJhY2tlZCA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICBlZmZlY3QuY2FsbChzY29wZSk7XG4gICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGlzcG9zZXI7XG59XG5leHBvcnRzLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gYXV0b3J1blVudGlsKHByZWRpY2F0ZSwgZWZmZWN0LCBzY29wZSkge1xuICAgIGRlcHJlY2F0ZWQoXCJgYXV0b3J1blVudGlsYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGB3aGVuYC5cIik7XG4gICAgcmV0dXJuIHdoZW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYXV0b3J1blVudGlsID0gYXV0b3J1blVudGlsO1xuZnVuY3Rpb24gYXV0b3J1bkFzeW5jKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgZnVuYywgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZnVuYyA9IGFyZzI7XG4gICAgICAgIGRlbGF5ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkFzeW5jQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBmdW5jID0gYXJnMTtcbiAgICAgICAgZGVsYXkgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKVxuICAgICAgICBkZWxheSA9IDE7XG4gICAgaWYgKHNjb3BlKVxuICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcbiAgICB2YXIgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlzcG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2socmVhY3Rpb25SdW5uZXIpO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gcmVhY3Rpb25SdW5uZXIoKSB7IGZ1bmMocik7IH1cbiAgICByLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIHIuZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1bkFzeW5jID0gYXV0b3J1bkFzeW5jO1xuZnVuY3Rpb24gcmVhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNikge1xuICAgIHZhciBuYW1lLCBleHByZXNzaW9uLCBlZmZlY3QsIGZpcmVJbW1lZGlhdGVseSwgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGFyZzI7XG4gICAgICAgIGVmZmVjdCA9IGFyZzM7XG4gICAgICAgIGZpcmVJbW1lZGlhdGVseSA9IGFyZzQ7XG4gICAgICAgIGRlbGF5ID0gYXJnNTtcbiAgICAgICAgc2NvcGUgPSBhcmc2O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGFyZzEubmFtZSB8fCBhcmcyLm5hbWUgfHwgKFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBhcmczO1xuICAgICAgICBkZWxheSA9IGFyZzQ7XG4gICAgICAgIHNjb3BlID0gYXJnNTtcbiAgICB9XG4gICAgaWYgKGZpcmVJbW1lZGlhdGVseSA9PT0gdm9pZCAwKVxuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgICBpZiAoZGVsYXkgPT09IHZvaWQgMClcbiAgICAgICAgZGVsYXkgPSAwO1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByZXNzaW9uLCBWYWx1ZU1vZGUuUmVmZXJlbmNlKSwgdmFsdWVNb2RlID0gX2FbMF0sIHVud3JhcHBlZEV4cHJlc3Npb24gPSBfYVsxXTtcbiAgICB2YXIgY29tcGFyZVN0cnVjdHVyYWwgPSB2YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmU7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBwZWRFeHByZXNzaW9uLmJpbmQoc2NvcGUpO1xuICAgICAgICBlZmZlY3QgPSBhY3Rpb24obmFtZSwgZWZmZWN0LmJpbmQoc2NvcGUpKTtcbiAgICB9XG4gICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgdmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdmFyIG5leHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChkZWxheSA8IDEpIHtcbiAgICAgICAgICAgIHJlYWN0aW9uUnVubmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzU2NoZWR1bGVkKSB7XG4gICAgICAgICAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uUnVubmVyKCk7XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiByZWFjdGlvblJ1bm5lcigpIHtcbiAgICAgICAgaWYgKHIuaXNEaXNwb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgci50cmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHVud3JhcHBlZEV4cHJlc3Npb24ocik7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdmFsdWVEaWRDaGFuZ2UoY29tcGFyZVN0cnVjdHVyYWwsIG5leHRWYWx1ZSwgdik7XG4gICAgICAgICAgICBuZXh0VmFsdWUgPSB2O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpcnN0VGltZSAmJiBmaXJlSW1tZWRpYXRlbHkpXG4gICAgICAgICAgICBlZmZlY3QobmV4dFZhbHVlLCByKTtcbiAgICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgY2hhbmdlZCA9PT0gdHJ1ZSlcbiAgICAgICAgICAgIGVmZmVjdChuZXh0VmFsdWUsIHIpO1xuICAgICAgICBpZiAoZmlyc3RUaW1lKVxuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgfVxuICAgIHIuc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gci5nZXREaXNwb3NlcigpO1xufVxuZXhwb3J0cy5yZWFjdGlvbiA9IHJlYWN0aW9uO1xudmFyIGNvbXB1dGVkRGVjb3JhdG9yID0gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBfLCBkZWNvcmF0b3JBcmdzLCBvcmlnaW5hbERlc2NyaXB0b3IpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIG9yaWdpbmFsRGVzY3JpcHRvciAhPT0gXCJ1bmRlZmluZWRcIiwgXCJAY29tcHV0ZWQgY2FuIG9ubHkgYmUgdXNlZCBvbiBnZXR0ZXIgZnVuY3Rpb25zLCBsaWtlOiAnQGNvbXB1dGVkIGdldCBteVByb3BzKCkgeyByZXR1cm4gLi4uOyB9Jy4gSXQgbG9va3MgbGlrZSBpdCB3YXMgdXNlZCBvbiBhIHByb3BlcnR5LlwiKTtcbiAgICB2YXIgYmFzZVZhbHVlID0gb3JpZ2luYWxEZXNjcmlwdG9yLmdldDtcbiAgICB2YXIgc2V0dGVyID0gb3JpZ2luYWxEZXNjcmlwdG9yLnNldDtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiLCBcIkBjb21wdXRlZCBjYW4gb25seSBiZSB1c2VkIG9uIGdldHRlciBmdW5jdGlvbnMsIGxpa2U6ICdAY29tcHV0ZWQgZ2V0IG15UHJvcHMoKSB7IHJldHVybiAuLi47IH0nXCIpO1xuICAgIHZhciBjb21wYXJlU3RydWN0dXJhbCA9IGZhbHNlO1xuICAgIGlmIChkZWNvcmF0b3JBcmdzICYmIGRlY29yYXRvckFyZ3MubGVuZ3RoID09PSAxICYmIGRlY29yYXRvckFyZ3NbMF0uYXNTdHJ1Y3R1cmUgPT09IHRydWUpXG4gICAgICAgIGNvbXBhcmVTdHJ1Y3R1cmFsID0gdHJ1ZTtcbiAgICB2YXIgYWRtID0gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgdW5kZWZpbmVkLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKTtcbiAgICBkZWZpbmVPYnNlcnZhYmxlUHJvcGVydHkoYWRtLCBuYW1lLCBjb21wYXJlU3RydWN0dXJhbCA/IGFzU3RydWN0dXJlKGJhc2VWYWx1ZSkgOiBiYXNlVmFsdWUsIGZhbHNlLCBzZXR0ZXIpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IHRoaXMuJG1vYngudmFsdWVzW25hbWVdO1xuICAgIGlmIChvYnNlcnZhYmxlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9ic2VydmFibGUuZ2V0KCk7XG59LCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLiRtb2J4LnZhbHVlc1tuYW1lXS5zZXQodmFsdWUpO1xufSwgZmFsc2UsIHRydWUpO1xuZnVuY3Rpb24gY29tcHV0ZWQodGFyZ2V0T3JFeHByLCBrZXlPclNjb3BlT3JTZXR0ZXIsIGJhc2VEZXNjcmlwdG9yLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRPckV4cHIgPT09IFwiZnVuY3Rpb25cIiAmJiBhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBpZiAodHlwZW9mIGtleU9yU2NvcGVPclNldHRlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkRXhwcih0YXJnZXRPckV4cHIsIGtleU9yU2NvcGVPclNldHRlciwgdW5kZWZpbmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkRXhwcih0YXJnZXRPckV4cHIsIHVuZGVmaW5lZCwga2V5T3JTY29wZU9yU2V0dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVkRGVjb3JhdG9yLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG5mdW5jdGlvbiBjb21wdXRlZEV4cHIoZXhwciwgc2V0dGVyLCBzY29wZSkge1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgbW9kZSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgIHJldHVybiBuZXcgQ29tcHV0ZWRWYWx1ZSh2YWx1ZSwgc2NvcGUsIG1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUsIHZhbHVlLm5hbWUsIHNldHRlcik7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lciwgb25DbGVhbnVwKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0cmFuc2Zvcm1lciA9PT0gXCJmdW5jdGlvblwiICYmIHRyYW5zZm9ybWVyLmxlbmd0aCA9PT0gMSwgXCJjcmVhdGVUcmFuc2Zvcm1lciBleHBlY3RzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBhcmd1bWVudFwiKTtcbiAgICB2YXIgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICB2YXIgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgdmFyIFRyYW5zZm9ybWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKFRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1lcihzb3VyY2VJZGVudGlmaWVyLCBzb3VyY2VPYmplY3QpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZm9ybWVyKHNvdXJjZU9iamVjdCk7IH0sIG51bGwsIGZhbHNlLCBcIlRyYW5zZm9ybWVyLVwiICsgdHJhbnNmb3JtZXIubmFtZSArIFwiLVwiICsgc291cmNlSWRlbnRpZmllciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlSWRlbnRpZmllciA9IHNvdXJjZUlkZW50aWZpZXI7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZU9iamVjdCA9IHNvdXJjZU9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBUcmFuc2Zvcm1lci5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgZGVsZXRlIG9iamVjdENhY2hlW3RoaXMuc291cmNlSWRlbnRpZmllcl07XG4gICAgICAgICAgICBpZiAob25DbGVhbnVwKVxuICAgICAgICAgICAgICAgIG9uQ2xlYW51cChsYXN0VmFsdWUsIHRoaXMuc291cmNlT2JqZWN0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVyO1xuICAgIH0oQ29tcHV0ZWRWYWx1ZSkpO1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmIChyZXNldElkICE9PSBnbG9iYWxTdGF0ZS5yZXNldElkKSB7XG4gICAgICAgICAgICBvYmplY3RDYWNoZSA9IHt9O1xuICAgICAgICAgICAgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlkZW50aWZpZXIgPSBnZXRNZW1vaXphdGlvbklkKG9iamVjdCk7XG4gICAgICAgIHZhciByZWFjdGl2ZVRyYW5zZm9ybWVyID0gb2JqZWN0Q2FjaGVbaWRlbnRpZmllcl07XG4gICAgICAgIGlmIChyZWFjdGl2ZVRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgcmV0dXJuIHJlYWN0aXZlVHJhbnNmb3JtZXIuZ2V0KCk7XG4gICAgICAgIHJlYWN0aXZlVHJhbnNmb3JtZXIgPSBvYmplY3RDYWNoZVtpZGVudGlmaWVyXSA9IG5ldyBUcmFuc2Zvcm1lcihpZGVudGlmaWVyLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVUcmFuc2Zvcm1lci5nZXQoKTtcbiAgICB9O1xufVxuZXhwb3J0cy5jcmVhdGVUcmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyO1xuZnVuY3Rpb24gZ2V0TWVtb2l6YXRpb25JZChvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsIHx8IHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSB0cmFuc2Zvcm0gZXhwZWN0ZWQgc29tZSBraW5kIG9mIG9iamVjdCwgZ290OiBcIiArIG9iamVjdCk7XG4gICAgdmFyIHRpZCA9IG9iamVjdC4kdHJhbnNmb3JtSWQ7XG4gICAgaWYgKHRpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRpZCA9IGdldE5leHRJZCgpO1xuICAgICAgICBhZGRIaWRkZW5Qcm9wKG9iamVjdCwgXCIkdHJhbnNmb3JtSWRcIiwgdGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpZDtcbn1cbmZ1bmN0aW9uIGV4cHIoZXhwciwgc2NvcGUpIHtcbiAgICBpZiAoIWlzQ29tcHV0aW5nRGVyaXZhdGlvbigpKVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbbW9ieC5leHByXSAnZXhwcicgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgb3RoZXIgcmVhY3RpdmUgZnVuY3Rpb25zLlwiKTtcbiAgICByZXR1cm4gY29tcHV0ZWQoZXhwciwgc2NvcGUpLmdldCgpO1xufVxuZXhwb3J0cy5leHByID0gZXhwcjtcbmZ1bmN0aW9uIGV4dGVuZE9ic2VydmFibGUodGFyZ2V0KSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBwcm9wZXJ0aWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA+PSAyLCBcImV4dGVuZE9ic2VydmFibGUgZXhwZWN0ZWQgMiBvciBtb3JlIGFyZ3VtZW50c1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiwgXCJleHRlbmRPYnNlcnZhYmxlIGV4cGVjdHMgYW4gb2JqZWN0IGFzIGZpcnN0IGFyZ3VtZW50XCIpO1xuICAgIGludmFyaWFudCghKHRhcmdldCBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXApLCBcImV4dGVuZE9ic2VydmFibGUgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIG1hcHMsIHVzZSBtYXAubWVyZ2UgaW5zdGVhZFwiKTtcbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BTZXQpIHtcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBwcm9wU2V0ID09PSBcIm9iamVjdFwiLCBcImFsbCBhcmd1bWVudHMgb2YgZXh0ZW5kT2JzZXJ2YWJsZSBzaG91bGQgYmUgb2JqZWN0c1wiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih0YXJnZXQsIHByb3BTZXQsIFZhbHVlTW9kZS5SZWN1cnNpdmUsIG51bGwpO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG5leHBvcnRzLmV4dGVuZE9ic2VydmFibGUgPSBleHRlbmRPYnNlcnZhYmxlO1xuZnVuY3Rpb24gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih0YXJnZXQsIHByb3BlcnRpZXMsIG1vZGUsIG5hbWUpIHtcbiAgICB2YXIgYWRtID0gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgbmFtZSwgbW9kZSk7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShwcm9wZXJ0aWVzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBwcm9wZXJ0aWVzICYmICFpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHRhcmdldCwga2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lUcmVlKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlVG9EZXBlbmRlbmN5VHJlZShnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xufVxuZnVuY3Rpb24gbm9kZVRvRGVwZW5kZW5jeVRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2aW5nICYmIG5vZGUub2JzZXJ2aW5nLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSB1bmlxdWUobm9kZS5vYnNlcnZpbmcpLm1hcChub2RlVG9EZXBlbmRlbmN5VHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE9ic2VydmVyVHJlZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gbm9kZVRvT2JzZXJ2ZXJUcmVlKGdldEF0b20odGhpbmcsIHByb3BlcnR5KSk7XG59XG5mdW5jdGlvbiBub2RlVG9PYnNlcnZlclRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKGhhc09ic2VydmVycyhub2RlKSlcbiAgICAgICAgcmVzdWx0Lm9ic2VydmVycyA9IGdldE9ic2VydmVycyhub2RlKS5tYXAobm9kZVRvT2JzZXJ2ZXJUcmVlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0KHRoaW5nLCBwcm9wT3JIYW5kbGVyLCBoYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcE9ySGFuZGxlciwgaGFuZGxlcik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gaW50ZXJjZXB0SW50ZXJjZXB0YWJsZSh0aGluZywgcHJvcE9ySGFuZGxlcik7XG59XG5leHBvcnRzLmludGVyY2VwdCA9IGludGVyY2VwdDtcbmZ1bmN0aW9uIGludGVyY2VwdEludGVyY2VwdGFibGUodGhpbmcsIGhhbmRsZXIpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh0aGluZykgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcIlBhc3NpbmcgcGxhaW4gb2JqZWN0cyB0byBpbnRlcmNlcHQgLyBvYnNlcnZlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjBcIik7XG4gICAgICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbihvYnNlcnZhYmxlKHRoaW5nKSkuaW50ZXJjZXB0KGhhbmRsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpLmludGVyY2VwdChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdFByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgaGFuZGxlcikge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZSh0aGluZywge1xuICAgICAgICAgICAgcHJvcGVydHk6IHRoaW5nW3Byb3BlcnR5XVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVyY2VwdFByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgaGFuZGxlcik7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZywgcHJvcGVydHkpLmludGVyY2VwdChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSh2YWx1ZSwgcHJvcGVydHkpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5pc09ic2VydmFibGVdIGlzT2JzZXJ2YWJsZShvYmplY3QsIHByb3BlcnR5TmFtZSkgaXMgbm90IHN1cHBvcnRlZCBmb3IgYXJyYXlzIGFuZCBtYXBzLiBVc2UgbWFwLmhhcyBvciBhcnJheS5sZW5ndGggaW5zdGVhZC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhciBvID0gdmFsdWUuJG1vYng7XG4gICAgICAgICAgICByZXR1cm4gby52YWx1ZXMgJiYgISFvLnZhbHVlc1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISF2YWx1ZS4kbW9ieCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJhc2VBdG9tIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVhY3Rpb24gfHwgdmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGUgPSBpc09ic2VydmFibGU7XG52YXIgZGVjb3JhdG9ySW1wbCA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgYmFzZVZhbHVlKSB7XG4gICAgdmFyIHByZXZBID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICBpZiAodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBiYXNlVmFsdWUgPSBhc1JlZmVyZW5jZShiYXNlVmFsdWUpO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGJhc2VWYWx1ZSwgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2QSk7XG59LCBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV07XG4gICAgaWYgKG9ic2VydmFibGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZS5nZXQoKTtcbn0sIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHNldFByb3BlcnR5VmFsdWUodGhpcywgbmFtZSwgdmFsdWUpO1xufSwgdHJ1ZSwgZmFsc2UpO1xuZnVuY3Rpb24gb2JzZXJ2YWJsZURlY29yYXRvcih0YXJnZXQsIGtleSwgYmFzZURlc2NyaXB0b3IpIHtcbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA+PSAyICYmIGFyZ3VtZW50cy5sZW5ndGggPD0gMywgXCJJbGxlZ2FsIGRlY29yYXRvciBjb25maWdcIiwga2V5KTtcbiAgICBhc3NlcnRQcm9wZXJ0eUNvbmZpZ3VyYWJsZSh0YXJnZXQsIGtleSk7XG4gICAgaW52YXJpYW50KCFiYXNlRGVzY3JpcHRvciB8fCAhYmFzZURlc2NyaXB0b3IuZ2V0LCBcIkBvYnNlcnZhYmxlIGNhbiBub3QgYmUgdXNlZCBvbiBnZXR0ZXJzLCB1c2UgQGNvbXB1dGVkIGluc3RlYWRcIik7XG4gICAgcmV0dXJuIGRlY29yYXRvckltcGwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIG9ic2VydmFibGUodiwga2V5T3JTY29wZSkge1xuICAgIGlmICh2ID09PSB2b2lkIDApIHsgdiA9IHVuZGVmaW5lZDsgfVxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIGludmFyaWFudChhcmd1bWVudHMubGVuZ3RoIDwgMywgXCJvYnNlcnZhYmxlIGV4cGVjdHMgemVybywgb25lIG9yIHR3byBhcmd1bWVudHNcIik7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2KSlcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgdmFyIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHYsIFZhbHVlTW9kZS5SZWN1cnNpdmUpLCBtb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgdmFyIHNvdXJjZVR5cGUgPSBtb2RlID09PSBWYWx1ZU1vZGUuUmVmZXJlbmNlID8gVmFsdWVUeXBlLlJlZmVyZW5jZSA6IGdldFR5cGVPZlZhbHVlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHNvdXJjZVR5cGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuQXJyYXk6XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLlBsYWluT2JqZWN0OlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUodmFsdWUsIG1vZGUpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5SZWZlcmVuY2U6XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkNvbXBsZXhPYmplY3Q6XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgbW9kZSk7XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkNvbXBsZXhGdW5jdGlvbjpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4Lm9ic2VydmFibGVdIFRvIGJlIGFibGUgdG8gbWFrZSBhIGZ1bmN0aW9uIHJlYWN0aXZlIGl0IHNob3VsZCBub3QgaGF2ZSBhcmd1bWVudHMuIElmIHlvdSBuZWVkIGFuIG9ic2VydmFibGUgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIHVzZSBgb2JzZXJ2YWJsZShhc1JlZmVyZW5jZShmKSlgXCIpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5WaWV3RnVuY3Rpb246XG4gICAgICAgICAgICBkZXByZWNhdGVkKFwiVXNlIGBjb21wdXRlZChleHByKWAgaW5zdGVhZCBvZiBgb2JzZXJ2YWJsZShleHByKWBcIik7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZWQodiwga2V5T3JTY29wZSk7XG4gICAgfVxuICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xufVxuZXhwb3J0cy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTtcbnZhciBWYWx1ZVR5cGU7XG4oZnVuY3Rpb24gKFZhbHVlVHlwZSkge1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJSZWZlcmVuY2VcIl0gPSAwXSA9IFwiUmVmZXJlbmNlXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIlBsYWluT2JqZWN0XCJdID0gMV0gPSBcIlBsYWluT2JqZWN0XCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkNvbXBsZXhPYmplY3RcIl0gPSAyXSA9IFwiQ29tcGxleE9iamVjdFwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJBcnJheVwiXSA9IDNdID0gXCJBcnJheVwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJWaWV3RnVuY3Rpb25cIl0gPSA0XSA9IFwiVmlld0Z1bmN0aW9uXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkNvbXBsZXhGdW5jdGlvblwiXSA9IDVdID0gXCJDb21wbGV4RnVuY3Rpb25cIjtcbn0pKFZhbHVlVHlwZSB8fCAoVmFsdWVUeXBlID0ge30pKTtcbmZ1bmN0aW9uIGdldFR5cGVPZlZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBWYWx1ZVR5cGUuUmVmZXJlbmNlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IFZhbHVlVHlwZS5Db21wbGV4RnVuY3Rpb24gOiBWYWx1ZVR5cGUuVmlld0Z1bmN0aW9uO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGVBcnJheSlcbiAgICAgICAgcmV0dXJuIFZhbHVlVHlwZS5BcnJheTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKVxuICAgICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyBWYWx1ZVR5cGUuUGxhaW5PYmplY3QgOiBWYWx1ZVR5cGUuQ29tcGxleE9iamVjdDtcbiAgICByZXR1cm4gVmFsdWVUeXBlLlJlZmVyZW5jZTtcbn1cbmZ1bmN0aW9uIG9ic2VydmUodGhpbmcsIHByb3BPckNiLCBjYk9yRmlyZSwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKHR5cGVvZiBjYk9yRmlyZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gb2JzZXJ2ZU9ic2VydmFibGVQcm9wZXJ0eSh0aGluZywgcHJvcE9yQ2IsIGNiT3JGaXJlLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlKHRoaW5nLCBwcm9wT3JDYiwgY2JPckZpcmUpO1xufVxuZXhwb3J0cy5vYnNlcnZlID0gb2JzZXJ2ZTtcbmZ1bmN0aW9uIG9ic2VydmVPYnNlcnZhYmxlKHRoaW5nLCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24ob2JzZXJ2YWJsZSh0aGluZykpLm9ic2VydmUobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSk7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZykub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbn1cbmZ1bmN0aW9uIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BlcnR5LCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICBleHRlbmRPYnNlcnZhYmxlKHRoaW5nLCB7XG4gICAgICAgICAgICBwcm9wZXJ0eTogdGhpbmdbcHJvcGVydHldXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZU9ic2VydmFibGVQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcsIHByb3BlcnR5KS5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xufVxuZnVuY3Rpb24gdG9KUyhzb3VyY2UsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbikge1xuICAgIGlmIChkZXRlY3RDeWNsZXMgPT09IHZvaWQgMCkgeyBkZXRlY3RDeWNsZXMgPSB0cnVlOyB9XG4gICAgaWYgKF9fYWxyZWFkeVNlZW4gPT09IHZvaWQgMCkgeyBfX2FscmVhZHlTZWVuID0gbnVsbDsgfVxuICAgIGZ1bmN0aW9uIGNhY2hlKHZhbHVlKSB7XG4gICAgICAgIGlmIChkZXRlY3RDeWNsZXMpXG4gICAgICAgICAgICBfX2FscmVhZHlTZWVuLnB1c2goW3NvdXJjZSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRGF0ZSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgaWYgKGRldGVjdEN5Y2xlcyAmJiBfX2FscmVhZHlTZWVuID09PSBudWxsKVxuICAgICAgICBfX2FscmVhZHlTZWVuID0gW107XG4gICAgaWYgKGRldGVjdEN5Y2xlcyAmJiBzb3VyY2UgIT09IG51bGwgJiYgdHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IF9fYWxyZWFkeVNlZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgaWYgKF9fYWxyZWFkeVNlZW5baV1bMF0gPT09IHNvdXJjZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hbHJlYWR5U2VlbltpXVsxXTtcbiAgICB9XG4gICAgaWYgKCFzb3VyY2UpXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpIHtcbiAgICAgICAgdmFyIHJlcyA9IGNhY2hlKFtdKTtcbiAgICAgICAgdmFyIHRvQWRkID0gc291cmNlLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRvSlModmFsdWUsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7IH0pO1xuICAgICAgICByZXMubGVuZ3RoID0gdG9BZGQubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRvQWRkLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIHJlc1tpXSA9IHRvQWRkW2ldO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcCkge1xuICAgICAgICB2YXIgcmVzXzEgPSBjYWNoZSh7fSk7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7IHJldHVybiByZXNfMVtrZXldID0gdG9KUyh2YWx1ZSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKTsgfSk7XG4gICAgICAgIHJldHVybiByZXNfMTtcbiAgICB9XG4gICAgaWYgKGlzT2JzZXJ2YWJsZShzb3VyY2UpICYmIHNvdXJjZS4kbW9ieCBpbnN0YW5jZW9mIE9ic2VydmFibGVWYWx1ZSlcbiAgICAgICAgcmV0dXJuIHRvSlMoc291cmNlKCksIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE9ic2VydmFibGVWYWx1ZSlcbiAgICAgICAgcmV0dXJuIHRvSlMoc291cmNlLmdldCgpLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhciByZXMgPSBjYWNoZSh7fSk7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpXG4gICAgICAgICAgICByZXNba2V5XSA9IHRvSlMoc291cmNlW2tleV0sIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG5leHBvcnRzLnRvSlMgPSB0b0pTO1xuZnVuY3Rpb24gdG9KU09OKHNvdXJjZSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKSB7XG4gICAgaWYgKGRldGVjdEN5Y2xlcyA9PT0gdm9pZCAwKSB7IGRldGVjdEN5Y2xlcyA9IHRydWU7IH1cbiAgICBpZiAoX19hbHJlYWR5U2VlbiA9PT0gdm9pZCAwKSB7IF9fYWxyZWFkeVNlZW4gPSBudWxsOyB9XG4gICAgZGVwcmVjYXRlZChcInRvSlNPTiBpcyBkZXByZWNhdGVkLiBVc2UgdG9KUyBpbnN0ZWFkXCIpO1xuICAgIHJldHVybiB0b0pTLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLnRvSlNPTiA9IHRvSlNPTjtcbmZ1bmN0aW9uIGxvZyhtc2cpIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIHJldHVybiBtc2c7XG59XG5mdW5jdGlvbiB3aHlSdW4odGhpbmcsIHByb3ApIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhpbmcgPSBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgICAgICAgICBpZiAoIXRoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2coXCJ3aHlSdW4oKSBjYW4gb25seSBiZSB1c2VkIGlmIGEgZGVyaXZhdGlvbiBpcyBhY3RpdmUsIG9yIGJ5IHBhc3NpbmcgYW4gY29tcHV0ZWQgdmFsdWUgLyByZWFjdGlvbiBleHBsaWNpdGx5LiBJZiB5b3UgaW52b2tlZCB3aHlSdW4gZnJvbSBpbnNpZGUgYSBjb21wdXRhdGlvbjsgdGhlIGNvbXB1dGF0aW9uIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQgYnV0IHJlLWV2YWx1YXRpbmcgYmVjYXVzZSBzb21lYm9keSByZXF1ZXN0ZWQgaXQncyB2YWx1ZS5cIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGhpbmcgPSBnZXRBdG9tKHRoaW5nLCBwcm9wKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGluZyA9IGdldEF0b20odGhpbmcpO1xuICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpXG4gICAgICAgIHJldHVybiBsb2codGhpbmcud2h5UnVuKCkpO1xuICAgIGVsc2UgaWYgKHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pXG4gICAgICAgIHJldHVybiBsb2codGhpbmcud2h5UnVuKCkpO1xuICAgIGVsc2VcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCBcIndoeVJ1biBjYW4gb25seSBiZSB1c2VkIG9uIHJlYWN0aW9ucyBhbmQgY29tcHV0ZWQgdmFsdWVzXCIpO1xufVxuZXhwb3J0cy53aHlSdW4gPSB3aHlSdW47XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24oYWN0aW9uTmFtZSwgZm4pIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIsIFwiYGFjdGlvbmAgY2FuIG9ubHkgYmUgaW52b2tlZCBvbiBmdW5jdGlvbnNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiBhY3Rpb25OYW1lID09PSBcInN0cmluZ1wiICYmIGFjdGlvbk5hbWUubGVuZ3RoID4gMCwgXCJhY3Rpb25zIHNob3VsZCBoYXZlIHZhbGlkIG5hbWVzLCBnb3Q6ICdcIiArIGFjdGlvbk5hbWUgKyBcIidcIik7XG4gICAgdmFyIHJlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVBY3Rpb24oYWN0aW9uTmFtZSwgZm4sIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICByZXMuaXNNb2J4QWN0aW9uID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIGFyZ3MpIHtcbiAgICBpbnZhcmlhbnQoIShnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb24gaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlKSwgXCJDb21wdXRlZCB2YWx1ZXMgb3IgdHJhbnNmb3JtZXJzIHNob3VsZCBub3QgaW52b2tlIGFjdGlvbnMgb3IgdHJpZ2dlciBvdGhlciBzaWRlIGVmZmVjdHNcIik7XG4gICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgIHZhciBzdGFydFRpbWU7XG4gICAgaWYgKG5vdGlmeVNweSkge1xuICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgbCA9IChhcmdzICYmIGFyZ3MubGVuZ3RoKSB8fCAwO1xuICAgICAgICB2YXIgZmxhdHRlbmRBcmdzID0gbmV3IEFycmF5KGwpO1xuICAgICAgICBpZiAobCA+IDApXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgICAgICBmbGF0dGVuZEFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICB0eXBlOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgbmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIGZuOiBmbixcbiAgICAgICAgICAgIHRhcmdldDogc2NvcGUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGZsYXR0ZW5kQXJnc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHRyYW5zYWN0aW9uU3RhcnQoYWN0aW9uTmFtZSwgc2NvcGUsIGZhbHNlKTtcbiAgICB2YXIgcHJldkFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoc2NvcGUsIGFyZ3MpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkFsbG93U3RhdGVDaGFuZ2VzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoeyB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVzZVN0cmljdChzdHJpY3QpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXByZWNhdGVkKFwiYHVzZVN0cmljdGAgd2l0aG91dCBhcmd1bWVudHMgaXMgZGVwcmVjYXRlZCwgdXNlIGBpc1N0cmljdE1vZGVFbmFibGVkKClgIGluc3RlYWRcIik7XG4gICAgICAgIHJldHVybiBnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52YXJpYW50KGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbiA9PT0gbnVsbCwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgYHVzZVN0cmljdGAgd2hlbiBhIGRlcml2YXRpb24gaXMgcnVubmluZ1wiKTtcbiAgICAgICAgZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZSA9IHN0cmljdDtcbiAgICAgICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSAhc3RyaWN0O1xuICAgIH1cbn1cbmV4cG9ydHMudXNlU3RyaWN0ID0gdXNlU3RyaWN0O1xuZnVuY3Rpb24gaXNTdHJpY3RNb2RlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZTtcbn1cbmV4cG9ydHMuaXNTdHJpY3RNb2RlRW5hYmxlZCA9IGlzU3RyaWN0TW9kZUVuYWJsZWQ7XG5mdW5jdGlvbiBhbGxvd1N0YXRlQ2hhbmdlcyhhbGxvd1N0YXRlQ2hhbmdlcywgZnVuYykge1xuICAgIHZhciBwcmV2ID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydChhbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgdmFyIHJlcyA9IGZ1bmMoKTtcbiAgICBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydChhbGxvd1N0YXRlQ2hhbmdlcykge1xuICAgIHZhciBwcmV2ID0gZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXM7XG4gICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSBhbGxvd1N0YXRlQ2hhbmdlcztcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXYpIHtcbiAgICBnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcyA9IHByZXY7XG59XG52YXIgQmFzZUF0b20gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VBdG9tKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkgeyBuYW1lID0gXCJBdG9tQFwiICsgZ2V0TmV4dElkKCk7IH1cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc1BlbmRpbmdVbm9ic2VydmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnNJbmRleGVzID0ge307XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRCeSA9IDA7XG4gICAgICAgIHRoaXMubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgIH1cbiAgICBCYXNlQXRvbS5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgQmFzZUF0b20ucHJvdG90eXBlLnJlcG9ydE9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICB9O1xuICAgIEJhc2VBdG9tLnByb3RvdHlwZS5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cmFuc2FjdGlvblN0YXJ0KFwicHJvcGFnYXRpbmdBdG9tQ2hhbmdlXCIsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgcHJvcGFnYXRlQ2hhbmdlZCh0aGlzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgIH07XG4gICAgQmFzZUF0b20ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VBdG9tO1xufSgpKTtcbmV4cG9ydHMuQmFzZUF0b20gPSBCYXNlQXRvbTtcbnZhciBBdG9tID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXRvbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBdG9tKG5hbWUsIG9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyLCBvbkJlY29tZVVub2JzZXJ2ZWRIYW5kbGVyKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiQXRvbUBcIiArIGdldE5leHRJZCgpOyB9XG4gICAgICAgIGlmIChvbkJlY29tZU9ic2VydmVkSGFuZGxlciA9PT0gdm9pZCAwKSB7IG9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyID0gbm9vcDsgfVxuICAgICAgICBpZiAob25CZWNvbWVVbm9ic2VydmVkSGFuZGxlciA9PT0gdm9pZCAwKSB7IG9uQmVjb21lVW5vYnNlcnZlZEhhbmRsZXIgPSBub29wOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG5hbWUpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyID0gb25CZWNvbWVPYnNlcnZlZEhhbmRsZXI7XG4gICAgICAgIHRoaXMub25CZWNvbWVVbm9ic2VydmVkSGFuZGxlciA9IG9uQmVjb21lVW5vYnNlcnZlZEhhbmRsZXI7XG4gICAgICAgIHRoaXMuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQmVpbmdUcmFja2VkID0gZmFsc2U7XG4gICAgfVxuICAgIEF0b20ucHJvdG90eXBlLnJlcG9ydE9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFydEJhdGNoKCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUucmVwb3J0T2JzZXJ2ZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQmVpbmdUcmFja2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQmVpbmdUcmFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub25CZWNvbWVPYnNlcnZlZEhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRCYXRjaCgpO1xuICAgICAgICByZXR1cm4gISFnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgfTtcbiAgICBBdG9tLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNCZWluZ1RyYWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkJlY29tZVVub2JzZXJ2ZWRIYW5kbGVyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQXRvbTtcbn0oQmFzZUF0b20pKTtcbmV4cG9ydHMuQXRvbSA9IEF0b207XG52YXIgQ29tcHV0ZWRWYWx1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcHV0ZWRWYWx1ZShkZXJpdmF0aW9uLCBzY29wZSwgY29tcGFyZVN0cnVjdHVyYWwsIG5hbWUsIHNldHRlcikge1xuICAgICAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuY29tcGFyZVN0cnVjdHVyYWwgPSBjb21wYXJlU3RydWN0dXJhbDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgICAgICB0aGlzLm9ic2VydmluZyA9IFtdO1xuICAgICAgICB0aGlzLm5ld09ic2VydmluZyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgICB0aGlzLm9ic2VydmVyc0luZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kaWZmVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRCeSA9IDA7XG4gICAgICAgIHRoaXMubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTtcbiAgICAgICAgdGhpcy51bmJvdW5kRGVwc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fX21hcGlkID0gXCIjXCIgKyBnZXROZXh0SWQoKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pc0NvbXB1dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiQ29tcHV0ZWRWYWx1ZUBcIiArIGdldE5leHRJZCgpO1xuICAgICAgICBpZiAoc2V0dGVyKVxuICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBjcmVhdGVBY3Rpb24obmFtZSArIFwiLXNldHRlclwiLCBzZXR0ZXIpO1xuICAgIH1cbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZBbGxvd1N0YXRlQ2hhbmdlcyA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoZmFsc2UpO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5kZXJpdmF0aW9uLmNhbGwodGhpcy5zY29wZSk7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXZBbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuaXNDb21wdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIDtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrVW50cmFja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMucGVlaygpO1xuICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoaGFzRXJyb3IpXG4gICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uSW5EZXJpdmF0aW9uKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZVN0YWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9wYWdhdGVNYXliZUNoYW5nZWQodGhpcyk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmRlcGVuZGVuY2llc1N0YXRlICE9PSBJRGVyaXZhdGlvblN0YXRlLk5PVF9UUkFDS0lORywgXCJJTlRFUk5BTCBFUlJPUiBvbmx5IG9uQmVjb21lVW5vYnNlcnZlZCBzaG91bGRuJ3QgYmUgY2FsbGVkIHR3aWNlIGluIGEgcm93XCIpO1xuICAgICAgICBjbGVhck9ic2VydmluZyh0aGlzKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzQ29tcHV0aW5nLCBcIkN5Y2xlIGRldGVjdGVkIGluIGNvbXB1dGF0aW9uIFwiICsgdGhpcy5uYW1lLCB0aGlzLmRlcml2YXRpb24pO1xuICAgICAgICBzdGFydEJhdGNoKCk7XG4gICAgICAgIGlmIChnbG9iYWxTdGF0ZS5pbkJhdGNoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZSh0aGlzKSlcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wZWVrVW50cmFja2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRDb21wdXRlKHRoaXMpKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQW5kQ29tcHV0ZSgpKVxuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVDaGFuZ2VDb25maXJtZWQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGVuZEJhdGNoKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5yZWNvdmVyRnJvbUVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gZmFsc2U7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGVyKVxuICAgICAgICAgICAgdGhpcy5zZXR0ZXIuY2FsbCh0aGlzLnNjb3BlLCB2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltDb21wdXRlZFZhbHVlICdcIiArIHRoaXMubmFtZSArIFwiJ10gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhIGNvbXB1dGVkIHZhbHVlLlwiKTtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLnRyYWNrQW5kQ29tcHV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzU3B5RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBzcHlSZXBvcnQoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImNvbXB1dGVcIixcbiAgICAgICAgICAgICAgICBmbjogdGhpcy5kZXJpdmF0aW9uLFxuICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcy5zY29wZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZSA9IHRyYWNrRGVyaXZlZEZ1bmN0aW9uKHRoaXMsIHRoaXMucGVlayk7XG4gICAgICAgIHJldHVybiB2YWx1ZURpZENoYW5nZSh0aGlzLmNvbXBhcmVTdHJ1Y3R1cmFsLCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXV0b3J1bihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBfdGhpcy5nZXQoKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RUaW1lIHx8IGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2VSA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdW50cmFja2VkRW5kKHByZXZVKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoKTtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbXCIgKyB0aGlzLmRlcml2YXRpb24udG9TdHJpbmcoKSArIFwiXVwiO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUud2h5UnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNUcmFja2luZyA9IEJvb2xlYW4oZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uKTtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLmlzQ29tcHV0aW5nID8gdGhpcy5uZXdPYnNlcnZpbmcgOiB0aGlzLm9ic2VydmluZykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KTtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IHVuaXF1ZShnZXRPYnNlcnZlcnModGhpcykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KSk7XG4gICAgICAgIHJldHVybiAoKFwiXFxuV2h5UnVuPyBjb21wdXRhdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogUnVubmluZyBiZWNhdXNlOiBcIiArIChpc1RyYWNraW5nID8gXCJbYWN0aXZlXSB0aGUgdmFsdWUgb2YgdGhpcyBjb21wdXRhdGlvbiBpcyBuZWVkZWQgYnkgYSByZWFjdGlvblwiIDogdGhpcy5pc0NvbXB1dGluZyA/IFwiW2dldF0gVGhlIHZhbHVlIG9mIHRoaXMgY29tcHV0ZWQgd2FzIHJlcXVlc3RlZCBvdXRzaWRlIGEgcmVhY3Rpb25cIiA6IFwiW2lkbGVdIG5vdCBydW5uaW5nIGF0IHRoZSBtb21lbnRcIikgKyBcIlxcblwiKSArXG4gICAgICAgICAgICAodGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5OT1RfVFJBQ0tJTkdcbiAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICAgIFwiICogVGhpcyBjb21wdXRhdGlvbiBpcyBzdXNwZW5kZWQgKG5vdCBpbiB1c2UgYnkgYW55IHJlYWN0aW9uKSBhbmQgd29uJ3QgcnVuIGF1dG9tYXRpY2FsbHkuXFxuXFx0RGlkbid0IGV4cGVjdCB0aGlzIGNvbXB1dGF0aW9uIHRvIGJlIHN1c3BlbmRlZCBhdCB0aGlzIHBvaW50P1xcblxcdCAgMS4gTWFrZSBzdXJlIHRoaXMgY29tcHV0YXRpb24gaXMgdXNlZCBieSBhIHJlYWN0aW9uIChyZWFjdGlvbiwgYXV0b3J1biwgb2JzZXJ2ZXIpLlxcblxcdCAgMi4gQ2hlY2sgd2hldGhlciB5b3UgYXJlIHVzaW5nIHRoaXMgY29tcHV0YXRpb24gc3luY2hyb25vdXNseSAoaW4gdGhlIHNhbWUgc3RhY2sgYXMgdGhleSByZWFjdGlvbiB0aGF0IG5lZWRzIGl0KS5cXG5cIlxuICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgXCIgKiBUaGlzIGNvbXB1dGF0aW9uIHdpbGwgcmUtcnVuIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIG9ic2VydmFibGVzIGNoYW5nZXM6XFxuICAgIFwiICsgam9pblN0cmluZ3Mob2JzZXJ2aW5nKSArIFwiXFxuICAgIFwiICsgKCh0aGlzLmlzQ29tcHV0aW5nICYmIGlzVHJhY2tpbmcpID8gXCIgKC4uLiBvciBhbnkgb2JzZXJ2YWJsZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBydW4pXCIgOiBcIlwiKSArIFwiXFxuXFx0TWlzc2luZyBpdGVtcyBpbiB0aGlzIGxpc3Q/XFxuXFx0ICAxLiBDaGVjayB3aGV0aGVyIGFsbCB1c2VkIHZhbHVlcyBhcmUgcHJvcGVybHkgbWFya2VkIGFzIG9ic2VydmFibGUgKHVzZSBpc09ic2VydmFibGUgdG8gdmVyaWZ5KVxcblxcdCAgMi4gTWFrZSBzdXJlIHlvdSBkaWRuJ3QgZGVyZWZlcmVuY2UgdmFsdWVzIHRvbyBlYXJseS4gTW9iWCBvYnNlcnZlcyBwcm9wcywgbm90IHByaW1pdGl2ZXMuIEUuZzogdXNlICdwZXJzb24ubmFtZScgaW5zdGVhZCBvZiAnbmFtZScgaW4geW91ciBjb21wdXRhdGlvbi5cXG4gICogSWYgdGhlIG91dGNvbWUgb2YgdGhpcyBjb21wdXRhdGlvbiBjaGFuZ2VzLCB0aGUgZm9sbG93aW5nIG9ic2VydmVycyB3aWxsIGJlIHJlLXJ1bjpcXG4gICAgXCIgKyBqb2luU3RyaW5ncyhvYnNlcnZlcnMpICsgXCJcXG5cIikpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbXB1dGVkVmFsdWU7XG59KCkpO1xudmFyIElEZXJpdmF0aW9uU3RhdGU7XG4oZnVuY3Rpb24gKElEZXJpdmF0aW9uU3RhdGUpIHtcbiAgICBJRGVyaXZhdGlvblN0YXRlW0lEZXJpdmF0aW9uU3RhdGVbXCJOT1RfVFJBQ0tJTkdcIl0gPSAtMV0gPSBcIk5PVF9UUkFDS0lOR1wiO1xuICAgIElEZXJpdmF0aW9uU3RhdGVbSURlcml2YXRpb25TdGF0ZVtcIlVQX1RPX0RBVEVcIl0gPSAwXSA9IFwiVVBfVE9fREFURVwiO1xuICAgIElEZXJpdmF0aW9uU3RhdGVbSURlcml2YXRpb25TdGF0ZVtcIlBPU1NJQkxZX1NUQUxFXCJdID0gMV0gPSBcIlBPU1NJQkxZX1NUQUxFXCI7XG4gICAgSURlcml2YXRpb25TdGF0ZVtJRGVyaXZhdGlvblN0YXRlW1wiU1RBTEVcIl0gPSAyXSA9IFwiU1RBTEVcIjtcbn0pKElEZXJpdmF0aW9uU3RhdGUgfHwgKElEZXJpdmF0aW9uU3RhdGUgPSB7fSkpO1xuZXhwb3J0cy5JRGVyaXZhdGlvblN0YXRlID0gSURlcml2YXRpb25TdGF0ZTtcbmZ1bmN0aW9uIHNob3VsZENvbXB1dGUoZGVyaXZhdGlvbikge1xuICAgIHN3aXRjaCAoZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSkge1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTogcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HOlxuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuU1RBTEU6IHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuUE9TU0lCTFlfU1RBTEU6IHtcbiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB2YXIgcHJldlVudHJhY2tlZCA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZywgbCA9IG9icy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IG9ic1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXJpdmF0aW9uLmRlcGVuZGVuY2llc1N0YXRlID09PSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZURlcGVuZGVuY2llc1N0YXRlVG8wKGRlcml2YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcHV0aW5nRGVyaXZhdGlvbigpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uICE9PSBudWxsO1xufVxuZnVuY3Rpb24gY2hlY2tJZlN0YXRlTW9kaWZpY2F0aW9uc0FyZUFsbG93ZWQoKSB7XG4gICAgaWYgKCFnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcykge1xuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIGdsb2JhbFN0YXRlLnN0cmljdE1vZGVcbiAgICAgICAgICAgID8gXCJJdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUgb3IgY2hhbmdlIHN0YXRlIG91dHNpZGUgYW4gYGFjdGlvbmAgd2hlbiBNb2JYIGlzIGluIHN0cmljdCBtb2RlLiBXcmFwIHRoZSBjdXJyZW50IG1ldGhvZCBpbiBgYWN0aW9uYCBpZiB0aGlzIHN0YXRlIGNoYW5nZSBpcyBpbnRlbmRlZFwiXG4gICAgICAgICAgICA6IFwiSXQgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBzdGF0ZSB3aGVuIGEgY29tcHV0ZWQgdmFsdWUgb3IgdHJhbnNmb3JtZXIgaXMgYmVpbmcgZXZhbHVhdGVkLiBVc2UgJ2F1dG9ydW4nIHRvIGNyZWF0ZSByZWFjdGl2ZSBmdW5jdGlvbnMgd2l0aCBzaWRlLWVmZmVjdHMuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyYWNrRGVyaXZlZEZ1bmN0aW9uKGRlcml2YXRpb24sIGYpIHtcbiAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLm5ld09ic2VydmluZyA9IG5ldyBBcnJheShkZXJpdmF0aW9uLm9ic2VydmluZy5sZW5ndGggKyAxMDApO1xuICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgZGVyaXZhdGlvbi5ydW5JZCA9ICsrZ2xvYmFsU3RhdGUucnVuSWQ7XG4gICAgdmFyIHByZXZUcmFja2luZyA9IGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbjtcbiAgICBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgIHZhciBoYXNFeGNlcHRpb24gPSB0cnVlO1xuICAgIHZhciByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZi5jYWxsKGRlcml2YXRpb24pO1xuICAgICAgICBoYXNFeGNlcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmIChoYXNFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbkluRGVyaXZhdGlvbihkZXJpdmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbiA9IHByZXZUcmFja2luZztcbiAgICAgICAgICAgIGJpbmREZXBlbmRlbmNpZXMoZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV4Y2VwdGlvbkluRGVyaXZhdGlvbihkZXJpdmF0aW9uKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAoXCJbbW9ieF0gQW4gdW5jYXVnaHQgZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQgdmFsdWUsIGF1dG9ydW4gb3IgdHJhbnNmb3JtZXIuIE9yIGluc2lkZSB0aGUgcmVuZGVyKCkgbWV0aG9kIG9mIGFuIG9ic2VydmVyIGJhc2VkIFJlYWN0IGNvbXBvbmVudC4gXCIgK1xuICAgICAgICBcIlRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbmV2ZXIgdGhyb3cgZXhjZXB0aW9ucyBhcyBNb2JYIHdpbGwgbm90IGFsd2F5cyBiZSBhYmxlIHRvIHJlY292ZXIgZnJvbSB0aGVtLiBcIiArXG4gICAgICAgIChcIlBsZWFzZSBmaXggdGhlIGVycm9yIHJlcG9ydGVkIGFmdGVyIHRoaXMgbWVzc2FnZSBvciBlbmFibGUgJ1BhdXNlIG9uIChjYXVnaHQpIGV4Y2VwdGlvbnMnIGluIHlvdXIgZGVidWdnZXIgdG8gZmluZCB0aGUgcm9vdCBjYXVzZS4gSW46ICdcIiArIGRlcml2YXRpb24ubmFtZSArIFwiJy4gXCIpICtcbiAgICAgICAgXCJGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW9ieGpzL21vYngvaXNzdWVzLzQ2MlwiKTtcbiAgICBpZiAoaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLm5ld09ic2VydmluZyA9IG51bGw7XG4gICAgZGVyaXZhdGlvbi51bmJvdW5kRGVwc0NvdW50ID0gMDtcbiAgICBkZXJpdmF0aW9uLnJlY292ZXJGcm9tRXJyb3IoKTtcbiAgICBlbmRCYXRjaCgpO1xuICAgIHJlc2V0R2xvYmFsU3RhdGUoKTtcbn1cbmZ1bmN0aW9uIGJpbmREZXBlbmRlbmNpZXMoZGVyaXZhdGlvbikge1xuICAgIHZhciBwcmV2T2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIG9ic2VydmluZyA9IGRlcml2YXRpb24ub2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5uZXdPYnNlcnZpbmc7XG4gICAgZGVyaXZhdGlvbi5uZXdPYnNlcnZpbmcgPSBudWxsO1xuICAgIHZhciBpMCA9IDAsIGwgPSBkZXJpdmF0aW9uLnVuYm91bmREZXBzQ291bnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIGRlcCA9IG9ic2VydmluZ1tpXTtcbiAgICAgICAgaWYgKGRlcC5kaWZmVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIGRlcC5kaWZmVmFsdWUgPSAxO1xuICAgICAgICAgICAgaWYgKGkwICE9PSBpKVxuICAgICAgICAgICAgICAgIG9ic2VydmluZ1tpMF0gPSBkZXA7XG4gICAgICAgICAgICBpMCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmluZy5sZW5ndGggPSBpMDtcbiAgICBsID0gcHJldk9ic2VydmluZy5sZW5ndGg7XG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgICB2YXIgZGVwID0gcHJldk9ic2VydmluZ1tsXTtcbiAgICAgICAgaWYgKGRlcC5kaWZmVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU9ic2VydmVyKGRlcCwgZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgfVxuICAgIHdoaWxlIChpMC0tKSB7XG4gICAgICAgIHZhciBkZXAgPSBvYnNlcnZpbmdbaTBdO1xuICAgICAgICBpZiAoZGVwLmRpZmZWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgICAgICBhZGRPYnNlcnZlcihkZXAsIGRlcml2YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJPYnNlcnZpbmcoZGVyaXZhdGlvbikge1xuICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZztcbiAgICB2YXIgaSA9IG9icy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgcmVtb3ZlT2JzZXJ2ZXIob2JzW2ldLCBkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLmRlcGVuZGVuY2llc1N0YXRlID0gSURlcml2YXRpb25TdGF0ZS5OT1RfVFJBQ0tJTkc7XG4gICAgb2JzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiB1bnRyYWNrZWQoYWN0aW9uKSB7XG4gICAgdmFyIHByZXYgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciByZXMgPSBhY3Rpb24oKTtcbiAgICB1bnRyYWNrZWRFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudW50cmFja2VkID0gdW50cmFja2VkO1xuZnVuY3Rpb24gdW50cmFja2VkU3RhcnQoKSB7XG4gICAgdmFyIHByZXYgPSBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uID0gbnVsbDtcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHVudHJhY2tlZEVuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uID0gcHJldjtcbn1cbmZ1bmN0aW9uIGNoYW5nZURlcGVuZGVuY2llc1N0YXRlVG8wKGRlcml2YXRpb24pIHtcbiAgICBpZiAoZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFKVxuICAgICAgICByZXR1cm47XG4gICAgZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTtcbiAgICB2YXIgb2JzID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIGkgPSBvYnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9ic1tpXS5sb3dlc3RPYnNlcnZlclN0YXRlID0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFO1xufVxudmFyIHBlcnNpc3RlbnRLZXlzID0gW1wibW9ieEd1aWRcIiwgXCJyZXNldElkXCIsIFwic3B5TGlzdGVuZXJzXCIsIFwic3RyaWN0TW9kZVwiLCBcInJ1bklkXCJdO1xudmFyIE1vYlhHbG9iYWxzID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb2JYR2xvYmFscygpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gNDtcbiAgICAgICAgdGhpcy50cmFja2luZ0Rlcml2YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5tb2J4R3VpZCA9IDA7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5CYXRjaCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ1Vub2JzZXJ2YXRpb25zID0gW107XG4gICAgICAgIHRoaXMucGVuZGluZ1JlYWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmFsbG93U3RhdGVDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdHJpY3RNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3B5TGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIHJldHVybiBNb2JYR2xvYmFscztcbn0oKSk7XG52YXIgZ2xvYmFsU3RhdGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXMgPSBuZXcgTW9iWEdsb2JhbHMoKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ic2VydmFibGVUcmFja2luZ1N0YWNrIHx8IGdsb2JhbC5fX21vYnNlcnZhYmxlVmlld1N0YWNrKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gQW4gaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgbW9ic2VydmFibGUgaXMgYWxyZWFkeSBsb2FkZWQuXCIpO1xuICAgIGlmIChnbG9iYWwuX19tb2J4R2xvYmFsICYmIGdsb2JhbC5fX21vYnhHbG9iYWwudmVyc2lvbiAhPT0gcmVzLnZlcnNpb24pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBBbiBpbmNvbXBhdGlibGUgdmVyc2lvbiBvZiBtb2J4IGlzIGFscmVhZHkgbG9hZGVkLlwiKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ieEdsb2JhbClcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5fX21vYnhHbG9iYWw7XG4gICAgcmV0dXJuIGdsb2JhbC5fX21vYnhHbG9iYWwgPSByZXM7XG59KSgpO1xuZnVuY3Rpb24gcmVnaXN0ZXJHbG9iYWxzKCkge1xufVxuZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcbiAgICBnbG9iYWxTdGF0ZS5yZXNldElkKys7XG4gICAgdmFyIGRlZmF1bHRHbG9iYWxzID0gbmV3IE1vYlhHbG9iYWxzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIGRlZmF1bHRHbG9iYWxzKVxuICAgICAgICBpZiAocGVyc2lzdGVudEtleXMuaW5kZXhPZihrZXkpID09PSAtMSlcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlW2tleV0gPSBkZWZhdWx0R2xvYmFsc1trZXldO1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gIWdsb2JhbFN0YXRlLnN0cmljdE1vZGU7XG59XG5mdW5jdGlvbiBoYXNPYnNlcnZlcnMob2JzZXJ2YWJsZSkge1xuICAgIHJldHVybiBvYnNlcnZhYmxlLm9ic2VydmVycyAmJiBvYnNlcnZhYmxlLm9ic2VydmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gZ2V0T2JzZXJ2ZXJzKG9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZS5vYnNlcnZlcnM7XG59XG5mdW5jdGlvbiBpbnZhcmlhbnRPYnNlcnZlcnMob2JzZXJ2YWJsZSkge1xuICAgIHZhciBsaXN0ID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnM7XG4gICAgdmFyIG1hcCA9IG9ic2VydmFibGUub2JzZXJ2ZXJzSW5kZXhlcztcbiAgICB2YXIgbCA9IGxpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGxpc3RbaV0uX19tYXBpZDtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGludmFyaWFudChtYXBbaWRdID09PSBpLCBcIklOVEVSTkFMIEVSUk9SIG1hcHMgZGVyaXZhdGlvbi5fX21hcGlkIHRvIGluZGV4IGluIGxpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnZhcmlhbnQoIShpZCBpbiBtYXApLCBcIklOVEVSTkFMIEVSUk9SIG9ic2VydmVyIG9uIGluZGV4IDAgc2hvdWxkbnQgYmUgaGVsZCBpbiBtYXAuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludmFyaWFudChsaXN0Lmxlbmd0aCA9PT0gMCB8fCBPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA9PT0gbGlzdC5sZW5ndGggLSAxLCBcIklOVEVSTkFMIEVSUk9SIHRoZXJlIGlzIG5vIGp1bmsgaW4gbWFwXCIpO1xufVxuZnVuY3Rpb24gYWRkT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIHZhciBsID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoO1xuICAgIGlmIChsKSB7XG4gICAgICAgIG9ic2VydmFibGUub2JzZXJ2ZXJzSW5kZXhlc1tub2RlLl9fbWFwaWRdID0gbDtcbiAgICB9XG4gICAgb2JzZXJ2YWJsZS5vYnNlcnZlcnNbbF0gPSBub2RlO1xuICAgIGlmIChvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPiBub2RlLmRlcGVuZGVuY2llc1N0YXRlKVxuICAgICAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBub2RlLmRlcGVuZGVuY2llc1N0YXRlO1xufVxuZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIGlmIChvYnNlcnZhYmxlLm9ic2VydmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgb2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgcXVldWVGb3JVbm9ic2VydmF0aW9uKG9ic2VydmFibGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxpc3QgPSBvYnNlcnZhYmxlLm9ic2VydmVycztcbiAgICAgICAgdmFyIG1hcF8xID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnNJbmRleGVzO1xuICAgICAgICB2YXIgZmlsbGVyID0gbGlzdC5wb3AoKTtcbiAgICAgICAgaWYgKGZpbGxlciAhPT0gbm9kZSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gbWFwXzFbbm9kZS5fX21hcGlkXSB8fCAwO1xuICAgICAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgbWFwXzFbZmlsbGVyLl9fbWFwaWRdID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWFwXzFbZmlsbGVyLl9fbWFwaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdFtpbmRleF0gPSBmaWxsZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIG1hcF8xW25vZGUuX19tYXBpZF07XG4gICAgfVxufVxuZnVuY3Rpb24gcXVldWVGb3JVbm9ic2VydmF0aW9uKG9ic2VydmFibGUpIHtcbiAgICBpZiAoIW9ic2VydmFibGUuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbikge1xuICAgICAgICBvYnNlcnZhYmxlLmlzUGVuZGluZ1Vub2JzZXJ2YXRpb24gPSB0cnVlO1xuICAgICAgICBnbG9iYWxTdGF0ZS5wZW5kaW5nVW5vYnNlcnZhdGlvbnMucHVzaChvYnNlcnZhYmxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgIGdsb2JhbFN0YXRlLmluQmF0Y2grKztcbn1cbmZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5pbkJhdGNoID09PSAxKSB7XG4gICAgICAgIHZhciBsaXN0ID0gZ2xvYmFsU3RhdGUucGVuZGluZ1Vub2JzZXJ2YXRpb25zO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzEgPSBsaXN0W2ldO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZV8xLmlzUGVuZGluZ1Vub2JzZXJ2YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZhYmxlXzEub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGVfMS5vbkJlY29tZVVub2JzZXJ2ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxTdGF0ZS5wZW5kaW5nVW5vYnNlcnZhdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgZ2xvYmFsU3RhdGUuaW5CYXRjaC0tO1xufVxuZnVuY3Rpb24gcmVwb3J0T2JzZXJ2ZWQob2JzZXJ2YWJsZSkge1xuICAgIHZhciBkZXJpdmF0aW9uID0gZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uO1xuICAgIGlmIChkZXJpdmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZXJpdmF0aW9uLnJ1bklkICE9PSBvYnNlcnZhYmxlLmxhc3RBY2Nlc3NlZEJ5KSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLmxhc3RBY2Nlc3NlZEJ5ID0gZGVyaXZhdGlvbi5ydW5JZDtcbiAgICAgICAgICAgIGRlcml2YXRpb24ubmV3T2JzZXJ2aW5nW2Rlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCsrXSA9IG9ic2VydmFibGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHF1ZXVlRm9yVW5vYnNlcnZhdGlvbihvYnNlcnZhYmxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnZhcmlhbnRMT1Mob2JzZXJ2YWJsZSwgbXNnKSB7XG4gICAgdmFyIG1pbiA9IGdldE9ic2VydmVycyhvYnNlcnZhYmxlKS5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIE1hdGgubWluKGEsIGIuZGVwZW5kZW5jaWVzU3RhdGUpOyB9LCAyKTtcbiAgICBpZiAobWluID49IG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHRocm93IG5ldyBFcnJvcihcImxvd2VzdE9ic2VydmVyU3RhdGUgaXMgd3JvbmcgZm9yIFwiICsgbXNnICsgXCIgYmVjYXVzZSBcIiArIG1pbiArIFwiIDwgXCIgKyBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUpO1xufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ2hhbmdlZChvYnNlcnZhYmxlKSB7XG4gICAgaWYgKG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5TVEFMRSlcbiAgICAgICAgcmV0dXJuO1xuICAgIG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuU1RBTEU7XG4gICAgdmFyIG9ic2VydmVycyA9IG9ic2VydmFibGUub2JzZXJ2ZXJzO1xuICAgIHZhciBpID0gb2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciBkID0gb2JzZXJ2ZXJzW2ldO1xuICAgICAgICBpZiAoZC5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFKVxuICAgICAgICAgICAgZC5vbkJlY29tZVN0YWxlKCk7XG4gICAgICAgIGQuZGVwZW5kZW5jaWVzU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNoYW5nZUNvbmZpcm1lZChvYnNlcnZhYmxlKSB7XG4gICAgaWYgKG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5TVEFMRSlcbiAgICAgICAgcmV0dXJuO1xuICAgIG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuU1RBTEU7XG4gICAgdmFyIG9ic2VydmVycyA9IG9ic2VydmFibGUub2JzZXJ2ZXJzO1xuICAgIHZhciBpID0gb2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciBkID0gb2JzZXJ2ZXJzW2ldO1xuICAgICAgICBpZiAoZC5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5QT1NTSUJMWV9TVEFMRSlcbiAgICAgICAgICAgIGQuZGVwZW5kZW5jaWVzU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFO1xuICAgICAgICBlbHNlIGlmIChkLmRlcGVuZGVuY2llc1N0YXRlID09PSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEUpXG4gICAgICAgICAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEU7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlTWF5YmVDaGFuZ2VkKG9ic2VydmFibGUpIHtcbiAgICBpZiAob2JzZXJ2YWJsZS5sb3dlc3RPYnNlcnZlclN0YXRlICE9PSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEUpXG4gICAgICAgIHJldHVybjtcbiAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlBPU1NJQkxZX1NUQUxFO1xuICAgIHZhciBvYnNlcnZlcnMgPSBvYnNlcnZhYmxlLm9ic2VydmVycztcbiAgICB2YXIgaSA9IG9ic2VydmVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICB2YXIgZCA9IG9ic2VydmVyc1tpXTtcbiAgICAgICAgaWYgKGQuZGVwZW5kZW5jaWVzU3RhdGUgPT09IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURSkge1xuICAgICAgICAgICAgZC5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuUE9TU0lCTFlfU1RBTEU7XG4gICAgICAgICAgICBkLm9uQmVjb21lU3RhbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbnZhciBSZWFjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVhY3Rpb24obmFtZSwgb25JbnZhbGlkYXRlKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uSW52YWxpZGF0ZSA9IG9uSW52YWxpZGF0ZTtcbiAgICAgICAgdGhpcy5vYnNlcnZpbmcgPSBbXTtcbiAgICAgICAgdGhpcy5uZXdPYnNlcnZpbmcgPSBbXTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgICAgICB0aGlzLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgIHRoaXMucnVuSWQgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkJlY29tZVN0YWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnBlbmRpbmdSZWFjdGlvbnMucHVzaCh0aGlzKTtcbiAgICAgICAgICAgIHN0YXJ0QmF0Y2goKTtcbiAgICAgICAgICAgIHJ1blJlYWN0aW9ucygpO1xuICAgICAgICAgICAgZW5kQmF0Y2goKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLmlzU2NoZWR1bGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTY2hlZHVsZWQ7XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUucnVuUmVhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNob3VsZENvbXB1dGUodGhpcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1RyYWNrUGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkludmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUcmFja1BlbmRpbmcgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2NoZWR1bGVkLXJlYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUudHJhY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgc3RhcnRCYXRjaCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBzdGFydFRpbWU7XG4gICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBmbjogZm5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG4gICAgICAgIHRyYWNrRGVyaXZlZEZ1bmN0aW9uKHRoaXMsIGZuKTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzVHJhY2tQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNsZWFyT2JzZXJ2aW5nKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCh7XG4gICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kQmF0Y2goKTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5yZWNvdmVyRnJvbUVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRCYXRjaCgpO1xuICAgICAgICAgICAgICAgIGNsZWFyT2JzZXJ2aW5nKHRoaXMpO1xuICAgICAgICAgICAgICAgIGVuZEJhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5nZXREaXNwb3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmRpc3Bvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgci4kbW9ieCA9IHRoaXM7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJSZWFjdGlvbltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLndoeVJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLl9pc1J1bm5pbmcgPyB0aGlzLm5ld09ic2VydmluZyA6IHRoaXMub2JzZXJ2aW5nKS5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gZGVwLm5hbWU7IH0pO1xuICAgICAgICByZXR1cm4gKFwiXFxuV2h5UnVuPyByZWFjdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogU3RhdHVzOiBbXCIgKyAodGhpcy5pc0Rpc3Bvc2VkID8gXCJzdG9wcGVkXCIgOiB0aGlzLl9pc1J1bm5pbmcgPyBcInJ1bm5pbmdcIiA6IHRoaXMuaXNTY2hlZHVsZWQoKSA/IFwic2NoZWR1bGVkXCIgOiBcImlkbGVcIikgKyBcIl1cXG4gKiBUaGlzIHJlYWN0aW9uIHdpbGwgcmUtcnVuIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIG9ic2VydmFibGVzIGNoYW5nZXM6XFxuICAgIFwiICsgam9pblN0cmluZ3Mob2JzZXJ2aW5nKSArIFwiXFxuICAgIFwiICsgKCh0aGlzLl9pc1J1bm5pbmcpID8gXCIgKC4uLiBvciBhbnkgb2JzZXJ2YWJsZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBydW4pXCIgOiBcIlwiKSArIFwiXFxuXFx0TWlzc2luZyBpdGVtcyBpbiB0aGlzIGxpc3Q/XFxuXFx0ICAxLiBDaGVjayB3aGV0aGVyIGFsbCB1c2VkIHZhbHVlcyBhcmUgcHJvcGVybHkgbWFya2VkIGFzIG9ic2VydmFibGUgKHVzZSBpc09ic2VydmFibGUgdG8gdmVyaWZ5KVxcblxcdCAgMi4gTWFrZSBzdXJlIHlvdSBkaWRuJ3QgZGVyZWZlcmVuY2UgdmFsdWVzIHRvbyBlYXJseS4gTW9iWCBvYnNlcnZlcyBwcm9wcywgbm90IHByaW1pdGl2ZXMuIEUuZzogdXNlICdwZXJzb24ubmFtZScgaW5zdGVhZCBvZiAnbmFtZScgaW4geW91ciBjb21wdXRhdGlvbi5cXG5cIik7XG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3Rpb247XG59KCkpO1xuZXhwb3J0cy5SZWFjdGlvbiA9IFJlYWN0aW9uO1xudmFyIE1BWF9SRUFDVElPTl9JVEVSQVRJT05TID0gMTAwO1xuZnVuY3Rpb24gcnVuUmVhY3Rpb25zKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5pc1J1bm5pbmdSZWFjdGlvbnMgPT09IHRydWUgfHwgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiA+IDApXG4gICAgICAgIHJldHVybjtcbiAgICBnbG9iYWxTdGF0ZS5pc1J1bm5pbmdSZWFjdGlvbnMgPSB0cnVlO1xuICAgIHZhciBhbGxSZWFjdGlvbnMgPSBnbG9iYWxTdGF0ZS5wZW5kaW5nUmVhY3Rpb25zO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB3aGlsZSAoYWxsUmVhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCsraXRlcmF0aW9ucyA9PT0gTUFYX1JFQUNUSU9OX0lURVJBVElPTlMpIHtcbiAgICAgICAgICAgIHJlc2V0R2xvYmFsU3RhdGUoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJSZWFjdGlvbiBkb2Vzbid0IGNvbnZlcmdlIHRvIGEgc3RhYmxlIHN0YXRlIGFmdGVyIFwiICsgTUFYX1JFQUNUSU9OX0lURVJBVElPTlMgKyBcIiBpdGVyYXRpb25zLlwiKVxuICAgICAgICAgICAgICAgICsgKFwiIFByb2JhYmx5IHRoZXJlIGlzIGEgY3ljbGUgaW4gdGhlIHJlYWN0aXZlIGZ1bmN0aW9uOiBcIiArIGFsbFJlYWN0aW9uc1swXSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZW1haW5pbmdSZWFjdGlvbnMgPSBhbGxSZWFjdGlvbnMuc3BsaWNlKDApO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlbWFpbmluZ1JlYWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICByZW1haW5pbmdSZWFjdGlvbnNbaV0ucnVuUmVhY3Rpb24oKTtcbiAgICB9XG4gICAgZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID0gZmFsc2U7XG59XG52YXIgc3B5RW5hYmxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaXNTcHlFbmFibGVkKCkge1xuICAgIHJldHVybiBzcHlFbmFibGVkO1xufVxuZnVuY3Rpb24gc3B5UmVwb3J0KGV2ZW50KSB7XG4gICAgaWYgKCFzcHlFbmFibGVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxpc3RlbmVycyA9IGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgIGxpc3RlbmVyc1tpXShldmVudCk7XG59XG5mdW5jdGlvbiBzcHlSZXBvcnRTdGFydChldmVudCkge1xuICAgIHZhciBjaGFuZ2UgPSBvYmplY3RBc3NpZ24oe30sIGV2ZW50LCB7IHNweVJlcG9ydFN0YXJ0OiB0cnVlIH0pO1xuICAgIHNweVJlcG9ydChjaGFuZ2UpO1xufVxudmFyIEVORF9FVkVOVCA9IHsgc3B5UmVwb3J0RW5kOiB0cnVlIH07XG5mdW5jdGlvbiBzcHlSZXBvcnRFbmQoY2hhbmdlKSB7XG4gICAgaWYgKGNoYW5nZSlcbiAgICAgICAgc3B5UmVwb3J0KG9iamVjdEFzc2lnbih7fSwgY2hhbmdlLCBFTkRfRVZFTlQpKTtcbiAgICBlbHNlXG4gICAgICAgIHNweVJlcG9ydChFTkRfRVZFTlQpO1xufVxuZnVuY3Rpb24gc3B5KGxpc3RlbmVyKSB7XG4gICAgZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHNweUVuYWJsZWQgPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnMubGVuZ3RoID4gMDtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpZHggIT09IC0xKVxuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBzcHlFbmFibGVkID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmxlbmd0aCA+IDA7XG4gICAgfSk7XG59XG5leHBvcnRzLnNweSA9IHNweTtcbmZ1bmN0aW9uIHRyYWNrVHJhbnNpdGlvbnMob25SZXBvcnQpIHtcbiAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyBpcyBkZXByZWNhdGVkLiBVc2UgbW9ieC5zcHkgaW5zdGVhZFwiKTtcbiAgICBpZiAodHlwZW9mIG9uUmVwb3J0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyBvbmx5IHRha2VzIGEgc2luZ2xlIGNhbGxiYWNrIGZ1bmN0aW9uLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBtb2J4LXJlYWN0LWRldnRvb2xzLCBwbGVhc2UgdXBkYXRlIHRoZW0gZmlyc3RcIik7XG4gICAgICAgIG9uUmVwb3J0ID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgICBpZiAoIW9uUmVwb3J0KSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJ0cmFja1RyYW5zaXRpb25zIHdpdGhvdXQgY2FsbGJhY2sgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgYSBuby1vcCBub3cuIElmIHlvdSBhcmUgdXNpbmcgdGhlIG1vYngtcmVhY3QtZGV2dG9vbHMsIHBsZWFzZSB1cGRhdGUgdGhlbSBmaXJzdFwiKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNweShvblJlcG9ydCk7XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbihhY3Rpb24sIHRoaXNBcmcsIHJlcG9ydCkge1xuICAgIGlmICh0aGlzQXJnID09PSB2b2lkIDApIHsgdGhpc0FyZyA9IHVuZGVmaW5lZDsgfVxuICAgIGlmIChyZXBvcnQgPT09IHZvaWQgMCkgeyByZXBvcnQgPSB0cnVlOyB9XG4gICAgdHJhbnNhY3Rpb25TdGFydCgoYWN0aW9uLm5hbWUpIHx8IFwiYW5vbnltb3VzIHRyYW5zYWN0aW9uXCIsIHRoaXNBcmcsIHJlcG9ydCk7XG4gICAgdmFyIHJlcyA9IGFjdGlvbi5jYWxsKHRoaXNBcmcpO1xuICAgIHRyYW5zYWN0aW9uRW5kKHJlcG9ydCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbmZ1bmN0aW9uIHRyYW5zYWN0aW9uU3RhcnQobmFtZSwgdGhpc0FyZywgcmVwb3J0KSB7XG4gICAgaWYgKHRoaXNBcmcgPT09IHZvaWQgMCkgeyB0aGlzQXJnID0gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHJlcG9ydCA9PT0gdm9pZCAwKSB7IHJlcG9ydCA9IHRydWU7IH1cbiAgICBzdGFydEJhdGNoKCk7XG4gICAgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiArPSAxO1xuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzQXJnLFxuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbkVuZChyZXBvcnQpIHtcbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIGlmICgtLWdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPT09IDApIHtcbiAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgfVxuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpXG4gICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIGVuZEJhdGNoKCk7XG59XG5mdW5jdGlvbiBoYXNJbnRlcmNlcHRvcnMoaW50ZXJjZXB0YWJsZSkge1xuICAgIHJldHVybiAoaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckludGVyY2VwdG9yKGludGVyY2VwdGFibGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgfHwgKGludGVyY2VwdGFibGUuaW50ZXJjZXB0b3JzID0gW10pO1xuICAgIGludGVyY2VwdG9ycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkeCA9IGludGVyY2VwdG9ycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGludGVyY2VwdG9ycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdENoYW5nZShpbnRlcmNlcHRhYmxlLCBjaGFuZ2UpIHtcbiAgICB2YXIgcHJldlUgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciBpbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRhYmxlLmludGVyY2VwdG9ycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGludGVyY2VwdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY2hhbmdlID0gaW50ZXJjZXB0b3JzW2ldKGNoYW5nZSk7XG4gICAgICAgIGludmFyaWFudCghY2hhbmdlIHx8IGNoYW5nZS50eXBlLCBcIkludGVyY2VwdCBoYW5kbGVycyBzaG91bGQgcmV0dXJuIG5vdGhpbmcgb3IgYSBjaGFuZ2Ugb2JqZWN0XCIpO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgIHJldHVybiBjaGFuZ2U7XG59XG5mdW5jdGlvbiBoYXNMaXN0ZW5lcnMobGlzdGVuYWJsZSkge1xuICAgIHJldHVybiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyAmJiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5hYmxlLCBoYW5kbGVyKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IGxpc3RlbmFibGUuY2hhbmdlTGlzdGVuZXJzIHx8IChsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBsaXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMobGlzdGVuYWJsZSwgY2hhbmdlKSB7XG4gICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICB2YXIgbGlzdGVuZXJzID0gbGlzdGVuYWJsZS5jaGFuZ2VMaXN0ZW5lcnM7XG4gICAgaWYgKCFsaXN0ZW5lcnMpXG4gICAgICAgIHJldHVybjtcbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlKSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0oY2hhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xufVxudmFyIFZhbHVlTW9kZTtcbihmdW5jdGlvbiAoVmFsdWVNb2RlKSB7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIlJlY3Vyc2l2ZVwiXSA9IDBdID0gXCJSZWN1cnNpdmVcIjtcbiAgICBWYWx1ZU1vZGVbVmFsdWVNb2RlW1wiUmVmZXJlbmNlXCJdID0gMV0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlTW9kZVtWYWx1ZU1vZGVbXCJTdHJ1Y3R1cmVcIl0gPSAyXSA9IFwiU3RydWN0dXJlXCI7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIkZsYXRcIl0gPSAzXSA9IFwiRmxhdFwiO1xufSkoVmFsdWVNb2RlIHx8IChWYWx1ZU1vZGUgPSB7fSkpO1xuZnVuY3Rpb24gYXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzUmVmZXJlbmNlKHZhbHVlKTtcbn1cbmV4cG9ydHMuYXNSZWZlcmVuY2UgPSBhc1JlZmVyZW5jZTtcbmZ1bmN0aW9uIGFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBBc1N0cnVjdHVyZSh2YWx1ZSk7XG59XG5leHBvcnRzLmFzU3RydWN0dXJlID0gYXNTdHJ1Y3R1cmU7XG5mdW5jdGlvbiBhc0ZsYXQodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzRmxhdCh2YWx1ZSk7XG59XG5leHBvcnRzLmFzRmxhdCA9IGFzRmxhdDtcbnZhciBBc1JlZmVyZW5jZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiTW9kaWZpZXJzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBuZXN0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBBc1JlZmVyZW5jZTtcbn0oKSk7XG52YXIgQXNTdHJ1Y3R1cmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNTdHJ1Y3R1cmU7XG59KCkpO1xudmFyIEFzRmxhdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNGbGF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNGbGF0O1xufSgpKTtcbmZ1bmN0aW9uIGFzTWFwKGRhdGEsIG1vZGlmaWVyRnVuYykge1xuICAgIHJldHVybiBtYXAoZGF0YSwgbW9kaWZpZXJGdW5jKTtcbn1cbmV4cG9ydHMuYXNNYXAgPSBhc01hcDtcbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2YWx1ZSwgZGVmYXVsdE1vZGUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuUmVmZXJlbmNlLCB2YWx1ZS52YWx1ZV07XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBbVmFsdWVNb2RlLlN0cnVjdHVyZSwgdmFsdWUudmFsdWVdO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzRmxhdClcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuRmxhdCwgdmFsdWUudmFsdWVdO1xuICAgIHJldHVybiBbZGVmYXVsdE1vZGUsIHZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmMoZnVuYykge1xuICAgIGlmIChmdW5jID09PSBhc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgZWxzZSBpZiAoZnVuYyA9PT0gYXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgIGVsc2UgaWYgKGZ1bmMgPT09IGFzRmxhdClcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5GbGF0O1xuICAgIGludmFyaWFudChmdW5jID09PSB1bmRlZmluZWQsIFwiQ2Fubm90IGRldGVybWluZSB2YWx1ZSBtb2RlIGZyb20gZnVuY3Rpb24uIFBsZWFzZSBwYXNzIGluIG9uZSBvZiB0aGVzZTogbW9ieC5hc1JlZmVyZW5jZSwgbW9ieC5hc1N0cnVjdHVyZSBvciBtb2J4LmFzRmxhdCwgZ290OiBcIiArIGZ1bmMpO1xuICAgIHJldHVybiBWYWx1ZU1vZGUuUmVjdXJzaXZlO1xufVxuZnVuY3Rpb24gbWFrZUNoaWxkT2JzZXJ2YWJsZSh2YWx1ZSwgcGFyZW50TW9kZSwgbmFtZSkge1xuICAgIHZhciBjaGlsZE1vZGU7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBzd2l0Y2ggKHBhcmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZU1vZGUuUmVmZXJlbmNlOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFZhbHVlTW9kZS5GbGF0OlxuICAgICAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkl0ZW1zIGluc2lkZSAnYXNGbGF0JyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuUmVmZXJlbmNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlN0cnVjdHVyZTpcbiAgICAgICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJJdGVtcyBpbnNpZGUgJ2FzU3RydWN0dXJlJyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlJlY3Vyc2l2ZTpcbiAgICAgICAgICAgIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRNb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkodmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpICYmIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih2YWx1ZSwgdmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBfYTtcbn1cbmZ1bmN0aW9uIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzUmVmZXJlbmNlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUgfHwgdmFsdWUgaW5zdGFuY2VvZiBBc0ZsYXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBhc1N0cnVjdHVyZSAvIGFzUmVmZXJlbmNlIC8gYXNGbGF0IGNhbm5vdCBiZSB1c2VkIGhlcmUuIFwiICsgbWVzc2FnZSk7XG59XG52YXIgc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB2ID0gZmFsc2U7XG4gICAgdmFyIHAgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocCwgXCIwXCIsIHsgc2V0OiBmdW5jdGlvbiAoKSB7IHYgPSB0cnVlOyB9IH0pO1xuICAgIE9iamVjdC5jcmVhdGUocClbXCIwXCJdID0gMTtcbiAgICByZXR1cm4gdiA9PT0gZmFsc2U7XG59KSgpO1xudmFyIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSAwO1xudmFyIFN0dWJBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3R1YkFycmF5KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3R1YkFycmF5O1xufSgpKTtcblN0dWJBcnJheS5wcm90b3R5cGUgPSBbXTtcbnZhciBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24obmFtZSwgbW9kZSwgYXJyYXksIG93bmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICAgICAgdGhpcy5vd25lZCA9IG93bmVkO1xuICAgICAgICB0aGlzLmxhc3RLbm93bkxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0b20gPSBuZXcgQmFzZUF0b20obmFtZSB8fCAoXCJPYnNlcnZhYmxlQXJyYXlAXCIgKyBnZXROZXh0SWQoKSkpO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUubWFrZVJlYWN0aXZlQXJyYXlJdGVtID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJBcnJheSB2YWx1ZXMgY2Fubm90IGhhdmUgbW9kaWZpZXJzXCIpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBWYWx1ZU1vZGUuRmxhdCB8fCB0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5SZWZlcmVuY2UpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIHJldHVybiBtYWtlQ2hpbGRPYnNlcnZhYmxlKHZhbHVlLCB0aGlzLm1vZGUsIHRoaXMuYXRvbS5uYW1lICsgXCJbLi5dXCIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3RlckludGVyY2VwdG9yKHRoaXMsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5ID09PSB2b2lkIDApIHsgZmlyZUltbWVkaWF0ZWx5ID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGFkZGVkOiB0aGlzLnZhbHVlcy5zbGljZSgpLFxuICAgICAgICAgICAgICAgIGFkZGVkQ291bnQ6IHRoaXMudmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgICAgICAgICByZW1vdmVkQ291bnQ6IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5nZXRBcnJheUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuc2V0QXJyYXlMZW5ndGggPSBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3TGVuZ3RoICE9PSBcIm51bWJlclwiIHx8IG5ld0xlbmd0aCA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5hcnJheV0gT3V0IG9mIHJhbmdlOiBcIiArIG5ld0xlbmd0aCk7XG4gICAgICAgIHZhciBjdXJyZW50TGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuICAgICAgICBpZiAobmV3TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBlbHNlIGlmIChuZXdMZW5ndGggPiBjdXJyZW50TGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zcGxpY2VXaXRoQXJyYXkoY3VycmVudExlbmd0aCwgMCwgbmV3IEFycmF5KG5ld0xlbmd0aCAtIGN1cnJlbnRMZW5ndGgpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zcGxpY2VXaXRoQXJyYXkobmV3TGVuZ3RoLCBjdXJyZW50TGVuZ3RoIC0gbmV3TGVuZ3RoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS51cGRhdGVBcnJheUxlbmd0aCA9IGZ1bmN0aW9uIChvbGRMZW5ndGgsIGRlbHRhKSB7XG4gICAgICAgIGlmIChvbGRMZW5ndGggIT09IHRoaXMubGFzdEtub3duTGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIE1vZGlmaWNhdGlvbiBleGNlcHRpb246IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYW4gb2JzZXJ2YWJsZSBhcnJheSB3YXMgY2hhbmdlZC4gRGlkIHlvdSB1c2UgcGVlaygpIHRvIGNoYW5nZSBpdD9cIik7XG4gICAgICAgIHRoaXMubGFzdEtub3duTGVuZ3RoICs9IGRlbHRhO1xuICAgICAgICBpZiAoZGVsdGEgPiAwICYmIG9sZExlbmd0aCArIGRlbHRhICsgMSA+IE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUpXG4gICAgICAgICAgICByZXNlcnZlQXJyYXlCdWZmZXIob2xkTGVuZ3RoICsgZGVsdGEgKyAxKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5zcGxpY2VXaXRoQXJyYXkgPSBmdW5jdGlvbiAoaW5kZXgsIGRlbGV0ZUNvdW50LCBuZXdJdGVtcykge1xuICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPiBsZW5ndGgpXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1heCgwLCBsZW5ndGggKyBpbmRleCk7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBsZW5ndGggLSBpbmRleDtcbiAgICAgICAgZWxzZSBpZiAoZGVsZXRlQ291bnQgPT09IHVuZGVmaW5lZCB8fCBkZWxldGVDb3VudCA9PT0gbnVsbClcbiAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkZWxldGVDb3VudCwgbGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgICAgaWYgKG5ld0l0ZW1zID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBuZXdJdGVtcyA9IFtdO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMuYXJyYXksXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGxpY2VcIixcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvdW50OiBkZWxldGVDb3VudCxcbiAgICAgICAgICAgICAgICBhZGRlZDogbmV3SXRlbXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FSUkFZO1xuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBjaGFuZ2UucmVtb3ZlZENvdW50O1xuICAgICAgICAgICAgbmV3SXRlbXMgPSBjaGFuZ2UuYWRkZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV3SXRlbXMgPSBuZXdJdGVtcy5tYXAodGhpcy5tYWtlUmVhY3RpdmVBcnJheUl0ZW0sIHRoaXMpO1xuICAgICAgICB2YXIgbGVuZ3RoRGVsdGEgPSBuZXdJdGVtcy5sZW5ndGggLSBkZWxldGVDb3VudDtcbiAgICAgICAgdGhpcy51cGRhdGVBcnJheUxlbmd0aChsZW5ndGgsIGxlbmd0aERlbHRhKTtcbiAgICAgICAgdmFyIHJlcyA9IChfYSA9IHRoaXMudmFsdWVzKS5zcGxpY2UuYXBwbHkoX2EsIFtpbmRleCwgZGVsZXRlQ291bnRdLmNvbmNhdChuZXdJdGVtcykpO1xuICAgICAgICBpZiAoZGVsZXRlQ291bnQgIT09IDAgfHwgbmV3SXRlbXMubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlBcnJheVNwbGljZShpbmRleCwgbmV3SXRlbXMsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIHZhciBfYTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5ub3RpZnlBcnJheUNoaWxkVXBkYXRlID0gZnVuY3Rpb24gKGluZGV4LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9ICF0aGlzLm93bmVkICYmIGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlXG4gICAgICAgIH0gOiBudWxsO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUubm90aWZ5QXJyYXlTcGxpY2UgPSBmdW5jdGlvbiAoaW5kZXgsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICAgIHZhciBub3RpZnlTcHkgPSAhdGhpcy5vd25lZCAmJiBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgdmFyIGNoYW5nZSA9IG5vdGlmeSB8fCBub3RpZnlTcHkgPyB7XG4gICAgICAgICAgICBvYmplY3Q6IHRoaXMuYXJyYXksXG4gICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LCByZW1vdmVkOiByZW1vdmVkLCBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQubGVuZ3RoLFxuICAgICAgICAgICAgYWRkZWRDb3VudDogYWRkZWQubGVuZ3RoXG4gICAgICAgIH0gOiBudWxsO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb247XG59KCkpO1xudmFyIE9ic2VydmFibGVBcnJheSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9ic2VydmFibGVBcnJheSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgbW9kZSwgbmFtZSwgb3duZWQpIHtcbiAgICAgICAgaWYgKG93bmVkID09PSB2b2lkIDApIHsgb3duZWQgPSBmYWxzZTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdmFyIGFkbSA9IG5ldyBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbihuYW1lLCBtb2RlLCB0aGlzLCBvd25lZCk7XG4gICAgICAgIGFkZEhpZGRlbkZpbmFsUHJvcCh0aGlzLCBcIiRtb2J4XCIsIGFkbSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWVzICYmIGluaXRpYWxWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZG0udXBkYXRlQXJyYXlMZW5ndGgoMCwgaW5pdGlhbFZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgYWRtLnZhbHVlcyA9IGluaXRpYWxWYWx1ZXMubWFwKGFkbS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0sIGFkbSk7XG4gICAgICAgICAgICBhZG0ubm90aWZ5QXJyYXlTcGxpY2UoMCwgYWRtLnZhbHVlcy5zbGljZSgpLCBFTVBUWV9BUlJBWSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZG0udmFsdWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhZmFyaVByb3RvdHlwZVNldHRlckluaGVyaXRhbmNlQnVnKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWRtLmFycmF5LCBcIjBcIiwgRU5UUllfMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5pbnRlcmNlcHQoaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5ID09PSB2b2lkIDApIHsgZmlyZUltbWVkaWF0ZWx5ID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwbGljZSgwKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcnJheXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KHRoaXMuc2xpY2UoKSwgYXJyYXlzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gaXNPYnNlcnZhYmxlQXJyYXkoYSkgPyBhLnNsaWNlKCkgOiBhOyB9KSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiAobmV3SXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KDAsIHRoaXMuJG1vYngudmFsdWVzLmxlbmd0aCwgbmV3SXRlbXMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS50b0pTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZywgZnJvbUluZGV4KSB7XG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHZvaWQgMCkgeyBmcm9tSW5kZXggPSAwOyB9XG4gICAgICAgIHRoaXMuJG1vYnguYXRvbS5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLiRtb2J4LnZhbHVlcywgbCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCBpdGVtc1tpXSwgaSwgdGhpcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoaW5kZXgsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgIHZhciBuZXdJdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbmV3SXRlbXNbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCk7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KGluZGV4LCBkZWxldGVDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KGluZGV4LCBkZWxldGVDb3VudCwgbmV3SXRlbXMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KGFkbS52YWx1ZXMubGVuZ3RoLCAwLCBpdGVtcyk7XG4gICAgICAgIHJldHVybiBhZG0udmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoTWF0aC5tYXgodGhpcy4kbW9ieC52YWx1ZXMubGVuZ3RoIC0gMSwgMCksIDEpWzBdO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKDAsIDEpWzBdO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KDAsIDAsIGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGFkbS52YWx1ZXMubGVuZ3RoO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgdmFyIGNsb25lID0gdGhpcy5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY2xvbmUucmV2ZXJzZS5hcHBseShjbG9uZSwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uIChjb21wYXJlRm4pIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHZhciBjbG9uZSA9IHRoaXMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lLnNvcnQuYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaWR4ID0gdGhpcy4kbW9ieC52YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlttb2J4LmFycmF5XSBcIiArIEFycmF5LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlttb2J4LmFycmF5XSBcIiArIEFycmF5LnByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlQXJyYXk7XG59KFN0dWJBcnJheSkpO1xuZGVjbGFyZUl0ZXJhdG9yKE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuc2xpY2UoKSk7XG59KTtcbm1ha2VOb25FbnVtZXJhYmxlKE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUsIFtcbiAgICBcImNvbnN0cnVjdG9yXCIsXG4gICAgXCJpbnRlcmNlcHRcIixcbiAgICBcIm9ic2VydmVcIixcbiAgICBcImNsZWFyXCIsXG4gICAgXCJjb25jYXRcIixcbiAgICBcInJlcGxhY2VcIixcbiAgICBcInRvSlNcIixcbiAgICBcInRvSlNPTlwiLFxuICAgIFwicGVla1wiLFxuICAgIFwiZmluZFwiLFxuICAgIFwic3BsaWNlXCIsXG4gICAgXCJwdXNoXCIsXG4gICAgXCJwb3BcIixcbiAgICBcInNoaWZ0XCIsXG4gICAgXCJ1bnNoaWZ0XCIsXG4gICAgXCJyZXZlcnNlXCIsXG4gICAgXCJzb3J0XCIsXG4gICAgXCJyZW1vdmVcIixcbiAgICBcInRvU3RyaW5nXCIsXG4gICAgXCJ0b0xvY2FsZVN0cmluZ1wiXG5dKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5nZXRBcnJheUxlbmd0aCgpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuJG1vYnguc2V0QXJyYXlMZW5ndGgobmV3TGVuZ3RoKTtcbiAgICB9XG59KTtcbltcbiAgICBcImV2ZXJ5XCIsXG4gICAgXCJmaWx0ZXJcIixcbiAgICBcImZvckVhY2hcIixcbiAgICBcImluZGV4T2ZcIixcbiAgICBcImpvaW5cIixcbiAgICBcImxhc3RJbmRleE9mXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInJlZHVjZVwiLFxuICAgIFwicmVkdWNlUmlnaHRcIixcbiAgICBcInNsaWNlXCIsXG4gICAgXCJzb21lXCJcbl0uZm9yRWFjaChmdW5jdGlvbiAoZnVuY05hbWUpIHtcbiAgICB2YXIgYmFzZUZ1bmMgPSBBcnJheS5wcm90b3R5cGVbZnVuY05hbWVdO1xuICAgIGFkZEhpZGRlblByb3AoT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZSwgZnVuY05hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiBiYXNlRnVuYy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9KTtcbn0pO1xudmFyIEVOVFJZXzAgPSB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHNldDogY3JlYXRlQXJyYXlTZXR0ZXIoMCksXG4gICAgZ2V0OiBjcmVhdGVBcnJheUdldHRlcigwKVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5QnVmZmVySXRlbShpbmRleCkge1xuICAgIHZhciBzZXQgPSBjcmVhdGVBcnJheVNldHRlcihpbmRleCk7XG4gICAgdmFyIGdldCA9IGNyZWF0ZUFycmF5R2V0dGVyKGluZGV4KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZSwgXCJcIiArIGluZGV4LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHNldDogc2V0LCBnZXQ6IGdldFxuICAgIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQXJyYXlTZXR0ZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICB2YXIgdmFsdWVzID0gYWRtLnZhbHVlcztcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKG5ld1ZhbHVlLCBcIk1vZGlmaWVycyBjYW5ub3QgYmUgdXNlZCBvbiBhcnJheSB2YWx1ZXMuIEZvciBub24tcmVhY3RpdmUgYXJyYXkgdmFsdWVzIHVzZSBtYWtlUmVhY3RpdmUoYXNGbGF0KGFycmF5KSkuXCIpO1xuICAgICAgICBpZiAoaW5kZXggPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UoYWRtLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDogYWRtLmFycmF5LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGFkbS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0obmV3VmFsdWUpO1xuICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSAoYWRtLm1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUpID8gIWRlZXBFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSA6IG9sZFZhbHVlICE9PSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGFkbS5ub3RpZnlBcnJheUNoaWxkVXBkYXRlKGluZGV4LCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KGluZGV4LCAwLCBbbmV3VmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5hcnJheV0gSW5kZXggb3V0IG9mIGJvdW5kcywgXCIgKyBpbmRleCArIFwiIGlzIGxhcmdlciB0aGFuIFwiICsgdmFsdWVzLmxlbmd0aCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5R2V0dGVyKGluZGV4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGltcGwgPSB0aGlzLiRtb2J4O1xuICAgICAgICBpZiAoaW1wbCAmJiBpbmRleCA8IGltcGwudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW1wbC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gaW1wbC52YWx1ZXNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcIlttb2J4LmFycmF5XSBBdHRlbXB0IHRvIHJlYWQgYW4gYXJyYXkgaW5kZXggKFwiICsgaW5kZXggKyBcIikgdGhhdCBpcyBvdXQgb2YgYm91bmRzIChcIiArIGltcGwudmFsdWVzLmxlbmd0aCArIFwiKS4gUGxlYXNlIGNoZWNrIGxlbmd0aCBmaXJzdC4gT3V0IG9mIGJvdW5kIGluZGljZXMgd2lsbCBub3QgYmUgdHJhY2tlZCBieSBNb2JYXCIpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNlcnZlQXJyYXlCdWZmZXIobWF4KSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSBPQlNFUlZBQkxFX0FSUkFZX0JVRkZFUl9TSVpFOyBpbmRleCA8IG1heDsgaW5kZXgrKylcbiAgICAgICAgY3JlYXRlQXJyYXlCdWZmZXJJdGVtKGluZGV4KTtcbiAgICBPQlNFUlZBQkxFX0FSUkFZX0JVRkZFUl9TSVpFID0gbWF4O1xufVxucmVzZXJ2ZUFycmF5QnVmZmVyKDEwMDApO1xuZnVuY3Rpb24gY3JlYXRlT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIG1vZGUsIG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGVBcnJheShpbml0aWFsVmFsdWVzLCBtb2RlLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGZhc3RBcnJheShpbml0aWFsVmFsdWVzKSB7XG4gICAgZGVwcmVjYXRlZChcImZhc3RBcnJheSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBvYnNlcnZhYmxlKGFzRmxhdChbXSkpYFwiKTtcbiAgICByZXR1cm4gY3JlYXRlT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIFZhbHVlTW9kZS5GbGF0LCBudWxsKTtcbn1cbmV4cG9ydHMuZmFzdEFycmF5ID0gZmFzdEFycmF5O1xuZnVuY3Rpb24gaXNPYnNlcnZhYmxlQXJyYXkodGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXk7XG59XG5leHBvcnRzLmlzT2JzZXJ2YWJsZUFycmF5ID0gaXNPYnNlcnZhYmxlQXJyYXk7XG52YXIgT2JzZXJ2YWJsZU1hcE1hcmtlciA9IHt9O1xudmFyIE9ic2VydmFibGVNYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVNYXAoaW5pdGlhbERhdGEsIHZhbHVlTW9kZUZ1bmMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kbW9ieCA9IE9ic2VydmFibGVNYXBNYXJrZXI7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5faGFzTWFwID0ge307XG4gICAgICAgIHRoaXMubmFtZSA9IFwiT2JzZXJ2YWJsZU1hcEBcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLl9rZXlzID0gbmV3IE9ic2VydmFibGVBcnJheShudWxsLCBWYWx1ZU1vZGUuUmVmZXJlbmNlLCB0aGlzLm5hbWUgKyBcIi5rZXlzKClcIiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLl92YWx1ZU1vZGUgPSBnZXRWYWx1ZU1vZGVGcm9tTW9kaWZpZXJGdW5jKHZhbHVlTW9kZUZ1bmMpO1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVNb2RlID09PSBWYWx1ZU1vZGUuRmxhdClcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTW9kZSA9IFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzKHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGluaXRpYWxEYXRhKSlcbiAgICAgICAgICAgICAgICBfdGhpcy5tZXJnZShpbml0aWFsRGF0YSk7XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXRpYWxEYXRhKSlcbiAgICAgICAgICAgICAgICBpbml0aWFsRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5faGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2RhdGFba2V5XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRLZXkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc01hcFtrZXldKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc01hcFtrZXldLmdldCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkoa2V5LCBmYWxzZSkuZ2V0KCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmFzc2VydFZhbGlkS2V5KGtleSk7XG4gICAgICAgIGtleSA9IFwiXCIgKyBrZXk7XG4gICAgICAgIHZhciBoYXNLZXkgPSB0aGlzLl9oYXMoa2V5KTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIlttb2J4Lm1hcC5zZXRdIEV4cGVjdGVkIHVud3JhcHBlZCB2YWx1ZSB0byBiZSBpbnNlcnRlZCB0byBrZXkgJ1wiICsga2V5ICsgXCInLiBJZiB5b3UgbmVlZCB0byB1c2UgbW9kaWZpZXJzIHBhc3MgdGhlbSBhcyBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yXCIpO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBoYXNLZXkgPyBcInVwZGF0ZVwiIDogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGtleVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzS2V5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZShrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYXNzZXJ0VmFsaWRLZXkoa2V5KTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyh0aGlzKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZSh0aGlzLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faGFzKGtleSkpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogdGhpcy5fZGF0YVtrZXldLnZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGtleVxuICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2tleXMucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZUhhc01hcEVudHJ5KGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3RoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2RhdGFba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgY2hhbmdlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fdXBkYXRlSGFzTWFwRW50cnkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9oYXNNYXBba2V5XTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICBlbnRyeS5zZXROZXdWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuX2hhc01hcFtrZXldID0gbmV3IE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgVmFsdWVNb2RlLlJlZmVyZW5jZSwgdGhpcy5uYW1lICsgXCIuXCIgKyBrZXkgKyBcIj9cIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLl91cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IHRoaXMuX2RhdGFbbmFtZV07XG4gICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS5wcmVwYXJlTmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsdWUgIT09IFVOQ0hBTkdFRCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvYnNlcnZhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnkpXG4gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fYWRkVmFsdWUgPSBmdW5jdGlvbiAobmFtZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfdGhpcy5fZGF0YVtuYW1lXSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUobmV3VmFsdWUsIF90aGlzLl92YWx1ZU1vZGUsIF90aGlzLm5hbWUgKyBcIi5cIiArIG5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS52YWx1ZTtcbiAgICAgICAgICAgIF90aGlzLl91cGRhdGVIYXNNYXBFbnRyeShuYW1lLCB0cnVlKTtcbiAgICAgICAgICAgIF90aGlzLl9rZXlzLnB1c2gobmFtZSk7XG4gICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnkpXG4gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgY2hhbmdlKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV0uZ2V0KCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheUFzSXRlcmF0b3IodGhpcy5fa2V5cy5tYXAodGhpcy5nZXQsIHRoaXMpKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhcnJheUFzSXRlcmF0b3IodGhpcy5fa2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gW2tleSwgX3RoaXMuZ2V0KGtleSldOyB9KSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMua2V5cygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBfdGhpcy5nZXQoa2V5KSwga2V5KTsgfSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0cmFuc2FjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwKVxuICAgICAgICAgICAgICAgIG90aGVyLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF90aGlzLnNldChrZXksIG90aGVyLmdldChrZXkpKTsgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3RoZXIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX3RoaXMuc2V0KGtleSwgb3RoZXJba2V5XSk7IH0pO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdW50cmFja2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5rZXlzKCkuZm9yRWFjaChfdGhpcy5kZWxldGUsIF90aGlzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSlMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgICAgdGhpcy5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiByZXNba2V5XSA9IF90aGlzLmdldChrZXkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJ0b0pzIGlzIGRlcHJlY2F0ZWQsIHVzZSB0b0pTIGluc3RlYWRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KUygpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaXNWYWxpZEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gbnVsbCB8fCBrZXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGtleSAhPT0gXCJudW1iZXJcIiAmJiB0eXBlb2Yga2V5ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5hc3NlcnRWYWxpZEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRLZXkoa2V5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4Lm1hcF0gSW52YWxpZCBrZXk6ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbeyBcIiArIHRoaXMua2V5cygpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoa2V5ICsgXCI6IFwiICsgKFwiXCIgKyBfdGhpcy5nZXQoa2V5KSkpOyB9KS5qb2luKFwiLCBcIikgKyBcIiB9XVwiO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGludmFyaWFudChmaXJlSW1tZWRpYXRlbHkgIT09IHRydWUsIFwiYG9ic2VydmVgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmlyZSBpbW1lZGlhdGVseSBwcm9wZXJ0eSBmb3Igb2JzZXJ2YWJsZSBtYXBzLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZU1hcDtcbn0oKSk7XG5leHBvcnRzLk9ic2VydmFibGVNYXAgPSBPYnNlcnZhYmxlTWFwO1xuZGVjbGFyZUl0ZXJhdG9yKE9ic2VydmFibGVNYXAucHJvdG90eXBlLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xufSk7XG5mdW5jdGlvbiBtYXAoaW5pdGlhbFZhbHVlcywgdmFsdWVNb2RpZmllcikge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZU1hcChpbml0aWFsVmFsdWVzLCB2YWx1ZU1vZGlmaWVyKTtcbn1cbmV4cG9ydHMubWFwID0gbWFwO1xuZnVuY3Rpb24gaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcDtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlTWFwID0gaXNPYnNlcnZhYmxlTWFwO1xudmFyIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uKHRhcmdldCwgbmFtZSwgbW9kZSkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmludGVyY2VwdG9ycyA9IG51bGw7XG4gICAgfVxuICAgIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGludmFyaWFudChmaXJlSW1tZWRpYXRlbHkgIT09IHRydWUsIFwiYG9ic2VydmVgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmlyZSBpbW1lZGlhdGVseSBwcm9wZXJ0eSBmb3Igb2JzZXJ2YWJsZSBvYmplY3RzLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgY2FsbGJhY2spO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJJbnRlcmNlcHRvcih0aGlzLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb247XG59KCkpO1xuZnVuY3Rpb24gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgbmFtZSwgbW9kZSkge1xuICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IFZhbHVlTW9kZS5SZWN1cnNpdmU7IH1cbiAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIHJldHVybiB0YXJnZXQuJG1vYng7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIG5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZSArIFwiQFwiICsgZ2V0TmV4dElkKCk7XG4gICAgaWYgKCFuYW1lKVxuICAgICAgICBuYW1lID0gXCJPYnNlcnZhYmxlT2JqZWN0QFwiICsgZ2V0TmV4dElkKCk7XG4gICAgdmFyIGFkbSA9IG5ldyBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24odGFyZ2V0LCBuYW1lLCBtb2RlKTtcbiAgICBhZGRIaWRkZW5GaW5hbFByb3AodGFyZ2V0LCBcIiRtb2J4XCIsIGFkbSk7XG4gICAgcmV0dXJuIGFkbTtcbn1cbmZ1bmN0aW9uIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGFkbS52YWx1ZXNbcHJvcE5hbWVdKVxuICAgICAgICBhZG0udGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlO1xuICAgIGVsc2VcbiAgICAgICAgZGVmaW5lT2JzZXJ2YWJsZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIHZhbHVlLCB0cnVlLCB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gZGVmaW5lT2JzZXJ2YWJsZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIG5ld1ZhbHVlLCBhc0luc3RhbmNlUHJvcGVydHksIHNldHRlcikge1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpXG4gICAgICAgIGFzc2VydFByb3BlcnR5Q29uZmlndXJhYmxlKGFkbS50YXJnZXQsIHByb3BOYW1lKTtcbiAgICB2YXIgb2JzZXJ2YWJsZTtcbiAgICB2YXIgbmFtZSA9IGFkbS5uYW1lICsgXCIuXCIgKyBwcm9wTmFtZTtcbiAgICB2YXIgaXNDb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZVZhbHVlKSB7XG4gICAgICAgIG9ic2VydmFibGUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaXNDb21wdXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpIHtcbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ld1ZhbHVlO1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLnNjb3BlKVxuICAgICAgICAgICAgbmV3VmFsdWUuc2NvcGUgPSBhZG0udGFyZ2V0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiBuZXdWYWx1ZS5sZW5ndGggPT09IDAgJiYgIWlzQWN0aW9uKG5ld1ZhbHVlKSkge1xuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUsIGFkbS50YXJnZXQsIGZhbHNlLCBuYW1lLCBzZXR0ZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEFzU3RydWN0dXJlICYmIHR5cGVvZiBuZXdWYWx1ZS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUudmFsdWUsIGFkbS50YXJnZXQsIHRydWUsIG5hbWUsIHNldHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpc0NvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IGFkbS50YXJnZXQsXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUobmV3VmFsdWUsIGFkbS5tb2RlLCBuYW1lLCBmYWxzZSk7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS52YWx1ZTtcbiAgICB9XG4gICAgYWRtLnZhbHVlc1twcm9wTmFtZV0gPSBvYnNlcnZhYmxlO1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFkbS50YXJnZXQsIHByb3BOYW1lLCBpc0NvbXB1dGVkID8gZ2VuZXJhdGVDb21wdXRlZFByb3BDb25maWcocHJvcE5hbWUpIDogZ2VuZXJhdGVPYnNlcnZhYmxlUHJvcENvbmZpZyhwcm9wTmFtZSkpO1xuICAgIH1cbiAgICBpZiAoIWlzQ29tcHV0ZWQpXG4gICAgICAgIG5vdGlmeVByb3BlcnR5QWRkaXRpb24oYWRtLCBhZG0udGFyZ2V0LCBwcm9wTmFtZSwgbmV3VmFsdWUpO1xufVxudmFyIG9ic2VydmFibGVQcm9wZXJ0eUNvbmZpZ3MgPSB7fTtcbnZhciBjb21wdXRlZFByb3BlcnR5Q29uZmlncyA9IHt9O1xuZnVuY3Rpb24gZ2VuZXJhdGVPYnNlcnZhYmxlUHJvcENvbmZpZyhwcm9wTmFtZSkge1xuICAgIHZhciBjb25maWcgPSBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIHJldHVybiBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXSA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlc1twcm9wTmFtZV0uZ2V0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHNldFByb3BlcnR5VmFsdWUodGhpcywgcHJvcE5hbWUsIHYpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlQ29tcHV0ZWRQcm9wQ29uZmlnKHByb3BOYW1lKSB7XG4gICAgdmFyIGNvbmZpZyA9IGNvbXB1dGVkUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIHJldHVybiBjb21wdXRlZFByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzW3Byb3BOYW1lXS5nZXQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzW3Byb3BOYW1lXS5zZXQodik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0UHJvcGVydHlWYWx1ZShpbnN0YW5jZSwgbmFtZSwgbmV3VmFsdWUpIHtcbiAgICB2YXIgYWRtID0gaW5zdGFuY2UuJG1vYng7XG4gICAgdmFyIG9ic2VydmFibGUgPSBhZG0udmFsdWVzW25hbWVdO1xuICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKGFkbSwge1xuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIG9iamVjdDogaW5zdGFuY2UsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBuZXdWYWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICB9XG4gICAgbmV3VmFsdWUgPSBvYnNlcnZhYmxlLnByZXBhcmVOZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyhhZG0pO1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnlMaXN0ZW5lcnMgfHwgaGFzTGlzdGVuZXJzID8ge1xuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIG9iamVjdDogaW5zdGFuY2UsXG4gICAgICAgICAgICBvbGRWYWx1ZTogb2JzZXJ2YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgIG9ic2VydmFibGUuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKGFkbSwgY2hhbmdlKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vdGlmeVByb3BlcnR5QWRkaXRpb24oYWRtLCBvYmplY3QsIG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyhhZG0pO1xuICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgb2JqZWN0OiBvYmplY3QsIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH0gOiBudWxsO1xuICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgaWYgKG5vdGlmeSlcbiAgICAgICAgbm90aWZ5TGlzdGVuZXJzKGFkbSwgY2hhbmdlKTtcbiAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykge1xuICAgIGlmICh0eXBlb2YgdGhpbmcgPT09IFwib2JqZWN0XCIgJiYgdGhpbmcgIT09IG51bGwpIHtcbiAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGluZyk7XG4gICAgICAgIHJldHVybiB0aGluZy4kbW9ieCBpbnN0YW5jZW9mIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGVPYmplY3QgPSBpc09ic2VydmFibGVPYmplY3Q7XG52YXIgVU5DSEFOR0VEID0ge307XG52YXIgT2JzZXJ2YWJsZVZhbHVlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT2JzZXJ2YWJsZVZhbHVlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgbW9kZSwgbmFtZSwgbm90aWZ5U3B5KSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiT2JzZXJ2YWJsZVZhbHVlQFwiICsgZ2V0TmV4dElkKCk7IH1cbiAgICAgICAgaWYgKG5vdGlmeVNweSA9PT0gdm9pZCAwKSB7IG5vdGlmeVNweSA9IHRydWU7IH1cbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbmFtZSk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuaGFzVW5yZXBvcnRlZENoYW5nZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX2EgPSBnZXRWYWx1ZU1vZGVGcm9tVmFsdWUodmFsdWUsIFZhbHVlTW9kZS5SZWN1cnNpdmUpLCBjaGlsZG1vZGUgPSBfYVswXSwgdW53cmFwcGVkVmFsdWUgPSBfYVsxXTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gVmFsdWVNb2RlLlJlY3Vyc2l2ZSlcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGNoaWxkbW9kZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG1ha2VDaGlsZE9ic2VydmFibGUodW53cmFwcGVkVmFsdWUsIHRoaXMubW9kZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSAmJiBpc1NweUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgc3B5UmVwb3J0KHsgdHlwZTogXCJjcmVhdGVcIiwgb2JqZWN0OiB0aGlzLCBuZXdWYWx1ZTogdGhpcy52YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMucHJlcGFyZU5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpIHtcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5wcmVwYXJlTmV3VmFsdWUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKG5ld1ZhbHVlLCBcIk1vZGlmaWVycyBjYW5ub3QgYmUgdXNlZCBvbiBub24taW5pdGlhbCB2YWx1ZXMuXCIpO1xuICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHsgb2JqZWN0OiB0aGlzLCB0eXBlOiBcInVwZGF0ZVwiLCBuZXdWYWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gVU5DSEFOR0VEO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoYW5nZWQgPSB2YWx1ZURpZENoYW5nZSh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUsIHRoaXMudmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICByZXR1cm4gbWFrZUNoaWxkT2JzZXJ2YWJsZShuZXdWYWx1ZSwgdGhpcy5tb2RlLCB0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gVU5DSEFOR0VEO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5zZXROZXdWYWx1ZSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAoaGFzTGlzdGVuZXJzKHRoaXMpKVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIFtuZXdWYWx1ZSwgb2xkVmFsdWVdKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJJbnRlcmNlcHRvcih0aGlzLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkpXG4gICAgICAgICAgICBsaXN0ZW5lcih0aGlzLnZhbHVlLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbXCIgKyB0aGlzLnZhbHVlICsgXCJdXCI7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZVZhbHVlO1xufShCYXNlQXRvbSkpO1xuZnVuY3Rpb24gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc09ic2VydmFibGVBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIGludmFyaWFudChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkLCBcIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZXQgaW5kZXggYXRvbXMgZnJvbSBhcnJheXNcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnguYXRvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b20odGhpbmcuX2tleXMpO1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGVfMiA9IHRoaW5nLl9kYXRhW3Byb3BlcnR5XSB8fCB0aGluZy5faGFzTWFwW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGludmFyaWFudCghIW9ic2VydmFibGVfMiwgXCJ0aGUgZW50cnkgJ1wiICsgcHJvcGVydHkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG9ic2VydmFibGUgbWFwICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8yO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICAgICAgaW52YXJpYW50KCEhcHJvcGVydHksIFwicGxlYXNlIHNwZWNpZnkgYSBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzMgPSB0aGluZy4kbW9ieC52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgaW52YXJpYW50KCEhb2JzZXJ2YWJsZV8zLCBcIm5vIG9ic2VydmFibGUgcHJvcGVydHkgJ1wiICsgcHJvcGVydHkgKyBcIicgZm91bmQgb24gdGhlIG9ic2VydmFibGUgb2JqZWN0ICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEJhc2VBdG9tIHx8IHRoaW5nIGluc3RhbmNlb2YgQ29tcHV0ZWRWYWx1ZSB8fCB0aGluZyBpbnN0YW5jZW9mIFJlYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKHRoaW5nLiRtb2J4IGluc3RhbmNlb2YgUmVhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGluZy4kbW9ieDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiQ2Fubm90IG9idGFpbiBhdG9tIGZyb20gXCIgKyB0aGluZyk7XG59XG5mdW5jdGlvbiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZywgcHJvcGVydHkpIHtcbiAgICBpbnZhcmlhbnQodGhpbmcsIFwiRXhwZWN0aW9uIHNvbWUgb2JqZWN0XCIpO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24oZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpKTtcbiAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBCYXNlQXRvbSB8fCB0aGluZyBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUgfHwgdGhpbmcgaW5zdGFuY2VvZiBSZWFjdGlvbilcbiAgICAgICAgcmV0dXJuIHRoaW5nO1xuICAgIGlmIChpc09ic2VydmFibGVNYXAodGhpbmcpKVxuICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGluZyk7XG4gICAgaWYgKHRoaW5nLiRtb2J4KVxuICAgICAgICByZXR1cm4gdGhpbmcuJG1vYng7XG4gICAgaW52YXJpYW50KGZhbHNlLCBcIkNhbm5vdCBvYnRhaW4gYWRtaW5pc3RyYXRpb24gZnJvbSBcIiArIHRoaW5nKTtcbn1cbmZ1bmN0aW9uIGdldERlYnVnTmFtZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICB2YXIgbmFtZWQ7XG4gICAgaWYgKHByb3BlcnR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIG5hbWVkID0gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpO1xuICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykgfHwgaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSlcbiAgICAgICAgbmFtZWQgPSBnZXRBZG1pbmlzdHJhdGlvbih0aGluZyk7XG4gICAgZWxzZVxuICAgICAgICBuYW1lZCA9IGdldEF0b20odGhpbmcpO1xuICAgIHJldHVybiBuYW1lZC5uYW1lO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihvbkluaXRpYWxpemUsIGdldCwgc2V0LCBlbnVtZXJhYmxlLCBhbGxvd0N1c3RvbUFyZ3VtZW50cykge1xuICAgIGZ1bmN0aW9uIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIGN1c3RvbUFyZ3MpIHtcbiAgICAgICAgaW52YXJpYW50KGFsbG93Q3VzdG9tQXJndW1lbnRzIHx8IHF1YWNrc0xpa2VBRGVjb3JhdG9yKGFyZ3VtZW50cyksIFwiVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciwgYnV0IGl0IHdhc24ndCBpbnZva2VkIGxpa2UgYSBkZWNvcmF0b3JcIik7XG4gICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdmFyIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fX21vYnhJbml0aWFsaXplZFByb3BzIHx8IHRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eSh0aGlzLCBrZXksIHVuZGVmaW5lZCwgb25Jbml0aWFsaXplLCBjdXN0b21BcmdzLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fX21vYnhJbml0aWFsaXplZFByb3BzIHx8IHRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc2NyaXB0SW5pdGlhbGl6ZVByb3BlcnR5KHRoaXMsIGtleSwgdiwgb25Jbml0aWFsaXplLCBjdXN0b21BcmdzLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5jYWxsKHRoaXMsIGtleSwgdik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBuZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdEZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh0YXJnZXQsIFwiX19tb2J4TGF6eUluaXRpYWxpemVyc1wiKSkge1xuICAgICAgICAgICAgICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBcIl9fbW9ieExhenlJbml0aWFsaXplcnNcIiwgKHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzICYmIHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLnNsaWNlKCkpIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZV8xID0gZGVzY3JpcHRvci52YWx1ZSwgaW5pdGlhbGl6ZXJfMSA9IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICB0YXJnZXQuX19tb2J4TGF6eUluaXRpYWxpemVycy5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZShpbnN0YW5jZSwga2V5LCAoaW5pdGlhbGl6ZXJfMSA/IGluaXRpYWxpemVyXzEuY2FsbChpbnN0YW5jZSkgOiB2YWx1ZV8xKSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSwgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fbW9ieERpZFJ1bkxhenlJbml0aWFsaXplcnMgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MYXp5SW5pdGlhbGl6ZXJzKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93Q3VzdG9tQXJndW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAocXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NQcm9wZXJ0eURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIG91dGVyQXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHsgcmV0dXJuIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIG91dGVyQXJncyk7IH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yO1xufVxuZnVuY3Rpb24gdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB2LCBvbkluaXRpYWxpemUsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShpbnN0YW5jZSwgXCJfX21vYnhJbml0aWFsaXplZFByb3BzXCIpKVxuICAgICAgICBhZGRIaWRkZW5Qcm9wKGluc3RhbmNlLCBcIl9fbW9ieEluaXRpYWxpemVkUHJvcHNcIiwge30pO1xuICAgIGluc3RhbmNlLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSA9IHRydWU7XG4gICAgb25Jbml0aWFsaXplKGluc3RhbmNlLCBrZXksIHYsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKTtcbn1cbmZ1bmN0aW9uIHJ1bkxhenlJbml0aWFsaXplcnMoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UuX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVycyA9PT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChpbnN0YW5jZS5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIFwiX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVyc1wiLCB0cnVlKTtcbiAgICAgICAgaW5zdGFuY2UuX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVycyAmJiBpbnN0YW5jZS5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLmZvckVhY2goZnVuY3Rpb24gKGluaXRpYWxpemVyKSB7IHJldHVybiBpbml0aWFsaXplcihpbnN0YW5jZSk7IH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHF1YWNrc0xpa2VBRGVjb3JhdG9yKGFyZ3MpIHtcbiAgICByZXR1cm4gKGFyZ3MubGVuZ3RoID09PSAyIHx8IGFyZ3MubGVuZ3RoID09PSAzKSAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGl0ZXJhdG9yU3ltYm9sKCkge1xuICAgIHJldHVybiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcikgfHwgXCJAQGl0ZXJhdG9yXCI7XG59XG52YXIgSVNfSVRFUkFUSU5HX01BUktFUiA9IFwiX18kJGl0ZXJhdGluZ1wiO1xuZnVuY3Rpb24gYXJyYXlBc0l0ZXJhdG9yKGFycmF5KSB7XG4gICAgaW52YXJpYW50KGFycmF5W0lTX0lURVJBVElOR19NQVJLRVJdICE9PSB0cnVlLCBcIklsbGVnYWwgc3RhdGU6IGNhbm5vdCByZWN5Y2xlIGFycmF5IGFzIGl0ZXJhdG9yXCIpO1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChhcnJheSwgSVNfSVRFUkFUSU5HX01BUktFUiwgdHJ1ZSk7XG4gICAgdmFyIGlkeCA9IC0xO1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChhcnJheSwgXCJuZXh0XCIsIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlkeCsrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogaWR4ID49IHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdmFsdWU6IGlkeCA8IHRoaXMubGVuZ3RoID8gdGhpc1tpZHhdIDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZGVjbGFyZUl0ZXJhdG9yKHByb3RvdFR5cGUsIGl0ZXJhdG9yRmFjdG9yeSkge1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChwcm90b3RUeXBlLCBpdGVyYXRvclN5bWJvbCgpLCBpdGVyYXRvckZhY3RvcnkpO1xufVxudmFyIFNpbXBsZUV2ZW50RW1pdHRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2ltcGxlRXZlbnRFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICBkZXByZWNhdGVkKFwiZXh0cmFzLlNpbXBsZUV2ZW50RW1pdHRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZVwiKTtcbiAgICB9XG4gICAgU2ltcGxlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuc2xpY2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBTaW1wbGVFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gX3RoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgX3RoaXMubGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNpbXBsZUV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5vbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZUV2ZW50RW1pdHRlcjtcbn0oKSk7XG5leHBvcnRzLlNpbXBsZUV2ZW50RW1pdHRlciA9IFNpbXBsZUV2ZW50RW1pdHRlcjtcbnZhciBFTVBUWV9BUlJBWSA9IFtdO1xuT2JqZWN0LmZyZWV6ZShFTVBUWV9BUlJBWSk7XG5mdW5jdGlvbiBnZXROZXh0SWQoKSB7XG4gICAgcmV0dXJuICsrZ2xvYmFsU3RhdGUubW9ieEd1aWQ7XG59XG5mdW5jdGlvbiBpbnZhcmlhbnQoY2hlY2ssIG1lc3NhZ2UsIHRoaW5nKSB7XG4gICAgaWYgKCFjaGVjaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIEludmFyaWFudCBmYWlsZWQ6IFwiICsgbWVzc2FnZSArICh0aGluZyA/IFwiIGluICdcIiArIHRoaW5nICsgXCInXCIgOiBcIlwiKSk7XG59XG52YXIgZGVwcmVjYXRlZE1lc3NhZ2VzID0gW107XG5mdW5jdGlvbiBkZXByZWNhdGVkKG1zZykge1xuICAgIGlmIChkZXByZWNhdGVkTWVzc2FnZXMuaW5kZXhPZihtc2cpICE9PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGRlcHJlY2F0ZWRNZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgY29uc29sZS5lcnJvcihcIlttb2J4XSBEZXByZWNhdGVkOiBcIiArIG1zZyk7XG59XG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICB2YXIgaW52b2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnZva2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbnZva2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG5mdW5jdGlvbiB1bmlxdWUobGlzdCkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHJlcy5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICAgICAgICAgIHJlcy5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBqb2luU3RyaW5ncyh0aGluZ3MsIGxpbWl0LCBzZXBhcmF0b3IpIHtcbiAgICBpZiAobGltaXQgPT09IHZvaWQgMCkgeyBsaW1pdCA9IDEwMDsgfVxuICAgIGlmIChzZXBhcmF0b3IgPT09IHZvaWQgMCkgeyBzZXBhcmF0b3IgPSBcIiAtIFwiOyB9XG4gICAgaWYgKCF0aGluZ3MpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIHZhciBzbGljZWQgPSB0aGluZ3Muc2xpY2UoMCwgbGltaXQpO1xuICAgIHJldHVybiBcIlwiICsgc2xpY2VkLmpvaW4oc2VwYXJhdG9yKSArICh0aGluZ3MubGVuZ3RoID4gbGltaXQgPyBcIiAoLi4uIGFuZCBcIiArICh0aGluZ3MubGVuZ3RoIC0gbGltaXQpICsgXCJtb3JlKVwiIDogXCJcIik7XG59XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuZnVuY3Rpb24gb2JqZWN0QXNzaWduKCkge1xuICAgIHZhciByZXMgPSBhcmd1bWVudHNbMF07XG4gICAgZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbHVlRGlkQ2hhbmdlKGNvbXBhcmVTdHJ1Y3R1cmFsLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gY29tcGFyZVN0cnVjdHVyYWxcbiAgICAgICAgPyAhZGVlcEVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgICAgIDogb2xkVmFsdWUgIT09IG5ld1ZhbHVlO1xufVxudmFyIHByb3RvdHlwZUhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUpIHtcbiAgICByZXR1cm4gcHJvdG90eXBlSGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BOYW1lKTtcbn1cbmZ1bmN0aW9uIG1ha2VOb25FbnVtZXJhYmxlKG9iamVjdCwgcHJvcE5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIHByb3BOYW1lc1tpXSwgb2JqZWN0W3Byb3BOYW1lc1tpXV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEhpZGRlblByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG59XG5mdW5jdGlvbiBhZGRIaWRkZW5GaW5hbFByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcbiAgICByZXR1cm4gIWRlc2NyaXB0b3IgfHwgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlICE9PSBmYWxzZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlICE9PSBmYWxzZSk7XG59XG5mdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApIHtcbiAgICBpbnZhcmlhbnQoaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApLCBcIkNhbm5vdCBtYWtlIHByb3BlcnR5ICdcIiArIHByb3AgKyBcIicgb2JzZXJ2YWJsZSwgaXQgaXMgbm90IGNvbmZpZ3VyYWJsZSBhbmQgd3JpdGFibGUgaW4gdGhlIHRhcmdldCBvYmplY3RcIik7XG59XG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlS2V5cyhvYmopIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZGVlcEVxdWFscyhhLCBiKSB7XG4gICAgaWYgKGEgPT09IG51bGwgJiYgYiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHZhciBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSkgfHwgaXNPYnNlcnZhYmxlQXJyYXkoYSk7XG4gICAgaWYgKGFJc0FycmF5ICE9PSAoQXJyYXkuaXNBcnJheShiKSB8fCBpc09ic2VydmFibGVBcnJheShiKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChhSXNBcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFscyhhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZ2V0RW51bWVyYWJsZUtleXMoYSkubGVuZ3RoICE9PSBnZXRFbnVtZXJhYmxlS2V5cyhiKS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbHMoYVtwcm9wXSwgYltwcm9wXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYSA9PT0gYjtcbn1cbiJdfQ==
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImxpYi9tb2J4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnJlZ2lzdGVyR2xvYmFscygpO1xuZXhwb3J0cy5leHRyYXMgPSB7XG4gICAgYWxsb3dTdGF0ZUNoYW5nZXM6IGFsbG93U3RhdGVDaGFuZ2VzLFxuICAgIGdldEF0b206IGdldEF0b20sXG4gICAgZ2V0RGVidWdOYW1lOiBnZXREZWJ1Z05hbWUsXG4gICAgZ2V0RGVwZW5kZW5jeVRyZWU6IGdldERlcGVuZGVuY3lUcmVlLFxuICAgIGdldE9ic2VydmVyVHJlZTogZ2V0T2JzZXJ2ZXJUcmVlLFxuICAgIGlzQ29tcHV0aW5nRGVyaXZhdGlvbjogaXNDb21wdXRpbmdEZXJpdmF0aW9uLFxuICAgIGlzU3B5RW5hYmxlZDogaXNTcHlFbmFibGVkLFxuICAgIHJlc2V0R2xvYmFsU3RhdGU6IHJlc2V0R2xvYmFsU3RhdGUsXG4gICAgc3B5UmVwb3J0OiBzcHlSZXBvcnQsXG4gICAgc3B5UmVwb3J0RW5kOiBzcHlSZXBvcnRFbmQsXG4gICAgc3B5UmVwb3J0U3RhcnQ6IHNweVJlcG9ydFN0YXJ0LFxuICAgIHRyYWNrVHJhbnNpdGlvbnM6IHRyYWNrVHJhbnNpdGlvbnNcbn07XG5leHBvcnRzLl8gPSB7XG4gICAgZ2V0QWRtaW5pc3RyYXRpb246IGdldEFkbWluaXN0cmF0aW9uLFxuICAgIHJlc2V0R2xvYmFsU3RhdGU6IHJlc2V0R2xvYmFsU3RhdGVcbn07XG5pZiAodHlwZW9mIF9fTU9CWF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAnb2JqZWN0Jykge1xuICAgIF9fTU9CWF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdE1vYngobW9kdWxlLmV4cG9ydHMpO1xufVxudmFyIGFjdGlvbkZpZWxkRGVjb3JhdG9yID0gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBhcmdzLCBvcmlnaW5hbERlc2NyaXB0b3IpIHtcbiAgICB2YXIgYWN0aW9uTmFtZSA9IChhcmdzICYmIGFyZ3MubGVuZ3RoID09PSAxKSA/IGFyZ3NbMF0gOiAodmFsdWUubmFtZSB8fCBrZXkgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIpO1xuICAgIHZhciB3cmFwcGVkQWN0aW9uID0gYWN0aW9uKGFjdGlvbk5hbWUsIHZhbHVlKTtcbiAgICBhZGRIaWRkZW5Qcm9wKHRhcmdldCwga2V5LCB3cmFwcGVkQWN0aW9uKTtcbn0sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gdGhpc1trZXldO1xufSwgZnVuY3Rpb24gKCkge1xuICAgIGludmFyaWFudChmYWxzZSwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBhc3NpZ24gbmV3IHZhbHVlcyB0byBAYWN0aW9uIGZpZWxkc1wiKTtcbn0sIGZhbHNlLCB0cnVlKTtcbmZ1bmN0aW9uIGFjdGlvbihhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFjdGlvbihhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCIsIGFyZzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmcyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBjcmVhdGVBY3Rpb24oYXJnMSwgYXJnMik7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBuYW1lZEFjdGlvbkRlY29yYXRvcihhcmcxKTtcbiAgICByZXR1cm4gbmFtZWRBY3Rpb25EZWNvcmF0b3IoYXJnMikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYWN0aW9uID0gYWN0aW9uO1xuZnVuY3Rpb24gbmFtZWRBY3Rpb25EZWNvcmF0b3IobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBjcmVhdGVBY3Rpb24obmFtZSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25GaWVsZERlY29yYXRvcihuYW1lKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5mdW5jdGlvbiBydW5JbkFjdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdmFyIGFjdGlvbk5hbWUgPSB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIiA/IGFyZzEgOiBhcmcxLm5hbWUgfHwgXCI8dW5uYW1lZCBhY3Rpb24+XCI7XG4gICAgdmFyIGZuID0gdHlwZW9mIGFyZzEgPT09IFwiZnVuY3Rpb25cIiA/IGFyZzEgOiBhcmcyO1xuICAgIHZhciBzY29wZSA9IHR5cGVvZiBhcmcxID09PSBcImZ1bmN0aW9uXCIgPyBhcmcyIDogYXJnMztcbiAgICBpbnZhcmlhbnQodHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIsIFwiYHJ1bkluQWN0aW9uYCBleHBlY3RzIGEgZnVuY3Rpb25cIik7XG4gICAgaW52YXJpYW50KGZuLmxlbmd0aCA9PT0gMCwgXCJgcnVuSW5BY3Rpb25gIGV4cGVjdHMgYSBmdW5jdGlvbiB3aXRob3V0IGFyZ3VtZW50c1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGFjdGlvbk5hbWUgPT09IFwic3RyaW5nXCIgJiYgYWN0aW9uTmFtZS5sZW5ndGggPiAwLCBcImFjdGlvbnMgc2hvdWxkIGhhdmUgdmFsaWQgbmFtZXMsIGdvdDogJ1wiICsgYWN0aW9uTmFtZSArIFwiJ1wiKTtcbiAgICByZXR1cm4gZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIHVuZGVmaW5lZCk7XG59XG5leHBvcnRzLnJ1bkluQWN0aW9uID0gcnVuSW5BY3Rpb247XG5mdW5jdGlvbiBpc0FjdGlvbih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0aGluZy5pc01vYnhBY3Rpb24gPT09IHRydWU7XG59XG5leHBvcnRzLmlzQWN0aW9uID0gaXNBY3Rpb247XG5mdW5jdGlvbiBhdXRvcnVuKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICB2YXIgbmFtZSwgdmlldywgc2NvcGU7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxO1xuICAgICAgICB2aWV3ID0gYXJnMjtcbiAgICAgICAgc2NvcGUgPSBhcmczO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkBcIiArIGdldE5leHRJZCgpKTtcbiAgICAgICAgdmlldyA9IGFyZzE7XG4gICAgICAgIHNjb3BlID0gYXJnMjtcbiAgICB9XG4gICAgYXNzZXJ0VW53cmFwcGVkKHZpZXcsIFwiYXV0b3J1biBtZXRob2RzIGNhbm5vdCBoYXZlIG1vZGlmaWVyc1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHZpZXcgPT09IFwiZnVuY3Rpb25cIiwgXCJhdXRvcnVuIGV4cGVjdHMgYSBmdW5jdGlvblwiKTtcbiAgICBpZiAoc2NvcGUpXG4gICAgICAgIHZpZXcgPSB2aWV3LmJpbmQoc2NvcGUpO1xuICAgIHZhciByZWFjdGlvbiA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudHJhY2socmVhY3Rpb25SdW5uZXIpO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIHJlYWN0aW9uUnVubmVyKCkge1xuICAgICAgICB2aWV3KHJlYWN0aW9uKTtcbiAgICB9XG4gICAgcmVhY3Rpb24uc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gcmVhY3Rpb24uZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1biA9IGF1dG9ydW47XG5mdW5jdGlvbiB3aGVuKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgcHJlZGljYXRlLCBlZmZlY3QsIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgcHJlZGljYXRlID0gYXJnMjtcbiAgICAgICAgZWZmZWN0ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSAoXCJXaGVuQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBwcmVkaWNhdGUgPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIHZhciBkaXNwb3NlciA9IGF1dG9ydW4obmFtZSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHNjb3BlKSkge1xuICAgICAgICAgICAgci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB2YXIgcHJldlVudHJhY2tlZCA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICBlZmZlY3QuY2FsbChzY29wZSk7XG4gICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGlzcG9zZXI7XG59XG5leHBvcnRzLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gYXV0b3J1blVudGlsKHByZWRpY2F0ZSwgZWZmZWN0LCBzY29wZSkge1xuICAgIGRlcHJlY2F0ZWQoXCJgYXV0b3J1blVudGlsYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGB3aGVuYC5cIik7XG4gICAgcmV0dXJuIHdoZW4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydHMuYXV0b3J1blVudGlsID0gYXV0b3J1blVudGlsO1xuZnVuY3Rpb24gYXV0b3J1bkFzeW5jKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgbmFtZSwgZnVuYywgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZnVuYyA9IGFyZzI7XG4gICAgICAgIGRlbGF5ID0gYXJnMztcbiAgICAgICAgc2NvcGUgPSBhcmc0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5hbWUgPSBhcmcxLm5hbWUgfHwgKFwiQXV0b3J1bkFzeW5jQFwiICsgZ2V0TmV4dElkKCkpO1xuICAgICAgICBmdW5jID0gYXJnMTtcbiAgICAgICAgZGVsYXkgPSBhcmcyO1xuICAgICAgICBzY29wZSA9IGFyZzM7XG4gICAgfVxuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKVxuICAgICAgICBkZWxheSA9IDE7XG4gICAgaWYgKHNjb3BlKVxuICAgICAgICBmdW5jID0gZnVuYy5iaW5kKHNjb3BlKTtcbiAgICB2YXIgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlzcG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2socmVhY3Rpb25SdW5uZXIpO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gcmVhY3Rpb25SdW5uZXIoKSB7IGZ1bmMocik7IH1cbiAgICByLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIHIuZ2V0RGlzcG9zZXIoKTtcbn1cbmV4cG9ydHMuYXV0b3J1bkFzeW5jID0gYXV0b3J1bkFzeW5jO1xuZnVuY3Rpb24gcmVhY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNikge1xuICAgIHZhciBuYW1lLCBleHByZXNzaW9uLCBlZmZlY3QsIGZpcmVJbW1lZGlhdGVseSwgZGVsYXksIHNjb3BlO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBuYW1lID0gYXJnMTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGFyZzI7XG4gICAgICAgIGVmZmVjdCA9IGFyZzM7XG4gICAgICAgIGZpcmVJbW1lZGlhdGVseSA9IGFyZzQ7XG4gICAgICAgIGRlbGF5ID0gYXJnNTtcbiAgICAgICAgc2NvcGUgPSBhcmc2O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGFyZzEubmFtZSB8fCBhcmcyLm5hbWUgfHwgKFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSBhcmcxO1xuICAgICAgICBlZmZlY3QgPSBhcmcyO1xuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBhcmczO1xuICAgICAgICBkZWxheSA9IGFyZzQ7XG4gICAgICAgIHNjb3BlID0gYXJnNTtcbiAgICB9XG4gICAgaWYgKGZpcmVJbW1lZGlhdGVseSA9PT0gdm9pZCAwKVxuICAgICAgICBmaXJlSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgICBpZiAoZGVsYXkgPT09IHZvaWQgMClcbiAgICAgICAgZGVsYXkgPSAwO1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByZXNzaW9uLCBWYWx1ZU1vZGUuUmVmZXJlbmNlKSwgdmFsdWVNb2RlID0gX2FbMF0sIHVud3JhcHBlZEV4cHJlc3Npb24gPSBfYVsxXTtcbiAgICB2YXIgY29tcGFyZVN0cnVjdHVyYWwgPSB2YWx1ZU1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmU7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIHVud3JhcHBlZEV4cHJlc3Npb24gPSB1bndyYXBwZWRFeHByZXNzaW9uLmJpbmQoc2NvcGUpO1xuICAgICAgICBlZmZlY3QgPSBhY3Rpb24obmFtZSwgZWZmZWN0LmJpbmQoc2NvcGUpKTtcbiAgICB9XG4gICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG4gICAgdmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdmFyIG5leHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgciA9IG5ldyBSZWFjdGlvbihuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChkZWxheSA8IDEpIHtcbiAgICAgICAgICAgIHJlYWN0aW9uUnVubmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzU2NoZWR1bGVkKSB7XG4gICAgICAgICAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uUnVubmVyKCk7XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiByZWFjdGlvblJ1bm5lcigpIHtcbiAgICAgICAgaWYgKHIuaXNEaXNwb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgci50cmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHVud3JhcHBlZEV4cHJlc3Npb24ocik7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdmFsdWVEaWRDaGFuZ2UoY29tcGFyZVN0cnVjdHVyYWwsIG5leHRWYWx1ZSwgdik7XG4gICAgICAgICAgICBuZXh0VmFsdWUgPSB2O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpcnN0VGltZSAmJiBmaXJlSW1tZWRpYXRlbHkpXG4gICAgICAgICAgICBlZmZlY3QobmV4dFZhbHVlLCByKTtcbiAgICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgY2hhbmdlZCA9PT0gdHJ1ZSlcbiAgICAgICAgICAgIGVmZmVjdChuZXh0VmFsdWUsIHIpO1xuICAgICAgICBpZiAoZmlyc3RUaW1lKVxuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgfVxuICAgIHIuc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gci5nZXREaXNwb3NlcigpO1xufVxuZXhwb3J0cy5yZWFjdGlvbiA9IHJlYWN0aW9uO1xudmFyIGNvbXB1dGVkRGVjb3JhdG9yID0gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBfLCBkZWNvcmF0b3JBcmdzLCBvcmlnaW5hbERlc2NyaXB0b3IpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIG9yaWdpbmFsRGVzY3JpcHRvciAhPT0gXCJ1bmRlZmluZWRcIiwgXCJAY29tcHV0ZWQgY2FuIG9ubHkgYmUgdXNlZCBvbiBnZXR0ZXIgZnVuY3Rpb25zLCBsaWtlOiAnQGNvbXB1dGVkIGdldCBteVByb3BzKCkgeyByZXR1cm4gLi4uOyB9Jy4gSXQgbG9va3MgbGlrZSBpdCB3YXMgdXNlZCBvbiBhIHByb3BlcnR5LlwiKTtcbiAgICB2YXIgYmFzZVZhbHVlID0gb3JpZ2luYWxEZXNjcmlwdG9yLmdldDtcbiAgICB2YXIgc2V0dGVyID0gb3JpZ2luYWxEZXNjcmlwdG9yLnNldDtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiLCBcIkBjb21wdXRlZCBjYW4gb25seSBiZSB1c2VkIG9uIGdldHRlciBmdW5jdGlvbnMsIGxpa2U6ICdAY29tcHV0ZWQgZ2V0IG15UHJvcHMoKSB7IHJldHVybiAuLi47IH0nXCIpO1xuICAgIHZhciBjb21wYXJlU3RydWN0dXJhbCA9IGZhbHNlO1xuICAgIGlmIChkZWNvcmF0b3JBcmdzICYmIGRlY29yYXRvckFyZ3MubGVuZ3RoID09PSAxICYmIGRlY29yYXRvckFyZ3NbMF0uYXNTdHJ1Y3R1cmUgPT09IHRydWUpXG4gICAgICAgIGNvbXBhcmVTdHJ1Y3R1cmFsID0gdHJ1ZTtcbiAgICB2YXIgYWRtID0gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgdW5kZWZpbmVkLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKTtcbiAgICBkZWZpbmVPYnNlcnZhYmxlUHJvcGVydHkoYWRtLCBuYW1lLCBjb21wYXJlU3RydWN0dXJhbCA/IGFzU3RydWN0dXJlKGJhc2VWYWx1ZSkgOiBiYXNlVmFsdWUsIGZhbHNlLCBzZXR0ZXIpO1xufSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IHRoaXMuJG1vYngudmFsdWVzW25hbWVdO1xuICAgIGlmIChvYnNlcnZhYmxlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9ic2VydmFibGUuZ2V0KCk7XG59LCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLiRtb2J4LnZhbHVlc1tuYW1lXS5zZXQodmFsdWUpO1xufSwgZmFsc2UsIHRydWUpO1xuZnVuY3Rpb24gY29tcHV0ZWQodGFyZ2V0T3JFeHByLCBrZXlPclNjb3BlT3JTZXR0ZXIsIGJhc2VEZXNjcmlwdG9yLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRPckV4cHIgPT09IFwiZnVuY3Rpb25cIiAmJiBhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBpZiAodHlwZW9mIGtleU9yU2NvcGVPclNldHRlciA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkRXhwcih0YXJnZXRPckV4cHIsIGtleU9yU2NvcGVPclNldHRlciwgdW5kZWZpbmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkRXhwcih0YXJnZXRPckV4cHIsIHVuZGVmaW5lZCwga2V5T3JTY29wZU9yU2V0dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVkRGVjb3JhdG9yLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG5mdW5jdGlvbiBjb21wdXRlZEV4cHIoZXhwciwgc2V0dGVyLCBzY29wZSkge1xuICAgIHZhciBfYSA9IGdldFZhbHVlTW9kZUZyb21WYWx1ZShleHByLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgbW9kZSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgIHJldHVybiBuZXcgQ29tcHV0ZWRWYWx1ZSh2YWx1ZSwgc2NvcGUsIG1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUsIHZhbHVlLm5hbWUsIHNldHRlcik7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lciwgb25DbGVhbnVwKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0cmFuc2Zvcm1lciA9PT0gXCJmdW5jdGlvblwiICYmIHRyYW5zZm9ybWVyLmxlbmd0aCA9PT0gMSwgXCJjcmVhdGVUcmFuc2Zvcm1lciBleHBlY3RzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBhcmd1bWVudFwiKTtcbiAgICB2YXIgb2JqZWN0Q2FjaGUgPSB7fTtcbiAgICB2YXIgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgdmFyIFRyYW5zZm9ybWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKFRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1lcihzb3VyY2VJZGVudGlmaWVyLCBzb3VyY2VPYmplY3QpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZm9ybWVyKHNvdXJjZU9iamVjdCk7IH0sIG51bGwsIGZhbHNlLCBcIlRyYW5zZm9ybWVyLVwiICsgdHJhbnNmb3JtZXIubmFtZSArIFwiLVwiICsgc291cmNlSWRlbnRpZmllciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlSWRlbnRpZmllciA9IHNvdXJjZUlkZW50aWZpZXI7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZU9iamVjdCA9IHNvdXJjZU9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBUcmFuc2Zvcm1lci5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLm9uQmVjb21lVW5vYnNlcnZlZC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgZGVsZXRlIG9iamVjdENhY2hlW3RoaXMuc291cmNlSWRlbnRpZmllcl07XG4gICAgICAgICAgICBpZiAob25DbGVhbnVwKVxuICAgICAgICAgICAgICAgIG9uQ2xlYW51cChsYXN0VmFsdWUsIHRoaXMuc291cmNlT2JqZWN0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVyO1xuICAgIH0oQ29tcHV0ZWRWYWx1ZSkpO1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmIChyZXNldElkICE9PSBnbG9iYWxTdGF0ZS5yZXNldElkKSB7XG4gICAgICAgICAgICBvYmplY3RDYWNoZSA9IHt9O1xuICAgICAgICAgICAgcmVzZXRJZCA9IGdsb2JhbFN0YXRlLnJlc2V0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlkZW50aWZpZXIgPSBnZXRNZW1vaXphdGlvbklkKG9iamVjdCk7XG4gICAgICAgIHZhciByZWFjdGl2ZVRyYW5zZm9ybWVyID0gb2JqZWN0Q2FjaGVbaWRlbnRpZmllcl07XG4gICAgICAgIGlmIChyZWFjdGl2ZVRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgcmV0dXJuIHJlYWN0aXZlVHJhbnNmb3JtZXIuZ2V0KCk7XG4gICAgICAgIHJlYWN0aXZlVHJhbnNmb3JtZXIgPSBvYmplY3RDYWNoZVtpZGVudGlmaWVyXSA9IG5ldyBUcmFuc2Zvcm1lcihpZGVudGlmaWVyLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVUcmFuc2Zvcm1lci5nZXQoKTtcbiAgICB9O1xufVxuZXhwb3J0cy5jcmVhdGVUcmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyO1xuZnVuY3Rpb24gZ2V0TWVtb2l6YXRpb25JZChvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsIHx8IHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSB0cmFuc2Zvcm0gZXhwZWN0ZWQgc29tZSBraW5kIG9mIG9iamVjdCwgZ290OiBcIiArIG9iamVjdCk7XG4gICAgdmFyIHRpZCA9IG9iamVjdC4kdHJhbnNmb3JtSWQ7XG4gICAgaWYgKHRpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRpZCA9IGdldE5leHRJZCgpO1xuICAgICAgICBhZGRIaWRkZW5Qcm9wKG9iamVjdCwgXCIkdHJhbnNmb3JtSWRcIiwgdGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpZDtcbn1cbmZ1bmN0aW9uIGV4cHIoZXhwciwgc2NvcGUpIHtcbiAgICBpZiAoIWlzQ29tcHV0aW5nRGVyaXZhdGlvbigpKVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbbW9ieC5leHByXSAnZXhwcicgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgb3RoZXIgcmVhY3RpdmUgZnVuY3Rpb25zLlwiKTtcbiAgICByZXR1cm4gY29tcHV0ZWQoZXhwciwgc2NvcGUpLmdldCgpO1xufVxuZXhwb3J0cy5leHByID0gZXhwcjtcbmZ1bmN0aW9uIGV4dGVuZE9ic2VydmFibGUodGFyZ2V0KSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBwcm9wZXJ0aWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA+PSAyLCBcImV4dGVuZE9ic2VydmFibGUgZXhwZWN0ZWQgMiBvciBtb3JlIGFyZ3VtZW50c1wiKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiwgXCJleHRlbmRPYnNlcnZhYmxlIGV4cGVjdHMgYW4gb2JqZWN0IGFzIGZpcnN0IGFyZ3VtZW50XCIpO1xuICAgIGludmFyaWFudCghKHRhcmdldCBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXApLCBcImV4dGVuZE9ic2VydmFibGUgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIG1hcHMsIHVzZSBtYXAubWVyZ2UgaW5zdGVhZFwiKTtcbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BTZXQpIHtcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBwcm9wU2V0ID09PSBcIm9iamVjdFwiLCBcImFsbCBhcmd1bWVudHMgb2YgZXh0ZW5kT2JzZXJ2YWJsZSBzaG91bGQgYmUgb2JqZWN0c1wiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih0YXJnZXQsIHByb3BTZXQsIFZhbHVlTW9kZS5SZWN1cnNpdmUsIG51bGwpO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG5leHBvcnRzLmV4dGVuZE9ic2VydmFibGUgPSBleHRlbmRPYnNlcnZhYmxlO1xuZnVuY3Rpb24gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih0YXJnZXQsIHByb3BlcnRpZXMsIG1vZGUsIG5hbWUpIHtcbiAgICB2YXIgYWRtID0gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgbmFtZSwgbW9kZSk7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShwcm9wZXJ0aWVzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBwcm9wZXJ0aWVzICYmICFpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHRhcmdldCwga2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lUcmVlKHRoaW5nLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlVG9EZXBlbmRlbmN5VHJlZShnZXRBdG9tKHRoaW5nLCBwcm9wZXJ0eSkpO1xufVxuZnVuY3Rpb24gbm9kZVRvRGVwZW5kZW5jeVRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKG5vZGUub2JzZXJ2aW5nICYmIG5vZGUub2JzZXJ2aW5nLmxlbmd0aCA+IDApXG4gICAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSB1bmlxdWUobm9kZS5vYnNlcnZpbmcpLm1hcChub2RlVG9EZXBlbmRlbmN5VHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE9ic2VydmVyVHJlZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gbm9kZVRvT2JzZXJ2ZXJUcmVlKGdldEF0b20odGhpbmcsIHByb3BlcnR5KSk7XG59XG5mdW5jdGlvbiBub2RlVG9PYnNlcnZlclRyZWUobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IG5vZGUubmFtZVxuICAgIH07XG4gICAgaWYgKGhhc09ic2VydmVycyhub2RlKSlcbiAgICAgICAgcmVzdWx0Lm9ic2VydmVycyA9IGdldE9ic2VydmVycyhub2RlKS5tYXAobm9kZVRvT2JzZXJ2ZXJUcmVlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0KHRoaW5nLCBwcm9wT3JIYW5kbGVyLCBoYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRQcm9wZXJ0eSh0aGluZywgcHJvcE9ySGFuZGxlciwgaGFuZGxlcik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gaW50ZXJjZXB0SW50ZXJjZXB0YWJsZSh0aGluZywgcHJvcE9ySGFuZGxlcik7XG59XG5leHBvcnRzLmludGVyY2VwdCA9IGludGVyY2VwdDtcbmZ1bmN0aW9uIGludGVyY2VwdEludGVyY2VwdGFibGUodGhpbmcsIGhhbmRsZXIpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh0aGluZykgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykpIHtcbiAgICAgICAgZGVwcmVjYXRlZChcIlBhc3NpbmcgcGxhaW4gb2JqZWN0cyB0byBpbnRlcmNlcHQgLyBvYnNlcnZlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjBcIik7XG4gICAgICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbihvYnNlcnZhYmxlKHRoaW5nKSkuaW50ZXJjZXB0KGhhbmRsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcpLmludGVyY2VwdChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdFByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgaGFuZGxlcikge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHRoaW5nKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICBkZXByZWNhdGVkKFwiUGFzc2luZyBwbGFpbiBvYmplY3RzIHRvIGludGVyY2VwdCAvIG9ic2VydmUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMFwiKTtcbiAgICAgICAgZXh0ZW5kT2JzZXJ2YWJsZSh0aGluZywge1xuICAgICAgICAgICAgcHJvcGVydHk6IHRoaW5nW3Byb3BlcnR5XVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVyY2VwdFByb3BlcnR5KHRoaW5nLCBwcm9wZXJ0eSwgaGFuZGxlcik7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZywgcHJvcGVydHkpLmludGVyY2VwdChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSh2YWx1ZSwgcHJvcGVydHkpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGVNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5pc09ic2VydmFibGVdIGlzT2JzZXJ2YWJsZShvYmplY3QsIHByb3BlcnR5TmFtZSkgaXMgbm90IHN1cHBvcnRlZCBmb3IgYXJyYXlzIGFuZCBtYXBzLiBVc2UgbWFwLmhhcyBvciBhcnJheS5sZW5ndGggaW5zdGVhZC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhciBvID0gdmFsdWUuJG1vYng7XG4gICAgICAgICAgICByZXR1cm4gby52YWx1ZXMgJiYgISFvLnZhbHVlc1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISF2YWx1ZS4kbW9ieCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJhc2VBdG9tIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVhY3Rpb24gfHwgdmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGUgPSBpc09ic2VydmFibGU7XG52YXIgZGVjb3JhdG9ySW1wbCA9IGNyZWF0ZUNsYXNzUHJvcGVydHlEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgYmFzZVZhbHVlKSB7XG4gICAgdmFyIHByZXZBID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICBpZiAodHlwZW9mIGJhc2VWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBiYXNlVmFsdWUgPSBhc1JlZmVyZW5jZShiYXNlVmFsdWUpO1xuICAgIHZhciBhZG0gPSBhc09ic2VydmFibGVPYmplY3QodGFyZ2V0LCB1bmRlZmluZWQsIFZhbHVlTW9kZS5SZWN1cnNpdmUpO1xuICAgIGRlZmluZU9ic2VydmFibGVQcm9wZXJ0eShhZG0sIG5hbWUsIGJhc2VWYWx1ZSwgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2QSk7XG59LCBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy4kbW9ieC52YWx1ZXNbbmFtZV07XG4gICAgaWYgKG9ic2VydmFibGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZS5nZXQoKTtcbn0sIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHNldFByb3BlcnR5VmFsdWUodGhpcywgbmFtZSwgdmFsdWUpO1xufSwgdHJ1ZSwgZmFsc2UpO1xuZnVuY3Rpb24gb2JzZXJ2YWJsZURlY29yYXRvcih0YXJnZXQsIGtleSwgYmFzZURlc2NyaXB0b3IpIHtcbiAgICBpbnZhcmlhbnQoYXJndW1lbnRzLmxlbmd0aCA+PSAyICYmIGFyZ3VtZW50cy5sZW5ndGggPD0gMywgXCJJbGxlZ2FsIGRlY29yYXRvciBjb25maWdcIiwga2V5KTtcbiAgICBhc3NlcnRQcm9wZXJ0eUNvbmZpZ3VyYWJsZSh0YXJnZXQsIGtleSk7XG4gICAgaW52YXJpYW50KCFiYXNlRGVzY3JpcHRvciB8fCAhYmFzZURlc2NyaXB0b3IuZ2V0LCBcIkBvYnNlcnZhYmxlIGNhbiBub3QgYmUgdXNlZCBvbiBnZXR0ZXJzLCB1c2UgQGNvbXB1dGVkIGluc3RlYWRcIik7XG4gICAgcmV0dXJuIGRlY29yYXRvckltcGwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIG9ic2VydmFibGUodiwga2V5T3JTY29wZSkge1xuICAgIGlmICh2ID09PSB2b2lkIDApIHsgdiA9IHVuZGVmaW5lZDsgfVxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIGludmFyaWFudChhcmd1bWVudHMubGVuZ3RoIDwgMywgXCJvYnNlcnZhYmxlIGV4cGVjdHMgemVybywgb25lIG9yIHR3byBhcmd1bWVudHNcIik7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2KSlcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgdmFyIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHYsIFZhbHVlTW9kZS5SZWN1cnNpdmUpLCBtb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgdmFyIHNvdXJjZVR5cGUgPSBtb2RlID09PSBWYWx1ZU1vZGUuUmVmZXJlbmNlID8gVmFsdWVUeXBlLlJlZmVyZW5jZSA6IGdldFR5cGVPZlZhbHVlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHNvdXJjZVR5cGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZVR5cGUuQXJyYXk6XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLlBsYWluT2JqZWN0OlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VDaGlsZE9ic2VydmFibGUodmFsdWUsIG1vZGUpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5SZWZlcmVuY2U6XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkNvbXBsZXhPYmplY3Q6XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgbW9kZSk7XG4gICAgICAgIGNhc2UgVmFsdWVUeXBlLkNvbXBsZXhGdW5jdGlvbjpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4Lm9ic2VydmFibGVdIFRvIGJlIGFibGUgdG8gbWFrZSBhIGZ1bmN0aW9uIHJlYWN0aXZlIGl0IHNob3VsZCBub3QgaGF2ZSBhcmd1bWVudHMuIElmIHlvdSBuZWVkIGFuIG9ic2VydmFibGUgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIHVzZSBgb2JzZXJ2YWJsZShhc1JlZmVyZW5jZShmKSlgXCIpO1xuICAgICAgICBjYXNlIFZhbHVlVHlwZS5WaWV3RnVuY3Rpb246XG4gICAgICAgICAgICBkZXByZWNhdGVkKFwiVXNlIGBjb21wdXRlZChleHByKWAgaW5zdGVhZCBvZiBgb2JzZXJ2YWJsZShleHByKWBcIik7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZWQodiwga2V5T3JTY29wZSk7XG4gICAgfVxuICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xufVxuZXhwb3J0cy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTtcbnZhciBWYWx1ZVR5cGU7XG4oZnVuY3Rpb24gKFZhbHVlVHlwZSkge1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJSZWZlcmVuY2VcIl0gPSAwXSA9IFwiUmVmZXJlbmNlXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIlBsYWluT2JqZWN0XCJdID0gMV0gPSBcIlBsYWluT2JqZWN0XCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkNvbXBsZXhPYmplY3RcIl0gPSAyXSA9IFwiQ29tcGxleE9iamVjdFwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJBcnJheVwiXSA9IDNdID0gXCJBcnJheVwiO1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJWaWV3RnVuY3Rpb25cIl0gPSA0XSA9IFwiVmlld0Z1bmN0aW9uXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkNvbXBsZXhGdW5jdGlvblwiXSA9IDVdID0gXCJDb21wbGV4RnVuY3Rpb25cIjtcbn0pKFZhbHVlVHlwZSB8fCAoVmFsdWVUeXBlID0ge30pKTtcbmZ1bmN0aW9uIGdldFR5cGVPZlZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBWYWx1ZVR5cGUuUmVmZXJlbmNlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IFZhbHVlVHlwZS5Db21wbGV4RnVuY3Rpb24gOiBWYWx1ZVR5cGUuVmlld0Z1bmN0aW9uO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGVBcnJheSlcbiAgICAgICAgcmV0dXJuIFZhbHVlVHlwZS5BcnJheTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKVxuICAgICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyBWYWx1ZVR5cGUuUGxhaW5PYmplY3QgOiBWYWx1ZVR5cGUuQ29tcGxleE9iamVjdDtcbiAgICByZXR1cm4gVmFsdWVUeXBlLlJlZmVyZW5jZTtcbn1cbmZ1bmN0aW9uIG9ic2VydmUodGhpbmcsIHByb3BPckNiLCBjYk9yRmlyZSwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKHR5cGVvZiBjYk9yRmlyZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gb2JzZXJ2ZU9ic2VydmFibGVQcm9wZXJ0eSh0aGluZywgcHJvcE9yQ2IsIGNiT3JGaXJlLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG9ic2VydmVPYnNlcnZhYmxlKHRoaW5nLCBwcm9wT3JDYiwgY2JPckZpcmUpO1xufVxuZXhwb3J0cy5vYnNlcnZlID0gb2JzZXJ2ZTtcbmZ1bmN0aW9uIG9ic2VydmVPYnNlcnZhYmxlKHRoaW5nLCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24ob2JzZXJ2YWJsZSh0aGluZykpLm9ic2VydmUobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSk7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZykub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbn1cbmZ1bmN0aW9uIG9ic2VydmVPYnNlcnZhYmxlUHJvcGVydHkodGhpbmcsIHByb3BlcnR5LCBsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodGhpbmcpICYmICFpc09ic2VydmFibGVPYmplY3QodGhpbmcpKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJQYXNzaW5nIHBsYWluIG9iamVjdHMgdG8gaW50ZXJjZXB0IC8gb2JzZXJ2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wXCIpO1xuICAgICAgICBleHRlbmRPYnNlcnZhYmxlKHRoaW5nLCB7XG4gICAgICAgICAgICBwcm9wZXJ0eTogdGhpbmdbcHJvcGVydHldXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZU9ic2VydmFibGVQcm9wZXJ0eSh0aGluZywgcHJvcGVydHksIGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24odGhpbmcsIHByb3BlcnR5KS5vYnNlcnZlKGxpc3RlbmVyLCBmaXJlSW1tZWRpYXRlbHkpO1xufVxuZnVuY3Rpb24gdG9KUyhzb3VyY2UsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbikge1xuICAgIGlmIChkZXRlY3RDeWNsZXMgPT09IHZvaWQgMCkgeyBkZXRlY3RDeWNsZXMgPSB0cnVlOyB9XG4gICAgaWYgKF9fYWxyZWFkeVNlZW4gPT09IHZvaWQgMCkgeyBfX2FscmVhZHlTZWVuID0gbnVsbDsgfVxuICAgIGZ1bmN0aW9uIGNhY2hlKHZhbHVlKSB7XG4gICAgICAgIGlmIChkZXRlY3RDeWNsZXMpXG4gICAgICAgICAgICBfX2FscmVhZHlTZWVuLnB1c2goW3NvdXJjZSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRGF0ZSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgaWYgKGRldGVjdEN5Y2xlcyAmJiBfX2FscmVhZHlTZWVuID09PSBudWxsKVxuICAgICAgICBfX2FscmVhZHlTZWVuID0gW107XG4gICAgaWYgKGRldGVjdEN5Y2xlcyAmJiBzb3VyY2UgIT09IG51bGwgJiYgdHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IF9fYWxyZWFkeVNlZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgaWYgKF9fYWxyZWFkeVNlZW5baV1bMF0gPT09IHNvdXJjZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hbHJlYWR5U2VlbltpXVsxXTtcbiAgICB9XG4gICAgaWYgKCFzb3VyY2UpXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpIHtcbiAgICAgICAgdmFyIHJlcyA9IGNhY2hlKFtdKTtcbiAgICAgICAgdmFyIHRvQWRkID0gc291cmNlLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRvSlModmFsdWUsIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7IH0pO1xuICAgICAgICByZXMubGVuZ3RoID0gdG9BZGQubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRvQWRkLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIHJlc1tpXSA9IHRvQWRkW2ldO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcCkge1xuICAgICAgICB2YXIgcmVzXzEgPSBjYWNoZSh7fSk7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7IHJldHVybiByZXNfMVtrZXldID0gdG9KUyh2YWx1ZSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKTsgfSk7XG4gICAgICAgIHJldHVybiByZXNfMTtcbiAgICB9XG4gICAgaWYgKGlzT2JzZXJ2YWJsZShzb3VyY2UpICYmIHNvdXJjZS4kbW9ieCBpbnN0YW5jZW9mIE9ic2VydmFibGVWYWx1ZSlcbiAgICAgICAgcmV0dXJuIHRvSlMoc291cmNlKCksIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE9ic2VydmFibGVWYWx1ZSlcbiAgICAgICAgcmV0dXJuIHRvSlMoc291cmNlLmdldCgpLCBkZXRlY3RDeWNsZXMsIF9fYWxyZWFkeVNlZW4pO1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhciByZXMgPSBjYWNoZSh7fSk7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpXG4gICAgICAgICAgICByZXNba2V5XSA9IHRvSlMoc291cmNlW2tleV0sIGRldGVjdEN5Y2xlcywgX19hbHJlYWR5U2Vlbik7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG5leHBvcnRzLnRvSlMgPSB0b0pTO1xuZnVuY3Rpb24gdG9KU09OKHNvdXJjZSwgZGV0ZWN0Q3ljbGVzLCBfX2FscmVhZHlTZWVuKSB7XG4gICAgaWYgKGRldGVjdEN5Y2xlcyA9PT0gdm9pZCAwKSB7IGRldGVjdEN5Y2xlcyA9IHRydWU7IH1cbiAgICBpZiAoX19hbHJlYWR5U2VlbiA9PT0gdm9pZCAwKSB7IF9fYWxyZWFkeVNlZW4gPSBudWxsOyB9XG4gICAgZGVwcmVjYXRlZChcInRvSlNPTiBpcyBkZXByZWNhdGVkLiBVc2UgdG9KUyBpbnN0ZWFkXCIpO1xuICAgIHJldHVybiB0b0pTLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnRzLnRvSlNPTiA9IHRvSlNPTjtcbmZ1bmN0aW9uIGxvZyhtc2cpIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIHJldHVybiBtc2c7XG59XG5mdW5jdGlvbiB3aHlSdW4odGhpbmcsIHByb3ApIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhpbmcgPSBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgICAgICAgICBpZiAoIXRoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2coXCJ3aHlSdW4oKSBjYW4gb25seSBiZSB1c2VkIGlmIGEgZGVyaXZhdGlvbiBpcyBhY3RpdmUsIG9yIGJ5IHBhc3NpbmcgYW4gY29tcHV0ZWQgdmFsdWUgLyByZWFjdGlvbiBleHBsaWNpdGx5LiBJZiB5b3UgaW52b2tlZCB3aHlSdW4gZnJvbSBpbnNpZGUgYSBjb21wdXRhdGlvbjsgdGhlIGNvbXB1dGF0aW9uIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQgYnV0IHJlLWV2YWx1YXRpbmcgYmVjYXVzZSBzb21lYm9keSByZXF1ZXN0ZWQgaXQncyB2YWx1ZS5cIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGhpbmcgPSBnZXRBdG9tKHRoaW5nLCBwcm9wKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGluZyA9IGdldEF0b20odGhpbmcpO1xuICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpXG4gICAgICAgIHJldHVybiBsb2codGhpbmcud2h5UnVuKCkpO1xuICAgIGVsc2UgaWYgKHRoaW5nIGluc3RhbmNlb2YgUmVhY3Rpb24pXG4gICAgICAgIHJldHVybiBsb2codGhpbmcud2h5UnVuKCkpO1xuICAgIGVsc2VcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCBcIndoeVJ1biBjYW4gb25seSBiZSB1c2VkIG9uIHJlYWN0aW9ucyBhbmQgY29tcHV0ZWQgdmFsdWVzXCIpO1xufVxuZXhwb3J0cy53aHlSdW4gPSB3aHlSdW47XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24oYWN0aW9uTmFtZSwgZm4pIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIsIFwiYGFjdGlvbmAgY2FuIG9ubHkgYmUgaW52b2tlZCBvbiBmdW5jdGlvbnNcIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiBhY3Rpb25OYW1lID09PSBcInN0cmluZ1wiICYmIGFjdGlvbk5hbWUubGVuZ3RoID4gMCwgXCJhY3Rpb25zIHNob3VsZCBoYXZlIHZhbGlkIG5hbWVzLCBnb3Q6ICdcIiArIGFjdGlvbk5hbWUgKyBcIidcIik7XG4gICAgdmFyIHJlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVBY3Rpb24oYWN0aW9uTmFtZSwgZm4sIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICByZXMuaXNNb2J4QWN0aW9uID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgc2NvcGUsIGFyZ3MpIHtcbiAgICBpbnZhcmlhbnQoIShnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb24gaW5zdGFuY2VvZiBDb21wdXRlZFZhbHVlKSwgXCJDb21wdXRlZCB2YWx1ZXMgb3IgdHJhbnNmb3JtZXJzIHNob3VsZCBub3QgaW52b2tlIGFjdGlvbnMgb3IgdHJpZ2dlciBvdGhlciBzaWRlIGVmZmVjdHNcIik7XG4gICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgIHZhciBzdGFydFRpbWU7XG4gICAgaWYgKG5vdGlmeVNweSkge1xuICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgbCA9IChhcmdzICYmIGFyZ3MubGVuZ3RoKSB8fCAwO1xuICAgICAgICB2YXIgZmxhdHRlbmRBcmdzID0gbmV3IEFycmF5KGwpO1xuICAgICAgICBpZiAobCA+IDApXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgICAgICBmbGF0dGVuZEFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICB0eXBlOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgbmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIGZuOiBmbixcbiAgICAgICAgICAgIHRhcmdldDogc2NvcGUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGZsYXR0ZW5kQXJnc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHByZXZVbnRyYWNrZWQgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHRyYW5zYWN0aW9uU3RhcnQoYWN0aW9uTmFtZSwgc2NvcGUsIGZhbHNlKTtcbiAgICB2YXIgcHJldkFsbG93U3RhdGVDaGFuZ2VzID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoc2NvcGUsIGFyZ3MpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYWxsb3dTdGF0ZUNoYW5nZXNFbmQocHJldkFsbG93U3RhdGVDaGFuZ2VzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICBzcHlSZXBvcnRFbmQoeyB0aW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVzZVN0cmljdChzdHJpY3QpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXByZWNhdGVkKFwiYHVzZVN0cmljdGAgd2l0aG91dCBhcmd1bWVudHMgaXMgZGVwcmVjYXRlZCwgdXNlIGBpc1N0cmljdE1vZGVFbmFibGVkKClgIGluc3RlYWRcIik7XG4gICAgICAgIHJldHVybiBnbG9iYWxTdGF0ZS5zdHJpY3RNb2RlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52YXJpYW50KGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbiA9PT0gbnVsbCwgXCJJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgYHVzZVN0cmljdGAgd2hlbiBhIGRlcml2YXRpb24gaXMgcnVubmluZ1wiKTtcbiAgICAgICAgZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZSA9IHN0cmljdDtcbiAgICAgICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSAhc3RyaWN0O1xuICAgIH1cbn1cbmV4cG9ydHMudXNlU3RyaWN0ID0gdXNlU3RyaWN0O1xuZnVuY3Rpb24gaXNTdHJpY3RNb2RlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUuc3RyaWN0TW9kZTtcbn1cbmV4cG9ydHMuaXNTdHJpY3RNb2RlRW5hYmxlZCA9IGlzU3RyaWN0TW9kZUVuYWJsZWQ7XG5mdW5jdGlvbiBhbGxvd1N0YXRlQ2hhbmdlcyhhbGxvd1N0YXRlQ2hhbmdlcywgZnVuYykge1xuICAgIHZhciBwcmV2ID0gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydChhbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgdmFyIHJlcyA9IGZ1bmMoKTtcbiAgICBhbGxvd1N0YXRlQ2hhbmdlc0VuZChwcmV2KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gYWxsb3dTdGF0ZUNoYW5nZXNTdGFydChhbGxvd1N0YXRlQ2hhbmdlcykge1xuICAgIHZhciBwcmV2ID0gZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXM7XG4gICAgZ2xvYmFsU3RhdGUuYWxsb3dTdGF0ZUNoYW5nZXMgPSBhbGxvd1N0YXRlQ2hhbmdlcztcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXYpIHtcbiAgICBnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcyA9IHByZXY7XG59XG52YXIgQmFzZUF0b20gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VBdG9tKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkgeyBuYW1lID0gXCJBdG9tQFwiICsgZ2V0TmV4dElkKCk7IH1cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc1BlbmRpbmdVbm9ic2VydmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnNJbmRleGVzID0ge307XG4gICAgICAgIHRoaXMuZGlmZlZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRCeSA9IDA7XG4gICAgICAgIHRoaXMubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgIH1cbiAgICBCYXNlQXRvbS5wcm90b3R5cGUub25CZWNvbWVVbm9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgQmFzZUF0b20ucHJvdG90eXBlLnJlcG9ydE9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICB9O1xuICAgIEJhc2VBdG9tLnByb3RvdHlwZS5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cmFuc2FjdGlvblN0YXJ0KFwicHJvcGFnYXRpbmdBdG9tQ2hhbmdlXCIsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgcHJvcGFnYXRlQ2hhbmdlZCh0aGlzKTtcbiAgICAgICAgdHJhbnNhY3Rpb25FbmQoZmFsc2UpO1xuICAgIH07XG4gICAgQmFzZUF0b20ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VBdG9tO1xufSgpKTtcbmV4cG9ydHMuQmFzZUF0b20gPSBCYXNlQXRvbTtcbnZhciBBdG9tID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXRvbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBdG9tKG5hbWUsIG9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyLCBvbkJlY29tZVVub2JzZXJ2ZWRIYW5kbGVyKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiQXRvbUBcIiArIGdldE5leHRJZCgpOyB9XG4gICAgICAgIGlmIChvbkJlY29tZU9ic2VydmVkSGFuZGxlciA9PT0gdm9pZCAwKSB7IG9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyID0gbm9vcDsgfVxuICAgICAgICBpZiAob25CZWNvbWVVbm9ic2VydmVkSGFuZGxlciA9PT0gdm9pZCAwKSB7IG9uQmVjb21lVW5vYnNlcnZlZEhhbmRsZXIgPSBub29wOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG5hbWUpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uQmVjb21lT2JzZXJ2ZWRIYW5kbGVyID0gb25CZWNvbWVPYnNlcnZlZEhhbmRsZXI7XG4gICAgICAgIHRoaXMub25CZWNvbWVVbm9ic2VydmVkSGFuZGxlciA9IG9uQmVjb21lVW5vYnNlcnZlZEhhbmRsZXI7XG4gICAgICAgIHRoaXMuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQmVpbmdUcmFja2VkID0gZmFsc2U7XG4gICAgfVxuICAgIEF0b20ucHJvdG90eXBlLnJlcG9ydE9ic2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFydEJhdGNoKCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUucmVwb3J0T2JzZXJ2ZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQmVpbmdUcmFja2VkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQmVpbmdUcmFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub25CZWNvbWVPYnNlcnZlZEhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRCYXRjaCgpO1xuICAgICAgICByZXR1cm4gISFnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgfTtcbiAgICBBdG9tLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNCZWluZ1RyYWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkJlY29tZVVub2JzZXJ2ZWRIYW5kbGVyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQXRvbTtcbn0oQmFzZUF0b20pKTtcbmV4cG9ydHMuQXRvbSA9IEF0b207XG52YXIgQ29tcHV0ZWRWYWx1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcHV0ZWRWYWx1ZShkZXJpdmF0aW9uLCBzY29wZSwgY29tcGFyZVN0cnVjdHVyYWwsIG5hbWUsIHNldHRlcikge1xuICAgICAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuY29tcGFyZVN0cnVjdHVyYWwgPSBjb21wYXJlU3RydWN0dXJhbDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgICAgICB0aGlzLm9ic2VydmluZyA9IFtdO1xuICAgICAgICB0aGlzLm5ld09ic2VydmluZyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgICB0aGlzLm9ic2VydmVyc0luZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kaWZmVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRCeSA9IDA7XG4gICAgICAgIHRoaXMubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTtcbiAgICAgICAgdGhpcy51bmJvdW5kRGVwc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fX21hcGlkID0gXCIjXCIgKyBnZXROZXh0SWQoKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pc0NvbXB1dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiQ29tcHV0ZWRWYWx1ZUBcIiArIGdldE5leHRJZCgpO1xuICAgICAgICBpZiAoc2V0dGVyKVxuICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBjcmVhdGVBY3Rpb24obmFtZSArIFwiLXNldHRlclwiLCBzZXR0ZXIpO1xuICAgIH1cbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZBbGxvd1N0YXRlQ2hhbmdlcyA9IGFsbG93U3RhdGVDaGFuZ2VzU3RhcnQoZmFsc2UpO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5kZXJpdmF0aW9uLmNhbGwodGhpcy5zY29wZSk7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzRW5kKHByZXZBbGxvd1N0YXRlQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuaXNDb21wdXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIDtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5wZWVrVW50cmFja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMucGVlaygpO1xuICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoaGFzRXJyb3IpXG4gICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uSW5EZXJpdmF0aW9uKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZVN0YWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9wYWdhdGVNYXliZUNoYW5nZWQodGhpcyk7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5vbkJlY29tZVVub2JzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmRlcGVuZGVuY2llc1N0YXRlICE9PSBJRGVyaXZhdGlvblN0YXRlLk5PVF9UUkFDS0lORywgXCJJTlRFUk5BTCBFUlJPUiBvbmx5IG9uQmVjb21lVW5vYnNlcnZlZCBzaG91bGRuJ3QgYmUgY2FsbGVkIHR3aWNlIGluIGEgcm93XCIpO1xuICAgICAgICBjbGVhck9ic2VydmluZyh0aGlzKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzQ29tcHV0aW5nLCBcIkN5Y2xlIGRldGVjdGVkIGluIGNvbXB1dGF0aW9uIFwiICsgdGhpcy5uYW1lLCB0aGlzLmRlcml2YXRpb24pO1xuICAgICAgICBzdGFydEJhdGNoKCk7XG4gICAgICAgIGlmIChnbG9iYWxTdGF0ZS5pbkJhdGNoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZSh0aGlzKSlcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wZWVrVW50cmFja2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXBvcnRPYnNlcnZlZCh0aGlzKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRDb21wdXRlKHRoaXMpKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQW5kQ29tcHV0ZSgpKVxuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVDaGFuZ2VDb25maXJtZWQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGVuZEJhdGNoKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5yZWNvdmVyRnJvbUVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzQ29tcHV0aW5nID0gZmFsc2U7XG4gICAgfTtcbiAgICBDb21wdXRlZFZhbHVlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGVyKVxuICAgICAgICAgICAgdGhpcy5zZXR0ZXIuY2FsbCh0aGlzLnNjb3BlLCB2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltDb21wdXRlZFZhbHVlICdcIiArIHRoaXMubmFtZSArIFwiJ10gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhIGNvbXB1dGVkIHZhbHVlLlwiKTtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLnRyYWNrQW5kQ29tcHV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzU3B5RW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBzcHlSZXBvcnQoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImNvbXB1dGVcIixcbiAgICAgICAgICAgICAgICBmbjogdGhpcy5kZXJpdmF0aW9uLFxuICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcy5zY29wZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZSA9IHRyYWNrRGVyaXZlZEZ1bmN0aW9uKHRoaXMsIHRoaXMucGVlayk7XG4gICAgICAgIHJldHVybiB2YWx1ZURpZENoYW5nZSh0aGlzLmNvbXBhcmVTdHJ1Y3R1cmFsLCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXV0b3J1bihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBfdGhpcy5nZXQoKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RUaW1lIHx8IGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2VSA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdW50cmFja2VkRW5kKHByZXZVKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoKTtcbiAgICB9O1xuICAgIENvbXB1dGVkVmFsdWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbXCIgKyB0aGlzLmRlcml2YXRpb24udG9TdHJpbmcoKSArIFwiXVwiO1xuICAgIH07XG4gICAgQ29tcHV0ZWRWYWx1ZS5wcm90b3R5cGUud2h5UnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNUcmFja2luZyA9IEJvb2xlYW4oZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uKTtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLmlzQ29tcHV0aW5nID8gdGhpcy5uZXdPYnNlcnZpbmcgOiB0aGlzLm9ic2VydmluZykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KTtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IHVuaXF1ZShnZXRPYnNlcnZlcnModGhpcykubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGRlcC5uYW1lOyB9KSk7XG4gICAgICAgIHJldHVybiAoKFwiXFxuV2h5UnVuPyBjb21wdXRhdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogUnVubmluZyBiZWNhdXNlOiBcIiArIChpc1RyYWNraW5nID8gXCJbYWN0aXZlXSB0aGUgdmFsdWUgb2YgdGhpcyBjb21wdXRhdGlvbiBpcyBuZWVkZWQgYnkgYSByZWFjdGlvblwiIDogdGhpcy5pc0NvbXB1dGluZyA/IFwiW2dldF0gVGhlIHZhbHVlIG9mIHRoaXMgY29tcHV0ZWQgd2FzIHJlcXVlc3RlZCBvdXRzaWRlIGEgcmVhY3Rpb25cIiA6IFwiW2lkbGVdIG5vdCBydW5uaW5nIGF0IHRoZSBtb21lbnRcIikgKyBcIlxcblwiKSArXG4gICAgICAgICAgICAodGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5OT1RfVFJBQ0tJTkdcbiAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICAgIFwiICogVGhpcyBjb21wdXRhdGlvbiBpcyBzdXNwZW5kZWQgKG5vdCBpbiB1c2UgYnkgYW55IHJlYWN0aW9uKSBhbmQgd29uJ3QgcnVuIGF1dG9tYXRpY2FsbHkuXFxuXFx0RGlkbid0IGV4cGVjdCB0aGlzIGNvbXB1dGF0aW9uIHRvIGJlIHN1c3BlbmRlZCBhdCB0aGlzIHBvaW50P1xcblxcdCAgMS4gTWFrZSBzdXJlIHRoaXMgY29tcHV0YXRpb24gaXMgdXNlZCBieSBhIHJlYWN0aW9uIChyZWFjdGlvbiwgYXV0b3J1biwgb2JzZXJ2ZXIpLlxcblxcdCAgMi4gQ2hlY2sgd2hldGhlciB5b3UgYXJlIHVzaW5nIHRoaXMgY29tcHV0YXRpb24gc3luY2hyb25vdXNseSAoaW4gdGhlIHNhbWUgc3RhY2sgYXMgdGhleSByZWFjdGlvbiB0aGF0IG5lZWRzIGl0KS5cXG5cIlxuICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgXCIgKiBUaGlzIGNvbXB1dGF0aW9uIHdpbGwgcmUtcnVuIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIG9ic2VydmFibGVzIGNoYW5nZXM6XFxuICAgIFwiICsgam9pblN0cmluZ3Mob2JzZXJ2aW5nKSArIFwiXFxuICAgIFwiICsgKCh0aGlzLmlzQ29tcHV0aW5nICYmIGlzVHJhY2tpbmcpID8gXCIgKC4uLiBvciBhbnkgb2JzZXJ2YWJsZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBydW4pXCIgOiBcIlwiKSArIFwiXFxuXFx0TWlzc2luZyBpdGVtcyBpbiB0aGlzIGxpc3Q/XFxuXFx0ICAxLiBDaGVjayB3aGV0aGVyIGFsbCB1c2VkIHZhbHVlcyBhcmUgcHJvcGVybHkgbWFya2VkIGFzIG9ic2VydmFibGUgKHVzZSBpc09ic2VydmFibGUgdG8gdmVyaWZ5KVxcblxcdCAgMi4gTWFrZSBzdXJlIHlvdSBkaWRuJ3QgZGVyZWZlcmVuY2UgdmFsdWVzIHRvbyBlYXJseS4gTW9iWCBvYnNlcnZlcyBwcm9wcywgbm90IHByaW1pdGl2ZXMuIEUuZzogdXNlICdwZXJzb24ubmFtZScgaW5zdGVhZCBvZiAnbmFtZScgaW4geW91ciBjb21wdXRhdGlvbi5cXG4gICogSWYgdGhlIG91dGNvbWUgb2YgdGhpcyBjb21wdXRhdGlvbiBjaGFuZ2VzLCB0aGUgZm9sbG93aW5nIG9ic2VydmVycyB3aWxsIGJlIHJlLXJ1bjpcXG4gICAgXCIgKyBqb2luU3RyaW5ncyhvYnNlcnZlcnMpICsgXCJcXG5cIikpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbXB1dGVkVmFsdWU7XG59KCkpO1xudmFyIElEZXJpdmF0aW9uU3RhdGU7XG4oZnVuY3Rpb24gKElEZXJpdmF0aW9uU3RhdGUpIHtcbiAgICBJRGVyaXZhdGlvblN0YXRlW0lEZXJpdmF0aW9uU3RhdGVbXCJOT1RfVFJBQ0tJTkdcIl0gPSAtMV0gPSBcIk5PVF9UUkFDS0lOR1wiO1xuICAgIElEZXJpdmF0aW9uU3RhdGVbSURlcml2YXRpb25TdGF0ZVtcIlVQX1RPX0RBVEVcIl0gPSAwXSA9IFwiVVBfVE9fREFURVwiO1xuICAgIElEZXJpdmF0aW9uU3RhdGVbSURlcml2YXRpb25TdGF0ZVtcIlBPU1NJQkxZX1NUQUxFXCJdID0gMV0gPSBcIlBPU1NJQkxZX1NUQUxFXCI7XG4gICAgSURlcml2YXRpb25TdGF0ZVtJRGVyaXZhdGlvblN0YXRlW1wiU1RBTEVcIl0gPSAyXSA9IFwiU1RBTEVcIjtcbn0pKElEZXJpdmF0aW9uU3RhdGUgfHwgKElEZXJpdmF0aW9uU3RhdGUgPSB7fSkpO1xuZXhwb3J0cy5JRGVyaXZhdGlvblN0YXRlID0gSURlcml2YXRpb25TdGF0ZTtcbmZ1bmN0aW9uIHNob3VsZENvbXB1dGUoZGVyaXZhdGlvbikge1xuICAgIHN3aXRjaCAoZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSkge1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTogcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HOlxuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuU1RBTEU6IHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlIElEZXJpdmF0aW9uU3RhdGUuUE9TU0lCTFlfU1RBTEU6IHtcbiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB2YXIgcHJldlVudHJhY2tlZCA9IHVudHJhY2tlZFN0YXJ0KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZywgbCA9IG9icy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IG9ic1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXJpdmF0aW9uLmRlcGVuZGVuY2llc1N0YXRlID09PSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWRFbmQocHJldlVudHJhY2tlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZURlcGVuZGVuY2llc1N0YXRlVG8wKGRlcml2YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcHV0aW5nRGVyaXZhdGlvbigpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uICE9PSBudWxsO1xufVxuZnVuY3Rpb24gY2hlY2tJZlN0YXRlTW9kaWZpY2F0aW9uc0FyZUFsbG93ZWQoKSB7XG4gICAgaWYgKCFnbG9iYWxTdGF0ZS5hbGxvd1N0YXRlQ2hhbmdlcykge1xuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIGdsb2JhbFN0YXRlLnN0cmljdE1vZGVcbiAgICAgICAgICAgID8gXCJJdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUgb3IgY2hhbmdlIHN0YXRlIG91dHNpZGUgYW4gYGFjdGlvbmAgd2hlbiBNb2JYIGlzIGluIHN0cmljdCBtb2RlLiBXcmFwIHRoZSBjdXJyZW50IG1ldGhvZCBpbiBgYWN0aW9uYCBpZiB0aGlzIHN0YXRlIGNoYW5nZSBpcyBpbnRlbmRlZFwiXG4gICAgICAgICAgICA6IFwiSXQgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBzdGF0ZSB3aGVuIGEgY29tcHV0ZWQgdmFsdWUgb3IgdHJhbnNmb3JtZXIgaXMgYmVpbmcgZXZhbHVhdGVkLiBVc2UgJ2F1dG9ydW4nIHRvIGNyZWF0ZSByZWFjdGl2ZSBmdW5jdGlvbnMgd2l0aCBzaWRlLWVmZmVjdHMuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyYWNrRGVyaXZlZEZ1bmN0aW9uKGRlcml2YXRpb24sIGYpIHtcbiAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLm5ld09ic2VydmluZyA9IG5ldyBBcnJheShkZXJpdmF0aW9uLm9ic2VydmluZy5sZW5ndGggKyAxMDApO1xuICAgIGRlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCA9IDA7XG4gICAgZGVyaXZhdGlvbi5ydW5JZCA9ICsrZ2xvYmFsU3RhdGUucnVuSWQ7XG4gICAgdmFyIHByZXZUcmFja2luZyA9IGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbjtcbiAgICBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb24gPSBkZXJpdmF0aW9uO1xuICAgIHZhciBoYXNFeGNlcHRpb24gPSB0cnVlO1xuICAgIHZhciByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZi5jYWxsKGRlcml2YXRpb24pO1xuICAgICAgICBoYXNFeGNlcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmIChoYXNFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbkluRGVyaXZhdGlvbihkZXJpdmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnRyYWNraW5nRGVyaXZhdGlvbiA9IHByZXZUcmFja2luZztcbiAgICAgICAgICAgIGJpbmREZXBlbmRlbmNpZXMoZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV4Y2VwdGlvbkluRGVyaXZhdGlvbihkZXJpdmF0aW9uKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAoXCJbbW9ieF0gQW4gdW5jYXVnaHQgZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQgdmFsdWUsIGF1dG9ydW4gb3IgdHJhbnNmb3JtZXIuIE9yIGluc2lkZSB0aGUgcmVuZGVyKCkgbWV0aG9kIG9mIGFuIG9ic2VydmVyIGJhc2VkIFJlYWN0IGNvbXBvbmVudC4gXCIgK1xuICAgICAgICBcIlRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbmV2ZXIgdGhyb3cgZXhjZXB0aW9ucyBhcyBNb2JYIHdpbGwgbm90IGFsd2F5cyBiZSBhYmxlIHRvIHJlY292ZXIgZnJvbSB0aGVtLiBcIiArXG4gICAgICAgIChcIlBsZWFzZSBmaXggdGhlIGVycm9yIHJlcG9ydGVkIGFmdGVyIHRoaXMgbWVzc2FnZSBvciBlbmFibGUgJ1BhdXNlIG9uIChjYXVnaHQpIGV4Y2VwdGlvbnMnIGluIHlvdXIgZGVidWdnZXIgdG8gZmluZCB0aGUgcm9vdCBjYXVzZS4gSW46ICdcIiArIGRlcml2YXRpb24ubmFtZSArIFwiJy4gXCIpICtcbiAgICAgICAgXCJGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW9ieGpzL21vYngvaXNzdWVzLzQ2MlwiKTtcbiAgICBpZiAoaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICBjaGFuZ2VEZXBlbmRlbmNpZXNTdGF0ZVRvMChkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLm5ld09ic2VydmluZyA9IG51bGw7XG4gICAgZGVyaXZhdGlvbi51bmJvdW5kRGVwc0NvdW50ID0gMDtcbiAgICBkZXJpdmF0aW9uLnJlY292ZXJGcm9tRXJyb3IoKTtcbiAgICBlbmRCYXRjaCgpO1xuICAgIHJlc2V0R2xvYmFsU3RhdGUoKTtcbn1cbmZ1bmN0aW9uIGJpbmREZXBlbmRlbmNpZXMoZGVyaXZhdGlvbikge1xuICAgIHZhciBwcmV2T2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIG9ic2VydmluZyA9IGRlcml2YXRpb24ub2JzZXJ2aW5nID0gZGVyaXZhdGlvbi5uZXdPYnNlcnZpbmc7XG4gICAgZGVyaXZhdGlvbi5uZXdPYnNlcnZpbmcgPSBudWxsO1xuICAgIHZhciBpMCA9IDAsIGwgPSBkZXJpdmF0aW9uLnVuYm91bmREZXBzQ291bnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIGRlcCA9IG9ic2VydmluZ1tpXTtcbiAgICAgICAgaWYgKGRlcC5kaWZmVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIGRlcC5kaWZmVmFsdWUgPSAxO1xuICAgICAgICAgICAgaWYgKGkwICE9PSBpKVxuICAgICAgICAgICAgICAgIG9ic2VydmluZ1tpMF0gPSBkZXA7XG4gICAgICAgICAgICBpMCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmluZy5sZW5ndGggPSBpMDtcbiAgICBsID0gcHJldk9ic2VydmluZy5sZW5ndGg7XG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgICB2YXIgZGVwID0gcHJldk9ic2VydmluZ1tsXTtcbiAgICAgICAgaWYgKGRlcC5kaWZmVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU9ic2VydmVyKGRlcCwgZGVyaXZhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgfVxuICAgIHdoaWxlIChpMC0tKSB7XG4gICAgICAgIHZhciBkZXAgPSBvYnNlcnZpbmdbaTBdO1xuICAgICAgICBpZiAoZGVwLmRpZmZWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgZGVwLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgICAgICBhZGRPYnNlcnZlcihkZXAsIGRlcml2YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJPYnNlcnZpbmcoZGVyaXZhdGlvbikge1xuICAgIHZhciBvYnMgPSBkZXJpdmF0aW9uLm9ic2VydmluZztcbiAgICB2YXIgaSA9IG9icy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgcmVtb3ZlT2JzZXJ2ZXIob2JzW2ldLCBkZXJpdmF0aW9uKTtcbiAgICBkZXJpdmF0aW9uLmRlcGVuZGVuY2llc1N0YXRlID0gSURlcml2YXRpb25TdGF0ZS5OT1RfVFJBQ0tJTkc7XG4gICAgb2JzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiB1bnRyYWNrZWQoYWN0aW9uKSB7XG4gICAgdmFyIHByZXYgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciByZXMgPSBhY3Rpb24oKTtcbiAgICB1bnRyYWNrZWRFbmQocHJldik7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudW50cmFja2VkID0gdW50cmFja2VkO1xuZnVuY3Rpb24gdW50cmFja2VkU3RhcnQoKSB7XG4gICAgdmFyIHByZXYgPSBnbG9iYWxTdGF0ZS50cmFja2luZ0Rlcml2YXRpb247XG4gICAgZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uID0gbnVsbDtcbiAgICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHVudHJhY2tlZEVuZChwcmV2KSB7XG4gICAgZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uID0gcHJldjtcbn1cbmZ1bmN0aW9uIGNoYW5nZURlcGVuZGVuY2llc1N0YXRlVG8wKGRlcml2YXRpb24pIHtcbiAgICBpZiAoZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFKVxuICAgICAgICByZXR1cm47XG4gICAgZGVyaXZhdGlvbi5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURTtcbiAgICB2YXIgb2JzID0gZGVyaXZhdGlvbi5vYnNlcnZpbmc7XG4gICAgdmFyIGkgPSBvYnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9ic1tpXS5sb3dlc3RPYnNlcnZlclN0YXRlID0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFO1xufVxudmFyIHBlcnNpc3RlbnRLZXlzID0gW1wibW9ieEd1aWRcIiwgXCJyZXNldElkXCIsIFwic3B5TGlzdGVuZXJzXCIsIFwic3RyaWN0TW9kZVwiLCBcInJ1bklkXCJdO1xudmFyIE1vYlhHbG9iYWxzID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb2JYR2xvYmFscygpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gNDtcbiAgICAgICAgdGhpcy50cmFja2luZ0Rlcml2YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJ1bklkID0gMDtcbiAgICAgICAgdGhpcy5tb2J4R3VpZCA9IDA7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5CYXRjaCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ1Vub2JzZXJ2YXRpb25zID0gW107XG4gICAgICAgIHRoaXMucGVuZGluZ1JlYWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmFsbG93U3RhdGVDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdHJpY3RNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3B5TGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIHJldHVybiBNb2JYR2xvYmFscztcbn0oKSk7XG52YXIgZ2xvYmFsU3RhdGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXMgPSBuZXcgTW9iWEdsb2JhbHMoKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ic2VydmFibGVUcmFja2luZ1N0YWNrIHx8IGdsb2JhbC5fX21vYnNlcnZhYmxlVmlld1N0YWNrKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieF0gQW4gaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgbW9ic2VydmFibGUgaXMgYWxyZWFkeSBsb2FkZWQuXCIpO1xuICAgIGlmIChnbG9iYWwuX19tb2J4R2xvYmFsICYmIGdsb2JhbC5fX21vYnhHbG9iYWwudmVyc2lvbiAhPT0gcmVzLnZlcnNpb24pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBBbiBpbmNvbXBhdGlibGUgdmVyc2lvbiBvZiBtb2J4IGlzIGFscmVhZHkgbG9hZGVkLlwiKTtcbiAgICBpZiAoZ2xvYmFsLl9fbW9ieEdsb2JhbClcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5fX21vYnhHbG9iYWw7XG4gICAgcmV0dXJuIGdsb2JhbC5fX21vYnhHbG9iYWwgPSByZXM7XG59KSgpO1xuZnVuY3Rpb24gcmVnaXN0ZXJHbG9iYWxzKCkge1xufVxuZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcbiAgICBnbG9iYWxTdGF0ZS5yZXNldElkKys7XG4gICAgdmFyIGRlZmF1bHRHbG9iYWxzID0gbmV3IE1vYlhHbG9iYWxzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIGRlZmF1bHRHbG9iYWxzKVxuICAgICAgICBpZiAocGVyc2lzdGVudEtleXMuaW5kZXhPZihrZXkpID09PSAtMSlcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlW2tleV0gPSBkZWZhdWx0R2xvYmFsc1trZXldO1xuICAgIGdsb2JhbFN0YXRlLmFsbG93U3RhdGVDaGFuZ2VzID0gIWdsb2JhbFN0YXRlLnN0cmljdE1vZGU7XG59XG5mdW5jdGlvbiBoYXNPYnNlcnZlcnMob2JzZXJ2YWJsZSkge1xuICAgIHJldHVybiBvYnNlcnZhYmxlLm9ic2VydmVycyAmJiBvYnNlcnZhYmxlLm9ic2VydmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gZ2V0T2JzZXJ2ZXJzKG9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZS5vYnNlcnZlcnM7XG59XG5mdW5jdGlvbiBpbnZhcmlhbnRPYnNlcnZlcnMob2JzZXJ2YWJsZSkge1xuICAgIHZhciBsaXN0ID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnM7XG4gICAgdmFyIG1hcCA9IG9ic2VydmFibGUub2JzZXJ2ZXJzSW5kZXhlcztcbiAgICB2YXIgbCA9IGxpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGxpc3RbaV0uX19tYXBpZDtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGludmFyaWFudChtYXBbaWRdID09PSBpLCBcIklOVEVSTkFMIEVSUk9SIG1hcHMgZGVyaXZhdGlvbi5fX21hcGlkIHRvIGluZGV4IGluIGxpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnZhcmlhbnQoIShpZCBpbiBtYXApLCBcIklOVEVSTkFMIEVSUk9SIG9ic2VydmVyIG9uIGluZGV4IDAgc2hvdWxkbnQgYmUgaGVsZCBpbiBtYXAuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludmFyaWFudChsaXN0Lmxlbmd0aCA9PT0gMCB8fCBPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA9PT0gbGlzdC5sZW5ndGggLSAxLCBcIklOVEVSTkFMIEVSUk9SIHRoZXJlIGlzIG5vIGp1bmsgaW4gbWFwXCIpO1xufVxuZnVuY3Rpb24gYWRkT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIHZhciBsID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoO1xuICAgIGlmIChsKSB7XG4gICAgICAgIG9ic2VydmFibGUub2JzZXJ2ZXJzSW5kZXhlc1tub2RlLl9fbWFwaWRdID0gbDtcbiAgICB9XG4gICAgb2JzZXJ2YWJsZS5vYnNlcnZlcnNbbF0gPSBub2RlO1xuICAgIGlmIChvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPiBub2RlLmRlcGVuZGVuY2llc1N0YXRlKVxuICAgICAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBub2RlLmRlcGVuZGVuY2llc1N0YXRlO1xufVxuZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2YWJsZSwgbm9kZSkge1xuICAgIGlmIChvYnNlcnZhYmxlLm9ic2VydmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgb2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgcXVldWVGb3JVbm9ic2VydmF0aW9uKG9ic2VydmFibGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxpc3QgPSBvYnNlcnZhYmxlLm9ic2VydmVycztcbiAgICAgICAgdmFyIG1hcF8xID0gb2JzZXJ2YWJsZS5vYnNlcnZlcnNJbmRleGVzO1xuICAgICAgICB2YXIgZmlsbGVyID0gbGlzdC5wb3AoKTtcbiAgICAgICAgaWYgKGZpbGxlciAhPT0gbm9kZSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gbWFwXzFbbm9kZS5fX21hcGlkXSB8fCAwO1xuICAgICAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgbWFwXzFbZmlsbGVyLl9fbWFwaWRdID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWFwXzFbZmlsbGVyLl9fbWFwaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdFtpbmRleF0gPSBmaWxsZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIG1hcF8xW25vZGUuX19tYXBpZF07XG4gICAgfVxufVxuZnVuY3Rpb24gcXVldWVGb3JVbm9ic2VydmF0aW9uKG9ic2VydmFibGUpIHtcbiAgICBpZiAoIW9ic2VydmFibGUuaXNQZW5kaW5nVW5vYnNlcnZhdGlvbikge1xuICAgICAgICBvYnNlcnZhYmxlLmlzUGVuZGluZ1Vub2JzZXJ2YXRpb24gPSB0cnVlO1xuICAgICAgICBnbG9iYWxTdGF0ZS5wZW5kaW5nVW5vYnNlcnZhdGlvbnMucHVzaChvYnNlcnZhYmxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgIGdsb2JhbFN0YXRlLmluQmF0Y2grKztcbn1cbmZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5pbkJhdGNoID09PSAxKSB7XG4gICAgICAgIHZhciBsaXN0ID0gZ2xvYmFsU3RhdGUucGVuZGluZ1Vub2JzZXJ2YXRpb25zO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzEgPSBsaXN0W2ldO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZV8xLmlzUGVuZGluZ1Vub2JzZXJ2YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZhYmxlXzEub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGVfMS5vbkJlY29tZVVub2JzZXJ2ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxTdGF0ZS5wZW5kaW5nVW5vYnNlcnZhdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgZ2xvYmFsU3RhdGUuaW5CYXRjaC0tO1xufVxuZnVuY3Rpb24gcmVwb3J0T2JzZXJ2ZWQob2JzZXJ2YWJsZSkge1xuICAgIHZhciBkZXJpdmF0aW9uID0gZ2xvYmFsU3RhdGUudHJhY2tpbmdEZXJpdmF0aW9uO1xuICAgIGlmIChkZXJpdmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZXJpdmF0aW9uLnJ1bklkICE9PSBvYnNlcnZhYmxlLmxhc3RBY2Nlc3NlZEJ5KSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLmxhc3RBY2Nlc3NlZEJ5ID0gZGVyaXZhdGlvbi5ydW5JZDtcbiAgICAgICAgICAgIGRlcml2YXRpb24ubmV3T2JzZXJ2aW5nW2Rlcml2YXRpb24udW5ib3VuZERlcHNDb3VudCsrXSA9IG9ic2VydmFibGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob2JzZXJ2YWJsZS5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHF1ZXVlRm9yVW5vYnNlcnZhdGlvbihvYnNlcnZhYmxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnZhcmlhbnRMT1Mob2JzZXJ2YWJsZSwgbXNnKSB7XG4gICAgdmFyIG1pbiA9IGdldE9ic2VydmVycyhvYnNlcnZhYmxlKS5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIE1hdGgubWluKGEsIGIuZGVwZW5kZW5jaWVzU3RhdGUpOyB9LCAyKTtcbiAgICBpZiAobWluID49IG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHRocm93IG5ldyBFcnJvcihcImxvd2VzdE9ic2VydmVyU3RhdGUgaXMgd3JvbmcgZm9yIFwiICsgbXNnICsgXCIgYmVjYXVzZSBcIiArIG1pbiArIFwiIDwgXCIgKyBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUpO1xufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ2hhbmdlZChvYnNlcnZhYmxlKSB7XG4gICAgaWYgKG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5TVEFMRSlcbiAgICAgICAgcmV0dXJuO1xuICAgIG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuU1RBTEU7XG4gICAgdmFyIG9ic2VydmVycyA9IG9ic2VydmFibGUub2JzZXJ2ZXJzO1xuICAgIHZhciBpID0gb2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciBkID0gb2JzZXJ2ZXJzW2ldO1xuICAgICAgICBpZiAoZC5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5VUF9UT19EQVRFKVxuICAgICAgICAgICAgZC5vbkJlY29tZVN0YWxlKCk7XG4gICAgICAgIGQuZGVwZW5kZW5jaWVzU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNoYW5nZUNvbmZpcm1lZChvYnNlcnZhYmxlKSB7XG4gICAgaWYgKG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5TVEFMRSlcbiAgICAgICAgcmV0dXJuO1xuICAgIG9ic2VydmFibGUubG93ZXN0T2JzZXJ2ZXJTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuU1RBTEU7XG4gICAgdmFyIG9ic2VydmVycyA9IG9ic2VydmFibGUub2JzZXJ2ZXJzO1xuICAgIHZhciBpID0gb2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciBkID0gb2JzZXJ2ZXJzW2ldO1xuICAgICAgICBpZiAoZC5kZXBlbmRlbmNpZXNTdGF0ZSA9PT0gSURlcml2YXRpb25TdGF0ZS5QT1NTSUJMWV9TVEFMRSlcbiAgICAgICAgICAgIGQuZGVwZW5kZW5jaWVzU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlNUQUxFO1xuICAgICAgICBlbHNlIGlmIChkLmRlcGVuZGVuY2llc1N0YXRlID09PSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEUpXG4gICAgICAgICAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEU7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlTWF5YmVDaGFuZ2VkKG9ic2VydmFibGUpIHtcbiAgICBpZiAob2JzZXJ2YWJsZS5sb3dlc3RPYnNlcnZlclN0YXRlICE9PSBJRGVyaXZhdGlvblN0YXRlLlVQX1RPX0RBVEUpXG4gICAgICAgIHJldHVybjtcbiAgICBvYnNlcnZhYmxlLmxvd2VzdE9ic2VydmVyU3RhdGUgPSBJRGVyaXZhdGlvblN0YXRlLlBPU1NJQkxZX1NUQUxFO1xuICAgIHZhciBvYnNlcnZlcnMgPSBvYnNlcnZhYmxlLm9ic2VydmVycztcbiAgICB2YXIgaSA9IG9ic2VydmVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICB2YXIgZCA9IG9ic2VydmVyc1tpXTtcbiAgICAgICAgaWYgKGQuZGVwZW5kZW5jaWVzU3RhdGUgPT09IElEZXJpdmF0aW9uU3RhdGUuVVBfVE9fREFURSkge1xuICAgICAgICAgICAgZC5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuUE9TU0lCTFlfU1RBTEU7XG4gICAgICAgICAgICBkLm9uQmVjb21lU3RhbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbnZhciBSZWFjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVhY3Rpb24obmFtZSwgb25JbnZhbGlkYXRlKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiUmVhY3Rpb25AXCIgKyBnZXROZXh0SWQoKTsgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm9uSW52YWxpZGF0ZSA9IG9uSW52YWxpZGF0ZTtcbiAgICAgICAgdGhpcy5vYnNlcnZpbmcgPSBbXTtcbiAgICAgICAgdGhpcy5uZXdPYnNlcnZpbmcgPSBbXTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNTdGF0ZSA9IElEZXJpdmF0aW9uU3RhdGUuTk9UX1RSQUNLSU5HO1xuICAgICAgICB0aGlzLmRpZmZWYWx1ZSA9IDA7XG4gICAgICAgIHRoaXMucnVuSWQgPSAwO1xuICAgICAgICB0aGlzLnVuYm91bmREZXBzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9fbWFwaWQgPSBcIiNcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5vbkJlY29tZVN0YWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsb2JhbFN0YXRlLnBlbmRpbmdSZWFjdGlvbnMucHVzaCh0aGlzKTtcbiAgICAgICAgICAgIHN0YXJ0QmF0Y2goKTtcbiAgICAgICAgICAgIHJ1blJlYWN0aW9ucygpO1xuICAgICAgICAgICAgZW5kQmF0Y2goKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLmlzU2NoZWR1bGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTY2hlZHVsZWQ7XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUucnVuUmVhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNob3VsZENvbXB1dGUodGhpcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1RyYWNrUGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkludmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUcmFja1BlbmRpbmcgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3B5UmVwb3J0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2NoZWR1bGVkLXJlYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGlvbi5wcm90b3R5cGUudHJhY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgc3RhcnRCYXRjaCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBzdGFydFRpbWU7XG4gICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBmbjogZm5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG4gICAgICAgIHRyYWNrRGVyaXZlZEZ1bmN0aW9uKHRoaXMsIGZuKTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzVHJhY2tQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNsZWFyT2JzZXJ2aW5nKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCh7XG4gICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kQmF0Y2goKTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5yZWNvdmVyRnJvbUVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNUcmFja1BlbmRpbmcgPSBmYWxzZTtcbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRCYXRjaCgpO1xuICAgICAgICAgICAgICAgIGNsZWFyT2JzZXJ2aW5nKHRoaXMpO1xuICAgICAgICAgICAgICAgIGVuZEJhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aW9uLnByb3RvdHlwZS5nZXREaXNwb3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmRpc3Bvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgci4kbW9ieCA9IHRoaXM7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJSZWFjdGlvbltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH07XG4gICAgUmVhY3Rpb24ucHJvdG90eXBlLndoeVJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmluZyA9IHVuaXF1ZSh0aGlzLl9pc1J1bm5pbmcgPyB0aGlzLm5ld09ic2VydmluZyA6IHRoaXMub2JzZXJ2aW5nKS5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gZGVwLm5hbWU7IH0pO1xuICAgICAgICByZXR1cm4gKFwiXFxuV2h5UnVuPyByZWFjdGlvbiAnXCIgKyB0aGlzLm5hbWUgKyBcIic6XFxuICogU3RhdHVzOiBbXCIgKyAodGhpcy5pc0Rpc3Bvc2VkID8gXCJzdG9wcGVkXCIgOiB0aGlzLl9pc1J1bm5pbmcgPyBcInJ1bm5pbmdcIiA6IHRoaXMuaXNTY2hlZHVsZWQoKSA/IFwic2NoZWR1bGVkXCIgOiBcImlkbGVcIikgKyBcIl1cXG4gKiBUaGlzIHJlYWN0aW9uIHdpbGwgcmUtcnVuIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIG9ic2VydmFibGVzIGNoYW5nZXM6XFxuICAgIFwiICsgam9pblN0cmluZ3Mob2JzZXJ2aW5nKSArIFwiXFxuICAgIFwiICsgKCh0aGlzLl9pc1J1bm5pbmcpID8gXCIgKC4uLiBvciBhbnkgb2JzZXJ2YWJsZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBydW4pXCIgOiBcIlwiKSArIFwiXFxuXFx0TWlzc2luZyBpdGVtcyBpbiB0aGlzIGxpc3Q/XFxuXFx0ICAxLiBDaGVjayB3aGV0aGVyIGFsbCB1c2VkIHZhbHVlcyBhcmUgcHJvcGVybHkgbWFya2VkIGFzIG9ic2VydmFibGUgKHVzZSBpc09ic2VydmFibGUgdG8gdmVyaWZ5KVxcblxcdCAgMi4gTWFrZSBzdXJlIHlvdSBkaWRuJ3QgZGVyZWZlcmVuY2UgdmFsdWVzIHRvbyBlYXJseS4gTW9iWCBvYnNlcnZlcyBwcm9wcywgbm90IHByaW1pdGl2ZXMuIEUuZzogdXNlICdwZXJzb24ubmFtZScgaW5zdGVhZCBvZiAnbmFtZScgaW4geW91ciBjb21wdXRhdGlvbi5cXG5cIik7XG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3Rpb247XG59KCkpO1xuZXhwb3J0cy5SZWFjdGlvbiA9IFJlYWN0aW9uO1xudmFyIE1BWF9SRUFDVElPTl9JVEVSQVRJT05TID0gMTAwO1xuZnVuY3Rpb24gcnVuUmVhY3Rpb25zKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5pc1J1bm5pbmdSZWFjdGlvbnMgPT09IHRydWUgfHwgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiA+IDApXG4gICAgICAgIHJldHVybjtcbiAgICBnbG9iYWxTdGF0ZS5pc1J1bm5pbmdSZWFjdGlvbnMgPSB0cnVlO1xuICAgIHZhciBhbGxSZWFjdGlvbnMgPSBnbG9iYWxTdGF0ZS5wZW5kaW5nUmVhY3Rpb25zO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB3aGlsZSAoYWxsUmVhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCsraXRlcmF0aW9ucyA9PT0gTUFYX1JFQUNUSU9OX0lURVJBVElPTlMpIHtcbiAgICAgICAgICAgIHJlc2V0R2xvYmFsU3RhdGUoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJSZWFjdGlvbiBkb2Vzbid0IGNvbnZlcmdlIHRvIGEgc3RhYmxlIHN0YXRlIGFmdGVyIFwiICsgTUFYX1JFQUNUSU9OX0lURVJBVElPTlMgKyBcIiBpdGVyYXRpb25zLlwiKVxuICAgICAgICAgICAgICAgICsgKFwiIFByb2JhYmx5IHRoZXJlIGlzIGEgY3ljbGUgaW4gdGhlIHJlYWN0aXZlIGZ1bmN0aW9uOiBcIiArIGFsbFJlYWN0aW9uc1swXSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZW1haW5pbmdSZWFjdGlvbnMgPSBhbGxSZWFjdGlvbnMuc3BsaWNlKDApO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlbWFpbmluZ1JlYWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgICAgICByZW1haW5pbmdSZWFjdGlvbnNbaV0ucnVuUmVhY3Rpb24oKTtcbiAgICB9XG4gICAgZ2xvYmFsU3RhdGUuaXNSdW5uaW5nUmVhY3Rpb25zID0gZmFsc2U7XG59XG52YXIgc3B5RW5hYmxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaXNTcHlFbmFibGVkKCkge1xuICAgIHJldHVybiBzcHlFbmFibGVkO1xufVxuZnVuY3Rpb24gc3B5UmVwb3J0KGV2ZW50KSB7XG4gICAgaWYgKCFzcHlFbmFibGVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxpc3RlbmVycyA9IGdsb2JhbFN0YXRlLnNweUxpc3RlbmVycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgIGxpc3RlbmVyc1tpXShldmVudCk7XG59XG5mdW5jdGlvbiBzcHlSZXBvcnRTdGFydChldmVudCkge1xuICAgIHZhciBjaGFuZ2UgPSBvYmplY3RBc3NpZ24oe30sIGV2ZW50LCB7IHNweVJlcG9ydFN0YXJ0OiB0cnVlIH0pO1xuICAgIHNweVJlcG9ydChjaGFuZ2UpO1xufVxudmFyIEVORF9FVkVOVCA9IHsgc3B5UmVwb3J0RW5kOiB0cnVlIH07XG5mdW5jdGlvbiBzcHlSZXBvcnRFbmQoY2hhbmdlKSB7XG4gICAgaWYgKGNoYW5nZSlcbiAgICAgICAgc3B5UmVwb3J0KG9iamVjdEFzc2lnbih7fSwgY2hhbmdlLCBFTkRfRVZFTlQpKTtcbiAgICBlbHNlXG4gICAgICAgIHNweVJlcG9ydChFTkRfRVZFTlQpO1xufVxuZnVuY3Rpb24gc3B5KGxpc3RlbmVyKSB7XG4gICAgZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHNweUVuYWJsZWQgPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnMubGVuZ3RoID4gMDtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBnbG9iYWxTdGF0ZS5zcHlMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpZHggIT09IC0xKVxuICAgICAgICAgICAgZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBzcHlFbmFibGVkID0gZ2xvYmFsU3RhdGUuc3B5TGlzdGVuZXJzLmxlbmd0aCA+IDA7XG4gICAgfSk7XG59XG5leHBvcnRzLnNweSA9IHNweTtcbmZ1bmN0aW9uIHRyYWNrVHJhbnNpdGlvbnMob25SZXBvcnQpIHtcbiAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyBpcyBkZXByZWNhdGVkLiBVc2UgbW9ieC5zcHkgaW5zdGVhZFwiKTtcbiAgICBpZiAodHlwZW9mIG9uUmVwb3J0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBkZXByZWNhdGVkKFwidHJhY2tUcmFuc2l0aW9ucyBvbmx5IHRha2VzIGEgc2luZ2xlIGNhbGxiYWNrIGZ1bmN0aW9uLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBtb2J4LXJlYWN0LWRldnRvb2xzLCBwbGVhc2UgdXBkYXRlIHRoZW0gZmlyc3RcIik7XG4gICAgICAgIG9uUmVwb3J0ID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgICBpZiAoIW9uUmVwb3J0KSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJ0cmFja1RyYW5zaXRpb25zIHdpdGhvdXQgY2FsbGJhY2sgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgYSBuby1vcCBub3cuIElmIHlvdSBhcmUgdXNpbmcgdGhlIG1vYngtcmVhY3QtZGV2dG9vbHMsIHBsZWFzZSB1cGRhdGUgdGhlbSBmaXJzdFwiKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNweShvblJlcG9ydCk7XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbihhY3Rpb24sIHRoaXNBcmcsIHJlcG9ydCkge1xuICAgIGlmICh0aGlzQXJnID09PSB2b2lkIDApIHsgdGhpc0FyZyA9IHVuZGVmaW5lZDsgfVxuICAgIGlmIChyZXBvcnQgPT09IHZvaWQgMCkgeyByZXBvcnQgPSB0cnVlOyB9XG4gICAgdHJhbnNhY3Rpb25TdGFydCgoYWN0aW9uLm5hbWUpIHx8IFwiYW5vbnltb3VzIHRyYW5zYWN0aW9uXCIsIHRoaXNBcmcsIHJlcG9ydCk7XG4gICAgdmFyIHJlcyA9IGFjdGlvbi5jYWxsKHRoaXNBcmcpO1xuICAgIHRyYW5zYWN0aW9uRW5kKHJlcG9ydCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbmZ1bmN0aW9uIHRyYW5zYWN0aW9uU3RhcnQobmFtZSwgdGhpc0FyZywgcmVwb3J0KSB7XG4gICAgaWYgKHRoaXNBcmcgPT09IHZvaWQgMCkgeyB0aGlzQXJnID0gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHJlcG9ydCA9PT0gdm9pZCAwKSB7IHJlcG9ydCA9IHRydWU7IH1cbiAgICBzdGFydEJhdGNoKCk7XG4gICAgZ2xvYmFsU3RhdGUuaW5UcmFuc2FjdGlvbiArPSAxO1xuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpIHtcbiAgICAgICAgc3B5UmVwb3J0U3RhcnQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzQXJnLFxuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2FjdGlvbkVuZChyZXBvcnQpIHtcbiAgICBpZiAocmVwb3J0ID09PSB2b2lkIDApIHsgcmVwb3J0ID0gdHJ1ZTsgfVxuICAgIGlmICgtLWdsb2JhbFN0YXRlLmluVHJhbnNhY3Rpb24gPT09IDApIHtcbiAgICAgICAgcnVuUmVhY3Rpb25zKCk7XG4gICAgfVxuICAgIGlmIChyZXBvcnQgJiYgaXNTcHlFbmFibGVkKCkpXG4gICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIGVuZEJhdGNoKCk7XG59XG5mdW5jdGlvbiBoYXNJbnRlcmNlcHRvcnMoaW50ZXJjZXB0YWJsZSkge1xuICAgIHJldHVybiAoaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckludGVyY2VwdG9yKGludGVyY2VwdGFibGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0YWJsZS5pbnRlcmNlcHRvcnMgfHwgKGludGVyY2VwdGFibGUuaW50ZXJjZXB0b3JzID0gW10pO1xuICAgIGludGVyY2VwdG9ycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkeCA9IGludGVyY2VwdG9ycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcbiAgICAgICAgICAgIGludGVyY2VwdG9ycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGludGVyY2VwdENoYW5nZShpbnRlcmNlcHRhYmxlLCBjaGFuZ2UpIHtcbiAgICB2YXIgcHJldlUgPSB1bnRyYWNrZWRTdGFydCgpO1xuICAgIHZhciBpbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRhYmxlLmludGVyY2VwdG9ycztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGludGVyY2VwdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY2hhbmdlID0gaW50ZXJjZXB0b3JzW2ldKGNoYW5nZSk7XG4gICAgICAgIGludmFyaWFudCghY2hhbmdlIHx8IGNoYW5nZS50eXBlLCBcIkludGVyY2VwdCBoYW5kbGVycyBzaG91bGQgcmV0dXJuIG5vdGhpbmcgb3IgYSBjaGFuZ2Ugb2JqZWN0XCIpO1xuICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xuICAgIHJldHVybiBjaGFuZ2U7XG59XG5mdW5jdGlvbiBoYXNMaXN0ZW5lcnMobGlzdGVuYWJsZSkge1xuICAgIHJldHVybiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyAmJiBsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5hYmxlLCBoYW5kbGVyKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IGxpc3RlbmFibGUuY2hhbmdlTGlzdGVuZXJzIHx8IChsaXN0ZW5hYmxlLmNoYW5nZUxpc3RlbmVycyA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZHggPSBsaXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3RpZnlMaXN0ZW5lcnMobGlzdGVuYWJsZSwgY2hhbmdlKSB7XG4gICAgdmFyIHByZXZVID0gdW50cmFja2VkU3RhcnQoKTtcbiAgICB2YXIgbGlzdGVuZXJzID0gbGlzdGVuYWJsZS5jaGFuZ2VMaXN0ZW5lcnM7XG4gICAgaWYgKCFsaXN0ZW5lcnMpXG4gICAgICAgIHJldHVybjtcbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlKSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0oY2hhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnRyYWNrZWRFbmQocHJldlUpO1xufVxudmFyIFZhbHVlTW9kZTtcbihmdW5jdGlvbiAoVmFsdWVNb2RlKSB7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIlJlY3Vyc2l2ZVwiXSA9IDBdID0gXCJSZWN1cnNpdmVcIjtcbiAgICBWYWx1ZU1vZGVbVmFsdWVNb2RlW1wiUmVmZXJlbmNlXCJdID0gMV0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIFZhbHVlTW9kZVtWYWx1ZU1vZGVbXCJTdHJ1Y3R1cmVcIl0gPSAyXSA9IFwiU3RydWN0dXJlXCI7XG4gICAgVmFsdWVNb2RlW1ZhbHVlTW9kZVtcIkZsYXRcIl0gPSAzXSA9IFwiRmxhdFwiO1xufSkoVmFsdWVNb2RlIHx8IChWYWx1ZU1vZGUgPSB7fSkpO1xuZnVuY3Rpb24gYXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzUmVmZXJlbmNlKHZhbHVlKTtcbn1cbmV4cG9ydHMuYXNSZWZlcmVuY2UgPSBhc1JlZmVyZW5jZTtcbmZ1bmN0aW9uIGFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBBc1N0cnVjdHVyZSh2YWx1ZSk7XG59XG5leHBvcnRzLmFzU3RydWN0dXJlID0gYXNTdHJ1Y3R1cmU7XG5mdW5jdGlvbiBhc0ZsYXQodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEFzRmxhdCh2YWx1ZSk7XG59XG5leHBvcnRzLmFzRmxhdCA9IGFzRmxhdDtcbnZhciBBc1JlZmVyZW5jZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNSZWZlcmVuY2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBhc3NlcnRVbndyYXBwZWQodmFsdWUsIFwiTW9kaWZpZXJzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBuZXN0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBBc1JlZmVyZW5jZTtcbn0oKSk7XG52YXIgQXNTdHJ1Y3R1cmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNTdHJ1Y3R1cmU7XG59KCkpO1xudmFyIEFzRmxhdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXNGbGF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIk1vZGlmaWVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbmVzdGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQXNGbGF0O1xufSgpKTtcbmZ1bmN0aW9uIGFzTWFwKGRhdGEsIG1vZGlmaWVyRnVuYykge1xuICAgIHJldHVybiBtYXAoZGF0YSwgbW9kaWZpZXJGdW5jKTtcbn1cbmV4cG9ydHMuYXNNYXAgPSBhc01hcDtcbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21WYWx1ZSh2YWx1ZSwgZGVmYXVsdE1vZGUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuUmVmZXJlbmNlLCB2YWx1ZS52YWx1ZV07XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBbVmFsdWVNb2RlLlN0cnVjdHVyZSwgdmFsdWUudmFsdWVdO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzRmxhdClcbiAgICAgICAgcmV0dXJuIFtWYWx1ZU1vZGUuRmxhdCwgdmFsdWUudmFsdWVdO1xuICAgIHJldHVybiBbZGVmYXVsdE1vZGUsIHZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlTW9kZUZyb21Nb2RpZmllckZ1bmMoZnVuYykge1xuICAgIGlmIChmdW5jID09PSBhc1JlZmVyZW5jZSlcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgZWxzZSBpZiAoZnVuYyA9PT0gYXNTdHJ1Y3R1cmUpXG4gICAgICAgIHJldHVybiBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgIGVsc2UgaWYgKGZ1bmMgPT09IGFzRmxhdClcbiAgICAgICAgcmV0dXJuIFZhbHVlTW9kZS5GbGF0O1xuICAgIGludmFyaWFudChmdW5jID09PSB1bmRlZmluZWQsIFwiQ2Fubm90IGRldGVybWluZSB2YWx1ZSBtb2RlIGZyb20gZnVuY3Rpb24uIFBsZWFzZSBwYXNzIGluIG9uZSBvZiB0aGVzZTogbW9ieC5hc1JlZmVyZW5jZSwgbW9ieC5hc1N0cnVjdHVyZSBvciBtb2J4LmFzRmxhdCwgZ290OiBcIiArIGZ1bmMpO1xuICAgIHJldHVybiBWYWx1ZU1vZGUuUmVjdXJzaXZlO1xufVxuZnVuY3Rpb24gbWFrZUNoaWxkT2JzZXJ2YWJsZSh2YWx1ZSwgcGFyZW50TW9kZSwgbmFtZSkge1xuICAgIHZhciBjaGlsZE1vZGU7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBzd2l0Y2ggKHBhcmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSBWYWx1ZU1vZGUuUmVmZXJlbmNlOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFZhbHVlTW9kZS5GbGF0OlxuICAgICAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIkl0ZW1zIGluc2lkZSAnYXNGbGF0JyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuUmVmZXJlbmNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlN0cnVjdHVyZTpcbiAgICAgICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJJdGVtcyBpbnNpZGUgJ2FzU3RydWN0dXJlJyBjYW5ub3QgaGF2ZSBtb2RpZmllcnNcIik7XG4gICAgICAgICAgICBjaGlsZE1vZGUgPSBWYWx1ZU1vZGUuU3RydWN0dXJlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmFsdWVNb2RlLlJlY3Vyc2l2ZTpcbiAgICAgICAgICAgIF9hID0gZ2V0VmFsdWVNb2RlRnJvbVZhbHVlKHZhbHVlLCBWYWx1ZU1vZGUuUmVjdXJzaXZlKSwgY2hpbGRNb2RlID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgXCJJbGxlZ2FsIFN0YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBjcmVhdGVPYnNlcnZhYmxlQXJyYXkodmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpICYmIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gZXh0ZW5kT2JzZXJ2YWJsZUhlbHBlcih2YWx1ZSwgdmFsdWUsIGNoaWxkTW9kZSwgbmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBfYTtcbn1cbmZ1bmN0aW9uIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFzUmVmZXJlbmNlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXNTdHJ1Y3R1cmUgfHwgdmFsdWUgaW5zdGFuY2VvZiBBc0ZsYXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4XSBhc1N0cnVjdHVyZSAvIGFzUmVmZXJlbmNlIC8gYXNGbGF0IGNhbm5vdCBiZSB1c2VkIGhlcmUuIFwiICsgbWVzc2FnZSk7XG59XG52YXIgc2FmYXJpUHJvdG90eXBlU2V0dGVySW5oZXJpdGFuY2VCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB2ID0gZmFsc2U7XG4gICAgdmFyIHAgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocCwgXCIwXCIsIHsgc2V0OiBmdW5jdGlvbiAoKSB7IHYgPSB0cnVlOyB9IH0pO1xuICAgIE9iamVjdC5jcmVhdGUocClbXCIwXCJdID0gMTtcbiAgICByZXR1cm4gdiA9PT0gZmFsc2U7XG59KSgpO1xudmFyIE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUgPSAwO1xudmFyIFN0dWJBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3R1YkFycmF5KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3R1YkFycmF5O1xufSgpKTtcblN0dWJBcnJheS5wcm90b3R5cGUgPSBbXTtcbnZhciBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24obmFtZSwgbW9kZSwgYXJyYXksIG93bmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICAgICAgdGhpcy5vd25lZCA9IG93bmVkO1xuICAgICAgICB0aGlzLmxhc3RLbm93bkxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0b20gPSBuZXcgQmFzZUF0b20obmFtZSB8fCAoXCJPYnNlcnZhYmxlQXJyYXlAXCIgKyBnZXROZXh0SWQoKSkpO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUubWFrZVJlYWN0aXZlQXJyYXlJdGVtID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydFVud3JhcHBlZCh2YWx1ZSwgXCJBcnJheSB2YWx1ZXMgY2Fubm90IGhhdmUgbW9kaWZpZXJzXCIpO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBWYWx1ZU1vZGUuRmxhdCB8fCB0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5SZWZlcmVuY2UpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIHJldHVybiBtYWtlQ2hpbGRPYnNlcnZhYmxlKHZhbHVlLCB0aGlzLm1vZGUsIHRoaXMuYXRvbS5uYW1lICsgXCJbLi5dXCIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3RlckludGVyY2VwdG9yKHRoaXMsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb24ucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5ID09PSB2b2lkIDApIHsgZmlyZUltbWVkaWF0ZWx5ID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGFkZGVkOiB0aGlzLnZhbHVlcy5zbGljZSgpLFxuICAgICAgICAgICAgICAgIGFkZGVkQ291bnQ6IHRoaXMudmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgICAgICAgICByZW1vdmVkQ291bnQ6IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5nZXRBcnJheUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUuc2V0QXJyYXlMZW5ndGggPSBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3TGVuZ3RoICE9PSBcIm51bWJlclwiIHx8IG5ld0xlbmd0aCA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5hcnJheV0gT3V0IG9mIHJhbmdlOiBcIiArIG5ld0xlbmd0aCk7XG4gICAgICAgIHZhciBjdXJyZW50TGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuICAgICAgICBpZiAobmV3TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBlbHNlIGlmIChuZXdMZW5ndGggPiBjdXJyZW50TGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zcGxpY2VXaXRoQXJyYXkoY3VycmVudExlbmd0aCwgMCwgbmV3IEFycmF5KG5ld0xlbmd0aCAtIGN1cnJlbnRMZW5ndGgpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zcGxpY2VXaXRoQXJyYXkobmV3TGVuZ3RoLCBjdXJyZW50TGVuZ3RoIC0gbmV3TGVuZ3RoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS51cGRhdGVBcnJheUxlbmd0aCA9IGZ1bmN0aW9uIChvbGRMZW5ndGgsIGRlbHRhKSB7XG4gICAgICAgIGlmIChvbGRMZW5ndGggIT09IHRoaXMubGFzdEtub3duTGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIE1vZGlmaWNhdGlvbiBleGNlcHRpb246IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYW4gb2JzZXJ2YWJsZSBhcnJheSB3YXMgY2hhbmdlZC4gRGlkIHlvdSB1c2UgcGVlaygpIHRvIGNoYW5nZSBpdD9cIik7XG4gICAgICAgIHRoaXMubGFzdEtub3duTGVuZ3RoICs9IGRlbHRhO1xuICAgICAgICBpZiAoZGVsdGEgPiAwICYmIG9sZExlbmd0aCArIGRlbHRhICsgMSA+IE9CU0VSVkFCTEVfQVJSQVlfQlVGRkVSX1NJWkUpXG4gICAgICAgICAgICByZXNlcnZlQXJyYXlCdWZmZXIob2xkTGVuZ3RoICsgZGVsdGEgKyAxKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5zcGxpY2VXaXRoQXJyYXkgPSBmdW5jdGlvbiAoaW5kZXgsIGRlbGV0ZUNvdW50LCBuZXdJdGVtcykge1xuICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPiBsZW5ndGgpXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1heCgwLCBsZW5ndGggKyBpbmRleCk7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBsZW5ndGggLSBpbmRleDtcbiAgICAgICAgZWxzZSBpZiAoZGVsZXRlQ291bnQgPT09IHVuZGVmaW5lZCB8fCBkZWxldGVDb3VudCA9PT0gbnVsbClcbiAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkZWxldGVDb3VudCwgbGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgICAgaWYgKG5ld0l0ZW1zID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBuZXdJdGVtcyA9IFtdO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMuYXJyYXksXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGxpY2VcIixcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvdW50OiBkZWxldGVDb3VudCxcbiAgICAgICAgICAgICAgICBhZGRlZDogbmV3SXRlbXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FSUkFZO1xuICAgICAgICAgICAgZGVsZXRlQ291bnQgPSBjaGFuZ2UucmVtb3ZlZENvdW50O1xuICAgICAgICAgICAgbmV3SXRlbXMgPSBjaGFuZ2UuYWRkZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV3SXRlbXMgPSBuZXdJdGVtcy5tYXAodGhpcy5tYWtlUmVhY3RpdmVBcnJheUl0ZW0sIHRoaXMpO1xuICAgICAgICB2YXIgbGVuZ3RoRGVsdGEgPSBuZXdJdGVtcy5sZW5ndGggLSBkZWxldGVDb3VudDtcbiAgICAgICAgdGhpcy51cGRhdGVBcnJheUxlbmd0aChsZW5ndGgsIGxlbmd0aERlbHRhKTtcbiAgICAgICAgdmFyIHJlcyA9IChfYSA9IHRoaXMudmFsdWVzKS5zcGxpY2UuYXBwbHkoX2EsIFtpbmRleCwgZGVsZXRlQ291bnRdLmNvbmNhdChuZXdJdGVtcykpO1xuICAgICAgICBpZiAoZGVsZXRlQ291bnQgIT09IDAgfHwgbmV3SXRlbXMubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlBcnJheVNwbGljZShpbmRleCwgbmV3SXRlbXMsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIHZhciBfYTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheUFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5ub3RpZnlBcnJheUNoaWxkVXBkYXRlID0gZnVuY3Rpb24gKGluZGV4LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgdmFyIG5vdGlmeVNweSA9ICF0aGlzLm93bmVkICYmIGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICB2YXIgbm90aWZ5ID0gaGFzTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgIG9iamVjdDogdGhpcy5hcnJheSxcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlXG4gICAgICAgIH0gOiBudWxsO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUubm90aWZ5QXJyYXlTcGxpY2UgPSBmdW5jdGlvbiAoaW5kZXgsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICAgIHZhciBub3RpZnlTcHkgPSAhdGhpcy5vd25lZCAmJiBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgdmFyIGNoYW5nZSA9IG5vdGlmeSB8fCBub3RpZnlTcHkgPyB7XG4gICAgICAgICAgICBvYmplY3Q6IHRoaXMuYXJyYXksXG4gICAgICAgICAgICB0eXBlOiBcInNwbGljZVwiLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LCByZW1vdmVkOiByZW1vdmVkLCBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQubGVuZ3RoLFxuICAgICAgICAgICAgYWRkZWRDb3VudDogYWRkZWQubGVuZ3RoXG4gICAgICAgIH0gOiBudWxsO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0U3RhcnQoY2hhbmdlKTtcbiAgICAgICAgdGhpcy5hdG9tLnJlcG9ydENoYW5nZWQoKTtcbiAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZUFycmF5QWRtaW5pc3RyYXRpb247XG59KCkpO1xudmFyIE9ic2VydmFibGVBcnJheSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9ic2VydmFibGVBcnJheSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlQXJyYXkoaW5pdGlhbFZhbHVlcywgbW9kZSwgbmFtZSwgb3duZWQpIHtcbiAgICAgICAgaWYgKG93bmVkID09PSB2b2lkIDApIHsgb3duZWQgPSBmYWxzZTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdmFyIGFkbSA9IG5ldyBPYnNlcnZhYmxlQXJyYXlBZG1pbmlzdHJhdGlvbihuYW1lLCBtb2RlLCB0aGlzLCBvd25lZCk7XG4gICAgICAgIGFkZEhpZGRlbkZpbmFsUHJvcCh0aGlzLCBcIiRtb2J4XCIsIGFkbSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWVzICYmIGluaXRpYWxWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZG0udXBkYXRlQXJyYXlMZW5ndGgoMCwgaW5pdGlhbFZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgYWRtLnZhbHVlcyA9IGluaXRpYWxWYWx1ZXMubWFwKGFkbS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0sIGFkbSk7XG4gICAgICAgICAgICBhZG0ubm90aWZ5QXJyYXlTcGxpY2UoMCwgYWRtLnZhbHVlcy5zbGljZSgpLCBFTVBUWV9BUlJBWSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZG0udmFsdWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhZmFyaVByb3RvdHlwZVNldHRlckluaGVyaXRhbmNlQnVnKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWRtLmFycmF5LCBcIjBcIiwgRU5UUllfMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5pbnRlcmNlcHQoaGFuZGxlcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZmlyZUltbWVkaWF0ZWx5ID09PSB2b2lkIDApIHsgZmlyZUltbWVkaWF0ZWx5ID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngub2JzZXJ2ZShsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwbGljZSgwKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcnJheXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KHRoaXMuc2xpY2UoKSwgYXJyYXlzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gaXNPYnNlcnZhYmxlQXJyYXkoYSkgPyBhLnNsaWNlKCkgOiBhOyB9KSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiAobmV3SXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KDAsIHRoaXMuJG1vYngudmFsdWVzLmxlbmd0aCwgbmV3SXRlbXMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS50b0pTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgdGhpc0FyZywgZnJvbUluZGV4KSB7XG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHZvaWQgMCkgeyBmcm9tSW5kZXggPSAwOyB9XG4gICAgICAgIHRoaXMuJG1vYnguYXRvbS5yZXBvcnRPYnNlcnZlZCgpO1xuICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLiRtb2J4LnZhbHVlcywgbCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IGw7IGkrKylcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCBpdGVtc1tpXSwgaSwgdGhpcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoaW5kZXgsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgIHZhciBuZXdJdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbmV3SXRlbXNbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnNwbGljZVdpdGhBcnJheShpbmRleCk7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KGluZGV4LCBkZWxldGVDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYnguc3BsaWNlV2l0aEFycmF5KGluZGV4LCBkZWxldGVDb3VudCwgbmV3SXRlbXMpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KGFkbS52YWx1ZXMubGVuZ3RoLCAwLCBpdGVtcyk7XG4gICAgICAgIHJldHVybiBhZG0udmFsdWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoTWF0aC5tYXgodGhpcy4kbW9ieC52YWx1ZXMubGVuZ3RoIC0gMSwgMCksIDEpWzBdO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKDAsIDEpWzBdO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KDAsIDAsIGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGFkbS52YWx1ZXMubGVuZ3RoO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRtb2J4LmF0b20ucmVwb3J0T2JzZXJ2ZWQoKTtcbiAgICAgICAgdmFyIGNsb25lID0gdGhpcy5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY2xvbmUucmV2ZXJzZS5hcHBseShjbG9uZSwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uIChjb21wYXJlRm4pIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHZhciBjbG9uZSA9IHRoaXMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lLnNvcnQuYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaWR4ID0gdGhpcy4kbW9ieC52YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlttb2J4LmFycmF5XSBcIiArIEFycmF5LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlttb2J4LmFycmF5XSBcIiArIEFycmF5LnByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlQXJyYXk7XG59KFN0dWJBcnJheSkpO1xuZGVjbGFyZUl0ZXJhdG9yKE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuc2xpY2UoKSk7XG59KTtcbm1ha2VOb25FbnVtZXJhYmxlKE9ic2VydmFibGVBcnJheS5wcm90b3R5cGUsIFtcbiAgICBcImNvbnN0cnVjdG9yXCIsXG4gICAgXCJpbnRlcmNlcHRcIixcbiAgICBcIm9ic2VydmVcIixcbiAgICBcImNsZWFyXCIsXG4gICAgXCJjb25jYXRcIixcbiAgICBcInJlcGxhY2VcIixcbiAgICBcInRvSlNcIixcbiAgICBcInRvSlNPTlwiLFxuICAgIFwicGVla1wiLFxuICAgIFwiZmluZFwiLFxuICAgIFwic3BsaWNlXCIsXG4gICAgXCJwdXNoXCIsXG4gICAgXCJwb3BcIixcbiAgICBcInNoaWZ0XCIsXG4gICAgXCJ1bnNoaWZ0XCIsXG4gICAgXCJyZXZlcnNlXCIsXG4gICAgXCJzb3J0XCIsXG4gICAgXCJyZW1vdmVcIixcbiAgICBcInRvU3RyaW5nXCIsXG4gICAgXCJ0b0xvY2FsZVN0cmluZ1wiXG5dKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlQXJyYXkucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbW9ieC5nZXRBcnJheUxlbmd0aCgpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuJG1vYnguc2V0QXJyYXlMZW5ndGgobmV3TGVuZ3RoKTtcbiAgICB9XG59KTtcbltcbiAgICBcImV2ZXJ5XCIsXG4gICAgXCJmaWx0ZXJcIixcbiAgICBcImZvckVhY2hcIixcbiAgICBcImluZGV4T2ZcIixcbiAgICBcImpvaW5cIixcbiAgICBcImxhc3RJbmRleE9mXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInJlZHVjZVwiLFxuICAgIFwicmVkdWNlUmlnaHRcIixcbiAgICBcInNsaWNlXCIsXG4gICAgXCJzb21lXCJcbl0uZm9yRWFjaChmdW5jdGlvbiAoZnVuY05hbWUpIHtcbiAgICB2YXIgYmFzZUZ1bmMgPSBBcnJheS5wcm90b3R5cGVbZnVuY05hbWVdO1xuICAgIGFkZEhpZGRlblByb3AoT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZSwgZnVuY05hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy4kbW9ieC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiBiYXNlRnVuYy5hcHBseSh0aGlzLiRtb2J4LnZhbHVlcywgYXJndW1lbnRzKTtcbiAgICB9KTtcbn0pO1xudmFyIEVOVFJZXzAgPSB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHNldDogY3JlYXRlQXJyYXlTZXR0ZXIoMCksXG4gICAgZ2V0OiBjcmVhdGVBcnJheUdldHRlcigwKVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5QnVmZmVySXRlbShpbmRleCkge1xuICAgIHZhciBzZXQgPSBjcmVhdGVBcnJheVNldHRlcihpbmRleCk7XG4gICAgdmFyIGdldCA9IGNyZWF0ZUFycmF5R2V0dGVyKGluZGV4KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZUFycmF5LnByb3RvdHlwZSwgXCJcIiArIGluZGV4LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHNldDogc2V0LCBnZXQ6IGdldFxuICAgIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQXJyYXlTZXR0ZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhciBhZG0gPSB0aGlzLiRtb2J4O1xuICAgICAgICB2YXIgdmFsdWVzID0gYWRtLnZhbHVlcztcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKG5ld1ZhbHVlLCBcIk1vZGlmaWVycyBjYW5ub3QgYmUgdXNlZCBvbiBhcnJheSB2YWx1ZXMuIEZvciBub24tcmVhY3RpdmUgYXJyYXkgdmFsdWVzIHVzZSBtYWtlUmVhY3RpdmUoYXNGbGF0KGFycmF5KSkuXCIpO1xuICAgICAgICBpZiAoaW5kZXggPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBpbnRlcmNlcHRDaGFuZ2UoYWRtLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDogYWRtLmFycmF5LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGFkbS5tYWtlUmVhY3RpdmVBcnJheUl0ZW0obmV3VmFsdWUpO1xuICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSAoYWRtLm1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUpID8gIWRlZXBFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSA6IG9sZFZhbHVlICE9PSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGFkbS5ub3RpZnlBcnJheUNoaWxkVXBkYXRlKGluZGV4LCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZG0uc3BsaWNlV2l0aEFycmF5KGluZGV4LCAwLCBbbmV3VmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbbW9ieC5hcnJheV0gSW5kZXggb3V0IG9mIGJvdW5kcywgXCIgKyBpbmRleCArIFwiIGlzIGxhcmdlciB0aGFuIFwiICsgdmFsdWVzLmxlbmd0aCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5R2V0dGVyKGluZGV4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGltcGwgPSB0aGlzLiRtb2J4O1xuICAgICAgICBpZiAoaW1wbCAmJiBpbmRleCA8IGltcGwudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW1wbC5hdG9tLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gaW1wbC52YWx1ZXNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcIlttb2J4LmFycmF5XSBBdHRlbXB0IHRvIHJlYWQgYW4gYXJyYXkgaW5kZXggKFwiICsgaW5kZXggKyBcIikgdGhhdCBpcyBvdXQgb2YgYm91bmRzIChcIiArIGltcGwudmFsdWVzLmxlbmd0aCArIFwiKS4gUGxlYXNlIGNoZWNrIGxlbmd0aCBmaXJzdC4gT3V0IG9mIGJvdW5kIGluZGljZXMgd2lsbCBub3QgYmUgdHJhY2tlZCBieSBNb2JYXCIpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNlcnZlQXJyYXlCdWZmZXIobWF4KSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSBPQlNFUlZBQkxFX0FSUkFZX0JVRkZFUl9TSVpFOyBpbmRleCA8IG1heDsgaW5kZXgrKylcbiAgICAgICAgY3JlYXRlQXJyYXlCdWZmZXJJdGVtKGluZGV4KTtcbiAgICBPQlNFUlZBQkxFX0FSUkFZX0JVRkZFUl9TSVpFID0gbWF4O1xufVxucmVzZXJ2ZUFycmF5QnVmZmVyKDEwMDApO1xuZnVuY3Rpb24gY3JlYXRlT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIG1vZGUsIG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGVBcnJheShpbml0aWFsVmFsdWVzLCBtb2RlLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGZhc3RBcnJheShpbml0aWFsVmFsdWVzKSB7XG4gICAgZGVwcmVjYXRlZChcImZhc3RBcnJheSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBvYnNlcnZhYmxlKGFzRmxhdChbXSkpYFwiKTtcbiAgICByZXR1cm4gY3JlYXRlT2JzZXJ2YWJsZUFycmF5KGluaXRpYWxWYWx1ZXMsIFZhbHVlTW9kZS5GbGF0LCBudWxsKTtcbn1cbmV4cG9ydHMuZmFzdEFycmF5ID0gZmFzdEFycmF5O1xuZnVuY3Rpb24gaXNPYnNlcnZhYmxlQXJyYXkodGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXk7XG59XG5leHBvcnRzLmlzT2JzZXJ2YWJsZUFycmF5ID0gaXNPYnNlcnZhYmxlQXJyYXk7XG52YXIgT2JzZXJ2YWJsZU1hcE1hcmtlciA9IHt9O1xudmFyIE9ic2VydmFibGVNYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVNYXAoaW5pdGlhbERhdGEsIHZhbHVlTW9kZUZ1bmMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kbW9ieCA9IE9ic2VydmFibGVNYXBNYXJrZXI7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5faGFzTWFwID0ge307XG4gICAgICAgIHRoaXMubmFtZSA9IFwiT2JzZXJ2YWJsZU1hcEBcIiArIGdldE5leHRJZCgpO1xuICAgICAgICB0aGlzLl9rZXlzID0gbmV3IE9ic2VydmFibGVBcnJheShudWxsLCBWYWx1ZU1vZGUuUmVmZXJlbmNlLCB0aGlzLm5hbWUgKyBcIi5rZXlzKClcIiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLl92YWx1ZU1vZGUgPSBnZXRWYWx1ZU1vZGVGcm9tTW9kaWZpZXJGdW5jKHZhbHVlTW9kZUZ1bmMpO1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVNb2RlID09PSBWYWx1ZU1vZGUuRmxhdClcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTW9kZSA9IFZhbHVlTW9kZS5SZWZlcmVuY2U7XG4gICAgICAgIGFsbG93U3RhdGVDaGFuZ2VzKHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGluaXRpYWxEYXRhKSlcbiAgICAgICAgICAgICAgICBfdGhpcy5tZXJnZShpbml0aWFsRGF0YSk7XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXRpYWxEYXRhKSlcbiAgICAgICAgICAgICAgICBpbml0aWFsRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5faGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2RhdGFba2V5XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRLZXkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc01hcFtrZXldKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc01hcFtrZXldLmdldCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlSGFzTWFwRW50cnkoa2V5LCBmYWxzZSkuZ2V0KCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmFzc2VydFZhbGlkS2V5KGtleSk7XG4gICAgICAgIGtleSA9IFwiXCIgKyBrZXk7XG4gICAgICAgIHZhciBoYXNLZXkgPSB0aGlzLl9oYXMoa2V5KTtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKHZhbHVlLCBcIlttb2J4Lm1hcC5zZXRdIEV4cGVjdGVkIHVud3JhcHBlZCB2YWx1ZSB0byBiZSBpbnNlcnRlZCB0byBrZXkgJ1wiICsga2V5ICsgXCInLiBJZiB5b3UgbmVlZCB0byB1c2UgbW9kaWZpZXJzIHBhc3MgdGhlbSBhcyBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yXCIpO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBoYXNLZXkgPyBcInVwZGF0ZVwiIDogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGtleVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzS2V5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZShrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYXNzZXJ0VmFsaWRLZXkoa2V5KTtcbiAgICAgICAga2V5ID0gXCJcIiArIGtleTtcbiAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9ycyh0aGlzKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZSh0aGlzLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faGFzKGtleSkpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogdGhpcy5fZGF0YVtrZXldLnZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGtleVxuICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2tleXMucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZUhhc01hcEVudHJ5KGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3RoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2RhdGFba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeSlcbiAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgY2hhbmdlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgICAgICAgICAgc3B5UmVwb3J0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fdXBkYXRlSGFzTWFwRW50cnkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9oYXNNYXBba2V5XTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICBlbnRyeS5zZXROZXdWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuX2hhc01hcFtrZXldID0gbmV3IE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgVmFsdWVNb2RlLlJlZmVyZW5jZSwgdGhpcy5uYW1lICsgXCIuXCIgKyBrZXkgKyBcIj9cIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLl91cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IHRoaXMuX2RhdGFbbmFtZV07XG4gICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS5wcmVwYXJlTmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsdWUgIT09IFVOQ0hBTkdFRCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmeVNweSA9IGlzU3B5RW5hYmxlZCgpO1xuICAgICAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0OiB0aGlzLFxuICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvYnNlcnZhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub3RpZnkpXG4gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5fYWRkVmFsdWUgPSBmdW5jdGlvbiAobmFtZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfdGhpcy5fZGF0YVtuYW1lXSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUobmV3VmFsdWUsIF90aGlzLl92YWx1ZU1vZGUsIF90aGlzLm5hbWUgKyBcIi5cIiArIG5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS52YWx1ZTtcbiAgICAgICAgICAgIF90aGlzLl91cGRhdGVIYXNNYXBFbnRyeShuYW1lLCB0cnVlKTtcbiAgICAgICAgICAgIF90aGlzLl9rZXlzLnB1c2gobmFtZSk7XG4gICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBub3RpZnkgPSBoYXNMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnkgfHwgbm90aWZ5U3B5ID8ge1xuICAgICAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgIGlmIChub3RpZnkpXG4gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgY2hhbmdlKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBrZXkgPSBcIlwiICsga2V5O1xuICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV0uZ2V0KCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc0l0ZXJhdG9yKHRoaXMuX2tleXMuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheUFzSXRlcmF0b3IodGhpcy5fa2V5cy5tYXAodGhpcy5nZXQsIHRoaXMpKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhcnJheUFzSXRlcmF0b3IodGhpcy5fa2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gW2tleSwgX3RoaXMuZ2V0KGtleSldOyB9KSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMua2V5cygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBfdGhpcy5nZXQoa2V5KSwga2V5KTsgfSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0cmFuc2FjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlTWFwKVxuICAgICAgICAgICAgICAgIG90aGVyLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF90aGlzLnNldChrZXksIG90aGVyLmdldChrZXkpKTsgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3RoZXIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX3RoaXMuc2V0KGtleSwgb3RoZXJba2V5XSk7IH0pO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdHJhbnNhY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdW50cmFja2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5rZXlzKCkuZm9yRWFjaChfdGhpcy5kZWxldGUsIF90aGlzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSlMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgICAgdGhpcy5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiByZXNba2V5XSA9IF90aGlzLmdldChrZXkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlcHJlY2F0ZWQoXCJ0b0pzIGlzIGRlcHJlY2F0ZWQsIHVzZSB0b0pTIGluc3RlYWRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KUygpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaXNWYWxpZEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gbnVsbCB8fCBrZXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGtleSAhPT0gXCJudW1iZXJcIiAmJiB0eXBlb2Yga2V5ICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlTWFwLnByb3RvdHlwZS5hc3NlcnRWYWxpZEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRLZXkoa2V5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlttb2J4Lm1hcF0gSW52YWxpZCBrZXk6ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVNYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbeyBcIiArIHRoaXMua2V5cygpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoa2V5ICsgXCI6IFwiICsgKFwiXCIgKyBfdGhpcy5nZXQoa2V5KSkpOyB9KS5qb2luKFwiLCBcIikgKyBcIiB9XVwiO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGludmFyaWFudChmaXJlSW1tZWRpYXRlbHkgIT09IHRydWUsIFwiYG9ic2VydmVgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmlyZSBpbW1lZGlhdGVseSBwcm9wZXJ0eSBmb3Igb2JzZXJ2YWJsZSBtYXBzLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU1hcC5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVySW50ZXJjZXB0b3IodGhpcywgaGFuZGxlcik7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZU1hcDtcbn0oKSk7XG5leHBvcnRzLk9ic2VydmFibGVNYXAgPSBPYnNlcnZhYmxlTWFwO1xuZGVjbGFyZUl0ZXJhdG9yKE9ic2VydmFibGVNYXAucHJvdG90eXBlLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xufSk7XG5mdW5jdGlvbiBtYXAoaW5pdGlhbFZhbHVlcywgdmFsdWVNb2RpZmllcikge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZU1hcChpbml0aWFsVmFsdWVzLCB2YWx1ZU1vZGlmaWVyKTtcbn1cbmV4cG9ydHMubWFwID0gbWFwO1xuZnVuY3Rpb24gaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZU1hcDtcbn1cbmV4cG9ydHMuaXNPYnNlcnZhYmxlTWFwID0gaXNPYnNlcnZhYmxlTWFwO1xudmFyIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uKHRhcmdldCwgbmFtZSwgbW9kZSkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmludGVyY2VwdG9ycyA9IG51bGw7XG4gICAgfVxuICAgIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGludmFyaWFudChmaXJlSW1tZWRpYXRlbHkgIT09IHRydWUsIFwiYG9ic2VydmVgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmlyZSBpbW1lZGlhdGVseSBwcm9wZXJ0eSBmb3Igb2JzZXJ2YWJsZSBvYmplY3RzLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyTGlzdGVuZXIodGhpcywgY2FsbGJhY2spO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZU9iamVjdEFkbWluaXN0cmF0aW9uLnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJJbnRlcmNlcHRvcih0aGlzLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb247XG59KCkpO1xuZnVuY3Rpb24gYXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCwgbmFtZSwgbW9kZSkge1xuICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IFZhbHVlTW9kZS5SZWN1cnNpdmU7IH1cbiAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIHJldHVybiB0YXJnZXQuJG1vYng7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIG5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZSArIFwiQFwiICsgZ2V0TmV4dElkKCk7XG4gICAgaWYgKCFuYW1lKVxuICAgICAgICBuYW1lID0gXCJPYnNlcnZhYmxlT2JqZWN0QFwiICsgZ2V0TmV4dElkKCk7XG4gICAgdmFyIGFkbSA9IG5ldyBPYnNlcnZhYmxlT2JqZWN0QWRtaW5pc3RyYXRpb24odGFyZ2V0LCBuYW1lLCBtb2RlKTtcbiAgICBhZGRIaWRkZW5GaW5hbFByb3AodGFyZ2V0LCBcIiRtb2J4XCIsIGFkbSk7XG4gICAgcmV0dXJuIGFkbTtcbn1cbmZ1bmN0aW9uIHNldE9ic2VydmFibGVPYmplY3RJbnN0YW5jZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGFkbS52YWx1ZXNbcHJvcE5hbWVdKVxuICAgICAgICBhZG0udGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlO1xuICAgIGVsc2VcbiAgICAgICAgZGVmaW5lT2JzZXJ2YWJsZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIHZhbHVlLCB0cnVlLCB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gZGVmaW5lT2JzZXJ2YWJsZVByb3BlcnR5KGFkbSwgcHJvcE5hbWUsIG5ld1ZhbHVlLCBhc0luc3RhbmNlUHJvcGVydHksIHNldHRlcikge1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpXG4gICAgICAgIGFzc2VydFByb3BlcnR5Q29uZmlndXJhYmxlKGFkbS50YXJnZXQsIHByb3BOYW1lKTtcbiAgICB2YXIgb2JzZXJ2YWJsZTtcbiAgICB2YXIgbmFtZSA9IGFkbS5uYW1lICsgXCIuXCIgKyBwcm9wTmFtZTtcbiAgICB2YXIgaXNDb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZVZhbHVlKSB7XG4gICAgICAgIG9ic2VydmFibGUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaXNDb21wdXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUpIHtcbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ld1ZhbHVlO1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLnNjb3BlKVxuICAgICAgICAgICAgbmV3VmFsdWUuc2NvcGUgPSBhZG0udGFyZ2V0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiBuZXdWYWx1ZS5sZW5ndGggPT09IDAgJiYgIWlzQWN0aW9uKG5ld1ZhbHVlKSkge1xuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUsIGFkbS50YXJnZXQsIGZhbHNlLCBuYW1lLCBzZXR0ZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEFzU3RydWN0dXJlICYmIHR5cGVvZiBuZXdWYWx1ZS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG5ld1ZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvYnNlcnZhYmxlID0gbmV3IENvbXB1dGVkVmFsdWUobmV3VmFsdWUudmFsdWUsIGFkbS50YXJnZXQsIHRydWUsIG5hbWUsIHNldHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpc0NvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IGludGVyY2VwdENoYW5nZShhZG0sIHtcbiAgICAgICAgICAgICAgICBvYmplY3Q6IGFkbS50YXJnZXQsXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlVmFsdWUobmV3VmFsdWUsIGFkbS5tb2RlLCBuYW1lLCBmYWxzZSk7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JzZXJ2YWJsZS52YWx1ZTtcbiAgICB9XG4gICAgYWRtLnZhbHVlc1twcm9wTmFtZV0gPSBvYnNlcnZhYmxlO1xuICAgIGlmIChhc0luc3RhbmNlUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFkbS50YXJnZXQsIHByb3BOYW1lLCBpc0NvbXB1dGVkID8gZ2VuZXJhdGVDb21wdXRlZFByb3BDb25maWcocHJvcE5hbWUpIDogZ2VuZXJhdGVPYnNlcnZhYmxlUHJvcENvbmZpZyhwcm9wTmFtZSkpO1xuICAgIH1cbiAgICBpZiAoIWlzQ29tcHV0ZWQpXG4gICAgICAgIG5vdGlmeVByb3BlcnR5QWRkaXRpb24oYWRtLCBhZG0udGFyZ2V0LCBwcm9wTmFtZSwgbmV3VmFsdWUpO1xufVxudmFyIG9ic2VydmFibGVQcm9wZXJ0eUNvbmZpZ3MgPSB7fTtcbnZhciBjb21wdXRlZFByb3BlcnR5Q29uZmlncyA9IHt9O1xuZnVuY3Rpb24gZ2VuZXJhdGVPYnNlcnZhYmxlUHJvcENvbmZpZyhwcm9wTmFtZSkge1xuICAgIHZhciBjb25maWcgPSBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIHJldHVybiBvYnNlcnZhYmxlUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXSA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRtb2J4LnZhbHVlc1twcm9wTmFtZV0uZ2V0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHNldFByb3BlcnR5VmFsdWUodGhpcywgcHJvcE5hbWUsIHYpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlQ29tcHV0ZWRQcm9wQ29uZmlnKHByb3BOYW1lKSB7XG4gICAgdmFyIGNvbmZpZyA9IGNvbXB1dGVkUHJvcGVydHlDb25maWdzW3Byb3BOYW1lXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIHJldHVybiBjb21wdXRlZFByb3BlcnR5Q29uZmlnc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzW3Byb3BOYW1lXS5nZXQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1vYngudmFsdWVzW3Byb3BOYW1lXS5zZXQodik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0UHJvcGVydHlWYWx1ZShpbnN0YW5jZSwgbmFtZSwgbmV3VmFsdWUpIHtcbiAgICB2YXIgYWRtID0gaW5zdGFuY2UuJG1vYng7XG4gICAgdmFyIG9ic2VydmFibGUgPSBhZG0udmFsdWVzW25hbWVdO1xuICAgIGlmIChoYXNJbnRlcmNlcHRvcnMoYWRtKSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKGFkbSwge1xuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIG9iamVjdDogaW5zdGFuY2UsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2hhbmdlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBuZXdWYWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICB9XG4gICAgbmV3VmFsdWUgPSBvYnNlcnZhYmxlLnByZXBhcmVOZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyhhZG0pO1xuICAgICAgICB2YXIgbm90aWZ5U3B5ID0gaXNTcHlFbmFibGVkKCk7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBub3RpZnlMaXN0ZW5lcnMgfHwgaGFzTGlzdGVuZXJzID8ge1xuICAgICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIG9iamVjdDogaW5zdGFuY2UsXG4gICAgICAgICAgICBvbGRWYWx1ZTogb2JzZXJ2YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgICAgIG9ic2VydmFibGUuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICBpZiAobm90aWZ5KVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKGFkbSwgY2hhbmdlKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgIHNweVJlcG9ydEVuZCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vdGlmeVByb3BlcnR5QWRkaXRpb24oYWRtLCBvYmplY3QsIG5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgdmFyIG5vdGlmeSA9IGhhc0xpc3RlbmVycyhhZG0pO1xuICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICB2YXIgY2hhbmdlID0gbm90aWZ5IHx8IG5vdGlmeVNweSA/IHtcbiAgICAgICAgdHlwZTogXCJhZGRcIixcbiAgICAgICAgb2JqZWN0OiBvYmplY3QsIG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH0gOiBudWxsO1xuICAgIGlmIChub3RpZnlTcHkpXG4gICAgICAgIHNweVJlcG9ydFN0YXJ0KGNoYW5nZSk7XG4gICAgaWYgKG5vdGlmeSlcbiAgICAgICAgbm90aWZ5TGlzdGVuZXJzKGFkbSwgY2hhbmdlKTtcbiAgICBpZiAobm90aWZ5U3B5KVxuICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykge1xuICAgIGlmICh0eXBlb2YgdGhpbmcgPT09IFwib2JqZWN0XCIgJiYgdGhpbmcgIT09IG51bGwpIHtcbiAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGluZyk7XG4gICAgICAgIHJldHVybiB0aGluZy4kbW9ieCBpbnN0YW5jZW9mIE9ic2VydmFibGVPYmplY3RBZG1pbmlzdHJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5pc09ic2VydmFibGVPYmplY3QgPSBpc09ic2VydmFibGVPYmplY3Q7XG52YXIgVU5DSEFOR0VEID0ge307XG52YXIgT2JzZXJ2YWJsZVZhbHVlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT2JzZXJ2YWJsZVZhbHVlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVWYWx1ZSh2YWx1ZSwgbW9kZSwgbmFtZSwgbm90aWZ5U3B5KSB7XG4gICAgICAgIGlmIChuYW1lID09PSB2b2lkIDApIHsgbmFtZSA9IFwiT2JzZXJ2YWJsZVZhbHVlQFwiICsgZ2V0TmV4dElkKCk7IH1cbiAgICAgICAgaWYgKG5vdGlmeVNweSA9PT0gdm9pZCAwKSB7IG5vdGlmeVNweSA9IHRydWU7IH1cbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbmFtZSk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuaGFzVW5yZXBvcnRlZENoYW5nZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX2EgPSBnZXRWYWx1ZU1vZGVGcm9tVmFsdWUodmFsdWUsIFZhbHVlTW9kZS5SZWN1cnNpdmUpLCBjaGlsZG1vZGUgPSBfYVswXSwgdW53cmFwcGVkVmFsdWUgPSBfYVsxXTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gVmFsdWVNb2RlLlJlY3Vyc2l2ZSlcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGNoaWxkbW9kZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG1ha2VDaGlsZE9ic2VydmFibGUodW53cmFwcGVkVmFsdWUsIHRoaXMubW9kZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKG5vdGlmeVNweSAmJiBpc1NweUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgc3B5UmVwb3J0KHsgdHlwZTogXCJjcmVhdGVcIiwgb2JqZWN0OiB0aGlzLCBuZXdWYWx1ZTogdGhpcy52YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMucHJlcGFyZU5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBVTkNIQU5HRUQpIHtcbiAgICAgICAgICAgIHZhciBub3RpZnlTcHkgPSBpc1NweUVuYWJsZWQoKTtcbiAgICAgICAgICAgIGlmIChub3RpZnlTcHkpIHtcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRTdGFydCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAgICAgaWYgKG5vdGlmeVNweSlcbiAgICAgICAgICAgICAgICBzcHlSZXBvcnRFbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5wcmVwYXJlTmV3VmFsdWUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VW53cmFwcGVkKG5ld1ZhbHVlLCBcIk1vZGlmaWVycyBjYW5ub3QgYmUgdXNlZCBvbiBub24taW5pdGlhbCB2YWx1ZXMuXCIpO1xuICAgICAgICBjaGVja0lmU3RhdGVNb2RpZmljYXRpb25zQXJlQWxsb3dlZCgpO1xuICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3JzKHRoaXMpKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gaW50ZXJjZXB0Q2hhbmdlKHRoaXMsIHsgb2JqZWN0OiB0aGlzLCB0eXBlOiBcInVwZGF0ZVwiLCBuZXdWYWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gVU5DSEFOR0VEO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoYW5nZWQgPSB2YWx1ZURpZENoYW5nZSh0aGlzLm1vZGUgPT09IFZhbHVlTW9kZS5TdHJ1Y3R1cmUsIHRoaXMudmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICByZXR1cm4gbWFrZUNoaWxkT2JzZXJ2YWJsZShuZXdWYWx1ZSwgdGhpcy5tb2RlLCB0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gVU5DSEFOR0VEO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5zZXROZXdWYWx1ZSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMucmVwb3J0Q2hhbmdlZCgpO1xuICAgICAgICBpZiAoaGFzTGlzdGVuZXJzKHRoaXMpKVxuICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIFtuZXdWYWx1ZSwgb2xkVmFsdWVdKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlcG9ydE9ic2VydmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZVZhbHVlLnByb3RvdHlwZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJJbnRlcmNlcHRvcih0aGlzLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGVWYWx1ZS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGlmIChmaXJlSW1tZWRpYXRlbHkpXG4gICAgICAgICAgICBsaXN0ZW5lcih0aGlzLnZhbHVlLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlVmFsdWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJbXCIgKyB0aGlzLnZhbHVlICsgXCJdXCI7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZVZhbHVlO1xufShCYXNlQXRvbSkpO1xuZnVuY3Rpb24gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc09ic2VydmFibGVBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIGludmFyaWFudChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkLCBcIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZXQgaW5kZXggYXRvbXMgZnJvbSBhcnJheXNcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmcuJG1vYnguYXRvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b20odGhpbmcuX2tleXMpO1xuICAgICAgICAgICAgdmFyIG9ic2VydmFibGVfMiA9IHRoaW5nLl9kYXRhW3Byb3BlcnR5XSB8fCB0aGluZy5faGFzTWFwW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGludmFyaWFudCghIW9ic2VydmFibGVfMiwgXCJ0aGUgZW50cnkgJ1wiICsgcHJvcGVydHkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG9ic2VydmFibGUgbWFwICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8yO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkxhenlJbml0aWFsaXplcnModGhpbmcpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHRoaW5nKSkge1xuICAgICAgICAgICAgaW52YXJpYW50KCEhcHJvcGVydHksIFwicGxlYXNlIHNwZWNpZnkgYSBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlXzMgPSB0aGluZy4kbW9ieC52YWx1ZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgaW52YXJpYW50KCEhb2JzZXJ2YWJsZV8zLCBcIm5vIG9ic2VydmFibGUgcHJvcGVydHkgJ1wiICsgcHJvcGVydHkgKyBcIicgZm91bmQgb24gdGhlIG9ic2VydmFibGUgb2JqZWN0ICdcIiArIGdldERlYnVnTmFtZSh0aGluZykgKyBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZV8zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIEJhc2VBdG9tIHx8IHRoaW5nIGluc3RhbmNlb2YgQ29tcHV0ZWRWYWx1ZSB8fCB0aGluZyBpbnN0YW5jZW9mIFJlYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKHRoaW5nLiRtb2J4IGluc3RhbmNlb2YgUmVhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGluZy4kbW9ieDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsIFwiQ2Fubm90IG9idGFpbiBhdG9tIGZyb20gXCIgKyB0aGluZyk7XG59XG5mdW5jdGlvbiBnZXRBZG1pbmlzdHJhdGlvbih0aGluZywgcHJvcGVydHkpIHtcbiAgICBpbnZhcmlhbnQodGhpbmcsIFwiRXhwZWN0aW9uIHNvbWUgb2JqZWN0XCIpO1xuICAgIGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZ2V0QWRtaW5pc3RyYXRpb24oZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpKTtcbiAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBCYXNlQXRvbSB8fCB0aGluZyBpbnN0YW5jZW9mIENvbXB1dGVkVmFsdWUgfHwgdGhpbmcgaW5zdGFuY2VvZiBSZWFjdGlvbilcbiAgICAgICAgcmV0dXJuIHRoaW5nO1xuICAgIGlmIChpc09ic2VydmFibGVNYXAodGhpbmcpKVxuICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGluZyk7XG4gICAgaWYgKHRoaW5nLiRtb2J4KVxuICAgICAgICByZXR1cm4gdGhpbmcuJG1vYng7XG4gICAgaW52YXJpYW50KGZhbHNlLCBcIkNhbm5vdCBvYnRhaW4gYWRtaW5pc3RyYXRpb24gZnJvbSBcIiArIHRoaW5nKTtcbn1cbmZ1bmN0aW9uIGdldERlYnVnTmFtZSh0aGluZywgcHJvcGVydHkpIHtcbiAgICB2YXIgbmFtZWQ7XG4gICAgaWYgKHByb3BlcnR5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIG5hbWVkID0gZ2V0QXRvbSh0aGluZywgcHJvcGVydHkpO1xuICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdCh0aGluZykgfHwgaXNPYnNlcnZhYmxlTWFwKHRoaW5nKSlcbiAgICAgICAgbmFtZWQgPSBnZXRBZG1pbmlzdHJhdGlvbih0aGluZyk7XG4gICAgZWxzZVxuICAgICAgICBuYW1lZCA9IGdldEF0b20odGhpbmcpO1xuICAgIHJldHVybiBuYW1lZC5uYW1lO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NQcm9wZXJ0eURlY29yYXRvcihvbkluaXRpYWxpemUsIGdldCwgc2V0LCBlbnVtZXJhYmxlLCBhbGxvd0N1c3RvbUFyZ3VtZW50cykge1xuICAgIGZ1bmN0aW9uIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIGN1c3RvbUFyZ3MpIHtcbiAgICAgICAgaW52YXJpYW50KGFsbG93Q3VzdG9tQXJndW1lbnRzIHx8IHF1YWNrc0xpa2VBRGVjb3JhdG9yKGFyZ3VtZW50cyksIFwiVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciwgYnV0IGl0IHdhc24ndCBpbnZva2VkIGxpa2UgYSBkZWNvcmF0b3JcIik7XG4gICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdmFyIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fX21vYnhJbml0aWFsaXplZFByb3BzIHx8IHRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eSh0aGlzLCBrZXksIHVuZGVmaW5lZCwgb25Jbml0aWFsaXplLCBjdXN0b21BcmdzLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fX21vYnhJbml0aWFsaXplZFByb3BzIHx8IHRoaXMuX19tb2J4SW5pdGlhbGl6ZWRQcm9wc1trZXldICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc2NyaXB0SW5pdGlhbGl6ZVByb3BlcnR5KHRoaXMsIGtleSwgdiwgb25Jbml0aWFsaXplLCBjdXN0b21BcmdzLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5jYWxsKHRoaXMsIGtleSwgdik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBuZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdEZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh0YXJnZXQsIFwiX19tb2J4TGF6eUluaXRpYWxpemVyc1wiKSkge1xuICAgICAgICAgICAgICAgIGFkZEhpZGRlblByb3AodGFyZ2V0LCBcIl9fbW9ieExhenlJbml0aWFsaXplcnNcIiwgKHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzICYmIHRhcmdldC5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLnNsaWNlKCkpIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZV8xID0gZGVzY3JpcHRvci52YWx1ZSwgaW5pdGlhbGl6ZXJfMSA9IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICB0YXJnZXQuX19tb2J4TGF6eUluaXRpYWxpemVycy5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZShpbnN0YW5jZSwga2V5LCAoaW5pdGlhbGl6ZXJfMSA/IGluaXRpYWxpemVyXzEuY2FsbChpbnN0YW5jZSkgOiB2YWx1ZV8xKSwgY3VzdG9tQXJncywgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSwgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX21vYnhEaWRSdW5MYXp5SW5pdGlhbGl6ZXJzICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGF6eUluaXRpYWxpemVycyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fbW9ieERpZFJ1bkxhenlJbml0aWFsaXplcnMgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MYXp5SW5pdGlhbGl6ZXJzKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBrZXksIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93Q3VzdG9tQXJndW1lbnRzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAocXVhY2tzTGlrZUFEZWNvcmF0b3IoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NQcm9wZXJ0eURlY29yYXRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIG91dGVyQXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHsgcmV0dXJuIGNsYXNzUHJvcGVydHlEZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IsIG91dGVyQXJncyk7IH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1Byb3BlcnR5RGVjb3JhdG9yO1xufVxuZnVuY3Rpb24gdHlwZXNjcmlwdEluaXRpYWxpemVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB2LCBvbkluaXRpYWxpemUsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShpbnN0YW5jZSwgXCJfX21vYnhJbml0aWFsaXplZFByb3BzXCIpKVxuICAgICAgICBhZGRIaWRkZW5Qcm9wKGluc3RhbmNlLCBcIl9fbW9ieEluaXRpYWxpemVkUHJvcHNcIiwge30pO1xuICAgIGluc3RhbmNlLl9fbW9ieEluaXRpYWxpemVkUHJvcHNba2V5XSA9IHRydWU7XG4gICAgb25Jbml0aWFsaXplKGluc3RhbmNlLCBrZXksIHYsIGN1c3RvbUFyZ3MsIGJhc2VEZXNjcmlwdG9yKTtcbn1cbmZ1bmN0aW9uIHJ1bkxhenlJbml0aWFsaXplcnMoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UuX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVycyA9PT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChpbnN0YW5jZS5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgIGFkZEhpZGRlblByb3AoaW5zdGFuY2UsIFwiX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVyc1wiLCB0cnVlKTtcbiAgICAgICAgaW5zdGFuY2UuX19tb2J4RGlkUnVuTGF6eUluaXRpYWxpemVycyAmJiBpbnN0YW5jZS5fX21vYnhMYXp5SW5pdGlhbGl6ZXJzLmZvckVhY2goZnVuY3Rpb24gKGluaXRpYWxpemVyKSB7IHJldHVybiBpbml0aWFsaXplcihpbnN0YW5jZSk7IH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHF1YWNrc0xpa2VBRGVjb3JhdG9yKGFyZ3MpIHtcbiAgICByZXR1cm4gKGFyZ3MubGVuZ3RoID09PSAyIHx8IGFyZ3MubGVuZ3RoID09PSAzKSAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGl0ZXJhdG9yU3ltYm9sKCkge1xuICAgIHJldHVybiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcikgfHwgXCJAQGl0ZXJhdG9yXCI7XG59XG52YXIgSVNfSVRFUkFUSU5HX01BUktFUiA9IFwiX18kJGl0ZXJhdGluZ1wiO1xuZnVuY3Rpb24gYXJyYXlBc0l0ZXJhdG9yKGFycmF5KSB7XG4gICAgaW52YXJpYW50KGFycmF5W0lTX0lURVJBVElOR19NQVJLRVJdICE9PSB0cnVlLCBcIklsbGVnYWwgc3RhdGU6IGNhbm5vdCByZWN5Y2xlIGFycmF5IGFzIGl0ZXJhdG9yXCIpO1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChhcnJheSwgSVNfSVRFUkFUSU5HX01BUktFUiwgdHJ1ZSk7XG4gICAgdmFyIGlkeCA9IC0xO1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChhcnJheSwgXCJuZXh0XCIsIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlkeCsrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogaWR4ID49IHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdmFsdWU6IGlkeCA8IHRoaXMubGVuZ3RoID8gdGhpc1tpZHhdIDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZGVjbGFyZUl0ZXJhdG9yKHByb3RvdFR5cGUsIGl0ZXJhdG9yRmFjdG9yeSkge1xuICAgIGFkZEhpZGRlbkZpbmFsUHJvcChwcm90b3RUeXBlLCBpdGVyYXRvclN5bWJvbCgpLCBpdGVyYXRvckZhY3RvcnkpO1xufVxudmFyIFNpbXBsZUV2ZW50RW1pdHRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2ltcGxlRXZlbnRFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICBkZXByZWNhdGVkKFwiZXh0cmFzLlNpbXBsZUV2ZW50RW1pdHRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZVwiKTtcbiAgICB9XG4gICAgU2ltcGxlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuc2xpY2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBTaW1wbGVFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gX3RoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgX3RoaXMubGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNpbXBsZUV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5vbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZUV2ZW50RW1pdHRlcjtcbn0oKSk7XG5leHBvcnRzLlNpbXBsZUV2ZW50RW1pdHRlciA9IFNpbXBsZUV2ZW50RW1pdHRlcjtcbnZhciBFTVBUWV9BUlJBWSA9IFtdO1xuT2JqZWN0LmZyZWV6ZShFTVBUWV9BUlJBWSk7XG5mdW5jdGlvbiBnZXROZXh0SWQoKSB7XG4gICAgcmV0dXJuICsrZ2xvYmFsU3RhdGUubW9ieEd1aWQ7XG59XG5mdW5jdGlvbiBpbnZhcmlhbnQoY2hlY2ssIG1lc3NhZ2UsIHRoaW5nKSB7XG4gICAgaWYgKCFjaGVjaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW21vYnhdIEludmFyaWFudCBmYWlsZWQ6IFwiICsgbWVzc2FnZSArICh0aGluZyA/IFwiIGluICdcIiArIHRoaW5nICsgXCInXCIgOiBcIlwiKSk7XG59XG52YXIgZGVwcmVjYXRlZE1lc3NhZ2VzID0gW107XG5mdW5jdGlvbiBkZXByZWNhdGVkKG1zZykge1xuICAgIGlmIChkZXByZWNhdGVkTWVzc2FnZXMuaW5kZXhPZihtc2cpICE9PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGRlcHJlY2F0ZWRNZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgY29uc29sZS5lcnJvcihcIlttb2J4XSBEZXByZWNhdGVkOiBcIiArIG1zZyk7XG59XG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICB2YXIgaW52b2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnZva2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbnZva2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG5mdW5jdGlvbiB1bmlxdWUobGlzdCkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHJlcy5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICAgICAgICAgIHJlcy5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBqb2luU3RyaW5ncyh0aGluZ3MsIGxpbWl0LCBzZXBhcmF0b3IpIHtcbiAgICBpZiAobGltaXQgPT09IHZvaWQgMCkgeyBsaW1pdCA9IDEwMDsgfVxuICAgIGlmIChzZXBhcmF0b3IgPT09IHZvaWQgMCkgeyBzZXBhcmF0b3IgPSBcIiAtIFwiOyB9XG4gICAgaWYgKCF0aGluZ3MpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIHZhciBzbGljZWQgPSB0aGluZ3Muc2xpY2UoMCwgbGltaXQpO1xuICAgIHJldHVybiBcIlwiICsgc2xpY2VkLmpvaW4oc2VwYXJhdG9yKSArICh0aGluZ3MubGVuZ3RoID4gbGltaXQgPyBcIiAoLi4uIGFuZCBcIiArICh0aGluZ3MubGVuZ3RoIC0gbGltaXQpICsgXCJtb3JlKVwiIDogXCJcIik7XG59XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuZnVuY3Rpb24gb2JqZWN0QXNzaWduKCkge1xuICAgIHZhciByZXMgPSBhcmd1bWVudHNbMF07XG4gICAgZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbHVlRGlkQ2hhbmdlKGNvbXBhcmVTdHJ1Y3R1cmFsLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gY29tcGFyZVN0cnVjdHVyYWxcbiAgICAgICAgPyAhZGVlcEVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgICAgIDogb2xkVmFsdWUgIT09IG5ld1ZhbHVlO1xufVxudmFyIHByb3RvdHlwZUhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUpIHtcbiAgICByZXR1cm4gcHJvdG90eXBlSGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BOYW1lKTtcbn1cbmZ1bmN0aW9uIG1ha2VOb25FbnVtZXJhYmxlKG9iamVjdCwgcHJvcE5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkSGlkZGVuUHJvcChvYmplY3QsIHByb3BOYW1lc1tpXSwgb2JqZWN0W3Byb3BOYW1lc1tpXV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEhpZGRlblByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG59XG5mdW5jdGlvbiBhZGRIaWRkZW5GaW5hbFByb3Aob2JqZWN0LCBwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcbiAgICByZXR1cm4gIWRlc2NyaXB0b3IgfHwgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlICE9PSBmYWxzZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlICE9PSBmYWxzZSk7XG59XG5mdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApIHtcbiAgICBpbnZhcmlhbnQoaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmplY3QsIHByb3ApLCBcIkNhbm5vdCBtYWtlIHByb3BlcnR5ICdcIiArIHByb3AgKyBcIicgb2JzZXJ2YWJsZSwgaXQgaXMgbm90IGNvbmZpZ3VyYWJsZSBhbmQgd3JpdGFibGUgaW4gdGhlIHRhcmdldCBvYmplY3RcIik7XG59XG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlS2V5cyhvYmopIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZGVlcEVxdWFscyhhLCBiKSB7XG4gICAgaWYgKGEgPT09IG51bGwgJiYgYiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHZhciBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSkgfHwgaXNPYnNlcnZhYmxlQXJyYXkoYSk7XG4gICAgaWYgKGFJc0FycmF5ICE9PSAoQXJyYXkuaXNBcnJheShiKSB8fCBpc09ic2VydmFibGVBcnJheShiKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChhSXNBcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFscyhhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZ2V0RW51bWVyYWJsZUtleXMoYSkubGVuZ3RoICE9PSBnZXRFbnVtZXJhYmxlS2V5cyhiKS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbHMoYVtwcm9wXSwgYltwcm9wXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYSA9PT0gYjtcbn1cblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5dGIySjRMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lYQ0oxYzJVZ2MzUnlhV04wWENJN1hHNTJZWElnWDE5bGVIUmxibVJ6SUQwZ0tIUm9hWE1nSmlZZ2RHaHBjeTVmWDJWNGRHVnVaSE1wSUh4OElHWjFibU4wYVc5dUlDaGtMQ0JpS1NCN1hHNGdJQ0FnWm05eUlDaDJZWElnY0NCcGJpQmlLU0JwWmlBb1lpNW9ZWE5QZDI1UWNtOXdaWEowZVNod0tTa2daRnR3WFNBOUlHSmJjRjA3WEc0Z0lDQWdablZ1WTNScGIyNGdYMThvS1NCN0lIUm9hWE11WTI5dWMzUnlkV04wYjNJZ1BTQmtPeUI5WEc0Z0lDQWdaQzV3Y205MGIzUjVjR1VnUFNCaUlEMDlQU0J1ZFd4c0lEOGdUMkpxWldOMExtTnlaV0YwWlNoaUtTQTZJQ2hmWHk1d2NtOTBiM1I1Y0dVZ1BTQmlMbkJ5YjNSdmRIbHdaU3dnYm1WM0lGOWZLQ2twTzF4dWZUdGNibkpsWjJsemRHVnlSMnh2WW1Gc2N5Z3BPMXh1Wlhod2IzSjBjeTVsZUhSeVlYTWdQU0I3WEc0Z0lDQWdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTTZJR0ZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpMRnh1SUNBZ0lHZGxkRUYwYjIwNklHZGxkRUYwYjIwc1hHNGdJQ0FnWjJWMFJHVmlkV2RPWVcxbE9pQm5aWFJFWldKMVowNWhiV1VzWEc0Z0lDQWdaMlYwUkdWd1pXNWtaVzVqZVZSeVpXVTZJR2RsZEVSbGNHVnVaR1Z1WTNsVWNtVmxMRnh1SUNBZ0lHZGxkRTlpYzJWeWRtVnlWSEpsWlRvZ1oyVjBUMkp6WlhKMlpYSlVjbVZsTEZ4dUlDQWdJR2x6UTI5dGNIVjBhVzVuUkdWeWFYWmhkR2x2YmpvZ2FYTkRiMjF3ZFhScGJtZEVaWEpwZG1GMGFXOXVMRnh1SUNBZ0lHbHpVM0I1Ulc1aFlteGxaRG9nYVhOVGNIbEZibUZpYkdWa0xGeHVJQ0FnSUhKbGMyVjBSMnh2WW1Gc1UzUmhkR1U2SUhKbGMyVjBSMnh2WW1Gc1UzUmhkR1VzWEc0Z0lDQWdjM0I1VW1Wd2IzSjBPaUJ6Y0hsU1pYQnZjblFzWEc0Z0lDQWdjM0I1VW1Wd2IzSjBSVzVrT2lCemNIbFNaWEJ2Y25SRmJtUXNYRzRnSUNBZ2MzQjVVbVZ3YjNKMFUzUmhjblE2SUhOd2VWSmxjRzl5ZEZOMFlYSjBMRnh1SUNBZ0lIUnlZV05yVkhKaGJuTnBkR2x2Ym5NNklIUnlZV05yVkhKaGJuTnBkR2x2Ym5OY2JuMDdYRzVsZUhCdmNuUnpMbDhnUFNCN1hHNGdJQ0FnWjJWMFFXUnRhVzVwYzNSeVlYUnBiMjQ2SUdkbGRFRmtiV2x1YVhOMGNtRjBhVzl1TEZ4dUlDQWdJSEpsYzJWMFIyeHZZbUZzVTNSaGRHVTZJSEpsYzJWMFIyeHZZbUZzVTNSaGRHVmNibjA3WEc1cFppQW9kSGx3Wlc5bUlGOWZUVTlDV0Y5RVJWWlVUMDlNVTE5SFRFOUNRVXhmU0U5UFMxOWZJRDA5UFNBbmIySnFaV04wSnlrZ2UxeHVJQ0FnSUY5ZlRVOUNXRjlFUlZaVVQwOU1VMTlIVEU5Q1FVeGZTRTlQUzE5ZkxtbHVhbVZqZEUxdlluZ29iVzlrZFd4bExtVjRjRzl5ZEhNcE8xeHVmVnh1ZG1GeUlHRmpkR2x2YmtacFpXeGtSR1ZqYjNKaGRHOXlJRDBnWTNKbFlYUmxRMnhoYzNOUWNtOXdaWEowZVVSbFkyOXlZWFJ2Y2lobWRXNWpkR2x2YmlBb2RHRnlaMlYwTENCclpYa3NJSFpoYkhWbExDQmhjbWR6TENCdmNtbG5hVzVoYkVSbGMyTnlhWEIwYjNJcElIdGNiaUFnSUNCMllYSWdZV04wYVc5dVRtRnRaU0E5SUNoaGNtZHpJQ1ltSUdGeVozTXViR1Z1WjNSb0lEMDlQU0F4S1NBL0lHRnlaM05iTUYwZ09pQW9kbUZzZFdVdWJtRnRaU0I4ZkNCclpYa2dmSHdnWENJOGRXNXVZVzFsWkNCaFkzUnBiMjQrWENJcE8xeHVJQ0FnSUhaaGNpQjNjbUZ3Y0dWa1FXTjBhVzl1SUQwZ1lXTjBhVzl1S0dGamRHbHZiazVoYldVc0lIWmhiSFZsS1R0Y2JpQWdJQ0JoWkdSSWFXUmtaVzVRY205d0tIUmhjbWRsZEN3Z2EyVjVMQ0IzY21Gd2NHVmtRV04wYVc5dUtUdGNibjBzSUdaMWJtTjBhVzl1SUNoclpYa3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjMXRyWlhsZE8xeHVmU3dnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdsdWRtRnlhV0Z1ZENobVlXeHpaU3dnWENKSmRDQnBjeUJ1YjNRZ1lXeHNiM2RsWkNCMGJ5QmhjM05wWjI0Z2JtVjNJSFpoYkhWbGN5QjBieUJBWVdOMGFXOXVJR1pwWld4a2Mxd2lLVHRjYm4wc0lHWmhiSE5sTENCMGNuVmxLVHRjYm1aMWJtTjBhVzl1SUdGamRHbHZiaWhoY21jeExDQmhjbWN5TENCaGNtY3pMQ0JoY21jMEtTQjdYRzRnSUNBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURFZ0ppWWdkSGx3Wlc5bUlHRnlaekVnUFQwOUlGd2lablZ1WTNScGIyNWNJaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR055WldGMFpVRmpkR2x2YmloaGNtY3hMbTVoYldVZ2ZId2dYQ0k4ZFc1dVlXMWxaQ0JoWTNScGIyNCtYQ0lzSUdGeVp6RXBPMXh1SUNBZ0lHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBeUlDWW1JSFI1Y0dWdlppQmhjbWN5SUQwOVBTQmNJbVoxYm1OMGFXOXVYQ0lwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJqY21WaGRHVkJZM1JwYjI0b1lYSm5NU3dnWVhKbk1pazdYRzRnSUNBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURFZ0ppWWdkSGx3Wlc5bUlHRnlaekVnUFQwOUlGd2ljM1J5YVc1blhDSXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnVZVzFsWkVGamRHbHZia1JsWTI5eVlYUnZjaWhoY21jeEtUdGNiaUFnSUNCeVpYUjFjbTRnYm1GdFpXUkJZM1JwYjI1RVpXTnZjbUYwYjNJb1lYSm5NaWt1WVhCd2JIa29iblZzYkN3Z1lYSm5kVzFsYm5SektUdGNibjFjYm1WNGNHOXlkSE11WVdOMGFXOXVJRDBnWVdOMGFXOXVPMXh1Wm5WdVkzUnBiMjRnYm1GdFpXUkJZM1JwYjI1RVpXTnZjbUYwYjNJb2JtRnRaU2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9kR0Z5WjJWMExDQndjbTl3TENCa1pYTmpjbWx3ZEc5eUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoa1pYTmpjbWx3ZEc5eUlDWW1JSFI1Y0dWdlppQmtaWE5qY21sd2RHOXlMblpoYkhWbElEMDlQU0JjSW1aMWJtTjBhVzl1WENJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYjNJdWRtRnNkV1VnUFNCamNtVmhkR1ZCWTNScGIyNG9ibUZ0WlN3Z1pHVnpZM0pwY0hSdmNpNTJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhOamNtbHdkRzl5TG1WdWRXMWxjbUZpYkdVZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1JsYzJOeWFYQjBiM0l1WTI5dVptbG5kWEpoWW14bElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmtaWE5qY21sd2RHOXlPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJoWTNScGIyNUdhV1ZzWkVSbFkyOXlZWFJ2Y2lodVlXMWxLUzVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0FnSUgwN1hHNTlYRzVtZFc1amRHbHZiaUJ5ZFc1SmJrRmpkR2x2YmloaGNtY3hMQ0JoY21jeUxDQmhjbWN6S1NCN1hHNGdJQ0FnZG1GeUlHRmpkR2x2Yms1aGJXVWdQU0IwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0p6ZEhKcGJtZGNJaUEvSUdGeVp6RWdPaUJoY21jeExtNWhiV1VnZkh3Z1hDSThkVzV1WVcxbFpDQmhZM1JwYjI0K1hDSTdYRzRnSUNBZ2RtRnlJR1p1SUQwZ2RIbHdaVzltSUdGeVp6RWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQS9JR0Z5WnpFZ09pQmhjbWN5TzF4dUlDQWdJSFpoY2lCelkyOXdaU0E5SUhSNWNHVnZaaUJoY21jeElEMDlQU0JjSW1aMWJtTjBhVzl1WENJZ1B5QmhjbWN5SURvZ1lYSm5NenRjYmlBZ0lDQnBiblpoY21saGJuUW9kSGx3Wlc5bUlHWnVJRDA5UFNCY0ltWjFibU4wYVc5dVhDSXNJRndpWUhKMWJrbHVRV04wYVc5dVlDQmxlSEJsWTNSeklHRWdablZ1WTNScGIyNWNJaWs3WEc0Z0lDQWdhVzUyWVhKcFlXNTBLR1p1TG14bGJtZDBhQ0E5UFQwZ01Dd2dYQ0pnY25WdVNXNUJZM1JwYjI1Z0lHVjRjR1ZqZEhNZ1lTQm1kVzVqZEdsdmJpQjNhWFJvYjNWMElHRnlaM1Z0Wlc1MGMxd2lLVHRjYmlBZ0lDQnBiblpoY21saGJuUW9kSGx3Wlc5bUlHRmpkR2x2Yms1aGJXVWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0ppWWdZV04wYVc5dVRtRnRaUzVzWlc1bmRHZ2dQaUF3TENCY0ltRmpkR2x2Ym5NZ2MyaHZkV3hrSUdoaGRtVWdkbUZzYVdRZ2JtRnRaWE1zSUdkdmREb2dKMXdpSUNzZ1lXTjBhVzl1VG1GdFpTQXJJRndpSjF3aUtUdGNiaUFnSUNCeVpYUjFjbTRnWlhobFkzVjBaVUZqZEdsdmJpaGhZM1JwYjI1T1lXMWxMQ0JtYml3Z2MyTnZjR1VzSUhWdVpHVm1hVzVsWkNrN1hHNTlYRzVsZUhCdmNuUnpMbkoxYmtsdVFXTjBhVzl1SUQwZ2NuVnVTVzVCWTNScGIyNDdYRzVtZFc1amRHbHZiaUJwYzBGamRHbHZiaWgwYUdsdVp5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGVYQmxiMllnZEdocGJtY2dQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQW1KaUIwYUdsdVp5NXBjMDF2WW5oQlkzUnBiMjRnUFQwOUlIUnlkV1U3WEc1OVhHNWxlSEJ2Y25SekxtbHpRV04wYVc5dUlEMGdhWE5CWTNScGIyNDdYRzVtZFc1amRHbHZiaUJoZFhSdmNuVnVLR0Z5WnpFc0lHRnlaeklzSUdGeVp6TXBJSHRjYmlBZ0lDQjJZWElnYm1GdFpTd2dkbWxsZHl3Z2MyTnZjR1U3WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUJoY21jeElEMDlQU0JjSW5OMGNtbHVaMXdpS1NCN1hHNGdJQ0FnSUNBZ0lHNWhiV1VnUFNCaGNtY3hPMXh1SUNBZ0lDQWdJQ0IyYVdWM0lEMGdZWEpuTWp0Y2JpQWdJQ0FnSUNBZ2MyTnZjR1VnUFNCaGNtY3pPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNoMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUtTQjdYRzRnSUNBZ0lDQWdJRzVoYldVZ1BTQmhjbWN4TG01aGJXVWdmSHdnS0Z3aVFYVjBiM0oxYmtCY0lpQXJJR2RsZEU1bGVIUkpaQ2dwS1R0Y2JpQWdJQ0FnSUNBZ2RtbGxkeUE5SUdGeVp6RTdYRzRnSUNBZ0lDQWdJSE5qYjNCbElEMGdZWEpuTWp0Y2JpQWdJQ0I5WEc0Z0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tIWnBaWGNzSUZ3aVlYVjBiM0oxYmlCdFpYUm9iMlJ6SUdOaGJtNXZkQ0JvWVhabElHMXZaR2xtYVdWeWMxd2lLVHRjYmlBZ0lDQnBiblpoY21saGJuUW9kSGx3Wlc5bUlIWnBaWGNnUFQwOUlGd2lablZ1WTNScGIyNWNJaXdnWENKaGRYUnZjblZ1SUdWNGNHVmpkSE1nWVNCbWRXNWpkR2x2Ymx3aUtUdGNiaUFnSUNCcFppQW9jMk52Y0dVcFhHNGdJQ0FnSUNBZ0lIWnBaWGNnUFNCMmFXVjNMbUpwYm1Rb2MyTnZjR1VwTzF4dUlDQWdJSFpoY2lCeVpXRmpkR2x2YmlBOUlHNWxkeUJTWldGamRHbHZiaWh1WVcxbExDQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkSEpoWTJzb2NtVmhZM1JwYjI1U2RXNXVaWElwTzF4dUlDQWdJSDBwTzF4dUlDQWdJR1oxYm1OMGFXOXVJSEpsWVdOMGFXOXVVblZ1Ym1WeUtDa2dlMXh1SUNBZ0lDQWdJQ0IyYVdWM0tISmxZV04wYVc5dUtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WaFkzUnBiMjR1YzJOb1pXUjFiR1VvS1R0Y2JpQWdJQ0J5WlhSMWNtNGdjbVZoWTNScGIyNHVaMlYwUkdsemNHOXpaWElvS1R0Y2JuMWNibVY0Y0c5eWRITXVZWFYwYjNKMWJpQTlJR0YxZEc5eWRXNDdYRzVtZFc1amRHbHZiaUIzYUdWdUtHRnlaekVzSUdGeVp6SXNJR0Z5WnpNc0lHRnlaelFwSUh0Y2JpQWdJQ0IyWVhJZ2JtRnRaU3dnY0hKbFpHbGpZWFJsTENCbFptWmxZM1FzSUhOamIzQmxPMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdZWEpuTVNBOVBUMGdYQ0p6ZEhKcGJtZGNJaWtnZTF4dUlDQWdJQ0FnSUNCdVlXMWxJRDBnWVhKbk1UdGNiaUFnSUNBZ0lDQWdjSEpsWkdsallYUmxJRDBnWVhKbk1qdGNiaUFnSUNBZ0lDQWdaV1ptWldOMElEMGdZWEpuTXp0Y2JpQWdJQ0FnSUNBZ2MyTnZjR1VnUFNCaGNtYzBPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNoMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUtTQjdYRzRnSUNBZ0lDQWdJRzVoYldVZ1BTQW9YQ0pYYUdWdVFGd2lJQ3NnWjJWMFRtVjRkRWxrS0NrcE8xeHVJQ0FnSUNBZ0lDQndjbVZrYVdOaGRHVWdQU0JoY21jeE8xeHVJQ0FnSUNBZ0lDQmxabVpsWTNRZ1BTQmhjbWN5TzF4dUlDQWdJQ0FnSUNCelkyOXdaU0E5SUdGeVp6TTdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQmthWE53YjNObGNpQTlJR0YxZEc5eWRXNG9ibUZ0WlN3Z1puVnVZM1JwYjI0Z0tISXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIQnlaV1JwWTJGMFpTNWpZV3hzS0hOamIzQmxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjaTVrYVhOd2IzTmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0hKbGRsVnVkSEpoWTJ0bFpDQTlJSFZ1ZEhKaFkydGxaRk4wWVhKMEtDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCbFptWmxZM1F1WTJGc2JDaHpZMjl3WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkbFZ1ZEhKaFkydGxaQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdaR2x6Y0c5elpYSTdYRzU5WEc1bGVIQnZjblJ6TG5kb1pXNGdQU0IzYUdWdU8xeHVablZ1WTNScGIyNGdZWFYwYjNKMWJsVnVkR2xzS0hCeVpXUnBZMkYwWlN3Z1pXWm1aV04wTENCelkyOXdaU2tnZTF4dUlDQWdJR1JsY0hKbFkyRjBaV1FvWENKZ1lYVjBiM0oxYmxWdWRHbHNZQ0JwY3lCa1pYQnlaV05oZEdWa0xDQndiR1ZoYzJVZ2RYTmxJR0IzYUdWdVlDNWNJaWs3WEc0Z0lDQWdjbVYwZFhKdUlIZG9aVzR1WVhCd2JIa29iblZzYkN3Z1lYSm5kVzFsYm5SektUdGNibjFjYm1WNGNHOXlkSE11WVhWMGIzSjFibFZ1ZEdsc0lEMGdZWFYwYjNKMWJsVnVkR2xzTzF4dVpuVnVZM1JwYjI0Z1lYVjBiM0oxYmtGemVXNWpLR0Z5WnpFc0lHRnlaeklzSUdGeVp6TXNJR0Z5WnpRcElIdGNiaUFnSUNCMllYSWdibUZ0WlN3Z1puVnVZeXdnWkdWc1lYa3NJSE5qYjNCbE8xeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1lYSm5NU0E5UFQwZ1hDSnpkSEpwYm1kY0lpa2dlMXh1SUNBZ0lDQWdJQ0J1WVcxbElEMGdZWEpuTVR0Y2JpQWdJQ0FnSUNBZ1puVnVZeUE5SUdGeVp6STdYRzRnSUNBZ0lDQWdJR1JsYkdGNUlEMGdZWEpuTXp0Y2JpQWdJQ0FnSUNBZ2MyTnZjR1VnUFNCaGNtYzBPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNoMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUtTQjdYRzRnSUNBZ0lDQWdJRzVoYldVZ1BTQmhjbWN4TG01aGJXVWdmSHdnS0Z3aVFYVjBiM0oxYmtGemVXNWpRRndpSUNzZ1oyVjBUbVY0ZEVsa0tDa3BPMXh1SUNBZ0lDQWdJQ0JtZFc1aklEMGdZWEpuTVR0Y2JpQWdJQ0FnSUNBZ1pHVnNZWGtnUFNCaGNtY3lPMXh1SUNBZ0lDQWdJQ0J6WTI5d1pTQTlJR0Z5WnpNN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNoa1pXeGhlU0E5UFQwZ2RtOXBaQ0F3S1Z4dUlDQWdJQ0FnSUNCa1pXeGhlU0E5SURFN1hHNGdJQ0FnYVdZZ0tITmpiM0JsS1Z4dUlDQWdJQ0FnSUNCbWRXNWpJRDBnWm5WdVl5NWlhVzVrS0hOamIzQmxLVHRjYmlBZ0lDQjJZWElnYVhOVFkyaGxaSFZzWldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0IyWVhJZ2NpQTlJRzVsZHlCU1pXRmpkR2x2YmlodVlXMWxMQ0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2doYVhOVFkyaGxaSFZzWldRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdselUyTm9aV1IxYkdWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpVMk5vWldSMWJHVmtJRDBnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGeUxtbHpSR2x6Y0c5elpXUXBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhJdWRISmhZMnNvY21WaFkzUnBiMjVTZFc1dVpYSXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTd2daR1ZzWVhrcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZTazdYRzRnSUNBZ1puVnVZM1JwYjI0Z2NtVmhZM1JwYjI1U2RXNXVaWElvS1NCN0lHWjFibU1vY2lrN0lIMWNiaUFnSUNCeUxuTmphR1ZrZFd4bEtDazdYRzRnSUNBZ2NtVjBkWEp1SUhJdVoyVjBSR2x6Y0c5elpYSW9LVHRjYm4xY2JtVjRjRzl5ZEhNdVlYVjBiM0oxYmtGemVXNWpJRDBnWVhWMGIzSjFia0Z6ZVc1ak8xeHVablZ1WTNScGIyNGdjbVZoWTNScGIyNG9ZWEpuTVN3Z1lYSm5NaXdnWVhKbk15d2dZWEpuTkN3Z1lYSm5OU3dnWVhKbk5pa2dlMXh1SUNBZ0lIWmhjaUJ1WVcxbExDQmxlSEJ5WlhOemFXOXVMQ0JsWm1abFkzUXNJR1pwY21WSmJXMWxaR2xoZEdWc2VTd2daR1ZzWVhrc0lITmpiM0JsTzF4dUlDQWdJR2xtSUNoMGVYQmxiMllnWVhKbk1TQTlQVDBnWENKemRISnBibWRjSWlrZ2UxeHVJQ0FnSUNBZ0lDQnVZVzFsSUQwZ1lYSm5NVHRjYmlBZ0lDQWdJQ0FnWlhod2NtVnpjMmx2YmlBOUlHRnlaekk3WEc0Z0lDQWdJQ0FnSUdWbVptVmpkQ0E5SUdGeVp6TTdYRzRnSUNBZ0lDQWdJR1pwY21WSmJXMWxaR2xoZEdWc2VTQTlJR0Z5WnpRN1hHNGdJQ0FnSUNBZ0lHUmxiR0Y1SUQwZ1lYSm5OVHRjYmlBZ0lDQWdJQ0FnYzJOdmNHVWdQU0JoY21jMk8xeHVJQ0FnSUgxY2JpQWdJQ0JsYkhObElIdGNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlHRnlaekV1Ym1GdFpTQjhmQ0JoY21jeUxtNWhiV1VnZkh3Z0tGd2lVbVZoWTNScGIyNUFYQ0lnS3lCblpYUk9aWGgwU1dRb0tTazdYRzRnSUNBZ0lDQWdJR1Y0Y0hKbGMzTnBiMjRnUFNCaGNtY3hPMXh1SUNBZ0lDQWdJQ0JsWm1abFkzUWdQU0JoY21jeU8xeHVJQ0FnSUNBZ0lDQm1hWEpsU1cxdFpXUnBZWFJsYkhrZ1BTQmhjbWN6TzF4dUlDQWdJQ0FnSUNCa1pXeGhlU0E5SUdGeVp6UTdYRzRnSUNBZ0lDQWdJSE5qYjNCbElEMGdZWEpuTlR0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0dacGNtVkpiVzFsWkdsaGRHVnNlU0E5UFQwZ2RtOXBaQ0F3S1Z4dUlDQWdJQ0FnSUNCbWFYSmxTVzF0WldScFlYUmxiSGtnUFNCbVlXeHpaVHRjYmlBZ0lDQnBaaUFvWkdWc1lYa2dQVDA5SUhadmFXUWdNQ2xjYmlBZ0lDQWdJQ0FnWkdWc1lYa2dQU0F3TzF4dUlDQWdJSFpoY2lCZllTQTlJR2RsZEZaaGJIVmxUVzlrWlVaeWIyMVdZV3gxWlNobGVIQnlaWE56YVc5dUxDQldZV3gxWlUxdlpHVXVVbVZtWlhKbGJtTmxLU3dnZG1Gc2RXVk5iMlJsSUQwZ1gyRmJNRjBzSUhWdWQzSmhjSEJsWkVWNGNISmxjM05wYjI0Z1BTQmZZVnN4WFR0Y2JpQWdJQ0IyWVhJZ1kyOXRjR0Z5WlZOMGNuVmpkSFZ5WVd3Z1BTQjJZV3gxWlUxdlpHVWdQVDA5SUZaaGJIVmxUVzlrWlM1VGRISjFZM1IxY21VN1hHNGdJQ0FnYVdZZ0tITmpiM0JsS1NCN1hHNGdJQ0FnSUNBZ0lIVnVkM0poY0hCbFpFVjRjSEpsYzNOcGIyNGdQU0IxYm5keVlYQndaV1JGZUhCeVpYTnphVzl1TG1KcGJtUW9jMk52Y0dVcE8xeHVJQ0FnSUNBZ0lDQmxabVpsWTNRZ1BTQmhZM1JwYjI0b2JtRnRaU3dnWldabVpXTjBMbUpwYm1Rb2MyTnZjR1VwS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUdacGNuTjBWR2x0WlNBOUlIUnlkV1U3WEc0Z0lDQWdkbUZ5SUdselUyTm9aV1IxYkdWa0lEMGdabUZzYzJVN1hHNGdJQ0FnZG1GeUlHNWxlSFJXWVd4MVpTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQjJZWElnY2lBOUlHNWxkeUJTWldGamRHbHZiaWh1WVcxbExDQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaGtaV3hoZVNBOElERXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxZV04wYVc5dVVuVnVibVZ5S0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9JV2x6VTJOb1pXUjFiR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwYzFOamFHVmtkV3hsWkNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaWFJVYVcxbGIzVjBLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGMxTmphR1ZrZFd4bFpDQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxZV04wYVc5dVVuVnVibVZ5S0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5TENCa1pXeGhlU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5S1R0Y2JpQWdJQ0JtZFc1amRHbHZiaUJ5WldGamRHbHZibEoxYm01bGNpZ3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tISXVhWE5FYVhOd2IzTmxaQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2RtRnlJR05vWVc1blpXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdjaTUwY21GamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnZGlBOUlIVnVkM0poY0hCbFpFVjRjSEpsYzNOcGIyNG9jaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphR0Z1WjJWa0lEMGdkbUZzZFdWRWFXUkRhR0Z1WjJVb1kyOXRjR0Z5WlZOMGNuVmpkSFZ5WVd3c0lHNWxlSFJXWVd4MVpTd2dkaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGgwVm1Gc2RXVWdQU0IyTzF4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dacGNuTjBWR2x0WlNBbUppQm1hWEpsU1cxdFpXUnBZWFJsYkhrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JsWm1abFkzUW9ibVY0ZEZaaGJIVmxMQ0J5S1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLQ0ZtYVhKemRGUnBiV1VnSmlZZ1kyaGhibWRsWkNBOVBUMGdkSEoxWlNsY2JpQWdJQ0FnSUNBZ0lDQWdJR1ZtWm1WamRDaHVaWGgwVm1Gc2RXVXNJSElwTzF4dUlDQWdJQ0FnSUNCcFppQW9abWx5YzNSVWFXMWxLVnh1SUNBZ0lDQWdJQ0FnSUNBZ1ptbHljM1JVYVcxbElEMGdabUZzYzJVN1hHNGdJQ0FnZlZ4dUlDQWdJSEl1YzJOb1pXUjFiR1VvS1R0Y2JpQWdJQ0J5WlhSMWNtNGdjaTVuWlhSRWFYTndiM05sY2lncE8xeHVmVnh1Wlhod2IzSjBjeTV5WldGamRHbHZiaUE5SUhKbFlXTjBhVzl1TzF4dWRtRnlJR052YlhCMWRHVmtSR1ZqYjNKaGRHOXlJRDBnWTNKbFlYUmxRMnhoYzNOUWNtOXdaWEowZVVSbFkyOXlZWFJ2Y2lobWRXNWpkR2x2YmlBb2RHRnlaMlYwTENCdVlXMWxMQ0JmTENCa1pXTnZjbUYwYjNKQmNtZHpMQ0J2Y21sbmFXNWhiRVJsYzJOeWFYQjBiM0lwSUh0Y2JpQWdJQ0JwYm5aaGNtbGhiblFvZEhsd1pXOW1JRzl5YVdkcGJtRnNSR1Z6WTNKcGNIUnZjaUFoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaXdnWENKQVkyOXRjSFYwWldRZ1kyRnVJRzl1YkhrZ1ltVWdkWE5sWkNCdmJpQm5aWFIwWlhJZ1puVnVZM1JwYjI1ekxDQnNhV3RsT2lBblFHTnZiWEIxZEdWa0lHZGxkQ0J0ZVZCeWIzQnpLQ2tnZXlCeVpYUjFjbTRnTGk0dU95QjlKeTRnU1hRZ2JHOXZhM01nYkdsclpTQnBkQ0IzWVhNZ2RYTmxaQ0J2YmlCaElIQnliM0JsY25SNUxsd2lLVHRjYmlBZ0lDQjJZWElnWW1GelpWWmhiSFZsSUQwZ2IzSnBaMmx1WVd4RVpYTmpjbWx3ZEc5eUxtZGxkRHRjYmlBZ0lDQjJZWElnYzJWMGRHVnlJRDBnYjNKcFoybHVZV3hFWlhOamNtbHdkRzl5TG5ObGREdGNiaUFnSUNCcGJuWmhjbWxoYm5Rb2RIbHdaVzltSUdKaGMyVldZV3gxWlNBOVBUMGdYQ0ptZFc1amRHbHZibHdpTENCY0lrQmpiMjF3ZFhSbFpDQmpZVzRnYjI1c2VTQmlaU0IxYzJWa0lHOXVJR2RsZEhSbGNpQm1kVzVqZEdsdmJuTXNJR3hwYTJVNklDZEFZMjl0Y0hWMFpXUWdaMlYwSUcxNVVISnZjSE1vS1NCN0lISmxkSFZ5YmlBdUxpNDdJSDBuWENJcE8xeHVJQ0FnSUhaaGNpQmpiMjF3WVhKbFUzUnlkV04wZFhKaGJDQTlJR1poYkhObE8xeHVJQ0FnSUdsbUlDaGtaV052Y21GMGIzSkJjbWR6SUNZbUlHUmxZMjl5WVhSdmNrRnlaM011YkdWdVozUm9JRDA5UFNBeElDWW1JR1JsWTI5eVlYUnZja0Z5WjNOYk1GMHVZWE5UZEhKMVkzUjFjbVVnUFQwOUlIUnlkV1VwWEc0Z0lDQWdJQ0FnSUdOdmJYQmhjbVZUZEhKMVkzUjFjbUZzSUQwZ2RISjFaVHRjYmlBZ0lDQjJZWElnWVdSdElEMGdZWE5QWW5ObGNuWmhZbXhsVDJKcVpXTjBLSFJoY21kbGRDd2dkVzVrWldacGJtVmtMQ0JXWVd4MVpVMXZaR1V1VW1WamRYSnphWFpsS1R0Y2JpQWdJQ0JrWldacGJtVlBZbk5sY25aaFlteGxVSEp2Y0dWeWRIa29ZV1J0TENCdVlXMWxMQ0JqYjIxd1lYSmxVM1J5ZFdOMGRYSmhiQ0EvSUdGelUzUnlkV04wZFhKbEtHSmhjMlZXWVd4MVpTa2dPaUJpWVhObFZtRnNkV1VzSUdaaGJITmxMQ0J6WlhSMFpYSXBPMXh1ZlN3Z1puVnVZM1JwYjI0Z0tHNWhiV1VwSUh0Y2JpQWdJQ0IyWVhJZ2IySnpaWEoyWVdKc1pTQTlJSFJvYVhNdUpHMXZZbmd1ZG1Gc2RXVnpXMjVoYldWZE8xeHVJQ0FnSUdsbUlDaHZZbk5sY25aaFlteGxJRDA5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnY21WMGRYSnVJRzlpYzJWeWRtRmliR1V1WjJWMEtDazdYRzU5TENCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQjBhR2x6TGlSdGIySjRMblpoYkhWbGMxdHVZVzFsWFM1elpYUW9kbUZzZFdVcE8xeHVmU3dnWm1Gc2MyVXNJSFJ5ZFdVcE8xeHVablZ1WTNScGIyNGdZMjl0Y0hWMFpXUW9kR0Z5WjJWMFQzSkZlSEJ5TENCclpYbFBjbE5qYjNCbFQzSlRaWFIwWlhJc0lHSmhjMlZFWlhOamNtbHdkRzl5TENCdmNIUnBiMjV6S1NCN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCMFlYSm5aWFJQY2tWNGNISWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQW1KaUJoY21kMWJXVnVkSE11YkdWdVozUm9JRHdnTXlrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JR3RsZVU5eVUyTnZjR1ZQY2xObGRIUmxjaUE5UFQwZ1hDSm1kVzVqZEdsdmJsd2lLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOdmJYQjFkR1ZrUlhod2NpaDBZWEpuWlhSUGNrVjRjSElzSUd0bGVVOXlVMk52Y0dWUGNsTmxkSFJsY2l3Z2RXNWtaV1pwYm1Wa0tUdGNiaUFnSUNBZ0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTnZiWEIxZEdWa1JYaHdjaWgwWVhKblpYUlBja1Y0Y0hJc0lIVnVaR1ZtYVc1bFpDd2dhMlY1VDNKVFkyOXdaVTl5VTJWMGRHVnlLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdOdmJYQjFkR1ZrUkdWamIzSmhkRzl5TG1Gd2NHeDVLRzUxYkd3c0lHRnlaM1Z0Wlc1MGN5azdYRzU5WEc1bGVIQnZjblJ6TG1OdmJYQjFkR1ZrSUQwZ1kyOXRjSFYwWldRN1hHNW1kVzVqZEdsdmJpQmpiMjF3ZFhSbFpFVjRjSElvWlhod2Npd2djMlYwZEdWeUxDQnpZMjl3WlNrZ2UxeHVJQ0FnSUhaaGNpQmZZU0E5SUdkbGRGWmhiSFZsVFc5a1pVWnliMjFXWVd4MVpTaGxlSEJ5TENCV1lXeDFaVTF2WkdVdVVtVmpkWEp6YVhabEtTd2diVzlrWlNBOUlGOWhXekJkTENCMllXeDFaU0E5SUY5aFd6RmRPMXh1SUNBZ0lISmxkSFZ5YmlCdVpYY2dRMjl0Y0hWMFpXUldZV3gxWlNoMllXeDFaU3dnYzJOdmNHVXNJRzF2WkdVZ1BUMDlJRlpoYkhWbFRXOWtaUzVUZEhKMVkzUjFjbVVzSUhaaGJIVmxMbTVoYldVc0lITmxkSFJsY2lrN1hHNTlYRzVtZFc1amRHbHZiaUJqY21WaGRHVlVjbUZ1YzJadmNtMWxjaWgwY21GdWMyWnZjbTFsY2l3Z2IyNURiR1ZoYm5Wd0tTQjdYRzRnSUNBZ2FXNTJZWEpwWVc1MEtIUjVjR1Z2WmlCMGNtRnVjMlp2Y20xbGNpQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JSFJ5WVc1elptOXliV1Z5TG14bGJtZDBhQ0E5UFQwZ01Td2dYQ0pqY21WaGRHVlVjbUZ1YzJadmNtMWxjaUJsZUhCbFkzUnpJR0VnWm5WdVkzUnBiMjRnZEdoaGRDQmhZMk5sY0hSeklHOXVaU0JoY21kMWJXVnVkRndpS1R0Y2JpQWdJQ0IyWVhJZ2IySnFaV04wUTJGamFHVWdQU0I3ZlR0Y2JpQWdJQ0IyWVhJZ2NtVnpaWFJKWkNBOUlHZHNiMkpoYkZOMFlYUmxMbkpsYzJWMFNXUTdYRzRnSUNBZ2RtRnlJRlJ5WVc1elptOXliV1Z5SUQwZ0tHWjFibU4wYVc5dUlDaGZjM1Z3WlhJcElIdGNiaUFnSUNBZ0lDQWdYMTlsZUhSbGJtUnpLRlJ5WVc1elptOXliV1Z5TENCZmMzVndaWElwTzF4dUlDQWdJQ0FnSUNCbWRXNWpkR2x2YmlCVWNtRnVjMlp2Y20xbGNpaHpiM1Z5WTJWSlpHVnVkR2xtYVdWeUxDQnpiM1Z5WTJWUFltcGxZM1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRjl6ZFhCbGNpNWpZV3hzS0hSb2FYTXNJR1oxYm1OMGFXOXVJQ2dwSUhzZ2NtVjBkWEp1SUhSeVlXNXpabTl5YldWeUtITnZkWEpqWlU5aWFtVmpkQ2s3SUgwc0lHNTFiR3dzSUdaaGJITmxMQ0JjSWxSeVlXNXpabTl5YldWeUxWd2lJQ3NnZEhKaGJuTm1iM0p0WlhJdWJtRnRaU0FySUZ3aUxWd2lJQ3NnYzI5MWNtTmxTV1JsYm5ScFptbGxjaXdnZFc1a1pXWnBibVZrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyOTFjbU5sU1dSbGJuUnBabWxsY2lBOUlITnZkWEpqWlVsa1pXNTBhV1pwWlhJN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTnZkWEpqWlU5aWFtVmpkQ0E5SUhOdmRYSmpaVTlpYW1WamREdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JVY21GdWMyWnZjbTFsY2k1d2NtOTBiM1I1Y0dVdWIyNUNaV052YldWVmJtOWljMlZ5ZG1Wa0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUd4aGMzUldZV3gxWlNBOUlIUm9hWE11ZG1Gc2RXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCZmMzVndaWEl1Y0hKdmRHOTBlWEJsTG05dVFtVmpiMjFsVlc1dlluTmxjblpsWkM1allXeHNLSFJvYVhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWc1pYUmxJRzlpYW1WamRFTmhZMmhsVzNSb2FYTXVjMjkxY21ObFNXUmxiblJwWm1sbGNsMDdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iMjVEYkdWaGJuVndLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl1UTJ4bFlXNTFjQ2hzWVhOMFZtRnNkV1VzSUhSb2FYTXVjMjkxY21ObFQySnFaV04wS1R0Y2JpQWdJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGUnlZVzV6Wm05eWJXVnlPMXh1SUNBZ0lIMG9RMjl0Y0hWMFpXUldZV3gxWlNrcE8xeHVJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaUFvYjJKcVpXTjBLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHlaWE5sZEVsa0lDRTlQU0JuYkc5aVlXeFRkR0YwWlM1eVpYTmxkRWxrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2WW1wbFkzUkRZV05vWlNBOUlIdDlPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpaWFJKWkNBOUlHZHNiMkpoYkZOMFlYUmxMbkpsYzJWMFNXUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZG1GeUlHbGtaVzUwYVdacFpYSWdQU0JuWlhSTlpXMXZhWHBoZEdsdmJrbGtLRzlpYW1WamRDazdYRzRnSUNBZ0lDQWdJSFpoY2lCeVpXRmpkR2wyWlZSeVlXNXpabTl5YldWeUlEMGdiMkpxWldOMFEyRmphR1ZiYVdSbGJuUnBabWxsY2wwN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h5WldGamRHbDJaVlJ5WVc1elptOXliV1Z5S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlISmxZV04wYVhabFZISmhibk5tYjNKdFpYSXVaMlYwS0NrN1hHNGdJQ0FnSUNBZ0lISmxZV04wYVhabFZISmhibk5tYjNKdFpYSWdQU0J2WW1wbFkzUkRZV05vWlZ0cFpHVnVkR2xtYVdWeVhTQTlJRzVsZHlCVWNtRnVjMlp2Y20xbGNpaHBaR1Z1ZEdsbWFXVnlMQ0J2WW1wbFkzUXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZoWTNScGRtVlVjbUZ1YzJadmNtMWxjaTVuWlhRb0tUdGNiaUFnSUNCOU8xeHVmVnh1Wlhod2IzSjBjeTVqY21WaGRHVlVjbUZ1YzJadmNtMWxjaUE5SUdOeVpXRjBaVlJ5WVc1elptOXliV1Z5TzF4dVpuVnVZM1JwYjI0Z1oyVjBUV1Z0YjJsNllYUnBiMjVKWkNodlltcGxZM1FwSUh0Y2JpQWdJQ0JwWmlBb2IySnFaV04wSUQwOVBTQnVkV3hzSUh4OElIUjVjR1Z2WmlCdlltcGxZM1FnSVQwOUlGd2liMkpxWldOMFhDSXBYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNJbHR0YjJKNFhTQjBjbUZ1YzJadmNtMGdaWGh3WldOMFpXUWdjMjl0WlNCcmFXNWtJRzltSUc5aWFtVmpkQ3dnWjI5ME9pQmNJaUFySUc5aWFtVmpkQ2s3WEc0Z0lDQWdkbUZ5SUhScFpDQTlJRzlpYW1WamRDNGtkSEpoYm5ObWIzSnRTV1E3WEc0Z0lDQWdhV1lnS0hScFpDQTlQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lIUnBaQ0E5SUdkbGRFNWxlSFJKWkNncE8xeHVJQ0FnSUNBZ0lDQmhaR1JJYVdSa1pXNVFjbTl3S0c5aWFtVmpkQ3dnWENJa2RISmhibk5tYjNKdFNXUmNJaXdnZEdsa0tUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSFJwWkR0Y2JuMWNibVoxYm1OMGFXOXVJR1Y0Y0hJb1pYaHdjaXdnYzJOdmNHVXBJSHRjYmlBZ0lDQnBaaUFvSVdselEyOXRjSFYwYVc1blJHVnlhWFpoZEdsdmJpZ3BLVnh1SUNBZ0lDQWdJQ0JqYjI1emIyeGxMbmRoY200b1hDSmJiVzlpZUM1bGVIQnlYU0FuWlhod2NpY2djMmh2ZFd4a0lHOXViSGtnWW1VZ2RYTmxaQ0JwYm5OcFpHVWdiM1JvWlhJZ2NtVmhZM1JwZG1VZ1puVnVZM1JwYjI1ekxsd2lLVHRjYmlBZ0lDQnlaWFIxY200Z1kyOXRjSFYwWldRb1pYaHdjaXdnYzJOdmNHVXBMbWRsZENncE8xeHVmVnh1Wlhod2IzSjBjeTVsZUhCeUlEMGdaWGh3Y2p0Y2JtWjFibU4wYVc5dUlHVjRkR1Z1WkU5aWMyVnlkbUZpYkdVb2RHRnlaMlYwS1NCN1hHNGdJQ0FnZG1GeUlIQnliM0JsY25ScFpYTWdQU0JiWFR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJmYVNBOUlERTdJRjlwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ1gya3JLeWtnZTF4dUlDQWdJQ0FnSUNCd2NtOXdaWEowYVdWelcxOXBJQzBnTVYwZ1BTQmhjbWQxYldWdWRITmJYMmxkTzF4dUlDQWdJSDFjYmlBZ0lDQnBiblpoY21saGJuUW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQStQU0F5TENCY0ltVjRkR1Z1WkU5aWMyVnlkbUZpYkdVZ1pYaHdaV04wWldRZ01pQnZjaUJ0YjNKbElHRnlaM1Z0Wlc1MGMxd2lLVHRjYmlBZ0lDQnBiblpoY21saGJuUW9kSGx3Wlc5bUlIUmhjbWRsZENBOVBUMGdYQ0p2WW1wbFkzUmNJaXdnWENKbGVIUmxibVJQWW5ObGNuWmhZbXhsSUdWNGNHVmpkSE1nWVc0Z2IySnFaV04wSUdGeklHWnBjbk4wSUdGeVozVnRaVzUwWENJcE8xeHVJQ0FnSUdsdWRtRnlhV0Z1ZENnaEtIUmhjbWRsZENCcGJuTjBZVzVqWlc5bUlFOWljMlZ5ZG1GaWJHVk5ZWEFwTENCY0ltVjRkR1Z1WkU5aWMyVnlkbUZpYkdVZ2MyaHZkV3hrSUc1dmRDQmlaU0IxYzJWa0lHOXVJRzFoY0hNc0lIVnpaU0J0WVhBdWJXVnlaMlVnYVc1emRHVmhaRndpS1R0Y2JpQWdJQ0J3Y205d1pYSjBhV1Z6TG1admNrVmhZMmdvWm5WdVkzUnBiMjRnS0hCeWIzQlRaWFFwSUh0Y2JpQWdJQ0FnSUNBZ2FXNTJZWEpwWVc1MEtIUjVjR1Z2WmlCd2NtOXdVMlYwSUQwOVBTQmNJbTlpYW1WamRGd2lMQ0JjSW1Gc2JDQmhjbWQxYldWdWRITWdiMllnWlhoMFpXNWtUMkp6WlhKMllXSnNaU0J6YUc5MWJHUWdZbVVnYjJKcVpXTjBjMXdpS1R0Y2JpQWdJQ0FnSUNBZ1pYaDBaVzVrVDJKelpYSjJZV0pzWlVobGJIQmxjaWgwWVhKblpYUXNJSEJ5YjNCVFpYUXNJRlpoYkhWbFRXOWtaUzVTWldOMWNuTnBkbVVzSUc1MWJHd3BPMXh1SUNBZ0lIMHBPMXh1SUNBZ0lISmxkSFZ5YmlCMFlYSm5aWFE3WEc1OVhHNWxlSEJ2Y25SekxtVjRkR1Z1WkU5aWMyVnlkbUZpYkdVZ1BTQmxlSFJsYm1SUFluTmxjblpoWW14bE8xeHVablZ1WTNScGIyNGdaWGgwWlc1a1QySnpaWEoyWVdKc1pVaGxiSEJsY2loMFlYSm5aWFFzSUhCeWIzQmxjblJwWlhNc0lHMXZaR1VzSUc1aGJXVXBJSHRjYmlBZ0lDQjJZWElnWVdSdElEMGdZWE5QWW5ObGNuWmhZbXhsVDJKcVpXTjBLSFJoY21kbGRDd2dibUZ0WlN3Z2JXOWtaU2s3WEc0Z0lDQWdabTl5SUNoMllYSWdhMlY1SUdsdUlIQnliM0JsY25ScFpYTXBYRzRnSUNBZ0lDQWdJR2xtSUNob1lYTlBkMjVRY205d1pYSjBlU2h3Y205d1pYSjBhV1Z6TENCclpYa3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdGeVoyVjBJRDA5UFNCd2NtOXdaWEowYVdWeklDWW1JQ0ZwYzFCeWIzQmxjblI1UTI5dVptbG5kWEpoWW14bEtIUmhjbWRsZEN3Z2EyVjVLU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxkRTlpYzJWeWRtRmliR1ZQWW1wbFkzUkpibk4wWVc1alpWQnliM0JsY25SNUtHRmtiU3dnYTJWNUxDQndjbTl3WlhKMGFXVnpXMnRsZVYwcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhSaGNtZGxkRHRjYm4xY2JtWjFibU4wYVc5dUlHZGxkRVJsY0dWdVpHVnVZM2xVY21WbEtIUm9hVzVuTENCd2NtOXdaWEowZVNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ1YjJSbFZHOUVaWEJsYm1SbGJtTjVWSEpsWlNoblpYUkJkRzl0S0hSb2FXNW5MQ0J3Y205d1pYSjBlU2twTzF4dWZWeHVablZ1WTNScGIyNGdibTlrWlZSdlJHVndaVzVrWlc1amVWUnlaV1VvYm05a1pTa2dlMXh1SUNBZ0lIWmhjaUJ5WlhOMWJIUWdQU0I3WEc0Z0lDQWdJQ0FnSUc1aGJXVTZJRzV2WkdVdWJtRnRaVnh1SUNBZ0lIMDdYRzRnSUNBZ2FXWWdLRzV2WkdVdWIySnpaWEoyYVc1bklDWW1JRzV2WkdVdWIySnpaWEoyYVc1bkxteGxibWQwYUNBK0lEQXBYRzRnSUNBZ0lDQWdJSEpsYzNWc2RDNWtaWEJsYm1SbGJtTnBaWE1nUFNCMWJtbHhkV1VvYm05a1pTNXZZbk5sY25acGJtY3BMbTFoY0NodWIyUmxWRzlFWlhCbGJtUmxibU41VkhKbFpTazdYRzRnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYm4xY2JtWjFibU4wYVc5dUlHZGxkRTlpYzJWeWRtVnlWSEpsWlNoMGFHbHVaeXdnY0hKdmNHVnlkSGtwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdibTlrWlZSdlQySnpaWEoyWlhKVWNtVmxLR2RsZEVGMGIyMG9kR2hwYm1jc0lIQnliM0JsY25SNUtTazdYRzU5WEc1bWRXNWpkR2x2YmlCdWIyUmxWRzlQWW5ObGNuWmxjbFJ5WldVb2JtOWtaU2tnZTF4dUlDQWdJSFpoY2lCeVpYTjFiSFFnUFNCN1hHNGdJQ0FnSUNBZ0lHNWhiV1U2SUc1dlpHVXVibUZ0WlZ4dUlDQWdJSDA3WEc0Z0lDQWdhV1lnS0doaGMwOWljMlZ5ZG1WeWN5aHViMlJsS1NsY2JpQWdJQ0FnSUNBZ2NtVnpkV3gwTG05aWMyVnlkbVZ5Y3lBOUlHZGxkRTlpYzJWeWRtVnljeWh1YjJSbEtTNXRZWEFvYm05a1pWUnZUMkp6WlhKMlpYSlVjbVZsS1R0Y2JpQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVmVnh1Wm5WdVkzUnBiMjRnYVc1MFpYSmpaWEIwS0hSb2FXNW5MQ0J3Y205d1QzSklZVzVrYkdWeUxDQm9ZVzVrYkdWeUtTQjdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQm9ZVzVrYkdWeUlEMDlQU0JjSW1aMWJtTjBhVzl1WENJcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCcGJuUmxjbU5sY0hSUWNtOXdaWEowZVNoMGFHbHVaeXdnY0hKdmNFOXlTR0Z1Wkd4bGNpd2dhR0Z1Wkd4bGNpazdYRzRnSUNBZ1pXeHpaVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdhVzUwWlhKalpYQjBTVzUwWlhKalpYQjBZV0pzWlNoMGFHbHVaeXdnY0hKdmNFOXlTR0Z1Wkd4bGNpazdYRzU5WEc1bGVIQnZjblJ6TG1sdWRHVnlZMlZ3ZENBOUlHbHVkR1Z5WTJWd2REdGNibVoxYm1OMGFXOXVJR2x1ZEdWeVkyVndkRWx1ZEdWeVkyVndkR0ZpYkdVb2RHaHBibWNzSUdoaGJtUnNaWElwSUh0Y2JpQWdJQ0JwWmlBb2FYTlFiR0ZwYms5aWFtVmpkQ2gwYUdsdVp5a2dKaVlnSVdselQySnpaWEoyWVdKc1pVOWlhbVZqZENoMGFHbHVaeWtwSUh0Y2JpQWdJQ0FnSUNBZ1pHVndjbVZqWVhSbFpDaGNJbEJoYzNOcGJtY2djR3hoYVc0Z2IySnFaV04wY3lCMGJ5QnBiblJsY21ObGNIUWdMeUJ2WW5ObGNuWmxJR2x6SUdSbGNISmxZMkYwWldRZ1lXNWtJSGRwYkd3Z1ltVWdjbVZ0YjNabFpDQnBiaUF6TGpCY0lpazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm5aWFJCWkcxcGJtbHpkSEpoZEdsdmJpaHZZbk5sY25aaFlteGxLSFJvYVc1bktTa3VhVzUwWlhKalpYQjBLR2hoYm1Sc1pYSXBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnWjJWMFFXUnRhVzVwYzNSeVlYUnBiMjRvZEdocGJtY3BMbWx1ZEdWeVkyVndkQ2hvWVc1a2JHVnlLVHRjYm4xY2JtWjFibU4wYVc5dUlHbHVkR1Z5WTJWd2RGQnliM0JsY25SNUtIUm9hVzVuTENCd2NtOXdaWEowZVN3Z2FHRnVaR3hsY2lrZ2UxeHVJQ0FnSUdsbUlDaHBjMUJzWVdsdVQySnFaV04wS0hSb2FXNW5LU0FtSmlBaGFYTlBZbk5sY25aaFlteGxUMkpxWldOMEtIUm9hVzVuS1NrZ2UxeHVJQ0FnSUNBZ0lDQmtaWEJ5WldOaGRHVmtLRndpVUdGemMybHVaeUJ3YkdGcGJpQnZZbXBsWTNSeklIUnZJR2x1ZEdWeVkyVndkQ0F2SUc5aWMyVnlkbVVnYVhNZ1pHVndjbVZqWVhSbFpDQmhibVFnZDJsc2JDQmlaU0J5WlcxdmRtVmtJR2x1SURNdU1Gd2lLVHRjYmlBZ0lDQWdJQ0FnWlhoMFpXNWtUMkp6WlhKMllXSnNaU2gwYUdsdVp5d2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NISnZjR1Z5ZEhrNklIUm9hVzVuVzNCeWIzQmxjblI1WFZ4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHbHVkR1Z5WTJWd2RGQnliM0JsY25SNUtIUm9hVzVuTENCd2NtOXdaWEowZVN3Z2FHRnVaR3hsY2lrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQm5aWFJCWkcxcGJtbHpkSEpoZEdsdmJpaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcExtbHVkR1Z5WTJWd2RDaG9ZVzVrYkdWeUtUdGNibjFjYm1aMWJtTjBhVzl1SUdselQySnpaWEoyWVdKc1pTaDJZV3gxWlN3Z2NISnZjR1Z5ZEhrcElIdGNiaUFnSUNCcFppQW9kbUZzZFdVZ1BUMDlJRzUxYkd3Z2ZId2dkbUZzZFdVZ1BUMDlJSFZ1WkdWbWFXNWxaQ2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUdsbUlDaHdjbTl3WlhKMGVTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gyWVd4MVpTQnBibk4wWVc1alpXOW1JRTlpYzJWeWRtRmliR1ZOWVhBZ2ZId2dkbUZzZFdVZ2FXNXpkR0Z1WTJWdlppQlBZbk5sY25aaFlteGxRWEp5WVhrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0piYlc5aWVDNXBjMDlpYzJWeWRtRmliR1ZkSUdselQySnpaWEoyWVdKc1pTaHZZbXBsWTNRc0lIQnliM0JsY25SNVRtRnRaU2tnYVhNZ2JtOTBJSE4xY0hCdmNuUmxaQ0JtYjNJZ1lYSnlZWGx6SUdGdVpDQnRZWEJ6TGlCVmMyVWdiV0Z3TG1oaGN5QnZjaUJoY25KaGVTNXNaVzVuZEdnZ2FXNXpkR1ZoWkM1Y0lpazdYRzRnSUNBZ0lDQWdJR1ZzYzJVZ2FXWWdLR2x6VDJKelpYSjJZV0pzWlU5aWFtVmpkQ2gyWVd4MVpTa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ2SUQwZ2RtRnNkV1V1SkcxdlluZzdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYnk1MllXeDFaWE1nSmlZZ0lTRnZMblpoYkhWbGMxdHdjbTl3WlhKMGVWMDdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdJU0YyWVd4MVpTNGtiVzlpZUNCOGZDQjJZV3gxWlNCcGJuTjBZVzVqWlc5bUlFSmhjMlZCZEc5dElIeDhJSFpoYkhWbElHbHVjM1JoYm1ObGIyWWdVbVZoWTNScGIyNGdmSHdnZG1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJEYjIxd2RYUmxaRlpoYkhWbE8xeHVmVnh1Wlhod2IzSjBjeTVwYzA5aWMyVnlkbUZpYkdVZ1BTQnBjMDlpYzJWeWRtRmliR1U3WEc1MllYSWdaR1ZqYjNKaGRHOXlTVzF3YkNBOUlHTnlaV0YwWlVOc1lYTnpVSEp2Y0dWeWRIbEVaV052Y21GMGIzSW9ablZ1WTNScGIyNGdLSFJoY21kbGRDd2dibUZ0WlN3Z1ltRnpaVlpoYkhWbEtTQjdYRzRnSUNBZ2RtRnlJSEJ5WlhaQklEMGdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTlRkR0Z5ZENoMGNuVmxLVHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JR0poYzJWV1lXeDFaU0E5UFQwZ1hDSm1kVzVqZEdsdmJsd2lLVnh1SUNBZ0lDQWdJQ0JpWVhObFZtRnNkV1VnUFNCaGMxSmxabVZ5Wlc1alpTaGlZWE5sVm1Gc2RXVXBPMXh1SUNBZ0lIWmhjaUJoWkcwZ1BTQmhjMDlpYzJWeWRtRmliR1ZQWW1wbFkzUW9kR0Z5WjJWMExDQjFibVJsWm1sdVpXUXNJRlpoYkhWbFRXOWtaUzVTWldOMWNuTnBkbVVwTzF4dUlDQWdJR1JsWm1sdVpVOWljMlZ5ZG1GaWJHVlFjbTl3WlhKMGVTaGhaRzBzSUc1aGJXVXNJR0poYzJWV1lXeDFaU3dnZEhKMVpTd2dkVzVrWldacGJtVmtLVHRjYmlBZ0lDQmhiR3h2ZDFOMFlYUmxRMmhoYm1kbGMwVnVaQ2h3Y21WMlFTazdYRzU5TENCbWRXNWpkR2x2YmlBb2JtRnRaU2tnZTF4dUlDQWdJSFpoY2lCdlluTmxjblpoWW14bElEMGdkR2hwY3k0a2JXOWllQzUyWVd4MVpYTmJibUZ0WlYwN1hHNGdJQ0FnYVdZZ0tHOWljMlZ5ZG1GaWJHVWdQVDA5SUhWdVpHVm1hVzVsWkNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0J5WlhSMWNtNGdiMkp6WlhKMllXSnNaUzVuWlhRb0tUdGNibjBzSUdaMWJtTjBhVzl1SUNodVlXMWxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lITmxkRkJ5YjNCbGNuUjVWbUZzZFdVb2RHaHBjeXdnYm1GdFpTd2dkbUZzZFdVcE8xeHVmU3dnZEhKMVpTd2dabUZzYzJVcE8xeHVablZ1WTNScGIyNGdiMkp6WlhKMllXSnNaVVJsWTI5eVlYUnZjaWgwWVhKblpYUXNJR3RsZVN3Z1ltRnpaVVJsYzJOeWFYQjBiM0lwSUh0Y2JpQWdJQ0JwYm5aaGNtbGhiblFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0ErUFNBeUlDWW1JR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQRDBnTXl3Z1hDSkpiR3hsWjJGc0lHUmxZMjl5WVhSdmNpQmpiMjVtYVdkY0lpd2dhMlY1S1R0Y2JpQWdJQ0JoYzNObGNuUlFjbTl3WlhKMGVVTnZibVpwWjNWeVlXSnNaU2gwWVhKblpYUXNJR3RsZVNrN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0NGaVlYTmxSR1Z6WTNKcGNIUnZjaUI4ZkNBaFltRnpaVVJsYzJOeWFYQjBiM0l1WjJWMExDQmNJa0J2WW5ObGNuWmhZbXhsSUdOaGJpQnViM1FnWW1VZ2RYTmxaQ0J2YmlCblpYUjBaWEp6TENCMWMyVWdRR052YlhCMWRHVmtJR2x1YzNSbFlXUmNJaWs3WEc0Z0lDQWdjbVYwZFhKdUlHUmxZMjl5WVhSdmNrbHRjR3d1WVhCd2JIa29iblZzYkN3Z1lYSm5kVzFsYm5SektUdGNibjFjYm1aMWJtTjBhVzl1SUc5aWMyVnlkbUZpYkdVb2Rpd2dhMlY1VDNKVFkyOXdaU2tnZTF4dUlDQWdJR2xtSUNoMklEMDlQU0IyYjJsa0lEQXBJSHNnZGlBOUlIVnVaR1ZtYVc1bFpEc2dmVnh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdZWEpuZFcxbGJuUnpXekZkSUQwOVBTQmNJbk4wY21sdVoxd2lLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiMkp6WlhKMllXSnNaVVJsWTI5eVlYUnZjaTVoY0hCc2VTaHVkV3hzTENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0FnSUdsdWRtRnlhV0Z1ZENoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUR3Z015d2dYQ0p2WW5ObGNuWmhZbXhsSUdWNGNHVmpkSE1nZW1WeWJ5d2diMjVsSUc5eUlIUjNieUJoY21kMWJXVnVkSE5jSWlrN1hHNGdJQ0FnYVdZZ0tHbHpUMkp6WlhKMllXSnNaU2gyS1NsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhZN1hHNGdJQ0FnZG1GeUlGOWhJRDBnWjJWMFZtRnNkV1ZOYjJSbFJuSnZiVlpoYkhWbEtIWXNJRlpoYkhWbFRXOWtaUzVTWldOMWNuTnBkbVVwTENCdGIyUmxJRDBnWDJGYk1GMHNJSFpoYkhWbElEMGdYMkZiTVYwN1hHNGdJQ0FnZG1GeUlITnZkWEpqWlZSNWNHVWdQU0J0YjJSbElEMDlQU0JXWVd4MVpVMXZaR1V1VW1WbVpYSmxibU5sSUQ4Z1ZtRnNkV1ZVZVhCbExsSmxabVZ5Wlc1alpTQTZJR2RsZEZSNWNHVlBabFpoYkhWbEtIWmhiSFZsS1R0Y2JpQWdJQ0J6ZDJsMFkyZ2dLSE52ZFhKalpWUjVjR1VwSUh0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0JXWVd4MVpWUjVjR1V1UVhKeVlYazZYRzRnSUNBZ0lDQWdJR05oYzJVZ1ZtRnNkV1ZVZVhCbExsQnNZV2x1VDJKcVpXTjBPbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUcxaGEyVkRhR2xzWkU5aWMyVnlkbUZpYkdVb2RtRnNkV1VzSUcxdlpHVXBPMXh1SUNBZ0lDQWdJQ0JqWVhObElGWmhiSFZsVkhsd1pTNVNaV1psY21WdVkyVTZYRzRnSUNBZ0lDQWdJR05oYzJVZ1ZtRnNkV1ZVZVhCbExrTnZiWEJzWlhoUFltcGxZM1E2WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRTlpYzJWeWRtRmliR1ZXWVd4MVpTaDJZV3gxWlN3Z2JXOWtaU2s3WEc0Z0lDQWdJQ0FnSUdOaGMyVWdWbUZzZFdWVWVYQmxMa052YlhCc1pYaEdkVzVqZEdsdmJqcGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSWx0dGIySjRMbTlpYzJWeWRtRmliR1ZkSUZSdklHSmxJR0ZpYkdVZ2RHOGdiV0ZyWlNCaElHWjFibU4wYVc5dUlISmxZV04wYVhabElHbDBJSE5vYjNWc1pDQnViM1FnYUdGMlpTQmhjbWQxYldWdWRITXVJRWxtSUhsdmRTQnVaV1ZrSUdGdUlHOWljMlZ5ZG1GaWJHVWdjbVZtWlhKbGJtTmxJSFJ2SUdFZ1puVnVZM1JwYjI0c0lIVnpaU0JnYjJKelpYSjJZV0pzWlNoaGMxSmxabVZ5Wlc1alpTaG1LU2xnWENJcE8xeHVJQ0FnSUNBZ0lDQmpZWE5sSUZaaGJIVmxWSGx3WlM1V2FXVjNSblZ1WTNScGIyNDZYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnlaV05oZEdWa0tGd2lWWE5sSUdCamIyMXdkWFJsWkNobGVIQnlLV0FnYVc1emRHVmhaQ0J2WmlCZ2IySnpaWEoyWVdKc1pTaGxlSEJ5S1dCY0lpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5dGNIVjBaV1FvZGl3Z2EyVjVUM0pUWTI5d1pTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsdWRtRnlhV0Z1ZENobVlXeHpaU3dnWENKSmJHeGxaMkZzSUZOMFlYUmxYQ0lwTzF4dWZWeHVaWGh3YjNKMGN5NXZZbk5sY25aaFlteGxJRDBnYjJKelpYSjJZV0pzWlR0Y2JuWmhjaUJXWVd4MVpWUjVjR1U3WEc0b1puVnVZM1JwYjI0Z0tGWmhiSFZsVkhsd1pTa2dlMXh1SUNBZ0lGWmhiSFZsVkhsd1pWdFdZV3gxWlZSNWNHVmJYQ0pTWldabGNtVnVZMlZjSWwwZ1BTQXdYU0E5SUZ3aVVtVm1aWEpsYm1ObFhDSTdYRzRnSUNBZ1ZtRnNkV1ZVZVhCbFcxWmhiSFZsVkhsd1pWdGNJbEJzWVdsdVQySnFaV04wWENKZElEMGdNVjBnUFNCY0lsQnNZV2x1VDJKcVpXTjBYQ0k3WEc0Z0lDQWdWbUZzZFdWVWVYQmxXMVpoYkhWbFZIbHdaVnRjSWtOdmJYQnNaWGhQWW1wbFkzUmNJbDBnUFNBeVhTQTlJRndpUTI5dGNHeGxlRTlpYW1WamRGd2lPMXh1SUNBZ0lGWmhiSFZsVkhsd1pWdFdZV3gxWlZSNWNHVmJYQ0pCY25KaGVWd2lYU0E5SUROZElEMGdYQ0pCY25KaGVWd2lPMXh1SUNBZ0lGWmhiSFZsVkhsd1pWdFdZV3gxWlZSNWNHVmJYQ0pXYVdWM1JuVnVZM1JwYjI1Y0lsMGdQU0EwWFNBOUlGd2lWbWxsZDBaMWJtTjBhVzl1WENJN1hHNGdJQ0FnVm1Gc2RXVlVlWEJsVzFaaGJIVmxWSGx3WlZ0Y0lrTnZiWEJzWlhoR2RXNWpkR2x2Ymx3aVhTQTlJRFZkSUQwZ1hDSkRiMjF3YkdWNFJuVnVZM1JwYjI1Y0lqdGNibjBwS0ZaaGJIVmxWSGx3WlNCOGZDQW9WbUZzZFdWVWVYQmxJRDBnZTMwcEtUdGNibVoxYm1OMGFXOXVJR2RsZEZSNWNHVlBabFpoYkhWbEtIWmhiSFZsS1NCN1hHNGdJQ0FnYVdZZ0tIWmhiSFZsSUQwOVBTQnVkV3hzSUh4OElIWmhiSFZsSUQwOVBTQjFibVJsWm1sdVpXUXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQldZV3gxWlZSNWNHVXVVbVZtWlhKbGJtTmxPMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdkbUZzZFdVZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhaaGJIVmxMbXhsYm1kMGFDQS9JRlpoYkhWbFZIbHdaUzVEYjIxd2JHVjRSblZ1WTNScGIyNGdPaUJXWVd4MVpWUjVjR1V1Vm1sbGQwWjFibU4wYVc5dU8xeHVJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0haaGJIVmxLU0I4ZkNCMllXeDFaU0JwYm5OMFlXNWpaVzltSUU5aWMyVnlkbUZpYkdWQmNuSmhlU2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRlpoYkhWbFZIbHdaUzVCY25KaGVUdGNiaUFnSUNCcFppQW9kSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQmNJbTlpYW1WamRGd2lLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdhWE5RYkdGcGJrOWlhbVZqZENoMllXeDFaU2tnUHlCV1lXeDFaVlI1Y0dVdVVHeGhhVzVQWW1wbFkzUWdPaUJXWVd4MVpWUjVjR1V1UTI5dGNHeGxlRTlpYW1WamREdGNiaUFnSUNCeVpYUjFjbTRnVm1Gc2RXVlVlWEJsTGxKbFptVnlaVzVqWlR0Y2JuMWNibVoxYm1OMGFXOXVJRzlpYzJWeWRtVW9kR2hwYm1jc0lIQnliM0JQY2tOaUxDQmpZazl5Um1seVpTd2dabWx5WlVsdGJXVmthV0YwWld4NUtTQjdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQmpZazl5Um1seVpTQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUtWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2IySnpaWEoyWlU5aWMyVnlkbUZpYkdWUWNtOXdaWEowZVNoMGFHbHVaeXdnY0hKdmNFOXlRMklzSUdOaVQzSkdhWEpsTENCbWFYSmxTVzF0WldScFlYUmxiSGtwTzF4dUlDQWdJR1ZzYzJWY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUc5aWMyVnlkbVZQWW5ObGNuWmhZbXhsS0hSb2FXNW5MQ0J3Y205d1QzSkRZaXdnWTJKUGNrWnBjbVVwTzF4dWZWeHVaWGh3YjNKMGN5NXZZbk5sY25abElEMGdiMkp6WlhKMlpUdGNibVoxYm1OMGFXOXVJRzlpYzJWeWRtVlBZbk5sY25aaFlteGxLSFJvYVc1bkxDQnNhWE4wWlc1bGNpd2dabWx5WlVsdGJXVmthV0YwWld4NUtTQjdYRzRnSUNBZ2FXWWdLR2x6VUd4aGFXNVBZbXBsWTNRb2RHaHBibWNwSUNZbUlDRnBjMDlpYzJWeWRtRmliR1ZQWW1wbFkzUW9kR2hwYm1jcEtTQjdYRzRnSUNBZ0lDQWdJR1JsY0hKbFkyRjBaV1FvWENKUVlYTnphVzVuSUhCc1lXbHVJRzlpYW1WamRITWdkRzhnYVc1MFpYSmpaWEIwSUM4Z2IySnpaWEoyWlNCcGN5QmtaWEJ5WldOaGRHVmtJR0Z1WkNCM2FXeHNJR0psSUhKbGJXOTJaV1FnYVc0Z015NHdYQ0lwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWjJWMFFXUnRhVzVwYzNSeVlYUnBiMjRvYjJKelpYSjJZV0pzWlNoMGFHbHVaeWtwTG05aWMyVnlkbVVvYkdsemRHVnVaWElzSUdacGNtVkpiVzFsWkdsaGRHVnNlU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCblpYUkJaRzFwYm1semRISmhkR2x2YmloMGFHbHVaeWt1YjJKelpYSjJaU2hzYVhOMFpXNWxjaXdnWm1seVpVbHRiV1ZrYVdGMFpXeDVLVHRjYm4xY2JtWjFibU4wYVc5dUlHOWljMlZ5ZG1WUFluTmxjblpoWW14bFVISnZjR1Z5ZEhrb2RHaHBibWNzSUhCeWIzQmxjblI1TENCc2FYTjBaVzVsY2l3Z1ptbHlaVWx0YldWa2FXRjBaV3g1S1NCN1hHNGdJQ0FnYVdZZ0tHbHpVR3hoYVc1UFltcGxZM1FvZEdocGJtY3BJQ1ltSUNGcGMwOWljMlZ5ZG1GaWJHVlBZbXBsWTNRb2RHaHBibWNwS1NCN1hHNGdJQ0FnSUNBZ0lHUmxjSEpsWTJGMFpXUW9YQ0pRWVhOemFXNW5JSEJzWVdsdUlHOWlhbVZqZEhNZ2RHOGdhVzUwWlhKalpYQjBJQzhnYjJKelpYSjJaU0JwY3lCa1pYQnlaV05oZEdWa0lHRnVaQ0IzYVd4c0lHSmxJSEpsYlc5MlpXUWdhVzRnTXk0d1hDSXBPMXh1SUNBZ0lDQWdJQ0JsZUhSbGJtUlBZbk5sY25aaFlteGxLSFJvYVc1bkxDQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCd2NtOXdaWEowZVRvZ2RHaHBibWRiY0hKdmNHVnlkSGxkWEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2IySnpaWEoyWlU5aWMyVnlkbUZpYkdWUWNtOXdaWEowZVNoMGFHbHVaeXdnY0hKdmNHVnlkSGtzSUd4cGMzUmxibVZ5TENCbWFYSmxTVzF0WldScFlYUmxiSGtwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1oyVjBRV1J0YVc1cGMzUnlZWFJwYjI0b2RHaHBibWNzSUhCeWIzQmxjblI1S1M1dlluTmxjblpsS0d4cGMzUmxibVZ5TENCbWFYSmxTVzF0WldScFlYUmxiSGtwTzF4dWZWeHVablZ1WTNScGIyNGdkRzlLVXloemIzVnlZMlVzSUdSbGRHVmpkRU41WTJ4bGN5d2dYMTloYkhKbFlXUjVVMlZsYmlrZ2UxeHVJQ0FnSUdsbUlDaGtaWFJsWTNSRGVXTnNaWE1nUFQwOUlIWnZhV1FnTUNrZ2V5QmtaWFJsWTNSRGVXTnNaWE1nUFNCMGNuVmxPeUI5WEc0Z0lDQWdhV1lnS0Y5ZllXeHlaV0ZrZVZObFpXNGdQVDA5SUhadmFXUWdNQ2tnZXlCZlgyRnNjbVZoWkhsVFpXVnVJRDBnYm5Wc2JEc2dmVnh1SUNBZ0lHWjFibU4wYVc5dUlHTmhZMmhsS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaGtaWFJsWTNSRGVXTnNaWE1wWEc0Z0lDQWdJQ0FnSUNBZ0lDQmZYMkZzY21WaFpIbFRaV1Z1TG5CMWMyZ29XM052ZFhKalpTd2dkbUZzZFdWZEtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvYzI5MWNtTmxJR2x1YzNSaGJtTmxiMllnUkdGMFpTQjhmQ0J6YjNWeVkyVWdhVzV6ZEdGdVkyVnZaaUJTWldkRmVIQXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnpiM1Z5WTJVN1hHNGdJQ0FnYVdZZ0tHUmxkR1ZqZEVONVkyeGxjeUFtSmlCZlgyRnNjbVZoWkhsVFpXVnVJRDA5UFNCdWRXeHNLVnh1SUNBZ0lDQWdJQ0JmWDJGc2NtVmhaSGxUWldWdUlEMGdXMTA3WEc0Z0lDQWdhV1lnS0dSbGRHVmpkRU41WTJ4bGN5QW1KaUJ6YjNWeVkyVWdJVDA5SUc1MWJHd2dKaVlnZEhsd1pXOW1JSE52ZFhKalpTQTlQVDBnWENKdlltcGxZM1JjSWlrZ2UxeHVJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JDQTlJRjlmWVd4eVpXRmtlVk5sWlc0dWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcktWeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGOWZZV3h5WldGa2VWTmxaVzViYVYxYk1GMGdQVDA5SUhOdmRYSmpaU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdYMTloYkhKbFlXUjVVMlZsYmx0cFhWc3hYVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLQ0Z6YjNWeVkyVXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnpiM1Z5WTJVN1hHNGdJQ0FnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvYzI5MWNtTmxLU0I4ZkNCemIzVnlZMlVnYVc1emRHRnVZMlZ2WmlCUFluTmxjblpoWW14bFFYSnlZWGtwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsY3lBOUlHTmhZMmhsS0Z0ZEtUdGNiaUFnSUNBZ0lDQWdkbUZ5SUhSdlFXUmtJRDBnYzI5MWNtTmxMbTFoY0NobWRXNWpkR2x2YmlBb2RtRnNkV1VwSUhzZ2NtVjBkWEp1SUhSdlNsTW9kbUZzZFdVc0lHUmxkR1ZqZEVONVkyeGxjeXdnWDE5aGJISmxZV1I1VTJWbGJpazdJSDBwTzF4dUlDQWdJQ0FnSUNCeVpYTXViR1Z1WjNSb0lEMGdkRzlCWkdRdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkNBOUlIUnZRV1JrTG14bGJtZDBhRHNnYVNBOElHdzdJR2tyS3lsY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzF0cFhTQTlJSFJ2UVdSa1cybGRPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6TzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvYzI5MWNtTmxJR2x1YzNSaGJtTmxiMllnVDJKelpYSjJZV0pzWlUxaGNDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnpYekVnUFNCallXTm9aU2g3ZlNrN1hHNGdJQ0FnSUNBZ0lITnZkWEpqWlM1bWIzSkZZV05vS0daMWJtTjBhVzl1SUNoMllXeDFaU3dnYTJWNUtTQjdJSEpsZEhWeWJpQnlaWE5mTVZ0clpYbGRJRDBnZEc5S1V5aDJZV3gxWlN3Z1pHVjBaV04wUTNsamJHVnpMQ0JmWDJGc2NtVmhaSGxUWldWdUtUc2dmU2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOZk1UdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHbHpUMkp6WlhKMllXSnNaU2h6YjNWeVkyVXBJQ1ltSUhOdmRYSmpaUzRrYlc5aWVDQnBibk4wWVc1alpXOW1JRTlpYzJWeWRtRmliR1ZXWVd4MVpTbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUnZTbE1vYzI5MWNtTmxLQ2tzSUdSbGRHVmpkRU41WTJ4bGN5d2dYMTloYkhKbFlXUjVVMlZsYmlrN1hHNGdJQ0FnYVdZZ0tITnZkWEpqWlNCcGJuTjBZVzVqWlc5bUlFOWljMlZ5ZG1GaWJHVldZV3gxWlNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSdlNsTW9jMjkxY21ObExtZGxkQ2dwTENCa1pYUmxZM1JEZVdOc1pYTXNJRjlmWVd4eVpXRmtlVk5sWlc0cE8xeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2MyOTFjbU5sSUQwOVBTQmNJbTlpYW1WamRGd2lLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaWE1nUFNCallXTm9aU2g3ZlNrN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCemIzVnlZMlVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE5iYTJWNVhTQTlJSFJ2U2xNb2MyOTFjbU5sVzJ0bGVWMHNJR1JsZEdWamRFTjVZMnhsY3l3Z1gxOWhiSEpsWVdSNVUyVmxiaWs3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhNN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnpiM1Z5WTJVN1hHNTlYRzVsZUhCdmNuUnpMblJ2U2xNZ1BTQjBiMHBUTzF4dVpuVnVZM1JwYjI0Z2RHOUtVMDlPS0hOdmRYSmpaU3dnWkdWMFpXTjBRM2xqYkdWekxDQmZYMkZzY21WaFpIbFRaV1Z1S1NCN1hHNGdJQ0FnYVdZZ0tHUmxkR1ZqZEVONVkyeGxjeUE5UFQwZ2RtOXBaQ0F3S1NCN0lHUmxkR1ZqZEVONVkyeGxjeUE5SUhSeWRXVTdJSDFjYmlBZ0lDQnBaaUFvWDE5aGJISmxZV1I1VTJWbGJpQTlQVDBnZG05cFpDQXdLU0I3SUY5ZllXeHlaV0ZrZVZObFpXNGdQU0J1ZFd4c095QjlYRzRnSUNBZ1pHVndjbVZqWVhSbFpDaGNJblJ2U2xOUFRpQnBjeUJrWlhCeVpXTmhkR1ZrTGlCVmMyVWdkRzlLVXlCcGJuTjBaV0ZrWENJcE8xeHVJQ0FnSUhKbGRIVnliaUIwYjBwVExtRndjR3g1S0c1MWJHd3NJR0Z5WjNWdFpXNTBjeWs3WEc1OVhHNWxlSEJ2Y25SekxuUnZTbE5QVGlBOUlIUnZTbE5QVGp0Y2JtWjFibU4wYVc5dUlHeHZaeWh0YzJjcElIdGNiaUFnSUNCamIyNXpiMnhsTG14dlp5aHRjMmNwTzF4dUlDQWdJSEpsZEhWeWJpQnRjMmM3WEc1OVhHNW1kVzVqZEdsdmJpQjNhSGxTZFc0b2RHaHBibWNzSUhCeWIzQXBJSHRjYmlBZ0lDQnpkMmwwWTJnZ0tHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdZMkZ6WlNBd09seHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGJtY2dQU0JuYkc5aVlXeFRkR0YwWlM1MGNtRmphMmx1WjBSbGNtbDJZWFJwYjI0N1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hVzVuS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJjb1hDSjNhSGxTZFc0b0tTQmpZVzRnYjI1c2VTQmlaU0IxYzJWa0lHbG1JR0VnWkdWeWFYWmhkR2x2YmlCcGN5QmhZM1JwZG1Vc0lHOXlJR0o1SUhCaGMzTnBibWNnWVc0Z1kyOXRjSFYwWldRZ2RtRnNkV1VnTHlCeVpXRmpkR2x2YmlCbGVIQnNhV05wZEd4NUxpQkpaaUI1YjNVZ2FXNTJiMnRsWkNCM2FIbFNkVzRnWm5KdmJTQnBibk5wWkdVZ1lTQmpiMjF3ZFhSaGRHbHZianNnZEdobElHTnZiWEIxZEdGMGFXOXVJR2x6SUdOMWNuSmxiblJzZVNCemRYTndaVzVrWldRZ1luVjBJSEpsTFdWMllXeDFZWFJwYm1jZ1ltVmpZWFZ6WlNCemIyMWxZbTlrZVNCeVpYRjFaWE4wWldRZ2FYUW5jeUIyWVd4MVpTNWNJaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0F5T2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwYm1jZ1BTQm5aWFJCZEc5dEtIUm9hVzVuTENCd2NtOXdLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x1WnlBOUlHZGxkRUYwYjIwb2RHaHBibWNwTzF4dUlDQWdJR2xtSUNoMGFHbHVaeUJwYm5OMFlXNWpaVzltSUVOdmJYQjFkR1ZrVm1Gc2RXVXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMmNvZEdocGJtY3VkMmg1VW5WdUtDa3BPMXh1SUNBZ0lHVnNjMlVnYVdZZ0tIUm9hVzVuSUdsdWMzUmhibU5sYjJZZ1VtVmhZM1JwYjI0cFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyY29kR2hwYm1jdWQyaDVVblZ1S0NrcE8xeHVJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lDQWdhVzUyWVhKcFlXNTBLR1poYkhObExDQmNJbmRvZVZKMWJpQmpZVzRnYjI1c2VTQmlaU0IxYzJWa0lHOXVJSEpsWVdOMGFXOXVjeUJoYm1RZ1kyOXRjSFYwWldRZ2RtRnNkV1Z6WENJcE8xeHVmVnh1Wlhod2IzSjBjeTUzYUhsU2RXNGdQU0IzYUhsU2RXNDdYRzVtZFc1amRHbHZiaUJqY21WaGRHVkJZM1JwYjI0b1lXTjBhVzl1VG1GdFpTd2dabTRwSUh0Y2JpQWdJQ0JwYm5aaGNtbGhiblFvZEhsd1pXOW1JR1p1SUQwOVBTQmNJbVoxYm1OMGFXOXVYQ0lzSUZ3aVlHRmpkR2x2Ym1BZ1kyRnVJRzl1YkhrZ1ltVWdhVzUyYjJ0bFpDQnZiaUJtZFc1amRHbHZibk5jSWlrN1hHNGdJQ0FnYVc1MllYSnBZVzUwS0hSNWNHVnZaaUJoWTNScGIyNU9ZVzFsSUQwOVBTQmNJbk4wY21sdVoxd2lJQ1ltSUdGamRHbHZiazVoYldVdWJHVnVaM1JvSUQ0Z01Dd2dYQ0poWTNScGIyNXpJSE5vYjNWc1pDQm9ZWFpsSUhaaGJHbGtJRzVoYldWekxDQm5iM1E2SUNkY0lpQXJJR0ZqZEdsdmJrNWhiV1VnS3lCY0lpZGNJaWs3WEc0Z0lDQWdkbUZ5SUhKbGN5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdWNFpXTjFkR1ZCWTNScGIyNG9ZV04wYVc5dVRtRnRaU3dnWm00c0lIUm9hWE1zSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J5WlhNdWFYTk5iMko0UVdOMGFXOXVJRDBnZEhKMVpUdGNiaUFnSUNCeVpYUjFjbTRnY21Wek8xeHVmVnh1Wm5WdVkzUnBiMjRnWlhobFkzVjBaVUZqZEdsdmJpaGhZM1JwYjI1T1lXMWxMQ0JtYml3Z2MyTnZjR1VzSUdGeVozTXBJSHRjYmlBZ0lDQnBiblpoY21saGJuUW9JU2huYkc5aVlXeFRkR0YwWlM1MGNtRmphMmx1WjBSbGNtbDJZWFJwYjI0Z2FXNXpkR0Z1WTJWdlppQkRiMjF3ZFhSbFpGWmhiSFZsS1N3Z1hDSkRiMjF3ZFhSbFpDQjJZV3gxWlhNZ2IzSWdkSEpoYm5ObWIzSnRaWEp6SUhOb2IzVnNaQ0J1YjNRZ2FXNTJiMnRsSUdGamRHbHZibk1nYjNJZ2RISnBaMmRsY2lCdmRHaGxjaUJ6YVdSbElHVm1abVZqZEhOY0lpazdYRzRnSUNBZ2RtRnlJRzV2ZEdsbWVWTndlU0E5SUdselUzQjVSVzVoWW14bFpDZ3BPMXh1SUNBZ0lIWmhjaUJ6ZEdGeWRGUnBiV1U3WEc0Z0lDQWdhV1lnS0c1dmRHbG1lVk53ZVNrZ2UxeHVJQ0FnSUNBZ0lDQnpkR0Z5ZEZScGJXVWdQU0JFWVhSbExtNXZkeWdwTzF4dUlDQWdJQ0FnSUNCMllYSWdiQ0E5SUNoaGNtZHpJQ1ltSUdGeVozTXViR1Z1WjNSb0tTQjhmQ0F3TzF4dUlDQWdJQ0FnSUNCMllYSWdabXhoZEhSbGJtUkJjbWR6SUQwZ2JtVjNJRUZ5Y21GNUtHd3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb2JDQStJREFwWEc0Z0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3c3SUdrckt5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iR0YwZEdWdVpFRnlaM05iYVYwZ1BTQmhjbWR6VzJsZE8xeHVJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUlRkR0Z5ZENoN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQmNJbUZqZEdsdmJsd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nWVdOMGFXOXVUbUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR1p1T2lCbWJpeGNiaUFnSUNBZ0lDQWdJQ0FnSUhSaGNtZGxkRG9nYzJOdmNHVXNYRzRnSUNBZ0lDQWdJQ0FnSUNCaGNtZDFiV1Z1ZEhNNklHWnNZWFIwWlc1a1FYSm5jMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUhCeVpYWlZiblJ5WVdOclpXUWdQU0IxYm5SeVlXTnJaV1JUZEdGeWRDZ3BPMXh1SUNBZ0lIUnlZVzV6WVdOMGFXOXVVM1JoY25Rb1lXTjBhVzl1VG1GdFpTd2djMk52Y0dVc0lHWmhiSE5sS1R0Y2JpQWdJQ0IyWVhJZ2NISmxka0ZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpJRDBnWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE5UZEdGeWRDaDBjblZsS1R0Y2JpQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptNHVZWEJ3Ykhrb2MyTnZjR1VzSUdGeVozTXBPMXh1SUNBZ0lIMWNiaUFnSUNCbWFXNWhiR3g1SUh0Y2JpQWdJQ0FnSUNBZ1lXeHNiM2RUZEdGMFpVTm9ZVzVuWlhORmJtUW9jSEpsZGtGc2JHOTNVM1JoZEdWRGFHRnVaMlZ6S1R0Y2JpQWdJQ0FnSUNBZ2RISmhibk5oWTNScGIyNUZibVFvWm1Gc2MyVXBPMXh1SUNBZ0lDQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkbFZ1ZEhKaFkydGxaQ2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BYRzRnSUNBZ0lDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SRmJtUW9leUIwYVcxbE9pQkVZWFJsTG01dmR5Z3BJQzBnYzNSaGNuUlVhVzFsSUgwcE8xeHVJQ0FnSUgxY2JuMWNibVoxYm1OMGFXOXVJSFZ6WlZOMGNtbGpkQ2h6ZEhKcFkzUXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0JrWlhCeVpXTmhkR1ZrS0Z3aVlIVnpaVk4wY21samRHQWdkMmwwYUc5MWRDQmhjbWQxYldWdWRITWdhWE1nWkdWd2NtVmpZWFJsWkN3Z2RYTmxJR0JwYzFOMGNtbGpkRTF2WkdWRmJtRmliR1ZrS0NsZ0lHbHVjM1JsWVdSY0lpazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm5iRzlpWVd4VGRHRjBaUzV6ZEhKcFkzUk5iMlJsTzF4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FXNTJZWEpwWVc1MEtHZHNiMkpoYkZOMFlYUmxMblJ5WVdOcmFXNW5SR1Z5YVhaaGRHbHZiaUE5UFQwZ2JuVnNiQ3dnWENKSmRDQnBjeUJ1YjNRZ1lXeHNiM2RsWkNCMGJ5QnpaWFFnWUhWelpWTjBjbWxqZEdBZ2QyaGxiaUJoSUdSbGNtbDJZWFJwYjI0Z2FYTWdjblZ1Ym1sdVoxd2lLVHRjYmlBZ0lDQWdJQ0FnWjJ4dlltRnNVM1JoZEdVdWMzUnlhV04wVFc5a1pTQTlJSE4wY21samREdGNiaUFnSUNBZ0lDQWdaMnh2WW1Gc1UzUmhkR1V1WVd4c2IzZFRkR0YwWlVOb1lXNW5aWE1nUFNBaGMzUnlhV04wTzF4dUlDQWdJSDFjYm4xY2JtVjRjRzl5ZEhNdWRYTmxVM1J5YVdOMElEMGdkWE5sVTNSeWFXTjBPMXh1Wm5WdVkzUnBiMjRnYVhOVGRISnBZM1JOYjJSbFJXNWhZbXhsWkNncElIdGNiaUFnSUNCeVpYUjFjbTRnWjJ4dlltRnNVM1JoZEdVdWMzUnlhV04wVFc5a1pUdGNibjFjYm1WNGNHOXlkSE11YVhOVGRISnBZM1JOYjJSbFJXNWhZbXhsWkNBOUlHbHpVM1J5YVdOMFRXOWtaVVZ1WVdKc1pXUTdYRzVtZFc1amRHbHZiaUJoYkd4dmQxTjBZWFJsUTJoaGJtZGxjeWhoYkd4dmQxTjBZWFJsUTJoaGJtZGxjeXdnWm5WdVl5a2dlMXh1SUNBZ0lIWmhjaUJ3Y21WMklEMGdZV3hzYjNkVGRHRjBaVU5vWVc1blpYTlRkR0Z5ZENoaGJHeHZkMU4wWVhSbFEyaGhibWRsY3lrN1hHNGdJQ0FnZG1GeUlISmxjeUE5SUdaMWJtTW9LVHRjYmlBZ0lDQmhiR3h2ZDFOMFlYUmxRMmhoYm1kbGMwVnVaQ2h3Y21WMktUdGNiaUFnSUNCeVpYUjFjbTRnY21Wek8xeHVmVnh1Wm5WdVkzUnBiMjRnWVd4c2IzZFRkR0YwWlVOb1lXNW5aWE5UZEdGeWRDaGhiR3h2ZDFOMFlYUmxRMmhoYm1kbGN5a2dlMXh1SUNBZ0lIWmhjaUJ3Y21WMklEMGdaMnh2WW1Gc1UzUmhkR1V1WVd4c2IzZFRkR0YwWlVOb1lXNW5aWE03WEc0Z0lDQWdaMnh2WW1Gc1UzUmhkR1V1WVd4c2IzZFRkR0YwWlVOb1lXNW5aWE1nUFNCaGJHeHZkMU4wWVhSbFEyaGhibWRsY3p0Y2JpQWdJQ0J5WlhSMWNtNGdjSEpsZGp0Y2JuMWNibVoxYm1OMGFXOXVJR0ZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpSVzVrS0hCeVpYWXBJSHRjYmlBZ0lDQm5iRzlpWVd4VGRHRjBaUzVoYkd4dmQxTjBZWFJsUTJoaGJtZGxjeUE5SUhCeVpYWTdYRzU5WEc1MllYSWdRbUZ6WlVGMGIyMGdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdaMWJtTjBhVzl1SUVKaGMyVkJkRzl0S0c1aGJXVXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNWhiV1VnUFQwOUlIWnZhV1FnTUNrZ2V5QnVZVzFsSUQwZ1hDSkJkRzl0UUZ3aUlDc2daMlYwVG1WNGRFbGtLQ2s3SUgxY2JpQWdJQ0FnSUNBZ2RHaHBjeTV1WVcxbElEMGdibUZ0WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVwYzFCbGJtUnBibWRWYm05aWMyVnlkbUYwYVc5dUlEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV2WW5ObGNuWmxjbk1nUFNCYlhUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dlluTmxjblpsY25OSmJtUmxlR1Z6SUQwZ2UzMDdYRzRnSUNBZ0lDQWdJSFJvYVhNdVpHbG1abFpoYkhWbElEMGdNRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXNZWE4wUVdOalpYTnpaV1JDZVNBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJHOTNaWE4wVDJKelpYSjJaWEpUZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVUazlVWDFSU1FVTkxTVTVITzF4dUlDQWdJSDFjYmlBZ0lDQkNZWE5sUVhSdmJTNXdjbTkwYjNSNWNHVXViMjVDWldOdmJXVlZibTlpYzJWeWRtVmtJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUgwN1hHNGdJQ0FnUW1GelpVRjBiMjB1Y0hKdmRHOTBlWEJsTG5KbGNHOXlkRTlpYzJWeWRtVmtJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWEJ2Y25SUFluTmxjblpsWkNoMGFHbHpLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFSmhjMlZCZEc5dExuQnliM1J2ZEhsd1pTNXlaWEJ2Y25SRGFHRnVaMlZrSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IwY21GdWMyRmpkR2x2YmxOMFlYSjBLRndpY0hKdmNHRm5ZWFJwYm1kQmRHOXRRMmhoYm1kbFhDSXNJRzUxYkd3c0lHWmhiSE5sS1R0Y2JpQWdJQ0FnSUNBZ2NISnZjR0ZuWVhSbFEyaGhibWRsWkNoMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnZEhKaGJuTmhZM1JwYjI1RmJtUW9abUZzYzJVcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnUW1GelpVRjBiMjB1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1dVlXMWxPMXh1SUNBZ0lIMDdYRzRnSUNBZ2NtVjBkWEp1SUVKaGMyVkJkRzl0TzF4dWZTZ3BLVHRjYm1WNGNHOXlkSE11UW1GelpVRjBiMjBnUFNCQ1lYTmxRWFJ2YlR0Y2JuWmhjaUJCZEc5dElEMGdLR1oxYm1OMGFXOXVJQ2hmYzNWd1pYSXBJSHRjYmlBZ0lDQmZYMlY0ZEdWdVpITW9RWFJ2YlN3Z1gzTjFjR1Z5S1R0Y2JpQWdJQ0JtZFc1amRHbHZiaUJCZEc5dEtHNWhiV1VzSUc5dVFtVmpiMjFsVDJKelpYSjJaV1JJWVc1a2JHVnlMQ0J2YmtKbFkyOXRaVlZ1YjJKelpYSjJaV1JJWVc1a2JHVnlLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHVZVzFsSUQwOVBTQjJiMmxrSURBcElIc2dibUZ0WlNBOUlGd2lRWFJ2YlVCY0lpQXJJR2RsZEU1bGVIUkpaQ2dwT3lCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2YmtKbFkyOXRaVTlpYzJWeWRtVmtTR0Z1Wkd4bGNpQTlQVDBnZG05cFpDQXdLU0I3SUc5dVFtVmpiMjFsVDJKelpYSjJaV1JJWVc1a2JHVnlJRDBnYm05dmNEc2dmVnh1SUNBZ0lDQWdJQ0JwWmlBb2IyNUNaV052YldWVmJtOWljMlZ5ZG1Wa1NHRnVaR3hsY2lBOVBUMGdkbTlwWkNBd0tTQjdJRzl1UW1WamIyMWxWVzV2WW5ObGNuWmxaRWhoYm1Sc1pYSWdQU0J1YjI5d095QjlYRzRnSUNBZ0lDQWdJRjl6ZFhCbGNpNWpZV3hzS0hSb2FYTXNJRzVoYldVcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG01aGJXVWdQU0J1WVcxbE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG05dVFtVmpiMjFsVDJKelpYSjJaV1JJWVc1a2JHVnlJRDBnYjI1Q1pXTnZiV1ZQWW5ObGNuWmxaRWhoYm1Sc1pYSTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWIyNUNaV052YldWVmJtOWljMlZ5ZG1Wa1NHRnVaR3hsY2lBOUlHOXVRbVZqYjIxbFZXNXZZbk5sY25abFpFaGhibVJzWlhJN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhOUVpXNWthVzVuVlc1dlluTmxjblpoZEdsdmJpQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1selFtVnBibWRVY21GamEyVmtJRDBnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0FnSUVGMGIyMHVjSEp2ZEc5MGVYQmxMbkpsY0c5eWRFOWljMlZ5ZG1Wa0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCemRHRnlkRUpoZEdOb0tDazdYRzRnSUNBZ0lDQWdJRjl6ZFhCbGNpNXdjbTkwYjNSNWNHVXVjbVZ3YjNKMFQySnpaWEoyWldRdVkyRnNiQ2gwYUdsektUdGNiaUFnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbWx6UW1WcGJtZFVjbUZqYTJWa0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWx6UW1WcGJtZFVjbUZqYTJWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIyNUNaV052YldWUFluTmxjblpsWkVoaGJtUnNaWElvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmxibVJDWVhSamFDZ3BPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdJU0ZuYkc5aVlXeFRkR0YwWlM1MGNtRmphMmx1WjBSbGNtbDJZWFJwYjI0N1hHNGdJQ0FnZlR0Y2JpQWdJQ0JCZEc5dExuQnliM1J2ZEhsd1pTNXZia0psWTI5dFpWVnViMkp6WlhKMlpXUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhOQ1pXbHVaMVJ5WVdOclpXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dmJrSmxZMjl0WlZWdWIySnpaWEoyWldSSVlXNWtiR1Z5S0NrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J5WlhSMWNtNGdRWFJ2YlR0Y2JuMG9RbUZ6WlVGMGIyMHBLVHRjYm1WNGNHOXlkSE11UVhSdmJTQTlJRUYwYjIwN1hHNTJZWElnUTI5dGNIVjBaV1JXWVd4MVpTQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnUTI5dGNIVjBaV1JXWVd4MVpTaGtaWEpwZG1GMGFXOXVMQ0J6WTI5d1pTd2dZMjl0Y0dGeVpWTjBjblZqZEhWeVlXd3NJRzVoYldVc0lITmxkSFJsY2lrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG1SbGNtbDJZWFJwYjI0Z1BTQmtaWEpwZG1GMGFXOXVPMXh1SUNBZ0lDQWdJQ0IwYUdsekxuTmpiM0JsSUQwZ2MyTnZjR1U3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZMjl0Y0dGeVpWTjBjblZqZEhWeVlXd2dQU0JqYjIxd1lYSmxVM1J5ZFdOMGRYSmhiRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWtaWEJsYm1SbGJtTnBaWE5UZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVUazlVWDFSU1FVTkxTVTVITzF4dUlDQWdJQ0FnSUNCMGFHbHpMbTlpYzJWeWRtbHVaeUE5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG01bGQwOWljMlZ5ZG1sdVp5QTlJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhOUVpXNWthVzVuVlc1dlluTmxjblpoZEdsdmJpQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG05aWMyVnlkbVZ5Y3lBOUlGdGRPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtOWljMlZ5ZG1WeWMwbHVaR1Y0WlhNZ1BTQjdmVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWthV1ptVm1Gc2RXVWdQU0F3TzF4dUlDQWdJQ0FnSUNCMGFHbHpMbkoxYmtsa0lEMGdNRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXNZWE4wUVdOalpYTnpaV1JDZVNBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJHOTNaWE4wVDJKelpYSjJaWEpUZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVWVkJmVkU5ZlJFRlVSVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTFibUp2ZFc1a1JHVndjME52ZFc1MElEMGdNRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZYMjFoY0dsa0lEMGdYQ0lqWENJZ0t5Qm5aWFJPWlhoMFNXUW9LVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lDQWdkR2hwY3k1cGMwTnZiWEIxZEdsdVp5QTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG01aGJXVWdQU0J1WVcxbElIeDhJRndpUTI5dGNIVjBaV1JXWVd4MVpVQmNJaUFySUdkbGRFNWxlSFJKWkNncE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYzJWMGRHVnlLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WlhSMFpYSWdQU0JqY21WaGRHVkJZM1JwYjI0b2JtRnRaU0FySUZ3aUxYTmxkSFJsY2x3aUxDQnpaWFIwWlhJcE8xeHVJQ0FnSUgxY2JpQWdJQ0JEYjIxd2RYUmxaRlpoYkhWbExuQnliM1J2ZEhsd1pTNXdaV1ZySUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtbHpRMjl0Y0hWMGFXNW5JRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdkbUZ5SUhCeVpYWkJiR3h2ZDFOMFlYUmxRMmhoYm1kbGN5QTlJR0ZzYkc5M1UzUmhkR1ZEYUdGdVoyVnpVM1JoY25Rb1ptRnNjMlVwTzF4dUlDQWdJQ0FnSUNCMllYSWdjbVZ6SUQwZ2RHaHBjeTVrWlhKcGRtRjBhVzl1TG1OaGJHd29kR2hwY3k1elkyOXdaU2s3WEc0Z0lDQWdJQ0FnSUdGc2JHOTNVM1JoZEdWRGFHRnVaMlZ6Ulc1a0tIQnlaWFpCYkd4dmQxTjBZWFJsUTJoaGJtZGxjeWs3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhWE5EYjIxd2RYUnBibWNnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsY3p0Y2JpQWdJQ0I5TzF4dUlDQWdJRHRjYmlBZ0lDQkRiMjF3ZFhSbFpGWmhiSFZsTG5CeWIzUnZkSGx3WlM1d1pXVnJWVzUwY21GamEyVmtJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYUdGelJYSnliM0lnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxjeUE5SUhSb2FYTXVjR1ZsYXlncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYUdGelJYSnliM0lnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpYTTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWm1sdVlXeHNlU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYUdGelJYSnliM0lwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYUdGdVpHeGxSWGhqWlhCMGFXOXVTVzVFWlhKcGRtRjBhVzl1S0hSb2FYTXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVHRjYmlBZ0lDQkRiMjF3ZFhSbFpGWmhiSFZsTG5CeWIzUnZkSGx3WlM1dmJrSmxZMjl0WlZOMFlXeGxJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl3WVdkaGRHVk5ZWGxpWlVOb1lXNW5aV1FvZEdocGN5azdYRzRnSUNBZ2ZUdGNiaUFnSUNCRGIyMXdkWFJsWkZaaGJIVmxMbkJ5YjNSdmRIbHdaUzV2YmtKbFkyOXRaVlZ1YjJKelpYSjJaV1FnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2gwYUdsekxtUmxjR1Z1WkdWdVkybGxjMU4wWVhSbElDRTlQU0JKUkdWeWFYWmhkR2x2YmxOMFlYUmxMazVQVkY5VVVrRkRTMGxPUnl3Z1hDSkpUbFJGVWs1QlRDQkZVbEpQVWlCdmJteDVJRzl1UW1WamIyMWxWVzV2WW5ObGNuWmxaQ0J6YUc5MWJHUnVKM1FnWW1VZ1kyRnNiR1ZrSUhSM2FXTmxJR2x1SUdFZ2NtOTNYQ0lwTzF4dUlDQWdJQ0FnSUNCamJHVmhjazlpYzJWeWRtbHVaeWgwYUdsektUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1MllXeDFaU0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0I5TzF4dUlDQWdJRU52YlhCMWRHVmtWbUZzZFdVdWNISnZkRzkwZVhCbExtZGxkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhVzUyWVhKcFlXNTBLQ0YwYUdsekxtbHpRMjl0Y0hWMGFXNW5MQ0JjSWtONVkyeGxJR1JsZEdWamRHVmtJR2x1SUdOdmJYQjFkR0YwYVc5dUlGd2lJQ3NnZEdocGN5NXVZVzFsTENCMGFHbHpMbVJsY21sMllYUnBiMjRwTzF4dUlDQWdJQ0FnSUNCemRHRnlkRUpoZEdOb0tDazdYRzRnSUNBZ0lDQWdJR2xtSUNobmJHOWlZV3hUZEdGMFpTNXBia0poZEdOb0lEMDlQU0F4S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MyaHZkV3hrUTI5dGNIVjBaU2gwYUdsektTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnZEdocGN5NXdaV1ZyVlc1MGNtRmphMlZrS0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhCdmNuUlBZbk5sY25abFpDaDBhR2x6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemFHOTFiR1JEYjIxd2RYUmxLSFJvYVhNcEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuUnlZV05yUVc1a1EyOXRjSFYwWlNncEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3Y205d1lXZGhkR1ZEYUdGdVoyVkRiMjVtYVhKdFpXUW9kR2hwY3lrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUhSb2FYTXVkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lHVnVaRUpoZEdOb0tDazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JEYjIxd2RYUmxaRlpoYkhWbExuQnliM1J2ZEhsd1pTNXlaV052ZG1WeVJuSnZiVVZ5Y205eUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx6UTI5dGNIVjBhVzVuSUQwZ1ptRnNjMlU3WEc0Z0lDQWdmVHRjYmlBZ0lDQkRiMjF3ZFhSbFpGWmhiSFZsTG5CeWIzUnZkSGx3WlM1elpYUWdQU0JtZFc1amRHbHZiaUFvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YzJWMGRHVnlLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WlhSMFpYSXVZMkZzYkNoMGFHbHpMbk5qYjNCbExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lHVnNjMlZjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0lsdERiMjF3ZFhSbFpGWmhiSFZsSUNkY0lpQXJJSFJvYVhNdWJtRnRaU0FySUZ3aUoxMGdTWFFnYVhNZ2JtOTBJSEJ2YzNOcFlteGxJSFJ2SUdGemMybG5iaUJoSUc1bGR5QjJZV3gxWlNCMGJ5QmhJR052YlhCMWRHVmtJSFpoYkhWbExsd2lLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFTnZiWEIxZEdWa1ZtRnNkV1V1Y0hKdmRHOTBlWEJsTG5SeVlXTnJRVzVrUTI5dGNIVjBaU0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhV1lnS0dselUzQjVSVzVoWW14bFpDZ3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUW9lMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlpYW1WamREb2dkR2hwY3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUJjSW1OdmJYQjFkR1ZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWJqb2dkR2hwY3k1a1pYSnBkbUYwYVc5dUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZERvZ2RHaHBjeTV6WTI5d1pWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkbUZ5SUc5c1pGWmhiSFZsSUQwZ2RHaHBjeTUyWVd4MVpUdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1bGQxWmhiSFZsSUQwZ2RHaHBjeTUyWVd4MVpTQTlJSFJ5WVdOclJHVnlhWFpsWkVaMWJtTjBhVzl1S0hSb2FYTXNJSFJvYVhNdWNHVmxheWs3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpVUnBaRU5vWVc1blpTaDBhR2x6TG1OdmJYQmhjbVZUZEhKMVkzUjFjbUZzTENCdVpYZFdZV3gxWlN3Z2IyeGtWbUZzZFdVcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnUTI5dGNIVjBaV1JXWVd4MVpTNXdjbTkwYjNSNWNHVXViMkp6WlhKMlpTQTlJR1oxYm1OMGFXOXVJQ2hzYVhOMFpXNWxjaXdnWm1seVpVbHRiV1ZrYVdGMFpXeDVLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmZkR2hwY3lBOUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUhaaGNpQm1hWEp6ZEZScGJXVWdQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQjJZWElnY0hKbGRsWmhiSFZsSUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1lYVjBiM0oxYmlobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdibVYzVm1Gc2RXVWdQU0JmZEdocGN5NW5aWFFvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaFptbHljM1JVYVcxbElIeDhJR1pwY21WSmJXMWxaR2xoZEdWc2VTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCd2NtVjJWU0E5SUhWdWRISmhZMnRsWkZOMFlYSjBLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdsemRHVnVaWElvYm1WM1ZtRnNkV1VzSUhCeVpYWldZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RXNTBjbUZqYTJWa1JXNWtLSEJ5WlhaVktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJR1pwY25OMFZHbHRaU0E5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NISmxkbFpoYkhWbElEMGdibVYzVm1Gc2RXVTdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJSDA3WEc0Z0lDQWdRMjl0Y0hWMFpXUldZV3gxWlM1d2NtOTBiM1I1Y0dVdWRHOUtVMDlPSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1blpYUW9LVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFTnZiWEIxZEdWa1ZtRnNkV1V1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1dVlXMWxJQ3NnWENKYlhDSWdLeUIwYUdsekxtUmxjbWwyWVhScGIyNHVkRzlUZEhKcGJtY29LU0FySUZ3aVhWd2lPMXh1SUNBZ0lIMDdYRzRnSUNBZ1EyOXRjSFYwWldSV1lXeDFaUzV3Y205MGIzUjVjR1V1ZDJoNVVuVnVJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVhOVWNtRmphMmx1WnlBOUlFSnZiMnhsWVc0b1oyeHZZbUZzVTNSaGRHVXVkSEpoWTJ0cGJtZEVaWEpwZG1GMGFXOXVLVHRjYmlBZ0lDQWdJQ0FnZG1GeUlHOWljMlZ5ZG1sdVp5QTlJSFZ1YVhGMVpTaDBhR2x6TG1selEyOXRjSFYwYVc1bklEOGdkR2hwY3k1dVpYZFBZbk5sY25acGJtY2dPaUIwYUdsekxtOWljMlZ5ZG1sdVp5a3ViV0Z3S0daMWJtTjBhVzl1SUNoa1pYQXBJSHNnY21WMGRYSnVJR1JsY0M1dVlXMWxPeUI5S1R0Y2JpQWdJQ0FnSUNBZ2RtRnlJRzlpYzJWeWRtVnljeUE5SUhWdWFYRjFaU2huWlhSUFluTmxjblpsY25Nb2RHaHBjeWt1YldGd0tHWjFibU4wYVc5dUlDaGtaWEFwSUhzZ2NtVjBkWEp1SUdSbGNDNXVZVzFsT3lCOUtTazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9LRndpWEZ4dVYyaDVVblZ1UHlCamIyMXdkWFJoZEdsdmJpQW5YQ0lnS3lCMGFHbHpMbTVoYldVZ0t5QmNJaWM2WEZ4dUlDb2dVblZ1Ym1sdVp5QmlaV05oZFhObE9pQmNJaUFySUNocGMxUnlZV05yYVc1bklEOGdYQ0piWVdOMGFYWmxYU0IwYUdVZ2RtRnNkV1VnYjJZZ2RHaHBjeUJqYjIxd2RYUmhkR2x2YmlCcGN5QnVaV1ZrWldRZ1lua2dZU0J5WldGamRHbHZibHdpSURvZ2RHaHBjeTVwYzBOdmJYQjFkR2x1WnlBL0lGd2lXMmRsZEYwZ1ZHaGxJSFpoYkhWbElHOW1JSFJvYVhNZ1kyOXRjSFYwWldRZ2QyRnpJSEpsY1hWbGMzUmxaQ0J2ZFhSemFXUmxJR0VnY21WaFkzUnBiMjVjSWlBNklGd2lXMmxrYkdWZElHNXZkQ0J5ZFc1dWFXNW5JR0YwSUhSb1pTQnRiMjFsYm5SY0lpa2dLeUJjSWx4Y2Jsd2lLU0FyWEc0Z0lDQWdJQ0FnSUNBZ0lDQW9kR2hwY3k1a1pYQmxibVJsYm1OcFpYTlRkR0YwWlNBOVBUMGdTVVJsY21sMllYUnBiMjVUZEdGMFpTNU9UMVJmVkZKQlEwdEpUa2RjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0EvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ29nVkdocGN5QmpiMjF3ZFhSaGRHbHZiaUJwY3lCemRYTndaVzVrWldRZ0tHNXZkQ0JwYmlCMWMyVWdZbmtnWVc1NUlISmxZV04wYVc5dUtTQmhibVFnZDI5dUozUWdjblZ1SUdGMWRHOXRZWFJwWTJGc2JIa3VYRnh1WEZ4MFJHbGtiaWQwSUdWNGNHVmpkQ0IwYUdseklHTnZiWEIxZEdGMGFXOXVJSFJ2SUdKbElITjFjM0JsYm1SbFpDQmhkQ0IwYUdseklIQnZhVzUwUDF4Y2JseGNkQ0FnTVM0Z1RXRnJaU0J6ZFhKbElIUm9hWE1nWTI5dGNIVjBZWFJwYjI0Z2FYTWdkWE5sWkNCaWVTQmhJSEpsWVdOMGFXOXVJQ2h5WldGamRHbHZiaXdnWVhWMGIzSjFiaXdnYjJKelpYSjJaWElwTGx4Y2JseGNkQ0FnTWk0Z1EyaGxZMnNnZDJobGRHaGxjaUI1YjNVZ1lYSmxJSFZ6YVc1bklIUm9hWE1nWTI5dGNIVjBZWFJwYjI0Z2MzbHVZMmh5YjI1dmRYTnNlU0FvYVc0Z2RHaGxJSE5oYldVZ2MzUmhZMnNnWVhNZ2RHaGxlU0J5WldGamRHbHZiaUIwYUdGMElHNWxaV1J6SUdsMEtTNWNYRzVjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSURwY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnS2lCVWFHbHpJR052YlhCMWRHRjBhVzl1SUhkcGJHd2djbVV0Y25WdUlHbG1JR0Z1ZVNCdlppQjBhR1VnWm05c2JHOTNhVzVuSUc5aWMyVnlkbUZpYkdWeklHTm9ZVzVuWlhNNlhGeHVJQ0FnSUZ3aUlDc2dhbTlwYmxOMGNtbHVaM01vYjJKelpYSjJhVzVuS1NBcklGd2lYRnh1SUNBZ0lGd2lJQ3NnS0NoMGFHbHpMbWx6UTI5dGNIVjBhVzVuSUNZbUlHbHpWSEpoWTJ0cGJtY3BJRDhnWENJZ0tDNHVMaUJ2Y2lCaGJua2diMkp6WlhKMllXSnNaU0JoWTJObGMzTmxaQ0JrZFhKcGJtY2dkR2hsSUhKbGJXRnBibVJsY2lCdlppQjBhR1VnWTNWeWNtVnVkQ0J5ZFc0cFhDSWdPaUJjSWx3aUtTQXJJRndpWEZ4dVhGeDBUV2x6YzJsdVp5QnBkR1Z0Y3lCcGJpQjBhR2x6SUd4cGMzUS9YRnh1WEZ4MElDQXhMaUJEYUdWamF5QjNhR1YwYUdWeUlHRnNiQ0IxYzJWa0lIWmhiSFZsY3lCaGNtVWdjSEp2Y0dWeWJIa2diV0Z5YTJWa0lHRnpJRzlpYzJWeWRtRmliR1VnS0hWelpTQnBjMDlpYzJWeWRtRmliR1VnZEc4Z2RtVnlhV1o1S1Z4Y2JseGNkQ0FnTWk0Z1RXRnJaU0J6ZFhKbElIbHZkU0JrYVdSdUozUWdaR1Z5WldabGNtVnVZMlVnZG1Gc2RXVnpJSFJ2YnlCbFlYSnNlUzRnVFc5aVdDQnZZbk5sY25abGN5QndjbTl3Y3l3Z2JtOTBJSEJ5YVcxcGRHbDJaWE11SUVVdVp6b2dkWE5sSUNkd1pYSnpiMjR1Ym1GdFpTY2dhVzV6ZEdWaFpDQnZaaUFuYm1GdFpTY2dhVzRnZVc5MWNpQmpiMjF3ZFhSaGRHbHZiaTVjWEc0Z0lDb2dTV1lnZEdobElHOTFkR052YldVZ2IyWWdkR2hwY3lCamIyMXdkWFJoZEdsdmJpQmphR0Z1WjJWekxDQjBhR1VnWm05c2JHOTNhVzVuSUc5aWMyVnlkbVZ5Y3lCM2FXeHNJR0psSUhKbExYSjFianBjWEc0Z0lDQWdYQ0lnS3lCcWIybHVVM1J5YVc1bmN5aHZZbk5sY25abGNuTXBJQ3NnWENKY1hHNWNJaWtwTzF4dUlDQWdJSDA3WEc0Z0lDQWdjbVYwZFhKdUlFTnZiWEIxZEdWa1ZtRnNkV1U3WEc1OUtDa3BPMXh1ZG1GeUlFbEVaWEpwZG1GMGFXOXVVM1JoZEdVN1hHNG9ablZ1WTNScGIyNGdLRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXBJSHRjYmlBZ0lDQkpSR1Z5YVhaaGRHbHZibE4wWVhSbFcwbEVaWEpwZG1GMGFXOXVVM1JoZEdWYlhDSk9UMVJmVkZKQlEwdEpUa2RjSWwwZ1BTQXRNVjBnUFNCY0lrNVBWRjlVVWtGRFMwbE9SMXdpTzF4dUlDQWdJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVmJTVVJsY21sMllYUnBiMjVUZEdGMFpWdGNJbFZRWDFSUFgwUkJWRVZjSWwwZ1BTQXdYU0E5SUZ3aVZWQmZWRTlmUkVGVVJWd2lPMXh1SUNBZ0lFbEVaWEpwZG1GMGFXOXVVM1JoZEdWYlNVUmxjbWwyWVhScGIyNVRkR0YwWlZ0Y0lsQlBVMU5KUWt4WlgxTlVRVXhGWENKZElEMGdNVjBnUFNCY0lsQlBVMU5KUWt4WlgxTlVRVXhGWENJN1hHNGdJQ0FnU1VSbGNtbDJZWFJwYjI1VGRHRjBaVnRKUkdWeWFYWmhkR2x2YmxOMFlYUmxXMXdpVTFSQlRFVmNJbDBnUFNBeVhTQTlJRndpVTFSQlRFVmNJanRjYm4wcEtFbEVaWEpwZG1GMGFXOXVVM1JoZEdVZ2ZId2dLRWxFWlhKcGRtRjBhVzl1VTNSaGRHVWdQU0I3ZlNrcE8xeHVaWGh3YjNKMGN5NUpSR1Z5YVhaaGRHbHZibE4wWVhSbElEMGdTVVJsY21sMllYUnBiMjVUZEdGMFpUdGNibVoxYm1OMGFXOXVJSE5vYjNWc1pFTnZiWEIxZEdVb1pHVnlhWFpoZEdsdmJpa2dlMXh1SUNBZ0lITjNhWFJqYUNBb1pHVnlhWFpoZEdsdmJpNWtaWEJsYm1SbGJtTnBaWE5UZEdGMFpTa2dlMXh1SUNBZ0lDQWdJQ0JqWVhObElFbEVaWEpwZG1GMGFXOXVVM1JoZEdVdVZWQmZWRTlmUkVGVVJUb2djbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCallYTmxJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVUazlVWDFSU1FVTkxTVTVIT2x4dUlDQWdJQ0FnSUNCallYTmxJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVVMVJCVEVVNklISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lDQWdJQ0JqWVhObElFbEVaWEpwZG1GMGFXOXVVM1JoZEdVdVVFOVRVMGxDVEZsZlUxUkJURVU2SUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCb1lYTkZjbkp2Y2lBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0hKbGRsVnVkSEpoWTJ0bFpDQTlJSFZ1ZEhKaFkydGxaRk4wWVhKMEtDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdlluTWdQU0JrWlhKcGRtRjBhVzl1TG05aWMyVnlkbWx1Wnl3Z2JDQTlJRzlpY3k1c1pXNW5kR2c3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCc095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc5aWFpQTlJRzlpYzF0cFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOWlhaUJwYm5OMFlXNWpaVzltSUVOdmJYQjFkR1ZrVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlpYWk1blpYUW9LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa1pYSnBkbUYwYVc5dUxtUmxjR1Z1WkdWdVkybGxjMU4wWVhSbElEMDlQU0JKUkdWeWFYWmhkR2x2YmxOMFlYUmxMbE5VUVV4RktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYUdGelJYSnliM0lnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWJuUnlZV05yWldSRmJtUW9jSEpsZGxWdWRISmhZMnRsWkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhR0Z6UlhKeWIzSWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmphR0Z1WjJWRVpYQmxibVJsYm1OcFpYTlRkR0YwWlZSdk1DaGtaWEpwZG1GMGFXOXVLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkbFZ1ZEhKaFkydGxaQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdabWx1WVd4c2VTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0doaGMwVnljbTl5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vWVc1blpVUmxjR1Z1WkdWdVkybGxjMU4wWVhSbFZHOHdLR1JsY21sMllYUnBiMjRwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYm4xY2JtWjFibU4wYVc5dUlHbHpRMjl0Y0hWMGFXNW5SR1Z5YVhaaGRHbHZiaWdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdaMnh2WW1Gc1UzUmhkR1V1ZEhKaFkydHBibWRFWlhKcGRtRjBhVzl1SUNFOVBTQnVkV3hzTzF4dWZWeHVablZ1WTNScGIyNGdZMmhsWTJ0SlpsTjBZWFJsVFc5a2FXWnBZMkYwYVc5dWMwRnlaVUZzYkc5M1pXUW9LU0I3WEc0Z0lDQWdhV1lnS0NGbmJHOWlZV3hUZEdGMFpTNWhiR3h2ZDFOMFlYUmxRMmhoYm1kbGN5a2dlMXh1SUNBZ0lDQWdJQ0JwYm5aaGNtbGhiblFvWm1Gc2MyVXNJR2RzYjJKaGJGTjBZWFJsTG5OMGNtbGpkRTF2WkdWY2JpQWdJQ0FnSUNBZ0lDQWdJRDhnWENKSmRDQnBjeUJ1YjNRZ1lXeHNiM2RsWkNCMGJ5QmpjbVZoZEdVZ2IzSWdZMmhoYm1kbElITjBZWFJsSUc5MWRITnBaR1VnWVc0Z1lHRmpkR2x2Ym1BZ2QyaGxiaUJOYjJKWUlHbHpJR2x1SUhOMGNtbGpkQ0J0YjJSbExpQlhjbUZ3SUhSb1pTQmpkWEp5Wlc1MElHMWxkR2h2WkNCcGJpQmdZV04wYVc5dVlDQnBaaUIwYUdseklITjBZWFJsSUdOb1lXNW5aU0JwY3lCcGJuUmxibVJsWkZ3aVhHNGdJQ0FnSUNBZ0lDQWdJQ0E2SUZ3aVNYUWdhWE1nYm05MElHRnNiRzkzWldRZ2RHOGdZMmhoYm1kbElIUm9aU0J6ZEdGMFpTQjNhR1Z1SUdFZ1kyOXRjSFYwWldRZ2RtRnNkV1VnYjNJZ2RISmhibk5tYjNKdFpYSWdhWE1nWW1WcGJtY2daWFpoYkhWaGRHVmtMaUJWYzJVZ0oyRjFkRzl5ZFc0bklIUnZJR055WldGMFpTQnlaV0ZqZEdsMlpTQm1kVzVqZEdsdmJuTWdkMmwwYUNCemFXUmxMV1ZtWm1WamRITXVYQ0lwTzF4dUlDQWdJSDFjYm4xY2JtWjFibU4wYVc5dUlIUnlZV05yUkdWeWFYWmxaRVoxYm1OMGFXOXVLR1JsY21sMllYUnBiMjRzSUdZcElIdGNiaUFnSUNCamFHRnVaMlZFWlhCbGJtUmxibU5wWlhOVGRHRjBaVlJ2TUNoa1pYSnBkbUYwYVc5dUtUdGNiaUFnSUNCa1pYSnBkbUYwYVc5dUxtNWxkMDlpYzJWeWRtbHVaeUE5SUc1bGR5QkJjbkpoZVNoa1pYSnBkbUYwYVc5dUxtOWljMlZ5ZG1sdVp5NXNaVzVuZEdnZ0t5QXhNREFwTzF4dUlDQWdJR1JsY21sMllYUnBiMjR1ZFc1aWIzVnVaRVJsY0hORGIzVnVkQ0E5SURBN1hHNGdJQ0FnWkdWeWFYWmhkR2x2Ymk1eWRXNUpaQ0E5SUNzcloyeHZZbUZzVTNSaGRHVXVjblZ1U1dRN1hHNGdJQ0FnZG1GeUlIQnlaWFpVY21GamEybHVaeUE5SUdkc2IySmhiRk4wWVhSbExuUnlZV05yYVc1blJHVnlhWFpoZEdsdmJqdGNiaUFnSUNCbmJHOWlZV3hUZEdGMFpTNTBjbUZqYTJsdVowUmxjbWwyWVhScGIyNGdQU0JrWlhKcGRtRjBhVzl1TzF4dUlDQWdJSFpoY2lCb1lYTkZlR05sY0hScGIyNGdQU0IwY25WbE8xeHVJQ0FnSUhaaGNpQnlaWE4xYkhRN1hHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdaaTVqWVd4c0tHUmxjbWwyWVhScGIyNHBPMXh1SUNBZ0lDQWdJQ0JvWVhORmVHTmxjSFJwYjI0Z1BTQm1ZV3h6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdabWx1WVd4c2VTQjdYRzRnSUNBZ0lDQWdJR2xtSUNob1lYTkZlR05sY0hScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHaGhibVJzWlVWNFkyVndkR2x2YmtsdVJHVnlhWFpoZEdsdmJpaGtaWEpwZG1GMGFXOXVLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHZHNiMkpoYkZOMFlYUmxMblJ5WVdOcmFXNW5SR1Z5YVhaaGRHbHZiaUE5SUhCeVpYWlVjbUZqYTJsdVp6dGNiaUFnSUNBZ0lDQWdJQ0FnSUdKcGJtUkVaWEJsYm1SbGJtTnBaWE1vWkdWeWFYWmhkR2x2YmlrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNibjFjYm1aMWJtTjBhVzl1SUdoaGJtUnNaVVY0WTJWd2RHbHZia2x1UkdWeWFYWmhkR2x2Ymloa1pYSnBkbUYwYVc5dUtTQjdYRzRnSUNBZ2RtRnlJRzFsYzNOaFoyVWdQU0FvWENKYmJXOWllRjBnUVc0Z2RXNWpZWFZuYUhRZ1pYaGpaWEIwYVc5dUlHOWpZM1Z5Y21Wa0lIZG9hV3hsSUdOaGJHTjFiR0YwYVc1bklIbHZkWElnWTI5dGNIVjBaV1FnZG1Gc2RXVXNJR0YxZEc5eWRXNGdiM0lnZEhKaGJuTm1iM0p0WlhJdUlFOXlJR2x1YzJsa1pTQjBhR1VnY21WdVpHVnlLQ2tnYldWMGFHOWtJRzltSUdGdUlHOWljMlZ5ZG1WeUlHSmhjMlZrSUZKbFlXTjBJR052YlhCdmJtVnVkQzRnWENJZ0sxeHVJQ0FnSUNBZ0lDQmNJbFJvWlhObElHWjFibU4wYVc5dWN5QnphRzkxYkdRZ2JtVjJaWElnZEdoeWIzY2daWGhqWlhCMGFXOXVjeUJoY3lCTmIySllJSGRwYkd3Z2JtOTBJR0ZzZDJGNWN5QmlaU0JoWW14bElIUnZJSEpsWTI5MlpYSWdabkp2YlNCMGFHVnRMaUJjSWlBclhHNGdJQ0FnSUNBZ0lDaGNJbEJzWldGelpTQm1hWGdnZEdobElHVnljbTl5SUhKbGNHOXlkR1ZrSUdGbWRHVnlJSFJvYVhNZ2JXVnpjMkZuWlNCdmNpQmxibUZpYkdVZ0oxQmhkWE5sSUc5dUlDaGpZWFZuYUhRcElHVjRZMlZ3ZEdsdmJuTW5JR2x1SUhsdmRYSWdaR1ZpZFdkblpYSWdkRzhnWm1sdVpDQjBhR1VnY205dmRDQmpZWFZ6WlM0Z1NXNDZJQ2RjSWlBcklHUmxjbWwyWVhScGIyNHVibUZ0WlNBcklGd2lKeTRnWENJcElDdGNiaUFnSUNBZ0lDQWdYQ0pHYjNJZ2JXOXlaU0JrWlhSaGFXeHpJSE5sWlNCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdmJXOWllR3B6TDIxdlluZ3ZhWE56ZFdWekx6UTJNbHdpS1R0Y2JpQWdJQ0JwWmlBb2FYTlRjSGxGYm1GaWJHVmtLQ2twSUh0Y2JpQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMEtIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpWlhKeWIzSmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxjM05oWjJVNklHMWxjM05oWjJWY2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdOdmJuTnZiR1V1ZDJGeWJpaHRaWE56WVdkbEtUdGNiaUFnSUNCamFHRnVaMlZFWlhCbGJtUmxibU5wWlhOVGRHRjBaVlJ2TUNoa1pYSnBkbUYwYVc5dUtUdGNiaUFnSUNCa1pYSnBkbUYwYVc5dUxtNWxkMDlpYzJWeWRtbHVaeUE5SUc1MWJHdzdYRzRnSUNBZ1pHVnlhWFpoZEdsdmJpNTFibUp2ZFc1a1JHVndjME52ZFc1MElEMGdNRHRjYmlBZ0lDQmtaWEpwZG1GMGFXOXVMbkpsWTI5MlpYSkdjbTl0UlhKeWIzSW9LVHRjYmlBZ0lDQmxibVJDWVhSamFDZ3BPMXh1SUNBZ0lISmxjMlYwUjJ4dlltRnNVM1JoZEdVb0tUdGNibjFjYm1aMWJtTjBhVzl1SUdKcGJtUkVaWEJsYm1SbGJtTnBaWE1vWkdWeWFYWmhkR2x2YmlrZ2UxeHVJQ0FnSUhaaGNpQndjbVYyVDJKelpYSjJhVzVuSUQwZ1pHVnlhWFpoZEdsdmJpNXZZbk5sY25acGJtYzdYRzRnSUNBZ2RtRnlJRzlpYzJWeWRtbHVaeUE5SUdSbGNtbDJZWFJwYjI0dWIySnpaWEoyYVc1bklEMGdaR1Z5YVhaaGRHbHZiaTV1WlhkUFluTmxjblpwYm1jN1hHNGdJQ0FnWkdWeWFYWmhkR2x2Ymk1dVpYZFBZbk5sY25acGJtY2dQU0J1ZFd4c08xeHVJQ0FnSUhaaGNpQnBNQ0E5SURBc0lHd2dQU0JrWlhKcGRtRjBhVzl1TG5WdVltOTFibVJFWlhCelEyOTFiblE3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JzT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHUmxjQ0E5SUc5aWMyVnlkbWx1WjF0cFhUdGNiaUFnSUNBZ0lDQWdhV1lnS0dSbGNDNWthV1ptVm1Gc2RXVWdQVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbGNDNWthV1ptVm1Gc2RXVWdQU0F4TzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0drd0lDRTlQU0JwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5aWMyVnlkbWx1WjF0cE1GMGdQU0JrWlhBN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwTUNzck8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUc5aWMyVnlkbWx1Wnk1c1pXNW5kR2dnUFNCcE1EdGNiaUFnSUNCc0lEMGdjSEpsZGs5aWMyVnlkbWx1Wnk1c1pXNW5kR2c3WEc0Z0lDQWdkMmhwYkdVZ0tHd3RMU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdaR1Z3SUQwZ2NISmxkazlpYzJWeWRtbHVaMXRzWFR0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1JsY0M1a2FXWm1WbUZzZFdVZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYlc5MlpVOWljMlZ5ZG1WeUtHUmxjQ3dnWkdWeWFYWmhkR2x2YmlrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaR1Z3TG1ScFptWldZV3gxWlNBOUlEQTdYRzRnSUNBZ2ZWeHVJQ0FnSUhkb2FXeGxJQ2hwTUMwdEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCa1pYQWdQU0J2WW5ObGNuWnBibWRiYVRCZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWkdWd0xtUnBabVpXWVd4MVpTQTlQVDBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWd0xtUnBabVpXWVd4MVpTQTlJREE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmhaR1JQWW5ObGNuWmxjaWhrWlhBc0lHUmxjbWwyWVhScGIyNHBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1ZlZ4dVpuVnVZM1JwYjI0Z1kyeGxZWEpQWW5ObGNuWnBibWNvWkdWeWFYWmhkR2x2YmlrZ2UxeHVJQ0FnSUhaaGNpQnZZbk1nUFNCa1pYSnBkbUYwYVc5dUxtOWljMlZ5ZG1sdVp6dGNiaUFnSUNCMllYSWdhU0E5SUc5aWN5NXNaVzVuZEdnN1hHNGdJQ0FnZDJocGJHVWdLR2t0TFNsY2JpQWdJQ0FnSUNBZ2NtVnRiM1psVDJKelpYSjJaWElvYjJKelcybGRMQ0JrWlhKcGRtRjBhVzl1S1R0Y2JpQWdJQ0JrWlhKcGRtRjBhVzl1TG1SbGNHVnVaR1Z1WTJsbGMxTjBZWFJsSUQwZ1NVUmxjbWwyWVhScGIyNVRkR0YwWlM1T1QxUmZWRkpCUTB0SlRrYzdYRzRnSUNBZ2IySnpMbXhsYm1kMGFDQTlJREE3WEc1OVhHNW1kVzVqZEdsdmJpQjFiblJ5WVdOclpXUW9ZV04wYVc5dUtTQjdYRzRnSUNBZ2RtRnlJSEJ5WlhZZ1BTQjFiblJ5WVdOclpXUlRkR0Z5ZENncE8xeHVJQ0FnSUhaaGNpQnlaWE1nUFNCaFkzUnBiMjRvS1R0Y2JpQWdJQ0IxYm5SeVlXTnJaV1JGYm1Rb2NISmxkaWs3WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JtVjRjRzl5ZEhNdWRXNTBjbUZqYTJWa0lEMGdkVzUwY21GamEyVmtPMXh1Wm5WdVkzUnBiMjRnZFc1MGNtRmphMlZrVTNSaGNuUW9LU0I3WEc0Z0lDQWdkbUZ5SUhCeVpYWWdQU0JuYkc5aVlXeFRkR0YwWlM1MGNtRmphMmx1WjBSbGNtbDJZWFJwYjI0N1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWRISmhZMnRwYm1kRVpYSnBkbUYwYVc5dUlEMGdiblZzYkR0Y2JpQWdJQ0J5WlhSMWNtNGdjSEpsZGp0Y2JuMWNibVoxYm1OMGFXOXVJSFZ1ZEhKaFkydGxaRVZ1WkNod2NtVjJLU0I3WEc0Z0lDQWdaMnh2WW1Gc1UzUmhkR1V1ZEhKaFkydHBibWRFWlhKcGRtRjBhVzl1SUQwZ2NISmxkanRjYm4xY2JtWjFibU4wYVc5dUlHTm9ZVzVuWlVSbGNHVnVaR1Z1WTJsbGMxTjBZWFJsVkc4d0tHUmxjbWwyWVhScGIyNHBJSHRjYmlBZ0lDQnBaaUFvWkdWeWFYWmhkR2x2Ymk1a1pYQmxibVJsYm1OcFpYTlRkR0YwWlNBOVBUMGdTVVJsY21sMllYUnBiMjVUZEdGMFpTNVZVRjlVVDE5RVFWUkZLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ1pHVnlhWFpoZEdsdmJpNWtaWEJsYm1SbGJtTnBaWE5UZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVWVkJmVkU5ZlJFRlVSVHRjYmlBZ0lDQjJZWElnYjJKeklEMGdaR1Z5YVhaaGRHbHZiaTV2WW5ObGNuWnBibWM3WEc0Z0lDQWdkbUZ5SUdrZ1BTQnZZbk11YkdWdVozUm9PMXh1SUNBZ0lIZG9hV3hsSUNocExTMHBYRzRnSUNBZ0lDQWdJRzlpYzF0cFhTNXNiM2RsYzNSUFluTmxjblpsY2xOMFlYUmxJRDBnU1VSbGNtbDJZWFJwYjI1VGRHRjBaUzVWVUY5VVQxOUVRVlJGTzF4dWZWeHVkbUZ5SUhCbGNuTnBjM1JsYm5STFpYbHpJRDBnVzF3aWJXOWllRWQxYVdSY0lpd2dYQ0p5WlhObGRFbGtYQ0lzSUZ3aWMzQjVUR2x6ZEdWdVpYSnpYQ0lzSUZ3aWMzUnlhV04wVFc5a1pWd2lMQ0JjSW5KMWJrbGtYQ0pkTzF4dWRtRnlJRTF2WWxoSGJHOWlZV3h6SUQwZ0tHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQm1kVzVqZEdsdmJpQk5iMkpZUjJ4dlltRnNjeWdwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUyWlhKemFXOXVJRDBnTkR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUwY21GamEybHVaMFJsY21sMllYUnBiMjRnUFNCdWRXeHNPMXh1SUNBZ0lDQWdJQ0IwYUdsekxuSjFia2xrSUQwZ01EdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dGIySjRSM1ZwWkNBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWFXNVVjbUZ1YzJGamRHbHZiaUE5SURBN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhOU2RXNXVhVzVuVW1WaFkzUnBiMjV6SUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhVzVDWVhSamFDQTlJREE3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjR1Z1WkdsdVoxVnViMkp6WlhKMllYUnBiMjV6SUQwZ1cxMDdYRzRnSUNBZ0lDQWdJSFJvYVhNdWNHVnVaR2x1WjFKbFlXTjBhVzl1Y3lBOUlGdGRPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtRnNiRzkzVTNSaGRHVkRhR0Z1WjJWeklEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV6ZEhKcFkzUk5iMlJsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjbVZ6WlhSSlpDQTlJREE3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjM0I1VEdsemRHVnVaWEp6SUQwZ1cxMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJOYjJKWVIyeHZZbUZzY3p0Y2JuMG9LU2s3WEc1MllYSWdaMnh2WW1Gc1UzUmhkR1VnUFNBb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lIWmhjaUJ5WlhNZ1BTQnVaWGNnVFc5aVdFZHNiMkpoYkhNb0tUdGNiaUFnSUNCcFppQW9aMnh2WW1Gc0xsOWZiVzlpYzJWeWRtRmliR1ZVY21GamEybHVaMU4wWVdOcklIeDhJR2RzYjJKaGJDNWZYMjF2WW5ObGNuWmhZbXhsVm1sbGQxTjBZV05yS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKYmJXOWllRjBnUVc0Z2FXNWpiMjF3WVhScFlteGxJSFpsY25OcGIyNGdiMllnYlc5aWMyVnlkbUZpYkdVZ2FYTWdZV3h5WldGa2VTQnNiMkZrWldRdVhDSXBPMXh1SUNBZ0lHbG1JQ2huYkc5aVlXd3VYMTl0YjJKNFIyeHZZbUZzSUNZbUlHZHNiMkpoYkM1ZlgyMXZZbmhIYkc5aVlXd3VkbVZ5YzJsdmJpQWhQVDBnY21WekxuWmxjbk5wYjI0cFhHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0lsdHRiMko0WFNCQmJpQnBibU52YlhCaGRHbGliR1VnZG1WeWMybHZiaUJ2WmlCdGIySjRJR2x6SUdGc2NtVmhaSGtnYkc5aFpHVmtMbHdpS1R0Y2JpQWdJQ0JwWmlBb1oyeHZZbUZzTGw5ZmJXOWllRWRzYjJKaGJDbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHZHNiMkpoYkM1ZlgyMXZZbmhIYkc5aVlXdzdYRzRnSUNBZ2NtVjBkWEp1SUdkc2IySmhiQzVmWDIxdlluaEhiRzlpWVd3Z1BTQnlaWE03WEc1OUtTZ3BPMXh1Wm5WdVkzUnBiMjRnY21WbmFYTjBaWEpIYkc5aVlXeHpLQ2tnZTF4dWZWeHVablZ1WTNScGIyNGdjbVZ6WlhSSGJHOWlZV3hUZEdGMFpTZ3BJSHRjYmlBZ0lDQm5iRzlpWVd4VGRHRjBaUzV5WlhObGRFbGtLeXM3WEc0Z0lDQWdkbUZ5SUdSbFptRjFiSFJIYkc5aVlXeHpJRDBnYm1WM0lFMXZZbGhIYkc5aVlXeHpLQ2s3WEc0Z0lDQWdabTl5SUNoMllYSWdhMlY1SUdsdUlHUmxabUYxYkhSSGJHOWlZV3h6S1Z4dUlDQWdJQ0FnSUNCcFppQW9jR1Z5YzJsemRHVnVkRXRsZVhNdWFXNWtaWGhQWmloclpYa3BJRDA5UFNBdE1TbGNiaUFnSUNBZ0lDQWdJQ0FnSUdkc2IySmhiRk4wWVhSbFcydGxlVjBnUFNCa1pXWmhkV3gwUjJ4dlltRnNjMXRyWlhsZE8xeHVJQ0FnSUdkc2IySmhiRk4wWVhSbExtRnNiRzkzVTNSaGRHVkRhR0Z1WjJWeklEMGdJV2RzYjJKaGJGTjBZWFJsTG5OMGNtbGpkRTF2WkdVN1hHNTlYRzVtZFc1amRHbHZiaUJvWVhOUFluTmxjblpsY25Nb2IySnpaWEoyWVdKc1pTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdlluTmxjblpoWW14bExtOWljMlZ5ZG1WeWN5QW1KaUJ2WW5ObGNuWmhZbXhsTG05aWMyVnlkbVZ5Y3k1c1pXNW5kR2dnUGlBd08xeHVmVnh1Wm5WdVkzUnBiMjRnWjJWMFQySnpaWEoyWlhKektHOWljMlZ5ZG1GaWJHVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2IySnpaWEoyWVdKc1pTNXZZbk5sY25abGNuTTdYRzU5WEc1bWRXNWpkR2x2YmlCcGJuWmhjbWxoYm5SUFluTmxjblpsY25Nb2IySnpaWEoyWVdKc1pTa2dlMXh1SUNBZ0lIWmhjaUJzYVhOMElEMGdiMkp6WlhKMllXSnNaUzV2WW5ObGNuWmxjbk03WEc0Z0lDQWdkbUZ5SUcxaGNDQTlJRzlpYzJWeWRtRmliR1V1YjJKelpYSjJaWEp6U1c1a1pYaGxjenRjYmlBZ0lDQjJZWElnYkNBOUlHeHBjM1F1YkdWdVozUm9PMXh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2diRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCcFpDQTlJR3hwYzNSYmFWMHVYMTl0WVhCcFpEdGNiaUFnSUNBZ0lDQWdhV1lnS0drcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWRtRnlhV0Z1ZENodFlYQmJhV1JkSUQwOVBTQnBMQ0JjSWtsT1ZFVlNUa0ZNSUVWU1VrOVNJRzFoY0hNZ1pHVnlhWFpoZEdsdmJpNWZYMjFoY0dsa0lIUnZJR2x1WkdWNElHbHVJR3hwYzNSY0lpazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJuWmhjbWxoYm5Rb0lTaHBaQ0JwYmlCdFlYQXBMQ0JjSWtsT1ZFVlNUa0ZNSUVWU1VrOVNJRzlpYzJWeWRtVnlJRzl1SUdsdVpHVjRJREFnYzJodmRXeGtiblFnWW1VZ2FHVnNaQ0JwYmlCdFlYQXVYQ0lwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJR2x1ZG1GeWFXRnVkQ2hzYVhOMExteGxibWQwYUNBOVBUMGdNQ0I4ZkNCUFltcGxZM1F1YTJWNWN5aHRZWEFwTG14bGJtZDBhQ0E5UFQwZ2JHbHpkQzVzWlc1bmRHZ2dMU0F4TENCY0lrbE9WRVZTVGtGTUlFVlNVazlTSUhSb1pYSmxJR2x6SUc1dklHcDFibXNnYVc0Z2JXRndYQ0lwTzF4dWZWeHVablZ1WTNScGIyNGdZV1JrVDJKelpYSjJaWElvYjJKelpYSjJZV0pzWlN3Z2JtOWtaU2tnZTF4dUlDQWdJSFpoY2lCc0lEMGdiMkp6WlhKMllXSnNaUzV2WW5ObGNuWmxjbk11YkdWdVozUm9PMXh1SUNBZ0lHbG1JQ2hzS1NCN1hHNGdJQ0FnSUNBZ0lHOWljMlZ5ZG1GaWJHVXViMkp6WlhKMlpYSnpTVzVrWlhobGMxdHViMlJsTGw5ZmJXRndhV1JkSUQwZ2JEdGNiaUFnSUNCOVhHNGdJQ0FnYjJKelpYSjJZV0pzWlM1dlluTmxjblpsY25OYmJGMGdQU0J1YjJSbE8xeHVJQ0FnSUdsbUlDaHZZbk5sY25aaFlteGxMbXh2ZDJWemRFOWljMlZ5ZG1WeVUzUmhkR1VnUGlCdWIyUmxMbVJsY0dWdVpHVnVZMmxsYzFOMFlYUmxLVnh1SUNBZ0lDQWdJQ0J2WW5ObGNuWmhZbXhsTG14dmQyVnpkRTlpYzJWeWRtVnlVM1JoZEdVZ1BTQnViMlJsTG1SbGNHVnVaR1Z1WTJsbGMxTjBZWFJsTzF4dWZWeHVablZ1WTNScGIyNGdjbVZ0YjNabFQySnpaWEoyWlhJb2IySnpaWEoyWVdKc1pTd2dibTlrWlNrZ2UxeHVJQ0FnSUdsbUlDaHZZbk5sY25aaFlteGxMbTlpYzJWeWRtVnljeTVzWlc1bmRHZ2dQVDA5SURFcElIdGNiaUFnSUNBZ0lDQWdiMkp6WlhKMllXSnNaUzV2WW5ObGNuWmxjbk11YkdWdVozUm9JRDBnTUR0Y2JpQWdJQ0FnSUNBZ2NYVmxkV1ZHYjNKVmJtOWljMlZ5ZG1GMGFXOXVLRzlpYzJWeWRtRmliR1VwTzF4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR3hwYzNRZ1BTQnZZbk5sY25aaFlteGxMbTlpYzJWeWRtVnljenRjYmlBZ0lDQWdJQ0FnZG1GeUlHMWhjRjh4SUQwZ2IySnpaWEoyWVdKc1pTNXZZbk5sY25abGNuTkpibVJsZUdWek8xeHVJQ0FnSUNBZ0lDQjJZWElnWm1sc2JHVnlJRDBnYkdsemRDNXdiM0FvS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1pwYkd4bGNpQWhQVDBnYm05a1pTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2x1WkdWNElEMGdiV0Z3WHpGYmJtOWtaUzVmWDIxaGNHbGtYU0I4ZkNBd08xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVaR1Y0S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRndYekZiWm1sc2JHVnlMbDlmYldGd2FXUmRJRDBnYVc1a1pYZzdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaV3hsZEdVZ2JXRndYekZiWm1sc2JHVnlMbDlmYldGd2FXUmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsemRGdHBibVJsZUYwZ1BTQm1hV3hzWlhJN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaR1ZzWlhSbElHMWhjRjh4VzI1dlpHVXVYMTl0WVhCcFpGMDdYRzRnSUNBZ2ZWeHVmVnh1Wm5WdVkzUnBiMjRnY1hWbGRXVkdiM0pWYm05aWMyVnlkbUYwYVc5dUtHOWljMlZ5ZG1GaWJHVXBJSHRjYmlBZ0lDQnBaaUFvSVc5aWMyVnlkbUZpYkdVdWFYTlFaVzVrYVc1blZXNXZZbk5sY25aaGRHbHZiaWtnZTF4dUlDQWdJQ0FnSUNCdlluTmxjblpoWW14bExtbHpVR1Z1WkdsdVoxVnViMkp6WlhKMllYUnBiMjRnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0JuYkc5aVlXeFRkR0YwWlM1d1pXNWthVzVuVlc1dlluTmxjblpoZEdsdmJuTXVjSFZ6YUNodlluTmxjblpoWW14bEtUdGNiaUFnSUNCOVhHNTlYRzVtZFc1amRHbHZiaUJ6ZEdGeWRFSmhkR05vS0NrZ2UxeHVJQ0FnSUdkc2IySmhiRk4wWVhSbExtbHVRbUYwWTJnckt6dGNibjFjYm1aMWJtTjBhVzl1SUdWdVpFSmhkR05vS0NrZ2UxeHVJQ0FnSUdsbUlDaG5iRzlpWVd4VGRHRjBaUzVwYmtKaGRHTm9JRDA5UFNBeEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCc2FYTjBJRDBnWjJ4dlltRnNVM1JoZEdVdWNHVnVaR2x1WjFWdWIySnpaWEoyWVhScGIyNXpPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4cGMzUXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdlluTmxjblpoWW14bFh6RWdQU0JzYVhOMFcybGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2IySnpaWEoyWVdKc1pWOHhMbWx6VUdWdVpHbHVaMVZ1YjJKelpYSjJZWFJwYjI0Z1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodlluTmxjblpoWW14bFh6RXViMkp6WlhKMlpYSnpMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWljMlZ5ZG1GaWJHVmZNUzV2YmtKbFkyOXRaVlZ1YjJKelpYSjJaV1FvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCbmJHOWlZV3hUZEdGMFpTNXdaVzVrYVc1blZXNXZZbk5sY25aaGRHbHZibk1nUFNCYlhUdGNiaUFnSUNCOVhHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFXNUNZWFJqYUMwdE8xeHVmVnh1Wm5WdVkzUnBiMjRnY21Wd2IzSjBUMkp6WlhKMlpXUW9iMkp6WlhKMllXSnNaU2tnZTF4dUlDQWdJSFpoY2lCa1pYSnBkbUYwYVc5dUlEMGdaMnh2WW1Gc1UzUmhkR1V1ZEhKaFkydHBibWRFWlhKcGRtRjBhVzl1TzF4dUlDQWdJR2xtSUNoa1pYSnBkbUYwYVc5dUlDRTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoa1pYSnBkbUYwYVc5dUxuSjFia2xrSUNFOVBTQnZZbk5sY25aaFlteGxMbXhoYzNSQlkyTmxjM05sWkVKNUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCdlluTmxjblpoWW14bExteGhjM1JCWTJObGMzTmxaRUo1SUQwZ1pHVnlhWFpoZEdsdmJpNXlkVzVKWkR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1JsY21sMllYUnBiMjR1Ym1WM1QySnpaWEoyYVc1blcyUmxjbWwyWVhScGIyNHVkVzVpYjNWdVpFUmxjSE5EYjNWdWRDc3JYU0E5SUc5aWMyVnlkbUZpYkdVN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnWld4elpTQnBaaUFvYjJKelpYSjJZV0pzWlM1dlluTmxjblpsY25NdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0FnSUhGMVpYVmxSbTl5Vlc1dlluTmxjblpoZEdsdmJpaHZZbk5sY25aaFlteGxLVHRjYmlBZ0lDQjlYRzU5WEc1bWRXNWpkR2x2YmlCcGJuWmhjbWxoYm5STVQxTW9iMkp6WlhKMllXSnNaU3dnYlhObktTQjdYRzRnSUNBZ2RtRnlJRzFwYmlBOUlHZGxkRTlpYzJWeWRtVnljeWh2WW5ObGNuWmhZbXhsS1M1eVpXUjFZMlVvWm5WdVkzUnBiMjRnS0dFc0lHSXBJSHNnY21WMGRYSnVJRTFoZEdndWJXbHVLR0VzSUdJdVpHVndaVzVrWlc1amFXVnpVM1JoZEdVcE95QjlMQ0F5S1R0Y2JpQWdJQ0JwWmlBb2JXbHVJRDQ5SUc5aWMyVnlkbUZpYkdVdWJHOTNaWE4wVDJKelpYSjJaWEpUZEdGMFpTbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSW14dmQyVnpkRTlpYzJWeWRtVnlVM1JoZEdVZ2FYTWdkM0p2Ym1jZ1ptOXlJRndpSUNzZ2JYTm5JQ3NnWENJZ1ltVmpZWFZ6WlNCY0lpQXJJRzFwYmlBcklGd2lJRHdnWENJZ0t5QnZZbk5sY25aaFlteGxMbXh2ZDJWemRFOWljMlZ5ZG1WeVUzUmhkR1VwTzF4dWZWeHVablZ1WTNScGIyNGdjSEp2Y0dGbllYUmxRMmhoYm1kbFpDaHZZbk5sY25aaFlteGxLU0I3WEc0Z0lDQWdhV1lnS0c5aWMyVnlkbUZpYkdVdWJHOTNaWE4wVDJKelpYSjJaWEpUZEdGMFpTQTlQVDBnU1VSbGNtbDJZWFJwYjI1VGRHRjBaUzVUVkVGTVJTbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUc5aWMyVnlkbUZpYkdVdWJHOTNaWE4wVDJKelpYSjJaWEpUZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVVMVJCVEVVN1hHNGdJQ0FnZG1GeUlHOWljMlZ5ZG1WeWN5QTlJRzlpYzJWeWRtRmliR1V1YjJKelpYSjJaWEp6TzF4dUlDQWdJSFpoY2lCcElEMGdiMkp6WlhKMlpYSnpMbXhsYm1kMGFEdGNiaUFnSUNCM2FHbHNaU0FvYVMwdEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCa0lEMGdiMkp6WlhKMlpYSnpXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9aQzVrWlhCbGJtUmxibU5wWlhOVGRHRjBaU0E5UFQwZ1NVUmxjbWwyWVhScGIyNVRkR0YwWlM1VlVGOVVUMTlFUVZSRktWeHVJQ0FnSUNBZ0lDQWdJQ0FnWkM1dmJrSmxZMjl0WlZOMFlXeGxLQ2s3WEc0Z0lDQWdJQ0FnSUdRdVpHVndaVzVrWlc1amFXVnpVM1JoZEdVZ1BTQkpSR1Z5YVhaaGRHbHZibE4wWVhSbExsTlVRVXhGTzF4dUlDQWdJSDFjYm4xY2JtWjFibU4wYVc5dUlIQnliM0JoWjJGMFpVTm9ZVzVuWlVOdmJtWnBjbTFsWkNodlluTmxjblpoWW14bEtTQjdYRzRnSUNBZ2FXWWdLRzlpYzJWeWRtRmliR1V1Ykc5M1pYTjBUMkp6WlhKMlpYSlRkR0YwWlNBOVBUMGdTVVJsY21sMllYUnBiMjVUZEdGMFpTNVRWRUZNUlNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJRzlpYzJWeWRtRmliR1V1Ykc5M1pYTjBUMkp6WlhKMlpYSlRkR0YwWlNBOUlFbEVaWEpwZG1GMGFXOXVVM1JoZEdVdVUxUkJURVU3WEc0Z0lDQWdkbUZ5SUc5aWMyVnlkbVZ5Y3lBOUlHOWljMlZ5ZG1GaWJHVXViMkp6WlhKMlpYSnpPMXh1SUNBZ0lIWmhjaUJwSUQwZ2IySnpaWEoyWlhKekxteGxibWQwYUR0Y2JpQWdJQ0IzYUdsc1pTQW9hUzB0S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJrSUQwZ2IySnpaWEoyWlhKelcybGRPMXh1SUNBZ0lDQWdJQ0JwWmlBb1pDNWtaWEJsYm1SbGJtTnBaWE5UZEdGMFpTQTlQVDBnU1VSbGNtbDJZWFJwYjI1VGRHRjBaUzVRVDFOVFNVSk1XVjlUVkVGTVJTbGNiaUFnSUNBZ0lDQWdJQ0FnSUdRdVpHVndaVzVrWlc1amFXVnpVM1JoZEdVZ1BTQkpSR1Z5YVhaaGRHbHZibE4wWVhSbExsTlVRVXhGTzF4dUlDQWdJQ0FnSUNCbGJITmxJR2xtSUNoa0xtUmxjR1Z1WkdWdVkybGxjMU4wWVhSbElEMDlQU0JKUkdWeWFYWmhkR2x2YmxOMFlYUmxMbFZRWDFSUFgwUkJWRVVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZZbk5sY25aaFlteGxMbXh2ZDJWemRFOWljMlZ5ZG1WeVUzUmhkR1VnUFNCSlJHVnlhWFpoZEdsdmJsTjBZWFJsTGxWUVgxUlBYMFJCVkVVN1hHNGdJQ0FnZlZ4dWZWeHVablZ1WTNScGIyNGdjSEp2Y0dGbllYUmxUV0Y1WW1WRGFHRnVaMlZrS0c5aWMyVnlkbUZpYkdVcElIdGNiaUFnSUNCcFppQW9iMkp6WlhKMllXSnNaUzVzYjNkbGMzUlBZbk5sY25abGNsTjBZWFJsSUNFOVBTQkpSR1Z5YVhaaGRHbHZibE4wWVhSbExsVlFYMVJQWDBSQlZFVXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCdlluTmxjblpoWW14bExteHZkMlZ6ZEU5aWMyVnlkbVZ5VTNSaGRHVWdQU0JKUkdWeWFYWmhkR2x2YmxOMFlYUmxMbEJQVTFOSlFreFpYMU5VUVV4Rk8xeHVJQ0FnSUhaaGNpQnZZbk5sY25abGNuTWdQU0J2WW5ObGNuWmhZbXhsTG05aWMyVnlkbVZ5Y3p0Y2JpQWdJQ0IyWVhJZ2FTQTlJRzlpYzJWeWRtVnljeTVzWlc1bmRHZzdYRzRnSUNBZ2QyaHBiR1VnS0drdExTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ1pDQTlJRzlpYzJWeWRtVnljMXRwWFR0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1F1WkdWd1pXNWtaVzVqYVdWelUzUmhkR1VnUFQwOUlFbEVaWEpwZG1GMGFXOXVVM1JoZEdVdVZWQmZWRTlmUkVGVVJTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pDNWtaWEJsYm1SbGJtTnBaWE5UZEdGMFpTQTlJRWxFWlhKcGRtRjBhVzl1VTNSaGRHVXVVRTlUVTBsQ1RGbGZVMVJCVEVVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrTG05dVFtVmpiMjFsVTNSaGJHVW9LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYm4xY2JuWmhjaUJTWldGamRHbHZiaUE5SUNobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ1puVnVZM1JwYjI0Z1VtVmhZM1JwYjI0b2JtRnRaU3dnYjI1SmJuWmhiR2xrWVhSbEtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNodVlXMWxJRDA5UFNCMmIybGtJREFwSUhzZ2JtRnRaU0E5SUZ3aVVtVmhZM1JwYjI1QVhDSWdLeUJuWlhST1pYaDBTV1FvS1RzZ2ZWeHVJQ0FnSUNBZ0lDQjBhR2x6TG01aGJXVWdQU0J1WVcxbE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG05dVNXNTJZV3hwWkdGMFpTQTlJRzl1U1c1MllXeHBaR0YwWlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV2WW5ObGNuWnBibWNnUFNCYlhUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dVpYZFBZbk5sY25acGJtY2dQU0JiWFR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVrWlhCbGJtUmxibU5wWlhOVGRHRjBaU0E5SUVsRVpYSnBkbUYwYVc5dVUzUmhkR1V1VGs5VVgxUlNRVU5MU1U1SE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1ScFptWldZV3gxWlNBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWNuVnVTV1FnUFNBd08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5WdVltOTFibVJFWlhCelEyOTFiblFnUFNBd08xeHVJQ0FnSUNBZ0lDQjBhR2x6TGw5ZmJXRndhV1FnUFNCY0lpTmNJaUFySUdkbGRFNWxlSFJKWkNncE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1selJHbHpjRzl6WldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVmYVhOVFkyaGxaSFZzWldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVmYVhOVWNtRmphMUJsYm1ScGJtY2dQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1ZmFYTlNkVzV1YVc1bklEMGdabUZzYzJVN1hHNGdJQ0FnZlZ4dUlDQWdJRkpsWVdOMGFXOXVMbkJ5YjNSdmRIbHdaUzV2YmtKbFkyOXRaVk4wWVd4bElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbk5qYUdWa2RXeGxLQ2s3WEc0Z0lDQWdmVHRjYmlBZ0lDQlNaV0ZqZEdsdmJpNXdjbTkwYjNSNWNHVXVjMk5vWldSMWJHVWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NWZhWE5UWTJobFpIVnNaV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVgybHpVMk5vWldSMWJHVmtJRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdkc2IySmhiRk4wWVhSbExuQmxibVJwYm1kU1pXRmpkR2x2Ym5NdWNIVnphQ2gwYUdsektUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhOMFlYSjBRbUYwWTJnb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKMWJsSmxZV04wYVc5dWN5Z3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pXNWtRbUYwWTJnb0tUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzRnSUNBZ1VtVmhZM1JwYjI0dWNISnZkRzkwZVhCbExtbHpVMk5vWldSMWJHVmtJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVmYVhOVFkyaGxaSFZzWldRN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JTWldGamRHbHZiaTV3Y205MGIzUjVjR1V1Y25WdVVtVmhZM1JwYjI0Z1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1cGMwUnBjM0J2YzJWa0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbDlwYzFOamFHVmtkV3hsWkNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOb2IzVnNaRU52YlhCMWRHVW9kR2hwY3lrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TGw5cGMxUnlZV05yVUdWdVpHbHVaeUE5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmJrbHVkbUZzYVdSaGRHVW9LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVmYVhOVWNtRmphMUJsYm1ScGJtY2dKaVlnYVhOVGNIbEZibUZpYkdWa0tDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMEtIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2RHaHBjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFI1Y0dVNklGd2ljMk5vWldSMWJHVmtMWEpsWVdOMGFXOXVYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNiaUFnSUNCU1pXRmpkR2x2Ymk1d2NtOTBiM1I1Y0dVdWRISmhZMnNnUFNCbWRXNWpkR2x2YmlBb1ptNHBJSHRjYmlBZ0lDQWdJQ0FnYzNSaGNuUkNZWFJqYUNncE8xeHVJQ0FnSUNBZ0lDQjJZWElnYm05MGFXWjVJRDBnYVhOVGNIbEZibUZpYkdWa0tDazdYRzRnSUNBZ0lDQWdJSFpoY2lCemRHRnlkRlJwYldVN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpua3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITjBZWEowVkdsdFpTQTlJRVJoZEdVdWJtOTNLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpjSGxTWlhCdmNuUlRkR0Z5ZENoN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IySnFaV04wT2lCMGFHbHpMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFI1Y0dVNklGd2ljbVZoWTNScGIyNWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYmpvZ1ptNWNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSFJvYVhNdVgybHpVblZ1Ym1sdVp5QTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lIUnlZV05yUkdWeWFYWmxaRVoxYm1OMGFXOXVLSFJvYVhNc0lHWnVLVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5TZFc1dWFXNW5JRDBnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdVgybHpWSEpoWTJ0UVpXNWthVzVuSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1selJHbHpjRzl6WldRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc1pXRnlUMkp6WlhKMmFXNW5LSFJvYVhNcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkRVZ1WkNoN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaVG9nUkdGMFpTNXViM2NvS1NBdElITjBZWEowVkdsdFpWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdaVzVrUW1GMFkyZ29LVHRjYmlBZ0lDQjlPMXh1SUNBZ0lGSmxZV04wYVc5dUxuQnliM1J2ZEhsd1pTNXlaV052ZG1WeVJuSnZiVVZ5Y205eUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbDlwYzFKMWJtNXBibWNnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWZhWE5VY21GamExQmxibVJwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0I5TzF4dUlDQWdJRkpsWVdOMGFXOXVMbkJ5YjNSdmRIbHdaUzVrYVhOd2IzTmxJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5FYVhOd2IzTmxaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1cGMwUnBjM0J2YzJWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVmYVhOU2RXNXVhVzVuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUmhjblJDWVhSamFDZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVQySnpaWEoyYVc1bktIUm9hWE1wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdVpFSmhkR05vS0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dUlDQWdJRkpsWVdOMGFXOXVMbkJ5YjNSdmRIbHdaUzVuWlhSRWFYTndiM05sY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlISWdQU0IwYUdsekxtUnBjM0J2YzJVdVltbHVaQ2gwYUdsektUdGNiaUFnSUNBZ0lDQWdjaTRrYlc5aWVDQTlJSFJvYVhNN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeU8xeHVJQ0FnSUgwN1hHNGdJQ0FnVW1WaFkzUnBiMjR1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdYQ0pTWldGamRHbHZibHRjSWlBcklIUm9hWE11Ym1GdFpTQXJJRndpWFZ3aU8xeHVJQ0FnSUgwN1hHNGdJQ0FnVW1WaFkzUnBiMjR1Y0hKdmRHOTBlWEJsTG5kb2VWSjFiaUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbWx1WnlBOUlIVnVhWEYxWlNoMGFHbHpMbDlwYzFKMWJtNXBibWNnUHlCMGFHbHpMbTVsZDA5aWMyVnlkbWx1WnlBNklIUm9hWE11YjJKelpYSjJhVzVuS1M1dFlYQW9ablZ1WTNScGIyNGdLR1JsY0NrZ2V5QnlaWFIxY200Z1pHVndMbTVoYldVN0lIMHBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdLRndpWEZ4dVYyaDVVblZ1UHlCeVpXRmpkR2x2YmlBblhDSWdLeUIwYUdsekxtNWhiV1VnS3lCY0lpYzZYRnh1SUNvZ1UzUmhkSFZ6T2lCYlhDSWdLeUFvZEdocGN5NXBjMFJwYzNCdmMyVmtJRDhnWENKemRHOXdjR1ZrWENJZ09pQjBhR2x6TGw5cGMxSjFibTVwYm1jZ1B5QmNJbkoxYm01cGJtZGNJaUE2SUhSb2FYTXVhWE5UWTJobFpIVnNaV1FvS1NBL0lGd2ljMk5vWldSMWJHVmtYQ0lnT2lCY0ltbGtiR1ZjSWlrZ0t5QmNJbDFjWEc0Z0tpQlVhR2x6SUhKbFlXTjBhVzl1SUhkcGJHd2djbVV0Y25WdUlHbG1JR0Z1ZVNCdlppQjBhR1VnWm05c2JHOTNhVzVuSUc5aWMyVnlkbUZpYkdWeklHTm9ZVzVuWlhNNlhGeHVJQ0FnSUZ3aUlDc2dhbTlwYmxOMGNtbHVaM01vYjJKelpYSjJhVzVuS1NBcklGd2lYRnh1SUNBZ0lGd2lJQ3NnS0NoMGFHbHpMbDlwYzFKMWJtNXBibWNwSUQ4Z1hDSWdLQzR1TGlCdmNpQmhibmtnYjJKelpYSjJZV0pzWlNCaFkyTmxjM05sWkNCa2RYSnBibWNnZEdobElISmxiV0ZwYm1SbGNpQnZaaUIwYUdVZ1kzVnljbVZ1ZENCeWRXNHBYQ0lnT2lCY0lsd2lLU0FySUZ3aVhGeHVYRngwVFdsemMybHVaeUJwZEdWdGN5QnBiaUIwYUdseklHeHBjM1EvWEZ4dVhGeDBJQ0F4TGlCRGFHVmpheUIzYUdWMGFHVnlJR0ZzYkNCMWMyVmtJSFpoYkhWbGN5QmhjbVVnY0hKdmNHVnliSGtnYldGeWEyVmtJR0Z6SUc5aWMyVnlkbUZpYkdVZ0tIVnpaU0JwYzA5aWMyVnlkbUZpYkdVZ2RHOGdkbVZ5YVdaNUtWeGNibHhjZENBZ01pNGdUV0ZyWlNCemRYSmxJSGx2ZFNCa2FXUnVKM1FnWkdWeVpXWmxjbVZ1WTJVZ2RtRnNkV1Z6SUhSdmJ5QmxZWEpzZVM0Z1RXOWlXQ0J2WW5ObGNuWmxjeUJ3Y205d2N5d2dibTkwSUhCeWFXMXBkR2wyWlhNdUlFVXVaem9nZFhObElDZHdaWEp6YjI0dWJtRnRaU2NnYVc1emRHVmhaQ0J2WmlBbmJtRnRaU2NnYVc0Z2VXOTFjaUJqYjIxd2RYUmhkR2x2Ymk1Y1hHNWNJaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQnlaWFIxY200Z1VtVmhZM1JwYjI0N1hHNTlLQ2twTzF4dVpYaHdiM0owY3k1U1pXRmpkR2x2YmlBOUlGSmxZV04wYVc5dU8xeHVkbUZ5SUUxQldGOVNSVUZEVkVsUFRsOUpWRVZTUVZSSlQwNVRJRDBnTVRBd08xeHVablZ1WTNScGIyNGdjblZ1VW1WaFkzUnBiMjV6S0NrZ2UxeHVJQ0FnSUdsbUlDaG5iRzlpWVd4VGRHRjBaUzVwYzFKMWJtNXBibWRTWldGamRHbHZibk1nUFQwOUlIUnlkV1VnZkh3Z1oyeHZZbUZzVTNSaGRHVXVhVzVVY21GdWMyRmpkR2x2YmlBK0lEQXBYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCbmJHOWlZV3hUZEdGMFpTNXBjMUoxYm01cGJtZFNaV0ZqZEdsdmJuTWdQU0IwY25WbE8xeHVJQ0FnSUhaaGNpQmhiR3hTWldGamRHbHZibk1nUFNCbmJHOWlZV3hUZEdGMFpTNXdaVzVrYVc1blVtVmhZM1JwYjI1ek8xeHVJQ0FnSUhaaGNpQnBkR1Z5WVhScGIyNXpJRDBnTUR0Y2JpQWdJQ0IzYUdsc1pTQW9ZV3hzVW1WaFkzUnBiMjV6TG14bGJtZDBhQ0ErSURBcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0NzcmFYUmxjbUYwYVc5dWN5QTlQVDBnVFVGWVgxSkZRVU5VU1U5T1gwbFVSVkpCVkVsUFRsTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjMlYwUjJ4dlltRnNVM1JoZEdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWdvWENKU1pXRmpkR2x2YmlCa2IyVnpiaWQwSUdOdmJuWmxjbWRsSUhSdklHRWdjM1JoWW14bElITjBZWFJsSUdGbWRHVnlJRndpSUNzZ1RVRllYMUpGUVVOVVNVOU9YMGxVUlZKQlZFbFBUbE1nS3lCY0lpQnBkR1Z5WVhScGIyNXpMbHdpS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNzZ0tGd2lJRkJ5YjJKaFlteDVJSFJvWlhKbElHbHpJR0VnWTNsamJHVWdhVzRnZEdobElISmxZV04wYVhabElHWjFibU4wYVc5dU9pQmNJaUFySUdGc2JGSmxZV04wYVc5dWMxc3dYU2twTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIWmhjaUJ5WlcxaGFXNXBibWRTWldGamRHbHZibk1nUFNCaGJHeFNaV0ZqZEdsdmJuTXVjM0JzYVdObEtEQXBPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diQ0E5SUhKbGJXRnBibWx1WjFKbFlXTjBhVzl1Y3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlcxaGFXNXBibWRTWldGamRHbHZibk5iYVYwdWNuVnVVbVZoWTNScGIyNG9LVHRjYmlBZ0lDQjlYRzRnSUNBZ1oyeHZZbUZzVTNSaGRHVXVhWE5TZFc1dWFXNW5VbVZoWTNScGIyNXpJRDBnWm1Gc2MyVTdYRzU5WEc1MllYSWdjM0I1Ulc1aFlteGxaQ0E5SUdaaGJITmxPMXh1Wm5WdVkzUnBiMjRnYVhOVGNIbEZibUZpYkdWa0tDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCemNIbEZibUZpYkdWa08xeHVmVnh1Wm5WdVkzUnBiMjRnYzNCNVVtVndiM0owS0dWMlpXNTBLU0I3WEc0Z0lDQWdhV1lnS0NGemNIbEZibUZpYkdWa0tWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdkbUZ5SUd4cGMzUmxibVZ5Y3lBOUlHZHNiMkpoYkZOMFlYUmxMbk53ZVV4cGMzUmxibVZ5Y3p0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diQ0E5SUd4cGMzUmxibVZ5Y3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcFhHNGdJQ0FnSUNBZ0lHeHBjM1JsYm1WeWMxdHBYU2hsZG1WdWRDazdYRzU5WEc1bWRXNWpkR2x2YmlCemNIbFNaWEJ2Y25SVGRHRnlkQ2hsZG1WdWRDa2dlMXh1SUNBZ0lIWmhjaUJqYUdGdVoyVWdQU0J2WW1wbFkzUkJjM05wWjI0b2UzMHNJR1YyWlc1MExDQjdJSE53ZVZKbGNHOXlkRk4wWVhKME9pQjBjblZsSUgwcE8xeHVJQ0FnSUhOd2VWSmxjRzl5ZENoamFHRnVaMlVwTzF4dWZWeHVkbUZ5SUVWT1JGOUZWa1ZPVkNBOUlIc2djM0I1VW1Wd2IzSjBSVzVrT2lCMGNuVmxJSDA3WEc1bWRXNWpkR2x2YmlCemNIbFNaWEJ2Y25SRmJtUW9ZMmhoYm1kbEtTQjdYRzRnSUNBZ2FXWWdLR05vWVc1blpTbGNiaUFnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBLRzlpYW1WamRFRnpjMmxuYmloN2ZTd2dZMmhoYm1kbExDQkZUa1JmUlZaRlRsUXBLVHRjYmlBZ0lDQmxiSE5sWEc0Z0lDQWdJQ0FnSUhOd2VWSmxjRzl5ZENoRlRrUmZSVlpGVGxRcE8xeHVmVnh1Wm5WdVkzUnBiMjRnYzNCNUtHeHBjM1JsYm1WeUtTQjdYRzRnSUNBZ1oyeHZZbUZzVTNSaGRHVXVjM0I1VEdsemRHVnVaWEp6TG5CMWMyZ29iR2x6ZEdWdVpYSXBPMXh1SUNBZ0lITndlVVZ1WVdKc1pXUWdQU0JuYkc5aVlXeFRkR0YwWlM1emNIbE1hWE4wWlc1bGNuTXViR1Z1WjNSb0lENGdNRHRjYmlBZ0lDQnlaWFIxY200Z2IyNWpaU2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJwWkhnZ1BTQm5iRzlpWVd4VGRHRjBaUzV6Y0hsTWFYTjBaVzVsY25NdWFXNWtaWGhQWmloc2FYTjBaVzVsY2lrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwWkhnZ0lUMDlJQzB4S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdaMnh2WW1Gc1UzUmhkR1V1YzNCNVRHbHpkR1Z1WlhKekxuTndiR2xqWlNocFpIZ3NJREVwTzF4dUlDQWdJQ0FnSUNCemNIbEZibUZpYkdWa0lEMGdaMnh2WW1Gc1UzUmhkR1V1YzNCNVRHbHpkR1Z1WlhKekxteGxibWQwYUNBK0lEQTdYRzRnSUNBZ2ZTazdYRzU5WEc1bGVIQnZjblJ6TG5Od2VTQTlJSE53ZVR0Y2JtWjFibU4wYVc5dUlIUnlZV05yVkhKaGJuTnBkR2x2Ym5Nb2IyNVNaWEJ2Y25RcElIdGNiaUFnSUNCa1pYQnlaV05oZEdWa0tGd2lkSEpoWTJ0VWNtRnVjMmwwYVc5dWN5QnBjeUJrWlhCeVpXTmhkR1ZrTGlCVmMyVWdiVzlpZUM1emNIa2dhVzV6ZEdWaFpGd2lLVHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JRzl1VW1Wd2IzSjBJRDA5UFNCY0ltSnZiMnhsWVc1Y0lpa2dlMXh1SUNBZ0lDQWdJQ0JrWlhCeVpXTmhkR1ZrS0Z3aWRISmhZMnRVY21GdWMybDBhVzl1Y3lCdmJteDVJSFJoYTJWeklHRWdjMmx1WjJ4bElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxpQkpaaUI1YjNVZ1lYSmxJSFZ6YVc1bklIUm9aU0J0YjJKNExYSmxZV04wTFdSbGRuUnZiMnh6TENCd2JHVmhjMlVnZFhCa1lYUmxJSFJvWlcwZ1ptbHljM1JjSWlrN1hHNGdJQ0FnSUNBZ0lHOXVVbVZ3YjNKMElEMGdZWEpuZFcxbGJuUnpXekZkTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvSVc5dVVtVndiM0owS1NCN1hHNGdJQ0FnSUNBZ0lHUmxjSEpsWTJGMFpXUW9YQ0owY21GamExUnlZVzV6YVhScGIyNXpJSGRwZEdodmRYUWdZMkZzYkdKaFkyc2dhR0Z6SUdKbFpXNGdaR1Z3Y21WallYUmxaQ0JoYm1RZ2FYTWdZU0J1YnkxdmNDQnViM2N1SUVsbUlIbHZkU0JoY21VZ2RYTnBibWNnZEdobElHMXZZbmd0Y21WaFkzUXRaR1YyZEc5dmJITXNJSEJzWldGelpTQjFjR1JoZEdVZ2RHaGxiU0JtYVhKemRGd2lLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUhzZ2ZUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSE53ZVNodmJsSmxjRzl5ZENrN1hHNTlYRzVtZFc1amRHbHZiaUIwY21GdWMyRmpkR2x2YmloaFkzUnBiMjRzSUhSb2FYTkJjbWNzSUhKbGNHOXlkQ2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpRWEpuSUQwOVBTQjJiMmxrSURBcElIc2dkR2hwYzBGeVp5QTlJSFZ1WkdWbWFXNWxaRHNnZlZ4dUlDQWdJR2xtSUNoeVpYQnZjblFnUFQwOUlIWnZhV1FnTUNrZ2V5QnlaWEJ2Y25RZ1BTQjBjblZsT3lCOVhHNGdJQ0FnZEhKaGJuTmhZM1JwYjI1VGRHRnlkQ2dvWVdOMGFXOXVMbTVoYldVcElIeDhJRndpWVc1dmJubHRiM1Z6SUhSeVlXNXpZV04wYVc5dVhDSXNJSFJvYVhOQmNtY3NJSEpsY0c5eWRDazdYRzRnSUNBZ2RtRnlJSEpsY3lBOUlHRmpkR2x2Ymk1allXeHNLSFJvYVhOQmNtY3BPMXh1SUNBZ0lIUnlZVzV6WVdOMGFXOXVSVzVrS0hKbGNHOXlkQ2s3WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JtVjRjRzl5ZEhNdWRISmhibk5oWTNScGIyNGdQU0IwY21GdWMyRmpkR2x2Ymp0Y2JtWjFibU4wYVc5dUlIUnlZVzV6WVdOMGFXOXVVM1JoY25Rb2JtRnRaU3dnZEdocGMwRnlaeXdnY21Wd2IzSjBLU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTkJjbWNnUFQwOUlIWnZhV1FnTUNrZ2V5QjBhR2x6UVhKbklEMGdkVzVrWldacGJtVmtPeUI5WEc0Z0lDQWdhV1lnS0hKbGNHOXlkQ0E5UFQwZ2RtOXBaQ0F3S1NCN0lISmxjRzl5ZENBOUlIUnlkV1U3SUgxY2JpQWdJQ0J6ZEdGeWRFSmhkR05vS0NrN1hHNGdJQ0FnWjJ4dlltRnNVM1JoZEdVdWFXNVVjbUZ1YzJGamRHbHZiaUFyUFNBeE8xeHVJQ0FnSUdsbUlDaHlaWEJ2Y25RZ0ppWWdhWE5UY0hsRmJtRmliR1ZrS0NrcElIdGNiaUFnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBVM1JoY25Rb2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0owY21GdWMyRmpkR2x2Ymx3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBPaUIwYUdselFYSm5MRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYm1GdFpWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzU5WEc1bWRXNWpkR2x2YmlCMGNtRnVjMkZqZEdsdmJrVnVaQ2h5WlhCdmNuUXBJSHRjYmlBZ0lDQnBaaUFvY21Wd2IzSjBJRDA5UFNCMmIybGtJREFwSUhzZ2NtVndiM0owSUQwZ2RISjFaVHNnZlZ4dUlDQWdJR2xtSUNndExXZHNiMkpoYkZOMFlYUmxMbWx1VkhKaGJuTmhZM1JwYjI0Z1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ2NuVnVVbVZoWTNScGIyNXpLQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1JQ2h5WlhCdmNuUWdKaVlnYVhOVGNIbEZibUZpYkdWa0tDa3BYRzRnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkRVZ1WkNncE8xeHVJQ0FnSUdWdVpFSmhkR05vS0NrN1hHNTlYRzVtZFc1amRHbHZiaUJvWVhOSmJuUmxjbU5sY0hSdmNuTW9hVzUwWlhKalpYQjBZV0pzWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUFvYVc1MFpYSmpaWEIwWVdKc1pTNXBiblJsY21ObGNIUnZjbk1nSmlZZ2FXNTBaWEpqWlhCMFlXSnNaUzVwYm5SbGNtTmxjSFJ2Y25NdWJHVnVaM1JvSUQ0Z01DazdYRzU5WEc1bWRXNWpkR2x2YmlCeVpXZHBjM1JsY2tsdWRHVnlZMlZ3ZEc5eUtHbHVkR1Z5WTJWd2RHRmliR1VzSUdoaGJtUnNaWElwSUh0Y2JpQWdJQ0IyWVhJZ2FXNTBaWEpqWlhCMGIzSnpJRDBnYVc1MFpYSmpaWEIwWVdKc1pTNXBiblJsY21ObGNIUnZjbk1nZkh3Z0tHbHVkR1Z5WTJWd2RHRmliR1V1YVc1MFpYSmpaWEIwYjNKeklEMGdXMTBwTzF4dUlDQWdJR2x1ZEdWeVkyVndkRzl5Y3k1d2RYTm9LR2hoYm1Sc1pYSXBPMXh1SUNBZ0lISmxkSFZ5YmlCdmJtTmxLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR2xrZUNBOUlHbHVkR1Z5WTJWd2RHOXljeTVwYm1SbGVFOW1LR2hoYm1Sc1pYSXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FXUjRJQ0U5UFNBdE1TbGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWRHVnlZMlZ3ZEc5eWN5NXpjR3hwWTJVb2FXUjRMQ0F4S1R0Y2JpQWdJQ0I5S1R0Y2JuMWNibVoxYm1OMGFXOXVJR2x1ZEdWeVkyVndkRU5vWVc1blpTaHBiblJsY21ObGNIUmhZbXhsTENCamFHRnVaMlVwSUh0Y2JpQWdJQ0IyWVhJZ2NISmxkbFVnUFNCMWJuUnlZV05yWldSVGRHRnlkQ2dwTzF4dUlDQWdJSFpoY2lCcGJuUmxjbU5sY0hSdmNuTWdQU0JwYm5SbGNtTmxjSFJoWW14bExtbHVkR1Z5WTJWd2RHOXljenRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JDQTlJR2x1ZEdWeVkyVndkRzl5Y3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdZMmhoYm1kbElEMGdhVzUwWlhKalpYQjBiM0p6VzJsZEtHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNBZ0lHbHVkbUZ5YVdGdWRDZ2hZMmhoYm1kbElIeDhJR05vWVc1blpTNTBlWEJsTENCY0lrbHVkR1Z5WTJWd2RDQm9ZVzVrYkdWeWN5QnphRzkxYkdRZ2NtVjBkWEp1SUc1dmRHaHBibWNnYjNJZ1lTQmphR0Z1WjJVZ2IySnFaV04wWENJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvSVdOb1lXNW5aU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdWRXeHNPMXh1SUNBZ0lIMWNiaUFnSUNCMWJuUnlZV05yWldSRmJtUW9jSEpsZGxVcE8xeHVJQ0FnSUhKbGRIVnliaUJqYUdGdVoyVTdYRzU5WEc1bWRXNWpkR2x2YmlCb1lYTk1hWE4wWlc1bGNuTW9iR2x6ZEdWdVlXSnNaU2tnZTF4dUlDQWdJSEpsZEhWeWJpQnNhWE4wWlc1aFlteGxMbU5vWVc1blpVeHBjM1JsYm1WeWN5QW1KaUJzYVhOMFpXNWhZbXhsTG1Ob1lXNW5aVXhwYzNSbGJtVnljeTVzWlc1bmRHZ2dQaUF3TzF4dWZWeHVablZ1WTNScGIyNGdjbVZuYVhOMFpYSk1hWE4wWlc1bGNpaHNhWE4wWlc1aFlteGxMQ0JvWVc1a2JHVnlLU0I3WEc0Z0lDQWdkbUZ5SUd4cGMzUmxibVZ5Y3lBOUlHeHBjM1JsYm1GaWJHVXVZMmhoYm1kbFRHbHpkR1Z1WlhKeklIeDhJQ2hzYVhOMFpXNWhZbXhsTG1Ob1lXNW5aVXhwYzNSbGJtVnljeUE5SUZ0ZEtUdGNiaUFnSUNCc2FYTjBaVzVsY25NdWNIVnphQ2hvWVc1a2JHVnlLVHRjYmlBZ0lDQnlaWFIxY200Z2IyNWpaU2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJwWkhnZ1BTQnNhWE4wWlc1bGNuTXVhVzVrWlhoUFppaG9ZVzVrYkdWeUtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dsa2VDQWhQVDBnTFRFcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMFpXNWxjbk11YzNCc2FXTmxLR2xrZUN3Z01TazdYRzRnSUNBZ2ZTazdYRzU5WEc1bWRXNWpkR2x2YmlCdWIzUnBabmxNYVhOMFpXNWxjbk1vYkdsemRHVnVZV0pzWlN3Z1kyaGhibWRsS1NCN1hHNGdJQ0FnZG1GeUlIQnlaWFpWSUQwZ2RXNTBjbUZqYTJWa1UzUmhjblFvS1R0Y2JpQWdJQ0IyWVhJZ2JHbHpkR1Z1WlhKeklEMGdiR2x6ZEdWdVlXSnNaUzVqYUdGdVoyVk1hWE4wWlc1bGNuTTdYRzRnSUNBZ2FXWWdLQ0ZzYVhOMFpXNWxjbk1wWEc0Z0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQnNhWE4wWlc1bGNuTWdQU0JzYVhOMFpXNWxjbk11YzJ4cFkyVW9LVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JDQTlJR3hwYzNSbGJtVnljeTVzWlc1bmRHZzdJR2tnUENCc095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRUZ5Y21GNUxtbHpRWEp5WVhrb1kyaGhibWRsS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsemRHVnVaWEp6VzJsZExtRndjR3g1S0c1MWJHd3NJR05vWVc1blpTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCc2FYTjBaVzVsY25OYmFWMG9ZMmhoYm1kbEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCMWJuUnlZV05yWldSRmJtUW9jSEpsZGxVcE8xeHVmVnh1ZG1GeUlGWmhiSFZsVFc5a1pUdGNiaWhtZFc1amRHbHZiaUFvVm1Gc2RXVk5iMlJsS1NCN1hHNGdJQ0FnVm1Gc2RXVk5iMlJsVzFaaGJIVmxUVzlrWlZ0Y0lsSmxZM1Z5YzJsMlpWd2lYU0E5SURCZElEMGdYQ0pTWldOMWNuTnBkbVZjSWp0Y2JpQWdJQ0JXWVd4MVpVMXZaR1ZiVm1Gc2RXVk5iMlJsVzF3aVVtVm1aWEpsYm1ObFhDSmRJRDBnTVYwZ1BTQmNJbEpsWm1WeVpXNWpaVndpTzF4dUlDQWdJRlpoYkhWbFRXOWtaVnRXWVd4MVpVMXZaR1ZiWENKVGRISjFZM1IxY21WY0lsMGdQU0F5WFNBOUlGd2lVM1J5ZFdOMGRYSmxYQ0k3WEc0Z0lDQWdWbUZzZFdWTmIyUmxXMVpoYkhWbFRXOWtaVnRjSWtac1lYUmNJbDBnUFNBelhTQTlJRndpUm14aGRGd2lPMXh1ZlNrb1ZtRnNkV1ZOYjJSbElIeDhJQ2hXWVd4MVpVMXZaR1VnUFNCN2ZTa3BPMXh1Wm5WdVkzUnBiMjRnWVhOU1pXWmxjbVZ1WTJVb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzSUVGelVtVm1aWEpsYm1ObEtIWmhiSFZsS1R0Y2JuMWNibVY0Y0c5eWRITXVZWE5TWldabGNtVnVZMlVnUFNCaGMxSmxabVZ5Wlc1alpUdGNibVoxYm1OMGFXOXVJR0Z6VTNSeWRXTjBkWEpsS0haaGJIVmxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHNWxkeUJCYzFOMGNuVmpkSFZ5WlNoMllXeDFaU2s3WEc1OVhHNWxlSEJ2Y25SekxtRnpVM1J5ZFdOMGRYSmxJRDBnWVhOVGRISjFZM1IxY21VN1hHNW1kVzVqZEdsdmJpQmhjMFpzWVhRb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzSUVGelJteGhkQ2gyWVd4MVpTazdYRzU5WEc1bGVIQnZjblJ6TG1GelJteGhkQ0E5SUdGelJteGhkRHRjYm5aaGNpQkJjMUpsWm1WeVpXNWpaU0E5SUNobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ1puVnVZM1JwYjI0Z1FYTlNaV1psY21WdVkyVW9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1MllXeDFaU0E5SUhaaGJIVmxPMXh1SUNBZ0lDQWdJQ0JoYzNObGNuUlZibmR5WVhCd1pXUW9kbUZzZFdVc0lGd2lUVzlrYVdacFpYSnpJR0Z5WlNCdWIzUWdZV3hzYjNkbFpDQjBieUJpWlNCdVpYTjBaV1JjSWlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQkJjMUpsWm1WeVpXNWpaVHRjYm4wb0tTazdYRzUyWVhJZ1FYTlRkSEoxWTNSMWNtVWdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdaMWJtTjBhVzl1SUVGelUzUnlkV04wZFhKbEtIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11ZG1Gc2RXVWdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tIWmhiSFZsTENCY0lrMXZaR2xtYVdWeWN5QmhjbVVnYm05MElHRnNiRzkzWldRZ2RHOGdZbVVnYm1WemRHVmtYQ0lwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1FYTlRkSEoxWTNSMWNtVTdYRzU5S0NrcE8xeHVkbUZ5SUVGelJteGhkQ0E5SUNobWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ1puVnVZM1JwYjI0Z1FYTkdiR0YwS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ1lYTnpaWEowVlc1M2NtRndjR1ZrS0haaGJIVmxMQ0JjSWsxdlpHbG1hV1Z5Y3lCaGNtVWdibTkwSUdGc2JHOTNaV1FnZEc4Z1ltVWdibVZ6ZEdWa1hDSXBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnUVhOR2JHRjBPMXh1ZlNncEtUdGNibVoxYm1OMGFXOXVJR0Z6VFdGd0tHUmhkR0VzSUcxdlpHbG1hV1Z5Um5WdVl5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCdFlYQW9aR0YwWVN3Z2JXOWthV1pwWlhKR2RXNWpLVHRjYm4xY2JtVjRjRzl5ZEhNdVlYTk5ZWEFnUFNCaGMwMWhjRHRjYm1aMWJtTjBhVzl1SUdkbGRGWmhiSFZsVFc5a1pVWnliMjFXWVd4MVpTaDJZV3gxWlN3Z1pHVm1ZWFZzZEUxdlpHVXBJSHRjYmlBZ0lDQnBaaUFvZG1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJCYzFKbFptVnlaVzVqWlNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUZ0V1lXeDFaVTF2WkdVdVVtVm1aWEpsYm1ObExDQjJZV3gxWlM1MllXeDFaVjA3WEc0Z0lDQWdhV1lnS0haaGJIVmxJR2x1YzNSaGJtTmxiMllnUVhOVGRISjFZM1IxY21VcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCYlZtRnNkV1ZOYjJSbExsTjBjblZqZEhWeVpTd2dkbUZzZFdVdWRtRnNkV1ZkTzF4dUlDQWdJR2xtSUNoMllXeDFaU0JwYm5OMFlXNWpaVzltSUVGelJteGhkQ2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRnRXWVd4MVpVMXZaR1V1Um14aGRDd2dkbUZzZFdVdWRtRnNkV1ZkTzF4dUlDQWdJSEpsZEhWeWJpQmJaR1ZtWVhWc2RFMXZaR1VzSUhaaGJIVmxYVHRjYm4xY2JtWjFibU4wYVc5dUlHZGxkRlpoYkhWbFRXOWtaVVp5YjIxTmIyUnBabWxsY2taMWJtTW9ablZ1WXlrZ2UxeHVJQ0FnSUdsbUlDaG1kVzVqSUQwOVBTQmhjMUpsWm1WeVpXNWpaU2xjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRlpoYkhWbFRXOWtaUzVTWldabGNtVnVZMlU3WEc0Z0lDQWdaV3h6WlNCcFppQW9ablZ1WXlBOVBUMGdZWE5UZEhKMVkzUjFjbVVwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJXWVd4MVpVMXZaR1V1VTNSeWRXTjBkWEpsTzF4dUlDQWdJR1ZzYzJVZ2FXWWdLR1oxYm1NZ1BUMDlJR0Z6Um14aGRDbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGWmhiSFZsVFc5a1pTNUdiR0YwTzF4dUlDQWdJR2x1ZG1GeWFXRnVkQ2htZFc1aklEMDlQU0IxYm1SbFptbHVaV1FzSUZ3aVEyRnVibTkwSUdSbGRHVnliV2x1WlNCMllXeDFaU0J0YjJSbElHWnliMjBnWm5WdVkzUnBiMjR1SUZCc1pXRnpaU0J3WVhOeklHbHVJRzl1WlNCdlppQjBhR1Z6WlRvZ2JXOWllQzVoYzFKbFptVnlaVzVqWlN3Z2JXOWllQzVoYzFOMGNuVmpkSFZ5WlNCdmNpQnRiMko0TG1GelJteGhkQ3dnWjI5ME9pQmNJaUFySUdaMWJtTXBPMXh1SUNBZ0lISmxkSFZ5YmlCV1lXeDFaVTF2WkdVdVVtVmpkWEp6YVhabE8xeHVmVnh1Wm5WdVkzUnBiMjRnYldGclpVTm9hV3hrVDJKelpYSjJZV0pzWlNoMllXeDFaU3dnY0dGeVpXNTBUVzlrWlN3Z2JtRnRaU2tnZTF4dUlDQWdJSFpoY2lCamFHbHNaRTF2WkdVN1hHNGdJQ0FnYVdZZ0tHbHpUMkp6WlhKMllXSnNaU2gyWVd4MVpTa3BYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2JpQWdJQ0J6ZDJsMFkyZ2dLSEJoY21WdWRFMXZaR1VwSUh0Y2JpQWdJQ0FnSUNBZ1kyRnpaU0JXWVd4MVpVMXZaR1V1VW1WbVpYSmxibU5sT2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJQ0FnSUNCallYTmxJRlpoYkhWbFRXOWtaUzVHYkdGME9seHVJQ0FnSUNBZ0lDQWdJQ0FnWVhOelpYSjBWVzUzY21Gd2NHVmtLSFpoYkhWbExDQmNJa2wwWlcxeklHbHVjMmxrWlNBbllYTkdiR0YwSnlCallXNXViM1FnYUdGMlpTQnRiMlJwWm1sbGNuTmNJaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphR2xzWkUxdlpHVWdQU0JXWVd4MVpVMXZaR1V1VW1WbVpYSmxibU5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBZ0lHTmhjMlVnVm1Gc2RXVk5iMlJsTGxOMGNuVmpkSFZ5WlRwY2JpQWdJQ0FnSUNBZ0lDQWdJR0Z6YzJWeWRGVnVkM0poY0hCbFpDaDJZV3gxWlN3Z1hDSkpkR1Z0Y3lCcGJuTnBaR1VnSjJGelUzUnlkV04wZFhKbEp5QmpZVzV1YjNRZ2FHRjJaU0J0YjJScFptbGxjbk5jSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqYUdsc1pFMXZaR1VnUFNCV1lXeDFaVTF2WkdVdVUzUnlkV04wZFhKbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQWdJR05oYzJVZ1ZtRnNkV1ZOYjJSbExsSmxZM1Z5YzJsMlpUcGNiaUFnSUNBZ0lDQWdJQ0FnSUY5aElEMGdaMlYwVm1Gc2RXVk5iMlJsUm5KdmJWWmhiSFZsS0haaGJIVmxMQ0JXWVd4MVpVMXZaR1V1VW1WamRYSnphWFpsS1N3Z1kyaHBiR1JOYjJSbElEMGdYMkZiTUYwc0lIWmhiSFZsSUQwZ1gyRmJNVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2htWVd4elpTd2dYQ0pKYkd4bFoyRnNJRk4wWVhSbFhDSXBPMXh1SUNBZ0lIMWNiaUFnSUNCcFppQW9RWEp5WVhrdWFYTkJjbkpoZVNoMllXeDFaU2twWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJqY21WaGRHVlBZbk5sY25aaFlteGxRWEp5WVhrb2RtRnNkV1VzSUdOb2FXeGtUVzlrWlN3Z2JtRnRaU2s3WEc0Z0lDQWdhV1lnS0dselVHeGhhVzVQWW1wbFkzUW9kbUZzZFdVcElDWW1JRTlpYW1WamRDNXBjMFY0ZEdWdWMybGliR1VvZG1Gc2RXVXBLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaWGgwWlc1a1QySnpaWEoyWVdKc1pVaGxiSEJsY2loMllXeDFaU3dnZG1Gc2RXVXNJR05vYVd4a1RXOWtaU3dnYm1GdFpTazdYRzRnSUNBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1SUNBZ0lIWmhjaUJmWVR0Y2JuMWNibVoxYm1OMGFXOXVJR0Z6YzJWeWRGVnVkM0poY0hCbFpDaDJZV3gxWlN3Z2JXVnpjMkZuWlNrZ2UxeHVJQ0FnSUdsbUlDaDJZV3gxWlNCcGJuTjBZVzVqWlc5bUlFRnpVbVZtWlhKbGJtTmxJSHg4SUhaaGJIVmxJR2x1YzNSaGJtTmxiMllnUVhOVGRISjFZM1IxY21VZ2ZId2dkbUZzZFdVZ2FXNXpkR0Z1WTJWdlppQkJjMFpzWVhRcFhHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0lsdHRiMko0WFNCaGMxTjBjblZqZEhWeVpTQXZJR0Z6VW1WbVpYSmxibU5sSUM4Z1lYTkdiR0YwSUdOaGJtNXZkQ0JpWlNCMWMyVmtJR2hsY21VdUlGd2lJQ3NnYldWemMyRm5aU2s3WEc1OVhHNTJZWElnYzJGbVlYSnBVSEp2ZEc5MGVYQmxVMlYwZEdWeVNXNW9aWEpwZEdGdVkyVkNkV2NnUFNBb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lIWmhjaUIySUQwZ1ptRnNjMlU3WEc0Z0lDQWdkbUZ5SUhBZ1BTQjdmVHRjYmlBZ0lDQlBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvY0N3Z1hDSXdYQ0lzSUhzZ2MyVjBPaUJtZFc1amRHbHZiaUFvS1NCN0lIWWdQU0IwY25WbE95QjlJSDBwTzF4dUlDQWdJRTlpYW1WamRDNWpjbVZoZEdVb2NDbGJYQ0l3WENKZElEMGdNVHRjYmlBZ0lDQnlaWFIxY200Z2RpQTlQVDBnWm1Gc2MyVTdYRzU5S1NncE8xeHVkbUZ5SUU5Q1UwVlNWa0ZDVEVWZlFWSlNRVmxmUWxWR1JrVlNYMU5KV2tVZ1BTQXdPMXh1ZG1GeUlGTjBkV0pCY25KaGVTQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnVTNSMVlrRnljbUY1S0NrZ2UxeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdVM1IxWWtGeWNtRjVPMXh1ZlNncEtUdGNibE4wZFdKQmNuSmhlUzV3Y205MGIzUjVjR1VnUFNCYlhUdGNiblpoY2lCUFluTmxjblpoWW14bFFYSnlZWGxCWkcxcGJtbHpkSEpoZEdsdmJpQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnVDJKelpYSjJZV0pzWlVGeWNtRjVRV1J0YVc1cGMzUnlZWFJwYjI0b2JtRnRaU3dnYlc5a1pTd2dZWEp5WVhrc0lHOTNibVZrS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Ylc5a1pTQTlJRzF2WkdVN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WVhKeVlYa2dQU0JoY25KaGVUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dmQyNWxaQ0E5SUc5M2JtVmtPMXh1SUNBZ0lDQWdJQ0IwYUdsekxteGhjM1JMYm05M2JreGxibWQwYUNBOUlEQTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWFXNTBaWEpqWlhCMGIzSnpJRDBnYm5Wc2JEdGNiaUFnSUNBZ0lDQWdkR2hwY3k1amFHRnVaMlZNYVhOMFpXNWxjbk1nUFNCdWRXeHNPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtRjBiMjBnUFNCdVpYY2dRbUZ6WlVGMGIyMG9ibUZ0WlNCOGZDQW9YQ0pQWW5ObGNuWmhZbXhsUVhKeVlYbEFYQ0lnS3lCblpYUk9aWGgwU1dRb0tTa3BPMXh1SUNBZ0lIMWNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGxCWkcxcGJtbHpkSEpoZEdsdmJpNXdjbTkwYjNSNWNHVXViV0ZyWlZKbFlXTjBhWFpsUVhKeVlYbEpkR1Z0SUQwZ1puVnVZM1JwYjI0Z0tIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lHRnpjMlZ5ZEZWdWQzSmhjSEJsWkNoMllXeDFaU3dnWENKQmNuSmhlU0IyWVd4MVpYTWdZMkZ1Ym05MElHaGhkbVVnYlc5a2FXWnBaWEp6WENJcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXRiMlJsSUQwOVBTQldZV3gxWlUxdlpHVXVSbXhoZENCOGZDQjBhR2x6TG0xdlpHVWdQVDA5SUZaaGJIVmxUVzlrWlM1U1pXWmxjbVZ1WTJVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlXdGxRMmhwYkdSUFluTmxjblpoWW14bEtIWmhiSFZsTENCMGFHbHpMbTF2WkdVc0lIUm9hWE11WVhSdmJTNXVZVzFsSUNzZ1hDSmJMaTVkWENJcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlVGeWNtRjVRV1J0YVc1cGMzUnlZWFJwYjI0dWNISnZkRzkwZVhCbExtbHVkR1Z5WTJWd2RDQTlJR1oxYm1OMGFXOXVJQ2hvWVc1a2JHVnlLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WldkcGMzUmxja2x1ZEdWeVkyVndkRzl5S0hSb2FYTXNJR2hoYm1Sc1pYSXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1UVdSdGFXNXBjM1J5WVhScGIyNHVjSEp2ZEc5MGVYQmxMbTlpYzJWeWRtVWdQU0JtZFc1amRHbHZiaUFvYkdsemRHVnVaWElzSUdacGNtVkpiVzFsWkdsaGRHVnNlU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9abWx5WlVsdGJXVmthV0YwWld4NUlEMDlQU0IyYjJsa0lEQXBJSHNnWm1seVpVbHRiV1ZrYVdGMFpXeDVJRDBnWm1Gc2MyVTdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tHWnBjbVZKYlcxbFpHbGhkR1ZzZVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsemRHVnVaWElvZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5aWFtVmpkRG9nZEdocGN5NWhjbkpoZVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUJjSW5Od2JHbGpaVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsdVpHVjRPaUF3TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGa1pHVmtPaUIwYUdsekxuWmhiSFZsY3k1emJHbGpaU2dwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGa1pHVmtRMjkxYm5RNklIUm9hWE11ZG1Gc2RXVnpMbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1Wa09pQmJYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlcxdmRtVmtRMjkxYm5RNklEQmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaV2RwYzNSbGNreHBjM1JsYm1WeUtIUm9hWE1zSUd4cGMzUmxibVZ5S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZCY25KaGVVRmtiV2x1YVhOMGNtRjBhVzl1TG5CeWIzUnZkSGx3WlM1blpYUkJjbkpoZVV4bGJtZDBhQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1aGRHOXRMbkpsY0c5eWRFOWljMlZ5ZG1Wa0tDazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5aaGJIVmxjeTVzWlc1bmRHZzdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFFYSnlZWGxCWkcxcGJtbHpkSEpoZEdsdmJpNXdjbTkwYjNSNWNHVXVjMlYwUVhKeVlYbE1aVzVuZEdnZ1BTQm1kVzVqZEdsdmJpQW9ibVYzVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JtVjNUR1Z1WjNSb0lDRTlQU0JjSW01MWJXSmxjbHdpSUh4OElHNWxkMHhsYm1kMGFDQThJREFwWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1hDSmJiVzlpZUM1aGNuSmhlVjBnVDNWMElHOW1JSEpoYm1kbE9pQmNJaUFySUc1bGQweGxibWQwYUNrN1hHNGdJQ0FnSUNBZ0lIWmhjaUJqZFhKeVpXNTBUR1Z1WjNSb0lEMGdkR2hwY3k1MllXeDFaWE11YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtVjNUR1Z1WjNSb0lEMDlQU0JqZFhKeVpXNTBUR1Z1WjNSb0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2h1WlhkTVpXNW5kR2dnUGlCamRYSnlaVzUwVEdWdVozUm9LVnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Y0d4cFkyVlhhWFJvUVhKeVlYa29ZM1Z5Y21WdWRFeGxibWQwYUN3Z01Dd2dibVYzSUVGeWNtRjVLRzVsZDB4bGJtZDBhQ0F0SUdOMWNuSmxiblJNWlc1bmRHZ3BLVHRjYmlBZ0lDQWdJQ0FnWld4elpWeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpjR3hwWTJWWGFYUm9RWEp5WVhrb2JtVjNUR1Z1WjNSb0xDQmpkWEp5Wlc1MFRHVnVaM1JvSUMwZ2JtVjNUR1Z1WjNSb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlVUZrYldsdWFYTjBjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNTFjR1JoZEdWQmNuSmhlVXhsYm1kMGFDQTlJR1oxYm1OMGFXOXVJQ2h2YkdSTVpXNW5kR2dzSUdSbGJIUmhLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHZiR1JNWlc1bmRHZ2dJVDA5SUhSb2FYTXViR0Z6ZEV0dWIzZHVUR1Z1WjNSb0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpVzIxdlluaGRJRTF2WkdsbWFXTmhkR2x2YmlCbGVHTmxjSFJwYjI0NklIUm9aU0JwYm5SbGNtNWhiQ0J6ZEhKMVkzUjFjbVVnYjJZZ1lXNGdiMkp6WlhKMllXSnNaU0JoY25KaGVTQjNZWE1nWTJoaGJtZGxaQzRnUkdsa0lIbHZkU0IxYzJVZ2NHVmxheWdwSUhSdklHTm9ZVzVuWlNCcGREOWNJaWs3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViR0Z6ZEV0dWIzZHVUR1Z1WjNSb0lDczlJR1JsYkhSaE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWkdWc2RHRWdQaUF3SUNZbUlHOXNaRXhsYm1kMGFDQXJJR1JsYkhSaElDc2dNU0ErSUU5Q1UwVlNWa0ZDVEVWZlFWSlNRVmxmUWxWR1JrVlNYMU5KV2tVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhObGNuWmxRWEp5WVhsQ2RXWm1aWElvYjJ4a1RHVnVaM1JvSUNzZ1pHVnNkR0VnS3lBeEtUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlVUZrYldsdWFYTjBjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNXpjR3hwWTJWWGFYUm9RWEp5WVhrZ1BTQm1kVzVqZEdsdmJpQW9hVzVrWlhnc0lHUmxiR1YwWlVOdmRXNTBMQ0J1WlhkSmRHVnRjeWtnZTF4dUlDQWdJQ0FnSUNCamFHVmphMGxtVTNSaGRHVk5iMlJwWm1sallYUnBiMjV6UVhKbFFXeHNiM2RsWkNncE8xeHVJQ0FnSUNBZ0lDQjJZWElnYkdWdVozUm9JRDBnZEdocGN5NTJZV3gxWlhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCcFppQW9hVzVrWlhnZ1BUMDlJSFZ1WkdWbWFXNWxaQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lHbHVaR1Y0SUQwZ01EdGNiaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9hVzVrWlhnZ1BpQnNaVzVuZEdncFhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm1SbGVDQTlJR3hsYm1kMGFEdGNiaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9hVzVrWlhnZ1BDQXdLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGdnUFNCTllYUm9MbTFoZUNnd0xDQnNaVzVuZEdnZ0t5QnBibVJsZUNrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBeEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWc1pYUmxRMjkxYm5RZ1BTQnNaVzVuZEdnZ0xTQnBibVJsZUR0Y2JpQWdJQ0FnSUNBZ1pXeHpaU0JwWmlBb1pHVnNaWFJsUTI5MWJuUWdQVDA5SUhWdVpHVm1hVzVsWkNCOGZDQmtaV3hsZEdWRGIzVnVkQ0E5UFQwZ2JuVnNiQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lHUmxiR1YwWlVOdmRXNTBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ1pXeHpaVnh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVnNaWFJsUTI5MWJuUWdQU0JOWVhSb0xtMWhlQ2d3TENCTllYUm9MbTFwYmloa1pXeGxkR1ZEYjNWdWRDd2diR1Z1WjNSb0lDMGdhVzVrWlhncEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0c1bGQwbDBaVzF6SUQwOVBTQjFibVJsWm1sdVpXUXBYRzRnSUNBZ0lDQWdJQ0FnSUNCdVpYZEpkR1Z0Y3lBOUlGdGRPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FHRnpTVzUwWlhKalpYQjBiM0p6S0hSb2FYTXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWTJoaGJtZGxJRDBnYVc1MFpYSmpaWEIwUTJoaGJtZGxLSFJvYVhNc0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZZbXBsWTNRNklIUm9hWE11WVhKeVlYa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ1hDSnpjR3hwWTJWY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibVJsZURvZ2FXNWtaWGdzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WdGIzWmxaRU52ZFc1ME9pQmtaV3hsZEdWRGIzVnVkQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWkdSbFpEb2dibVYzU1hSbGJYTmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmphR0Z1WjJVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUVWTlVGUlpYMEZTVWtGWk8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWc1pYUmxRMjkxYm5RZ1BTQmphR0Z1WjJVdWNtVnRiM1psWkVOdmRXNTBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JtVjNTWFJsYlhNZ1BTQmphR0Z1WjJVdVlXUmtaV1E3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2JtVjNTWFJsYlhNZ1BTQnVaWGRKZEdWdGN5NXRZWEFvZEdocGN5NXRZV3RsVW1WaFkzUnBkbVZCY25KaGVVbDBaVzBzSUhSb2FYTXBPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JHVnVaM1JvUkdWc2RHRWdQU0J1WlhkSmRHVnRjeTVzWlc1bmRHZ2dMU0JrWld4bGRHVkRiM1Z1ZER0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUxY0dSaGRHVkJjbkpoZVV4bGJtZDBhQ2hzWlc1bmRHZ3NJR3hsYm1kMGFFUmxiSFJoS1R0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsY3lBOUlDaGZZU0E5SUhSb2FYTXVkbUZzZFdWektTNXpjR3hwWTJVdVlYQndiSGtvWDJFc0lGdHBibVJsZUN3Z1pHVnNaWFJsUTI5MWJuUmRMbU52Ym1OaGRDaHVaWGRKZEdWdGN5a3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb1pHVnNaWFJsUTI5MWJuUWdJVDA5SURBZ2ZId2dibVYzU1hSbGJYTXViR1Z1WjNSb0lDRTlQU0F3S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dWIzUnBabmxCY25KaGVWTndiR2xqWlNocGJtUmxlQ3dnYm1WM1NYUmxiWE1zSUhKbGN5azdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWE03WEc0Z0lDQWdJQ0FnSUhaaGNpQmZZVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVVGa2JXbHVhWE4wY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzV1YjNScFpubEJjbkpoZVVOb2FXeGtWWEJrWVhSbElEMGdablZ1WTNScGIyNGdLR2x1WkdWNExDQnVaWGRXWVd4MVpTd2diMnhrVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHNXZkR2xtZVZOd2VTQTlJQ0YwYUdsekxtOTNibVZrSUNZbUlHbHpVM0I1Ulc1aFlteGxaQ2dwTzF4dUlDQWdJQ0FnSUNCMllYSWdibTkwYVdaNUlEMGdhR0Z6VEdsemRHVnVaWEp6S0hSb2FYTXBPMXh1SUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2JtOTBhV1o1SUh4OElHNXZkR2xtZVZOd2VTQS9JSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2RHaHBjeTVoY25KaGVTeGNiaUFnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpZFhCa1lYUmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnBibVJsZURvZ2FXNWtaWGdzSUc1bGQxWmhiSFZsT2lCdVpYZFdZV3gxWlN3Z2IyeGtWbUZzZFdVNklHOXNaRlpoYkhWbFhHNGdJQ0FnSUNBZ0lIMGdPaUJ1ZFd4c08xeHVJQ0FnSUNBZ0lDQnBaaUFvYm05MGFXWjVVM0I1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBVM1JoY25Rb1kyaGhibWRsS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVoZEc5dExuSmxjRzl5ZEVOb1lXNW5aV1FvS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzV2ZEdsbWVTbGNiaUFnSUNBZ0lDQWdJQ0FnSUc1dmRHbG1lVXhwYzNSbGJtVnljeWgwYUdsekxDQmphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYm05MGFXWjVVM0I1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjM0I1VW1Wd2IzSjBSVzVrS0NrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsUVhKeVlYbEJaRzFwYm1semRISmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdWJtOTBhV1o1UVhKeVlYbFRjR3hwWTJVZ1BTQm1kVzVqZEdsdmJpQW9hVzVrWlhnc0lHRmtaR1ZrTENCeVpXMXZkbVZrS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ1YjNScFpubFRjSGtnUFNBaGRHaHBjeTV2ZDI1bFpDQW1KaUJwYzFOd2VVVnVZV0pzWldRb0tUdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1dmRHbG1lU0E5SUdoaGMweHBjM1JsYm1WeWN5aDBhR2x6S1R0Y2JpQWdJQ0FnSUNBZ2RtRnlJR05vWVc1blpTQTlJRzV2ZEdsbWVTQjhmQ0J1YjNScFpubFRjSGtnUHlCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2WW1wbFkzUTZJSFJvYVhNdVlYSnlZWGtzWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBlWEJsT2lCY0luTndiR2xqWlZ3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnYVc1a1pYZzZJR2x1WkdWNExDQnlaVzF2ZG1Wa09pQnlaVzF2ZG1Wa0xDQmhaR1JsWkRvZ1lXUmtaV1FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1Wa1EyOTFiblE2SUhKbGJXOTJaV1F1YkdWdVozUm9MRnh1SUNBZ0lDQWdJQ0FnSUNBZ1lXUmtaV1JEYjNWdWREb2dZV1JrWldRdWJHVnVaM1JvWEc0Z0lDQWdJQ0FnSUgwZ09pQnVkV3hzTzF4dUlDQWdJQ0FnSUNCcFppQW9ibTkwYVdaNVUzQjVLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMFUzUmhjblFvWTJoaGJtZGxLVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWhkRzl0TG5KbGNHOXlkRU5vWVc1blpXUW9LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVNsY2JpQWdJQ0FnSUNBZ0lDQWdJRzV2ZEdsbWVVeHBjM1JsYm1WeWN5aDBhR2x6TENCamFHRnVaMlVwTzF4dUlDQWdJQ0FnSUNCcFppQW9ibTkwYVdaNVUzQjVLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMFJXNWtLQ2s3WEc0Z0lDQWdmVHRjYmlBZ0lDQnlaWFIxY200Z1QySnpaWEoyWVdKc1pVRnljbUY1UVdSdGFXNXBjM1J5WVhScGIyNDdYRzU5S0NrcE8xeHVkbUZ5SUU5aWMyVnlkbUZpYkdWQmNuSmhlU0E5SUNobWRXNWpkR2x2YmlBb1gzTjFjR1Z5S1NCN1hHNGdJQ0FnWDE5bGVIUmxibVJ6S0U5aWMyVnlkbUZpYkdWQmNuSmhlU3dnWDNOMWNHVnlLVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQlBZbk5sY25aaFlteGxRWEp5WVhrb2FXNXBkR2xoYkZaaGJIVmxjeXdnYlc5a1pTd2dibUZ0WlN3Z2IzZHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzkzYm1Wa0lEMDlQU0IyYjJsa0lEQXBJSHNnYjNkdVpXUWdQU0JtWVd4elpUc2dmVnh1SUNBZ0lDQWdJQ0JmYzNWd1pYSXVZMkZzYkNoMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnZG1GeUlHRmtiU0E5SUc1bGR5QlBZbk5sY25aaFlteGxRWEp5WVhsQlpHMXBibWx6ZEhKaGRHbHZiaWh1WVcxbExDQnRiMlJsTENCMGFHbHpMQ0J2ZDI1bFpDazdYRzRnSUNBZ0lDQWdJR0ZrWkVocFpHUmxia1pwYm1Gc1VISnZjQ2gwYUdsekxDQmNJaVJ0YjJKNFhDSXNJR0ZrYlNrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwYm1sMGFXRnNWbUZzZFdWeklDWW1JR2x1YVhScFlXeFdZV3gxWlhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoWkcwdWRYQmtZWFJsUVhKeVlYbE1aVzVuZEdnb01Dd2dhVzVwZEdsaGJGWmhiSFZsY3k1c1pXNW5kR2dwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZV1J0TG5aaGJIVmxjeUE5SUdsdWFYUnBZV3hXWVd4MVpYTXViV0Z3S0dGa2JTNXRZV3RsVW1WaFkzUnBkbVZCY25KaGVVbDBaVzBzSUdGa2JTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCaFpHMHVibTkwYVdaNVFYSnlZWGxUY0d4cFkyVW9NQ3dnWVdSdExuWmhiSFZsY3k1emJHbGpaU2dwTENCRlRWQlVXVjlCVWxKQldTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCaFpHMHVkbUZzZFdWeklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2FXWWdLSE5oWm1GeWFWQnliM1J2ZEhsd1pWTmxkSFJsY2tsdWFHVnlhWFJoYm1ObFFuVm5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQlBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvWVdSdExtRnljbUY1TENCY0lqQmNJaXdnUlU1VVVsbGZNQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNXBiblJsY21ObGNIUWdQU0JtZFc1amRHbHZiaUFvYUdGdVpHeGxjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NGtiVzlpZUM1cGJuUmxjbU5sY0hRb2FHRnVaR3hsY2lrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMbTlpYzJWeWRtVWdQU0JtZFc1amRHbHZiaUFvYkdsemRHVnVaWElzSUdacGNtVkpiVzFsWkdsaGRHVnNlU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9abWx5WlVsdGJXVmthV0YwWld4NUlEMDlQU0IyYjJsa0lEQXBJSHNnWm1seVpVbHRiV1ZrYVdGMFpXeDVJRDBnWm1Gc2MyVTdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdUpHMXZZbmd1YjJKelpYSjJaU2hzYVhOMFpXNWxjaXdnWm1seVpVbHRiV1ZrYVdGMFpXeDVLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdVkyeGxZWElnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Od2JHbGpaU2d3S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZCY25KaGVTNXdjbTkwYjNSNWNHVXVZMjl1WTJGMElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdZWEp5WVhseklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUY5cElEMGdNRHNnWDJrZ1BDQmhjbWQxYldWdWRITXViR1Z1WjNSb095QmZhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoY25KaGVYTmJYMmtnTFNBd1hTQTlJR0Z5WjNWdFpXNTBjMXRmYVYwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkR2hwY3k0a2JXOWllQzVoZEc5dExuSmxjRzl5ZEU5aWMyVnlkbVZrS0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCQmNuSmhlUzV3Y205MGIzUjVjR1V1WTI5dVkyRjBMbUZ3Y0d4NUtIUm9hWE11YzJ4cFkyVW9LU3dnWVhKeVlYbHpMbTFoY0NobWRXNWpkR2x2YmlBb1lTa2dleUJ5WlhSMWNtNGdhWE5QWW5ObGNuWmhZbXhsUVhKeVlYa29ZU2tnUHlCaExuTnNhV05sS0NrZ09pQmhPeUI5S1NrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsUVhKeVlYa3VjSEp2ZEc5MGVYQmxMbkpsY0d4aFkyVWdQU0JtZFc1amRHbHZiaUFvYm1WM1NYUmxiWE1wSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVKRzF2WW5ndWMzQnNhV05sVjJsMGFFRnljbUY1S0RBc0lIUm9hWE11SkcxdlluZ3VkbUZzZFdWekxteGxibWQwYUN3Z2JtVjNTWFJsYlhNcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlVGeWNtRjVMbkJ5YjNSdmRIbHdaUzUwYjBwVElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXpiR2xqWlNncE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlVGeWNtRjVMbkJ5YjNSdmRIbHdaUzUwYjBwVFQwNGdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblJ2U2xNb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1Y0dWbGF5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVKRzF2WW5ndWRtRnNkV1Z6TzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNW1hVzVrSUQwZ1puVnVZM1JwYjI0Z0tIQnlaV1JwWTJGMFpTd2dkR2hwYzBGeVp5d2dabkp2YlVsdVpHVjRLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaG1jbTl0U1c1a1pYZ2dQVDA5SUhadmFXUWdNQ2tnZXlCbWNtOXRTVzVrWlhnZ1BTQXdPeUI5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVKRzF2WW5ndVlYUnZiUzV5WlhCdmNuUlBZbk5sY25abFpDZ3BPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FYUmxiWE1nUFNCMGFHbHpMaVJ0YjJKNExuWmhiSFZsY3l3Z2JDQTlJR2wwWlcxekxteGxibWQwYUR0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJR1p5YjIxSmJtUmxlRHNnYVNBOElHdzdJR2tyS3lsY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod2NtVmthV05oZEdVdVkyRnNiQ2gwYUdselFYSm5MQ0JwZEdWdGMxdHBYU3dnYVN3Z2RHaHBjeWtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2wwWlcxelcybGRPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkVzVrWldacGJtVmtPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1TG5CeWIzUnZkSGx3WlM1emNHeHBZMlVnUFNCbWRXNWpkR2x2YmlBb2FXNWtaWGdzSUdSbGJHVjBaVU52ZFc1MEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCdVpYZEpkR1Z0Y3lBOUlGdGRPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJmYVNBOUlESTdJRjlwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ1gya3JLeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdibVYzU1hSbGJYTmJYMmtnTFNBeVhTQTlJR0Z5WjNWdFpXNTBjMXRmYVYwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjM2RwZEdOb0lDaGhjbWQxYldWdWRITXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCallYTmxJREE2WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRnRkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNBeE9seHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExuTndiR2xqWlZkcGRHaEJjbkpoZVNocGJtUmxlQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSURJNlhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVKRzF2WW5ndWMzQnNhV05sVjJsMGFFRnljbUY1S0dsdVpHVjRMQ0JrWld4bGRHVkRiM1Z1ZENrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11SkcxdlluZ3VjM0JzYVdObFYybDBhRUZ5Y21GNUtHbHVaR1Y0TENCa1pXeGxkR1ZEYjNWdWRDd2dibVYzU1hSbGJYTXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1TG5CeWIzUnZkSGx3WlM1d2RYTm9JRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVhSbGJYTWdQU0JiWFR0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ1gya2dQU0F3T3lCZmFTQThJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZzdJRjlwS3lzcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsMFpXMXpXMTlwSUMwZ01GMGdQU0JoY21kMWJXVnVkSE5iWDJsZE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSFpoY2lCaFpHMGdQU0IwYUdsekxpUnRiMko0TzF4dUlDQWdJQ0FnSUNCaFpHMHVjM0JzYVdObFYybDBhRUZ5Y21GNUtHRmtiUzUyWVd4MVpYTXViR1Z1WjNSb0xDQXdMQ0JwZEdWdGN5azdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhaRzB1ZG1Gc2RXVnpMbXhsYm1kMGFEdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1Y0c5d0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXpjR3hwWTJVb1RXRjBhQzV0WVhnb2RHaHBjeTRrYlc5aWVDNTJZV3gxWlhNdWJHVnVaM1JvSUMwZ01Td2dNQ2tzSURFcFd6QmRPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1TG5CeWIzUnZkSGx3WlM1emFHbG1kQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11YzNCc2FXTmxLREFzSURFcFd6QmRPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVRnljbUY1TG5CeWIzUnZkSGx3WlM1MWJuTm9hV1owSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FYUmxiWE1nUFNCYlhUdGNiaUFnSUNBZ0lDQWdabTl5SUNoMllYSWdYMmtnUFNBd095QmZhU0E4SUdGeVozVnRaVzUwY3k1c1pXNW5kR2c3SUY5cEt5c3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbDBaVzF6VzE5cElDMGdNRjBnUFNCaGNtZDFiV1Z1ZEhOYlgybGRPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhaaGNpQmhaRzBnUFNCMGFHbHpMaVJ0YjJKNE8xeHVJQ0FnSUNBZ0lDQmhaRzB1YzNCc2FXTmxWMmwwYUVGeWNtRjVLREFzSURBc0lHbDBaVzF6S1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdGa2JTNTJZV3gxWlhNdWJHVnVaM1JvTzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNXlaWFpsY25ObElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMaVJ0YjJKNExtRjBiMjB1Y21Wd2IzSjBUMkp6WlhKMlpXUW9LVHRjYmlBZ0lDQWdJQ0FnZG1GeUlHTnNiMjVsSUQwZ2RHaHBjeTV6YkdsalpTZ3BPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMnh2Ym1VdWNtVjJaWEp6WlM1aGNIQnNlU2hqYkc5dVpTd2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyOXlkQ0E5SUdaMWJtTjBhVzl1SUNoamIyMXdZWEpsUm00cElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k0a2JXOWllQzVoZEc5dExuSmxjRzl5ZEU5aWMyVnlkbVZrS0NrN1hHNGdJQ0FnSUNBZ0lIWmhjaUJqYkc5dVpTQTlJSFJvYVhNdWMyeHBZMlVvS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOc2IyNWxMbk52Y25RdVlYQndiSGtvWTJ4dmJtVXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxRWEp5WVhrdWNISnZkRzkwZVhCbExuSmxiVzkyWlNBOUlHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVdSNElEMGdkR2hwY3k0a2JXOWllQzUyWVd4MVpYTXVhVzVrWlhoUFppaDJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwWkhnZ1BpQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emNHeHBZMlVvYVdSNExDQXhLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWNnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmNJbHR0YjJKNExtRnljbUY1WFNCY0lpQXJJRUZ5Y21GNUxuQnliM1J2ZEhsd1pTNTBiMU4wY21sdVp5NWhjSEJzZVNoMGFHbHpMaVJ0YjJKNExuWmhiSFZsY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWQmNuSmhlUzV3Y205MGIzUjVjR1V1ZEc5TWIyTmhiR1ZUZEhKcGJtY2dQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCY0lsdHRiMko0TG1GeWNtRjVYU0JjSWlBcklFRnljbUY1TG5CeWIzUnZkSGx3WlM1MGIweHZZMkZzWlZOMGNtbHVaeTVoY0hCc2VTaDBhR2x6TGlSdGIySjRMblpoYkhWbGN5d2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lISmxkSFZ5YmlCUFluTmxjblpoWW14bFFYSnlZWGs3WEc1OUtGTjBkV0pCY25KaGVTa3BPMXh1WkdWamJHRnlaVWwwWlhKaGRHOXlLRTlpYzJWeWRtRmliR1ZCY25KaGVTNXdjbTkwYjNSNWNHVXNJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZWEp5WVhsQmMwbDBaWEpoZEc5eUtIUm9hWE11YzJ4cFkyVW9LU2s3WEc1OUtUdGNibTFoYTJWT2IyNUZiblZ0WlhKaFlteGxLRTlpYzJWeWRtRmliR1ZCY25KaGVTNXdjbTkwYjNSNWNHVXNJRnRjYmlBZ0lDQmNJbU52Ym5OMGNuVmpkRzl5WENJc1hHNGdJQ0FnWENKcGJuUmxjbU5sY0hSY0lpeGNiaUFnSUNCY0ltOWljMlZ5ZG1WY0lpeGNiaUFnSUNCY0ltTnNaV0Z5WENJc1hHNGdJQ0FnWENKamIyNWpZWFJjSWl4Y2JpQWdJQ0JjSW5KbGNHeGhZMlZjSWl4Y2JpQWdJQ0JjSW5SdlNsTmNJaXhjYmlBZ0lDQmNJblJ2U2xOUFRsd2lMRnh1SUNBZ0lGd2ljR1ZsYTF3aUxGeHVJQ0FnSUZ3aVptbHVaRndpTEZ4dUlDQWdJRndpYzNCc2FXTmxYQ0lzWEc0Z0lDQWdYQ0p3ZFhOb1hDSXNYRzRnSUNBZ1hDSndiM0JjSWl4Y2JpQWdJQ0JjSW5Ob2FXWjBYQ0lzWEc0Z0lDQWdYQ0oxYm5Ob2FXWjBYQ0lzWEc0Z0lDQWdYQ0p5WlhabGNuTmxYQ0lzWEc0Z0lDQWdYQ0p6YjNKMFhDSXNYRzRnSUNBZ1hDSnlaVzF2ZG1WY0lpeGNiaUFnSUNCY0luUnZVM1J5YVc1blhDSXNYRzRnSUNBZ1hDSjBiMHh2WTJGc1pWTjBjbWx1WjF3aVhHNWRLVHRjYms5aWFtVmpkQzVrWldacGJtVlFjbTl3WlhKMGVTaFBZbk5sY25aaFlteGxRWEp5WVhrdWNISnZkRzkwZVhCbExDQmNJbXhsYm1kMGFGd2lMQ0I3WEc0Z0lDQWdaVzUxYldWeVlXSnNaVG9nWm1Gc2MyVXNYRzRnSUNBZ1kyOXVabWxuZFhKaFlteGxPaUIwY25WbExGeHVJQ0FnSUdkbGREb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NGtiVzlpZUM1blpYUkJjbkpoZVV4bGJtZDBhQ2dwTzF4dUlDQWdJSDBzWEc0Z0lDQWdjMlYwT2lCbWRXNWpkR2x2YmlBb2JtVjNUR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdUpHMXZZbmd1YzJWMFFYSnlZWGxNWlc1bmRHZ29ibVYzVEdWdVozUm9LVHRjYmlBZ0lDQjlYRzU5S1R0Y2JsdGNiaUFnSUNCY0ltVjJaWEo1WENJc1hHNGdJQ0FnWENKbWFXeDBaWEpjSWl4Y2JpQWdJQ0JjSW1admNrVmhZMmhjSWl4Y2JpQWdJQ0JjSW1sdVpHVjRUMlpjSWl4Y2JpQWdJQ0JjSW1wdmFXNWNJaXhjYmlBZ0lDQmNJbXhoYzNSSmJtUmxlRTltWENJc1hHNGdJQ0FnWENKdFlYQmNJaXhjYmlBZ0lDQmNJbkpsWkhWalpWd2lMRnh1SUNBZ0lGd2ljbVZrZFdObFVtbG5hSFJjSWl4Y2JpQWdJQ0JjSW5Oc2FXTmxYQ0lzWEc0Z0lDQWdYQ0p6YjIxbFhDSmNibDB1Wm05eVJXRmphQ2htZFc1amRHbHZiaUFvWm5WdVkwNWhiV1VwSUh0Y2JpQWdJQ0IyWVhJZ1ltRnpaVVoxYm1NZ1BTQkJjbkpoZVM1d2NtOTBiM1I1Y0dWYlpuVnVZMDVoYldWZE8xeHVJQ0FnSUdGa1pFaHBaR1JsYmxCeWIzQW9UMkp6WlhKMllXSnNaVUZ5Y21GNUxuQnliM1J2ZEhsd1pTd2dablZ1WTA1aGJXVXNJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTRrYlc5aWVDNWhkRzl0TG5KbGNHOXlkRTlpYzJWeWRtVmtLQ2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJpWVhObFJuVnVZeTVoY0hCc2VTaDBhR2x6TGlSdGIySjRMblpoYkhWbGN5d2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjlLVHRjYm4wcE8xeHVkbUZ5SUVWT1ZGSlpYekFnUFNCN1hHNGdJQ0FnWTI5dVptbG5kWEpoWW14bE9pQjBjblZsTEZ4dUlDQWdJR1Z1ZFcxbGNtRmliR1U2SUdaaGJITmxMRnh1SUNBZ0lITmxkRG9nWTNKbFlYUmxRWEp5WVhsVFpYUjBaWElvTUNrc1hHNGdJQ0FnWjJWME9pQmpjbVZoZEdWQmNuSmhlVWRsZEhSbGNpZ3dLVnh1ZlR0Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlVGeWNtRjVRblZtWm1WeVNYUmxiU2hwYm1SbGVDa2dlMXh1SUNBZ0lIWmhjaUJ6WlhRZ1BTQmpjbVZoZEdWQmNuSmhlVk5sZEhSbGNpaHBibVJsZUNrN1hHNGdJQ0FnZG1GeUlHZGxkQ0E5SUdOeVpXRjBaVUZ5Y21GNVIyVjBkR1Z5S0dsdVpHVjRLVHRjYmlBZ0lDQlBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvVDJKelpYSjJZV0pzWlVGeWNtRjVMbkJ5YjNSdmRIbHdaU3dnWENKY0lpQXJJR2x1WkdWNExDQjdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRmliR1U2SUdaaGJITmxMRnh1SUNBZ0lDQWdJQ0JqYjI1bWFXZDFjbUZpYkdVNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUhObGREb2djMlYwTENCblpYUTZJR2RsZEZ4dUlDQWdJSDBwTzF4dWZWeHVablZ1WTNScGIyNGdZM0psWVhSbFFYSnlZWGxUWlhSMFpYSW9hVzVrWlhncElIdGNiaUFnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRnS0c1bGQxWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJoWkcwZ1BTQjBhR2x6TGlSdGIySjRPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2RtRnNkV1Z6SUQwZ1lXUnRMblpoYkhWbGN6dGNiaUFnSUNBZ0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tHNWxkMVpoYkhWbExDQmNJazF2WkdsbWFXVnljeUJqWVc1dWIzUWdZbVVnZFhObFpDQnZiaUJoY25KaGVTQjJZV3gxWlhNdUlFWnZjaUJ1YjI0dGNtVmhZM1JwZG1VZ1lYSnlZWGtnZG1Gc2RXVnpJSFZ6WlNCdFlXdGxVbVZoWTNScGRtVW9ZWE5HYkdGMEtHRnljbUY1S1NrdVhDSXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGdnUENCMllXeDFaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphR1ZqYTBsbVUzUmhkR1ZOYjJScFptbGpZWFJwYjI1elFYSmxRV3hzYjNkbFpDZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzlzWkZaaGJIVmxJRDBnZG1Gc2RXVnpXMmx1WkdWNFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaG9ZWE5KYm5SbGNtTmxjSFJ2Y25Nb1lXUnRLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQmphR0Z1WjJVZ1BTQnBiblJsY21ObGNIUkRhR0Z1WjJVb1lXUnRMQ0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUZ3aWRYQmtZWFJsWENJc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlpYW1WamREb2dZV1J0TG1GeWNtRjVMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxlRG9nYVc1a1pYZ3NJRzVsZDFaaGJIVmxPaUJ1WlhkV1lXeDFaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hZMmhoYm1kbEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibVYzVm1Gc2RXVWdQU0JqYUdGdVoyVXVibVYzVm1Gc2RXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J1WlhkV1lXeDFaU0E5SUdGa2JTNXRZV3RsVW1WaFkzUnBkbVZCY25KaGVVbDBaVzBvYm1WM1ZtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOb1lXNW5aV1FnUFNBb1lXUnRMbTF2WkdVZ1BUMDlJRlpoYkhWbFRXOWtaUzVUZEhKMVkzUjFjbVVwSUQ4Z0lXUmxaWEJGY1hWaGJITW9iMnhrVm1Gc2RXVXNJRzVsZDFaaGJIVmxLU0E2SUc5c1pGWmhiSFZsSUNFOVBTQnVaWGRXWVd4MVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGphR0Z1WjJWa0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdWelcybHVaR1Y0WFNBOUlHNWxkMVpoYkhWbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmtiUzV1YjNScFpubEJjbkpoZVVOb2FXeGtWWEJrWVhSbEtHbHVaR1Y0TENCdVpYZFdZV3gxWlN3Z2IyeGtWbUZzZFdVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHVnNjMlVnYVdZZ0tHbHVaR1Y0SUQwOVBTQjJZV3gxWlhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoWkcwdWMzQnNhV05sVjJsMGFFRnljbUY1S0dsdVpHVjRMQ0F3TENCYmJtVjNWbUZzZFdWZEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JsYkhObFhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0piYlc5aWVDNWhjbkpoZVYwZ1NXNWtaWGdnYjNWMElHOW1JR0p2ZFc1a2N5d2dYQ0lnS3lCcGJtUmxlQ0FySUZ3aUlHbHpJR3hoY21kbGNpQjBhR0Z1SUZ3aUlDc2dkbUZzZFdWekxteGxibWQwYUNrN1hHNGdJQ0FnZlR0Y2JuMWNibVoxYm1OMGFXOXVJR055WldGMFpVRnljbUY1UjJWMGRHVnlLR2x1WkdWNEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdsdGNHd2dQU0IwYUdsekxpUnRiMko0TzF4dUlDQWdJQ0FnSUNCcFppQW9hVzF3YkNBbUppQnBibVJsZUNBOElHbHRjR3d1ZG1Gc2RXVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXMXdiQzVoZEc5dExuSmxjRzl5ZEU5aWMyVnlkbVZrS0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdhVzF3YkM1MllXeDFaWE5iYVc1a1pYaGRPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdOdmJuTnZiR1V1ZDJGeWJpaGNJbHR0YjJKNExtRnljbUY1WFNCQmRIUmxiWEIwSUhSdklISmxZV1FnWVc0Z1lYSnlZWGtnYVc1a1pYZ2dLRndpSUNzZ2FXNWtaWGdnS3lCY0lpa2dkR2hoZENCcGN5QnZkWFFnYjJZZ1ltOTFibVJ6SUNoY0lpQXJJR2x0Y0d3dWRtRnNkV1Z6TG14bGJtZDBhQ0FySUZ3aUtTNGdVR3hsWVhObElHTm9aV05ySUd4bGJtZDBhQ0JtYVhKemRDNGdUM1YwSUc5bUlHSnZkVzVrSUdsdVpHbGpaWE1nZDJsc2JDQnViM1FnWW1VZ2RISmhZMnRsWkNCaWVTQk5iMkpZWENJcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUgwN1hHNTlYRzVtZFc1amRHbHZiaUJ5WlhObGNuWmxRWEp5WVhsQ2RXWm1aWElvYldGNEtTQjdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FXNWtaWGdnUFNCUFFsTkZVbFpCUWt4RlgwRlNVa0ZaWDBKVlJrWkZVbDlUU1ZwRk95QnBibVJsZUNBOElHMWhlRHNnYVc1a1pYZ3JLeWxjYmlBZ0lDQWdJQ0FnWTNKbFlYUmxRWEp5WVhsQ2RXWm1aWEpKZEdWdEtHbHVaR1Y0S1R0Y2JpQWdJQ0JQUWxORlVsWkJRa3hGWDBGU1VrRlpYMEpWUmtaRlVsOVRTVnBGSUQwZ2JXRjRPMXh1ZlZ4dWNtVnpaWEoyWlVGeWNtRjVRblZtWm1WeUtERXdNREFwTzF4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsVDJKelpYSjJZV0pzWlVGeWNtRjVLR2x1YVhScFlXeFdZV3gxWlhNc0lHMXZaR1VzSUc1aGJXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRTlpYzJWeWRtRmliR1ZCY25KaGVTaHBibWwwYVdGc1ZtRnNkV1Z6TENCdGIyUmxMQ0J1WVcxbEtUdGNibjFjYm1aMWJtTjBhVzl1SUdaaGMzUkJjbkpoZVNocGJtbDBhV0ZzVm1Gc2RXVnpLU0I3WEc0Z0lDQWdaR1Z3Y21WallYUmxaQ2hjSW1aaGMzUkJjbkpoZVNCcGN5QmtaWEJ5WldOaGRHVmtMaUJRYkdWaGMyVWdkWE5sSUdCdlluTmxjblpoWW14bEtHRnpSbXhoZENoYlhTa3BZRndpS1R0Y2JpQWdJQ0J5WlhSMWNtNGdZM0psWVhSbFQySnpaWEoyWVdKc1pVRnljbUY1S0dsdWFYUnBZV3hXWVd4MVpYTXNJRlpoYkhWbFRXOWtaUzVHYkdGMExDQnVkV3hzS1R0Y2JuMWNibVY0Y0c5eWRITXVabUZ6ZEVGeWNtRjVJRDBnWm1GemRFRnljbUY1TzF4dVpuVnVZM1JwYjI0Z2FYTlBZbk5sY25aaFlteGxRWEp5WVhrb2RHaHBibWNwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwYm1jZ2FXNXpkR0Z1WTJWdlppQlBZbk5sY25aaFlteGxRWEp5WVhrN1hHNTlYRzVsZUhCdmNuUnpMbWx6VDJKelpYSjJZV0pzWlVGeWNtRjVJRDBnYVhOUFluTmxjblpoWW14bFFYSnlZWGs3WEc1MllYSWdUMkp6WlhKMllXSnNaVTFoY0UxaGNtdGxjaUE5SUh0OU8xeHVkbUZ5SUU5aWMyVnlkbUZpYkdWTllYQWdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdaMWJtTjBhVzl1SUU5aWMyVnlkbUZpYkdWTllYQW9hVzVwZEdsaGJFUmhkR0VzSUhaaGJIVmxUVzlrWlVaMWJtTXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlGOTBhR2x6SUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnZEdocGN5NGtiVzlpZUNBOUlFOWljMlZ5ZG1GaWJHVk5ZWEJOWVhKclpYSTdYRzRnSUNBZ0lDQWdJSFJvYVhNdVgyUmhkR0VnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1ZmFHRnpUV0Z3SUQwZ2UzMDdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJtRnRaU0E5SUZ3aVQySnpaWEoyWVdKc1pVMWhjRUJjSWlBcklHZGxkRTVsZUhSSlpDZ3BPMXh1SUNBZ0lDQWdJQ0IwYUdsekxsOXJaWGx6SUQwZ2JtVjNJRTlpYzJWeWRtRmliR1ZCY25KaGVTaHVkV3hzTENCV1lXeDFaVTF2WkdVdVVtVm1aWEpsYm1ObExDQjBhR2x6TG01aGJXVWdLeUJjSWk1clpYbHpLQ2xjSWl3Z2RISjFaU2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhVzUwWlhKalpYQjBiM0p6SUQwZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWphR0Z1WjJWTWFYTjBaVzVsY25NZ1BTQnVkV3hzTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbDkyWVd4MVpVMXZaR1VnUFNCblpYUldZV3gxWlUxdlpHVkdjbTl0VFc5a2FXWnBaWEpHZFc1aktIWmhiSFZsVFc5a1pVWjFibU1wTzF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1ZmRtRnNkV1ZOYjJSbElEMDlQU0JXWVd4MVpVMXZaR1V1Um14aGRDbGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVYM1poYkhWbFRXOWtaU0E5SUZaaGJIVmxUVzlrWlM1U1pXWmxjbVZ1WTJVN1hHNGdJQ0FnSUNBZ0lHRnNiRzkzVTNSaGRHVkRhR0Z1WjJWektIUnlkV1VzSUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBjMUJzWVdsdVQySnFaV04wS0dsdWFYUnBZV3hFWVhSaEtTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmZkR2hwY3k1dFpYSm5aU2hwYm1sMGFXRnNSR0YwWVNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2hCY25KaGVTNXBjMEZ5Y21GNUtHbHVhWFJwWVd4RVlYUmhLU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm1sMGFXRnNSR0YwWVM1bWIzSkZZV05vS0daMWJtTjBhVzl1SUNoZllTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdhMlY1SUQwZ1gyRmJNRjBzSUhaaGJIVmxJRDBnWDJGYk1WMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJmZEdocGN5NXpaWFFvYTJWNUxDQjJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJSDFjYmlBZ0lDQlBZbk5sY25aaFlteGxUV0Z3TG5CeWIzUnZkSGx3WlM1ZmFHRnpJRDBnWm5WdVkzUnBiMjRnS0d0bGVTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIUm9hWE11WDJSaGRHRmJhMlY1WFNBaFBUMGdYQ0oxYm1SbFptbHVaV1JjSWp0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZOWVhBdWNISnZkRzkwZVhCbExtaGhjeUE5SUdaMWJtTjBhVzl1SUNoclpYa3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1selZtRnNhV1JMWlhrb2EyVjVLU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnYTJWNUlEMGdYQ0pjSWlBcklHdGxlVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11WDJoaGMwMWhjRnRyWlhsZEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgyaGhjMDFoY0Z0clpYbGRMbWRsZENncE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVmZFhCa1lYUmxTR0Z6VFdGd1JXNTBjbmtvYTJWNUxDQm1ZV3h6WlNrdVoyVjBLQ2s3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxUV0Z3TG5CeWIzUnZkSGx3WlM1elpYUWdQU0JtZFc1amRHbHZiaUFvYTJWNUxDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG1GemMyVnlkRlpoYkdsa1MyVjVLR3RsZVNrN1hHNGdJQ0FnSUNBZ0lHdGxlU0E5SUZ3aVhDSWdLeUJyWlhrN1hHNGdJQ0FnSUNBZ0lIWmhjaUJvWVhOTFpYa2dQU0IwYUdsekxsOW9ZWE1vYTJWNUtUdGNiaUFnSUNBZ0lDQWdZWE56WlhKMFZXNTNjbUZ3Y0dWa0tIWmhiSFZsTENCY0lsdHRiMko0TG0xaGNDNXpaWFJkSUVWNGNHVmpkR1ZrSUhWdWQzSmhjSEJsWkNCMllXeDFaU0IwYnlCaVpTQnBibk5sY25SbFpDQjBieUJyWlhrZ0oxd2lJQ3NnYTJWNUlDc2dYQ0luTGlCSlppQjViM1VnYm1WbFpDQjBieUIxYzJVZ2JXOWthV1pwWlhKeklIQmhjM01nZEdobGJTQmhjeUJ6WldOdmJtUWdZWEpuZFcxbGJuUWdkRzhnZEdobElHTnZibk4wY25WamRHOXlYQ0lwTzF4dUlDQWdJQ0FnSUNCcFppQW9hR0Z6U1c1MFpYSmpaWEIwYjNKektIUm9hWE1wS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2FXNTBaWEpqWlhCMFEyaGhibWRsS0hSb2FYTXNJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQm9ZWE5MWlhrZ1B5QmNJblZ3WkdGMFpWd2lJRG9nWENKaFpHUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WW1wbFkzUTZJSFJvYVhNc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVNklIWmhiSFZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1aGJXVTZJR3RsZVZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdOb1lXNW5aU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaU0E5SUdOb1lXNW5aUzV1WlhkV1lXeDFaVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppQW9hR0Z6UzJWNUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbDkxY0dSaGRHVldZV3gxWlNoclpYa3NJSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVYMkZrWkZaaGJIVmxLR3RsZVN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNWtaV3hsZEdVZ1BTQm1kVzVqZEdsdmJpQW9hMlY1S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJmZEdocGN5QTlJSFJvYVhNN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WVhOelpYSjBWbUZzYVdSTFpYa29hMlY1S1R0Y2JpQWdJQ0FnSUNBZ2EyVjVJRDBnWENKY0lpQXJJR3RsZVR0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2hoYzBsdWRHVnlZMlZ3ZEc5eWN5aDBhR2x6S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTm9ZVzVuWlNBOUlHbHVkR1Z5WTJWd2RFTm9ZVzVuWlNoMGFHbHpMQ0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0prWld4bGRHVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WW1wbFkzUTZJSFJvYVhNc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYTJWNVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaFkyaGhibWRsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVmYUdGektHdGxlU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdWIzUnBabmxUY0hrZ1BTQnBjMU53ZVVWdVlXSnNaV1FvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdWIzUnBabmtnUFNCb1lYTk1hWE4wWlc1bGNuTW9kR2hwY3lrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2JtOTBhV1o1SUh4OElHNXZkR2xtZVZOd2VTQS9JSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQmNJbVJsYkdWMFpWd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzlpYW1WamREb2dkR2hwY3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmJHUldZV3gxWlRvZ2RHaHBjeTVmWkdGMFlWdHJaWGxkTG5aaGJIVmxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVNklHdGxlVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQTZJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1VTNCNUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndlVkpsY0c5eWRGTjBZWEowS0dOb1lXNW5aU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBjbUZ1YzJGamRHbHZiaWhtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1gzUm9hWE11WDJ0bGVYTXVjbVZ0YjNabEtHdGxlU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWDNSb2FYTXVYM1Z3WkdGMFpVaGhjMDFoY0VWdWRISjVLR3RsZVN3Z1ptRnNjMlVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnZZbk5sY25aaFlteGxJRDBnWDNSb2FYTXVYMlJoZEdGYmEyVjVYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WW5ObGNuWmhZbXhsTG5ObGRFNWxkMVpoYkhWbEtIVnVaR1ZtYVc1bFpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYM1JvYVhNdVgyUmhkR0ZiYTJWNVhTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHNJSFZ1WkdWbWFXNWxaQ3dnWm1Gc2MyVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzV2ZEdsbWVTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnViM1JwWm5sTWFYTjBaVzVsY25Nb2RHaHBjeXdnWTJoaGJtZGxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1YjNScFpubFRjSGtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNCNVVtVndiM0owUlc1a0tDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEhKMVpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNWZkWEJrWVhSbFNHRnpUV0Z3Ulc1MGNua2dQU0JtZFc1amRHbHZiaUFvYTJWNUxDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWlc1MGNua2dQU0IwYUdsekxsOW9ZWE5OWVhCYmEyVjVYVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHVnVkSEo1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JsYm5SeWVTNXpaWFJPWlhkV1lXeDFaU2gyWVd4MVpTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGJuUnllU0E5SUhSb2FYTXVYMmhoYzAxaGNGdHJaWGxkSUQwZ2JtVjNJRTlpYzJWeWRtRmliR1ZXWVd4MVpTaDJZV3gxWlN3Z1ZtRnNkV1ZOYjJSbExsSmxabVZ5Wlc1alpTd2dkR2hwY3k1dVlXMWxJQ3NnWENJdVhDSWdLeUJyWlhrZ0t5QmNJajljSWl3Z1ptRnNjMlVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbGJuUnllVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVk5ZWEF1Y0hKdmRHOTBlWEJsTGw5MWNHUmhkR1ZXWVd4MVpTQTlJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQnVaWGRXWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2IySnpaWEoyWVdKc1pTQTlJSFJvYVhNdVgyUmhkR0ZiYm1GdFpWMDdYRzRnSUNBZ0lDQWdJRzVsZDFaaGJIVmxJRDBnYjJKelpYSjJZV0pzWlM1d2NtVndZWEpsVG1WM1ZtRnNkV1VvYm1WM1ZtRnNkV1VwTzF4dUlDQWdJQ0FnSUNCcFppQW9ibVYzVm1Gc2RXVWdJVDA5SUZWT1EwaEJUa2RGUkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHNXZkR2xtZVZOd2VTQTlJR2x6VTNCNVJXNWhZbXhsWkNncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHNXZkR2xtZVNBOUlHaGhjMHhwYzNSbGJtVnljeWgwYUdsektUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmphR0Z1WjJVZ1BTQnViM1JwWm5rZ2ZId2dibTkwYVdaNVUzQjVJRDhnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpZFhCa1lYUmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJKcVpXTjBPaUIwYUdsekxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXNaRlpoYkhWbE9pQnZZbk5sY25aaFlteGxMblpoYkhWbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1U2SUc1aGJXVXNJRzVsZDFaaGJIVmxPaUJ1WlhkV1lXeDFaVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQTZJRzUxYkd3N1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1VTNCNUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndlVkpsY0c5eWRGTjBZWEowS0dOb1lXNW5aU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnZZbk5sY25aaFlteGxMbk5sZEU1bGQxWmhiSFZsS0c1bGQxWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm05MGFXWjVUR2x6ZEdWdVpYSnpLSFJvYVhNc0lHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1VTNCNUtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITndlVkpsY0c5eWRFVnVaQ2dwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNWZZV1JrVm1Gc2RXVWdQU0JtZFc1amRHbHZiaUFvYm1GdFpTd2dibVYzVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlGOTBhR2x6SUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnZEhKaGJuTmhZM1JwYjI0b1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzlpYzJWeWRtRmliR1VnUFNCZmRHaHBjeTVmWkdGMFlWdHVZVzFsWFNBOUlHNWxkeUJQWW5ObGNuWmhZbXhsVm1Gc2RXVW9ibVYzVm1Gc2RXVXNJRjkwYUdsekxsOTJZV3gxWlUxdlpHVXNJRjkwYUdsekxtNWhiV1VnS3lCY0lpNWNJaUFySUc1aGJXVXNJR1poYkhObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQxWmhiSFZsSUQwZ2IySnpaWEoyWVdKc1pTNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJRjkwYUdsekxsOTFjR1JoZEdWSVlYTk5ZWEJGYm5SeWVTaHVZVzFsTENCMGNuVmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lGOTBhR2x6TGw5clpYbHpMbkIxYzJnb2JtRnRaU2s3WEc0Z0lDQWdJQ0FnSUgwc0lIVnVaR1ZtYVc1bFpDd2dabUZzYzJVcE8xeHVJQ0FnSUNBZ0lDQjJZWElnYm05MGFXWjVVM0I1SUQwZ2FYTlRjSGxGYm1GaWJHVmtLQ2s3WEc0Z0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5rZ1BTQm9ZWE5NYVhOMFpXNWxjbk1vZEdocGN5azdYRzRnSUNBZ0lDQWdJSFpoY2lCamFHRnVaMlVnUFNCdWIzUnBabmtnZkh3Z2JtOTBhV1o1VTNCNUlEOGdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RIbHdaVG9nWENKaFpHUmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2RHaHBjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1U2SUc1aGJXVXNJRzVsZDFaaGJIVmxPaUJ1WlhkV1lXeDFaVnh1SUNBZ0lDQWdJQ0I5SURvZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhOd2VWSmxjRzl5ZEZOMFlYSjBLR05vWVc1blpTazdYRzRnSUNBZ0lDQWdJR2xtSUNodWIzUnBabmtwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnViM1JwWm5sTWFYTjBaVzVsY25Nb2RHaHBjeXdnWTJoaGJtZGxLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhOd2VWSmxjRzl5ZEVWdVpDZ3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVMWhjQzV3Y205MGIzUjVjR1V1WjJWMElEMGdablZ1WTNScGIyNGdLR3RsZVNrZ2UxeHVJQ0FnSUNBZ0lDQnJaWGtnUFNCY0lsd2lJQ3NnYTJWNU8xeHVJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NW9ZWE1vYTJWNUtTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxsOWtZWFJoVzJ0bGVWMHVaMlYwS0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNXJaWGx6SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZWEp5WVhsQmMwbDBaWEpoZEc5eUtIUm9hWE11WDJ0bGVYTXVjMnhwWTJVb0tTazdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaUzUyWVd4MVpYTWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaGNuSmhlVUZ6U1hSbGNtRjBiM0lvZEdocGN5NWZhMlY1Y3k1dFlYQW9kR2hwY3k1blpYUXNJSFJvYVhNcEtUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMbVZ1ZEhKcFpYTWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJmZEdocGN5QTlJSFJvYVhNN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaGNuSmhlVUZ6U1hSbGNtRjBiM0lvZEdocGN5NWZhMlY1Y3k1dFlYQW9ablZ1WTNScGIyNGdLR3RsZVNrZ2V5QnlaWFIxY200Z1cydGxlU3dnWDNSb2FYTXVaMlYwS0d0bGVTbGRPeUI5S1NrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNW1iM0pGWVdOb0lEMGdablZ1WTNScGIyNGdLR05oYkd4aVlXTnJMQ0IwYUdselFYSm5LU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmZkR2hwY3lBOUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhMlY1Y3lncExtWnZja1ZoWTJnb1puVnVZM1JwYjI0Z0tHdGxlU2tnZXlCeVpYUjFjbTRnWTJGc2JHSmhZMnN1WTJGc2JDaDBhR2x6UVhKbkxDQmZkR2hwY3k1blpYUW9hMlY1S1N3Z2EyVjVLVHNnZlNrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JQWW5ObGNuWmhZbXhsVFdGd0xuQnliM1J2ZEhsd1pTNXRaWEpuWlNBOUlHWjFibU4wYVc5dUlDaHZkR2hsY2lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWDNSb2FYTWdQU0IwYUdsek8xeHVJQ0FnSUNBZ0lDQjBjbUZ1YzJGamRHbHZiaWhtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2IzUm9aWElnYVc1emRHRnVZMlZ2WmlCUFluTmxjblpoWW14bFRXRndLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkwYUdWeUxtdGxlWE1vS1M1bWIzSkZZV05vS0daMWJtTjBhVzl1SUNoclpYa3BJSHNnY21WMGRYSnVJRjkwYUdsekxuTmxkQ2hyWlhrc0lHOTBhR1Z5TG1kbGRDaHJaWGtwS1RzZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGJITmxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdUMkpxWldOMExtdGxlWE1vYjNSb1pYSXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3RsZVNrZ2V5QnlaWFIxY200Z1gzUm9hWE11YzJWMEtHdGxlU3dnYjNSb1pYSmJhMlY1WFNrN0lIMHBPMXh1SUNBZ0lDQWdJQ0I5TENCMWJtUmxabWx1WldRc0lHWmhiSE5sS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaUzVqYkdWaGNpQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRjkwYUdseklEMGdkR2hwY3p0Y2JpQWdJQ0FnSUNBZ2RISmhibk5oWTNScGIyNG9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkVzUwY21GamEyVmtLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCZmRHaHBjeTVyWlhsektDa3VabTl5UldGamFDaGZkR2hwY3k1a1pXeGxkR1VzSUY5MGFHbHpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5TENCMWJtUmxabWx1WldRc0lHWmhiSE5sS1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNoUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaU3dnWENKemFYcGxYQ0lzSUh0Y2JpQWdJQ0FnSUNBZ1oyVjBPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmEyVjVjeTVzWlc1bmRHZzdYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUdOdmJtWnBaM1Z5WVdKc1pUb2dkSEoxWlZ4dUlDQWdJSDBwTzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZOWVhBdWNISnZkRzkwZVhCbExuUnZTbE1nUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCZmRHaHBjeUE5SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSFpoY2lCeVpYTWdQU0I3ZlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVyWlhsektDa3VabTl5UldGamFDaG1kVzVqZEdsdmJpQW9hMlY1S1NCN0lISmxkSFZ5YmlCeVpYTmJhMlY1WFNBOUlGOTBhR2x6TG1kbGRDaHJaWGtwT3lCOUtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlISmxjenRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVk5ZWEF1Y0hKdmRHOTBlWEJsTG5SdlNuTWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lHUmxjSEpsWTJGMFpXUW9YQ0owYjBweklHbHpJR1JsY0hKbFkyRjBaV1FzSUhWelpTQjBiMHBUSUdsdWMzUmxZV1JjSWlrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblJ2U2xNb0tUdGNiaUFnSUNCOU8xeHVJQ0FnSUU5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMblJ2U2xOUFRpQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkRzlLVXlncE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVhWE5XWVd4cFpFdGxlU0E5SUdaMWJtTjBhVzl1SUNoclpYa3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHdGxlU0E5UFQwZ2JuVnNiQ0I4ZkNCclpYa2dQVDA5SUhWdVpHVm1hVzVsWkNsY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnJaWGtnSVQwOUlGd2ljM1J5YVc1blhDSWdKaVlnZEhsd1pXOW1JR3RsZVNBaFBUMGdYQ0p1ZFcxaVpYSmNJaUFtSmlCMGVYQmxiMllnYTJWNUlDRTlQU0JjSW1KdmIyeGxZVzVjSWlsY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUNBZ2ZUdGNiaUFnSUNCUFluTmxjblpoWW14bFRXRndMbkJ5YjNSdmRIbHdaUzVoYzNObGNuUldZV3hwWkV0bGVTQTlJR1oxYm1OMGFXOXVJQ2hyWlhrcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbWx6Vm1Gc2FXUkxaWGtvYTJWNUtTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSWx0dGIySjRMbTFoY0YwZ1NXNTJZV3hwWkNCclpYazZJQ2RjSWlBcklHdGxlU0FySUZ3aUoxd2lLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFOWljMlZ5ZG1GaWJHVk5ZWEF1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ1gzUm9hWE1nUFNCMGFHbHpPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1dVlXMWxJQ3NnWENKYmV5QmNJaUFySUhSb2FYTXVhMlY1Y3lncExtMWhjQ2htZFc1amRHbHZiaUFvYTJWNUtTQjdJSEpsZEhWeWJpQW9hMlY1SUNzZ1hDSTZJRndpSUNzZ0tGd2lYQ0lnS3lCZmRHaHBjeTVuWlhRb2EyVjVLU2twT3lCOUtTNXFiMmx1S0Z3aUxDQmNJaWtnS3lCY0lpQjlYVndpTzF4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVTFoY0M1d2NtOTBiM1I1Y0dVdWIySnpaWEoyWlNBOUlHWjFibU4wYVc5dUlDaHNhWE4wWlc1bGNpd2dabWx5WlVsdGJXVmthV0YwWld4NUtTQjdYRzRnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2htYVhKbFNXMXRaV1JwWVhSbGJIa2dJVDA5SUhSeWRXVXNJRndpWUc5aWMyVnlkbVZnSUdSdlpYTnVKM1FnYzNWd2NHOXlkQ0IwYUdVZ1ptbHlaU0JwYlcxbFpHbGhkR1ZzZVNCd2NtOXdaWEowZVNCbWIzSWdiMkp6WlhKMllXSnNaU0J0WVhCekxsd2lLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsWjJsemRHVnlUR2x6ZEdWdVpYSW9kR2hwY3l3Z2JHbHpkR1Z1WlhJcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlUxaGNDNXdjbTkwYjNSNWNHVXVhVzUwWlhKalpYQjBJRDBnWm5WdVkzUnBiMjRnS0doaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFoybHpkR1Z5U1c1MFpYSmpaWEIwYjNJb2RHaHBjeXdnYUdGdVpHeGxjaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQnlaWFIxY200Z1QySnpaWEoyWVdKc1pVMWhjRHRjYm4wb0tTazdYRzVsZUhCdmNuUnpMazlpYzJWeWRtRmliR1ZOWVhBZ1BTQlBZbk5sY25aaFlteGxUV0Z3TzF4dVpHVmpiR0Z5WlVsMFpYSmhkRzl5S0U5aWMyVnlkbUZpYkdWTllYQXVjSEp2ZEc5MGVYQmxMQ0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVpXNTBjbWxsY3lncE8xeHVmU2s3WEc1bWRXNWpkR2x2YmlCdFlYQW9hVzVwZEdsaGJGWmhiSFZsY3l3Z2RtRnNkV1ZOYjJScFptbGxjaWtnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVDJKelpYSjJZV0pzWlUxaGNDaHBibWwwYVdGc1ZtRnNkV1Z6TENCMllXeDFaVTF2WkdsbWFXVnlLVHRjYm4xY2JtVjRjRzl5ZEhNdWJXRndJRDBnYldGd08xeHVablZ1WTNScGIyNGdhWE5QWW5ObGNuWmhZbXhsVFdGd0tIUm9hVzVuS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVc1bklHbHVjM1JoYm1ObGIyWWdUMkp6WlhKMllXSnNaVTFoY0R0Y2JuMWNibVY0Y0c5eWRITXVhWE5QWW5ObGNuWmhZbXhsVFdGd0lEMGdhWE5QWW5ObGNuWmhZbXhsVFdGd08xeHVkbUZ5SUU5aWMyVnlkbUZpYkdWUFltcGxZM1JCWkcxcGJtbHpkSEpoZEdsdmJpQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnWm5WdVkzUnBiMjRnVDJKelpYSjJZV0pzWlU5aWFtVmpkRUZrYldsdWFYTjBjbUYwYVc5dUtIUmhjbWRsZEN3Z2JtRnRaU3dnYlc5a1pTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxuUmhjbWRsZENBOUlIUmhjbWRsZER0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV1WVcxbElEMGdibUZ0WlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0YjJSbElEMGdiVzlrWlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpYTWdQU0I3ZlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVqYUdGdVoyVk1hWE4wWlc1bGNuTWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1sdWRHVnlZMlZ3ZEc5eWN5QTlJRzUxYkd3N1hHNGdJQ0FnZlZ4dUlDQWdJRTlpYzJWeWRtRmliR1ZQWW1wbFkzUkJaRzFwYm1semRISmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdWIySnpaWEoyWlNBOUlHWjFibU4wYVc5dUlDaGpZV3hzWW1GamF5d2dabWx5WlVsdGJXVmthV0YwWld4NUtTQjdYRzRnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2htYVhKbFNXMXRaV1JwWVhSbGJIa2dJVDA5SUhSeWRXVXNJRndpWUc5aWMyVnlkbVZnSUdSdlpYTnVKM1FnYzNWd2NHOXlkQ0IwYUdVZ1ptbHlaU0JwYlcxbFpHbGhkR1ZzZVNCd2NtOXdaWEowZVNCbWIzSWdiMkp6WlhKMllXSnNaU0J2WW1wbFkzUnpMbHdpS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbFoybHpkR1Z5VEdsemRHVnVaWElvZEdocGN5d2dZMkZzYkdKaFkyc3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pVOWlhbVZqZEVGa2JXbHVhWE4wY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzVwYm5SbGNtTmxjSFFnUFNCbWRXNWpkR2x2YmlBb2FHRnVaR3hsY2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVm5hWE4wWlhKSmJuUmxjbU5sY0hSdmNpaDBhR2x6TENCb1lXNWtiR1Z5S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJSEpsZEhWeWJpQlBZbk5sY25aaFlteGxUMkpxWldOMFFXUnRhVzVwYzNSeVlYUnBiMjQ3WEc1OUtDa3BPMXh1Wm5WdVkzUnBiMjRnWVhOUFluTmxjblpoWW14bFQySnFaV04wS0hSaGNtZGxkQ3dnYm1GdFpTd2diVzlrWlNrZ2UxeHVJQ0FnSUdsbUlDaHRiMlJsSUQwOVBTQjJiMmxrSURBcElIc2diVzlrWlNBOUlGWmhiSFZsVFc5a1pTNVNaV04xY25OcGRtVTdJSDFjYmlBZ0lDQnBaaUFvYVhOUFluTmxjblpoWW14bFQySnFaV04wS0hSaGNtZGxkQ2twWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwWVhKblpYUXVKRzF2WW5nN1hHNGdJQ0FnYVdZZ0tDRnBjMUJzWVdsdVQySnFaV04wS0hSaGNtZGxkQ2twWEc0Z0lDQWdJQ0FnSUc1aGJXVWdQU0IwWVhKblpYUXVZMjl1YzNSeWRXTjBiM0l1Ym1GdFpTQXJJRndpUUZ3aUlDc2daMlYwVG1WNGRFbGtLQ2s3WEc0Z0lDQWdhV1lnS0NGdVlXMWxLVnh1SUNBZ0lDQWdJQ0J1WVcxbElEMGdYQ0pQWW5ObGNuWmhZbXhsVDJKcVpXTjBRRndpSUNzZ1oyVjBUbVY0ZEVsa0tDazdYRzRnSUNBZ2RtRnlJR0ZrYlNBOUlHNWxkeUJQWW5ObGNuWmhZbXhsVDJKcVpXTjBRV1J0YVc1cGMzUnlZWFJwYjI0b2RHRnlaMlYwTENCdVlXMWxMQ0J0YjJSbEtUdGNiaUFnSUNCaFpHUklhV1JrWlc1R2FXNWhiRkJ5YjNBb2RHRnlaMlYwTENCY0lpUnRiMko0WENJc0lHRmtiU2s3WEc0Z0lDQWdjbVYwZFhKdUlHRmtiVHRjYm4xY2JtWjFibU4wYVc5dUlITmxkRTlpYzJWeWRtRmliR1ZQWW1wbFkzUkpibk4wWVc1alpWQnliM0JsY25SNUtHRmtiU3dnY0hKdmNFNWhiV1VzSUhaaGJIVmxLU0I3WEc0Z0lDQWdhV1lnS0dGa2JTNTJZV3gxWlhOYmNISnZjRTVoYldWZEtWeHVJQ0FnSUNBZ0lDQmhaRzB1ZEdGeVoyVjBXM0J5YjNCT1lXMWxYU0E5SUhaaGJIVmxPMXh1SUNBZ0lHVnNjMlZjYmlBZ0lDQWdJQ0FnWkdWbWFXNWxUMkp6WlhKMllXSnNaVkJ5YjNCbGNuUjVLR0ZrYlN3Z2NISnZjRTVoYldVc0lIWmhiSFZsTENCMGNuVmxMQ0IxYm1SbFptbHVaV1FwTzF4dWZWeHVablZ1WTNScGIyNGdaR1ZtYVc1bFQySnpaWEoyWVdKc1pWQnliM0JsY25SNUtHRmtiU3dnY0hKdmNFNWhiV1VzSUc1bGQxWmhiSFZsTENCaGMwbHVjM1JoYm1ObFVISnZjR1Z5ZEhrc0lITmxkSFJsY2lrZ2UxeHVJQ0FnSUdsbUlDaGhjMGx1YzNSaGJtTmxVSEp2Y0dWeWRIa3BYRzRnSUNBZ0lDQWdJR0Z6YzJWeWRGQnliM0JsY25SNVEyOXVabWxuZFhKaFlteGxLR0ZrYlM1MFlYSm5aWFFzSUhCeWIzQk9ZVzFsS1R0Y2JpQWdJQ0IyWVhJZ2IySnpaWEoyWVdKc1pUdGNiaUFnSUNCMllYSWdibUZ0WlNBOUlHRmtiUzV1WVcxbElDc2dYQ0l1WENJZ0t5QndjbTl3VG1GdFpUdGNiaUFnSUNCMllYSWdhWE5EYjIxd2RYUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ2FXWWdLRzVsZDFaaGJIVmxJR2x1YzNSaGJtTmxiMllnVDJKelpYSjJZV0pzWlZaaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUc5aWMyVnlkbUZpYkdVZ1BTQnVaWGRXWVd4MVpUdGNiaUFnSUNBZ0lDQWdhWE5EYjIxd2RYUmxaQ0E5SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNodVpYZFdZV3gxWlNCcGJuTjBZVzVqWlc5bUlFTnZiWEIxZEdWa1ZtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2IySnpaWEoyWVdKc1pTQTlJRzVsZDFaaGJIVmxPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXNWxkMVpoYkhWbExuTmpiM0JsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdibVYzVm1Gc2RXVXVjMk52Y0dVZ1BTQmhaRzB1ZEdGeVoyVjBPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNoMGVYQmxiMllnYm1WM1ZtRnNkV1VnUFQwOUlGd2lablZ1WTNScGIyNWNJaUFtSmlCdVpYZFdZV3gxWlM1c1pXNW5kR2dnUFQwOUlEQWdKaVlnSVdselFXTjBhVzl1S0c1bGQxWmhiSFZsS1NrZ2UxeHVJQ0FnSUNBZ0lDQnZZbk5sY25aaFlteGxJRDBnYm1WM0lFTnZiWEIxZEdWa1ZtRnNkV1VvYm1WM1ZtRnNkV1VzSUdGa2JTNTBZWEpuWlhRc0lHWmhiSE5sTENCdVlXMWxMQ0J6WlhSMFpYSXBPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJR2xtSUNodVpYZFdZV3gxWlNCcGJuTjBZVzVqWlc5bUlFRnpVM1J5ZFdOMGRYSmxJQ1ltSUhSNWNHVnZaaUJ1WlhkV1lXeDFaUzUyWVd4MVpTQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JRzVsZDFaaGJIVmxMblpoYkhWbExteGxibWQwYUNBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNCdlluTmxjblpoWW14bElEMGdibVYzSUVOdmJYQjFkR1ZrVm1Gc2RXVW9ibVYzVm1Gc2RXVXVkbUZzZFdVc0lHRmtiUzUwWVhKblpYUXNJSFJ5ZFdVc0lHNWhiV1VzSUhObGRIUmxjaWs3WEc0Z0lDQWdmVnh1SUNBZ0lHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCcGMwTnZiWEIxZEdWa0lEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hvWVhOSmJuUmxjbU5sY0hSdmNuTW9ZV1J0S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTm9ZVzVuWlNBOUlHbHVkR1Z5WTJWd2RFTm9ZVzVuWlNoaFpHMHNJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2WW1wbFkzUTZJR0ZrYlM1MFlYSm5aWFFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1GdFpUb2djSEp2Y0U1aGJXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ1hDSmhaR1JjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdVpYZFdZV3gxWlRvZ2JtVjNWbUZzZFdWY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGamFHRnVaMlVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVZ1BTQmphR0Z1WjJVdWJtVjNWbUZzZFdVN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdiMkp6WlhKMllXSnNaU0E5SUc1bGR5QlBZbk5sY25aaFlteGxWbUZzZFdVb2JtVjNWbUZzZFdVc0lHRmtiUzV0YjJSbExDQnVZVzFsTENCbVlXeHpaU2s3WEc0Z0lDQWdJQ0FnSUc1bGQxWmhiSFZsSUQwZ2IySnpaWEoyWVdKc1pTNTJZV3gxWlR0Y2JpQWdJQ0I5WEc0Z0lDQWdZV1J0TG5aaGJIVmxjMXR3Y205d1RtRnRaVjBnUFNCdlluTmxjblpoWW14bE8xeHVJQ0FnSUdsbUlDaGhjMGx1YzNSaGJtTmxVSEp2Y0dWeWRIa3BJSHRjYmlBZ0lDQWdJQ0FnVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtHRmtiUzUwWVhKblpYUXNJSEJ5YjNCT1lXMWxMQ0JwYzBOdmJYQjFkR1ZrSUQ4Z1oyVnVaWEpoZEdWRGIyMXdkWFJsWkZCeWIzQkRiMjVtYVdjb2NISnZjRTVoYldVcElEb2daMlZ1WlhKaGRHVlBZbk5sY25aaFlteGxVSEp2Y0VOdmJtWnBaeWh3Y205d1RtRnRaU2twTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvSVdselEyOXRjSFYwWldRcFhHNGdJQ0FnSUNBZ0lHNXZkR2xtZVZCeWIzQmxjblI1UVdSa2FYUnBiMjRvWVdSdExDQmhaRzB1ZEdGeVoyVjBMQ0J3Y205d1RtRnRaU3dnYm1WM1ZtRnNkV1VwTzF4dWZWeHVkbUZ5SUc5aWMyVnlkbUZpYkdWUWNtOXdaWEowZVVOdmJtWnBaM01nUFNCN2ZUdGNiblpoY2lCamIyMXdkWFJsWkZCeWIzQmxjblI1UTI5dVptbG5jeUE5SUh0OU8xeHVablZ1WTNScGIyNGdaMlZ1WlhKaGRHVlBZbk5sY25aaFlteGxVSEp2Y0VOdmJtWnBaeWh3Y205d1RtRnRaU2tnZTF4dUlDQWdJSFpoY2lCamIyNW1hV2NnUFNCdlluTmxjblpoWW14bFVISnZjR1Z5ZEhsRGIyNW1hV2R6VzNCeWIzQk9ZVzFsWFR0Y2JpQWdJQ0JwWmlBb1kyOXVabWxuS1Z4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5dVptbG5PMXh1SUNBZ0lISmxkSFZ5YmlCdlluTmxjblpoWW14bFVISnZjR1Z5ZEhsRGIyNW1hV2R6VzNCeWIzQk9ZVzFsWFNBOUlIdGNiaUFnSUNBZ0lDQWdZMjl1Wm1sbmRYSmhZbXhsT2lCMGNuVmxMRnh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhZbXhsT2lCMGNuVmxMRnh1SUNBZ0lDQWdJQ0JuWlhRNklHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJ0YjJKNExuWmhiSFZsYzF0d2NtOXdUbUZ0WlYwdVoyVjBLQ2s3WEc0Z0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lITmxkRG9nWm5WdVkzUnBiMjRnS0hZcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhObGRGQnliM0JsY25SNVZtRnNkV1VvZEdocGN5d2djSEp2Y0U1aGJXVXNJSFlwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JuMWNibVoxYm1OMGFXOXVJR2RsYm1WeVlYUmxRMjl0Y0hWMFpXUlFjbTl3UTI5dVptbG5LSEJ5YjNCT1lXMWxLU0I3WEc0Z0lDQWdkbUZ5SUdOdmJtWnBaeUE5SUdOdmJYQjFkR1ZrVUhKdmNHVnlkSGxEYjI1bWFXZHpXM0J5YjNCT1lXMWxYVHRjYmlBZ0lDQnBaaUFvWTI5dVptbG5LVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMjl1Wm1sbk8xeHVJQ0FnSUhKbGRIVnliaUJqYjIxd2RYUmxaRkJ5YjNCbGNuUjVRMjl1Wm1sbmMxdHdjbTl3VG1GdFpWMGdQU0I3WEc0Z0lDQWdJQ0FnSUdOdmJtWnBaM1Z5WVdKc1pUb2dkSEoxWlN4Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVdKc1pUb2dabUZzYzJVc1hHNGdJQ0FnSUNBZ0lHZGxkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdUpHMXZZbmd1ZG1Gc2RXVnpXM0J5YjNCT1lXMWxYUzVuWlhRb0tUdGNiaUFnSUNBZ0lDQWdmU3hjYmlBZ0lDQWdJQ0FnYzJWME9pQm1kVzVqZEdsdmJpQW9kaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11SkcxdlluZ3VkbUZzZFdWelczQnliM0JPWVcxbFhTNXpaWFFvZGlrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVmVnh1Wm5WdVkzUnBiMjRnYzJWMFVISnZjR1Z5ZEhsV1lXeDFaU2hwYm5OMFlXNWpaU3dnYm1GdFpTd2dibVYzVm1Gc2RXVXBJSHRjYmlBZ0lDQjJZWElnWVdSdElEMGdhVzV6ZEdGdVkyVXVKRzF2WW5nN1hHNGdJQ0FnZG1GeUlHOWljMlZ5ZG1GaWJHVWdQU0JoWkcwdWRtRnNkV1Z6VzI1aGJXVmRPMXh1SUNBZ0lHbG1JQ2hvWVhOSmJuUmxjbU5sY0hSdmNuTW9ZV1J0S1NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWTJoaGJtZGxJRDBnYVc1MFpYSmpaWEIwUTJoaGJtZGxLR0ZrYlN3Z2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0oxY0dSaGRHVmNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2FXNXpkR0Z1WTJVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J1WVcxbE9pQnVZVzFsTENCdVpYZFdZV3gxWlRvZ2JtVjNWbUZzZFdWY2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJR2xtSUNnaFkyaGhibWRsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUNBZ0lDQnVaWGRXWVd4MVpTQTlJR05vWVc1blpTNXVaWGRXWVd4MVpUdGNiaUFnSUNCOVhHNGdJQ0FnYm1WM1ZtRnNkV1VnUFNCdlluTmxjblpoWW14bExuQnlaWEJoY21WT1pYZFdZV3gxWlNodVpYZFdZV3gxWlNrN1hHNGdJQ0FnYVdZZ0tHNWxkMVpoYkhWbElDRTlQU0JWVGtOSVFVNUhSVVFwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRzV2ZEdsbWVTQTlJR2hoYzB4cGMzUmxibVZ5Y3loaFpHMHBPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JtOTBhV1o1VTNCNUlEMGdhWE5UY0hsRmJtRmliR1ZrS0NrN1hHNGdJQ0FnSUNBZ0lIWmhjaUJqYUdGdVoyVWdQU0J1YjNScFpubE1hWE4wWlc1bGNuTWdmSHdnYUdGelRHbHpkR1Z1WlhKeklEOGdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RIbHdaVG9nWENKMWNHUmhkR1ZjSWl4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzlpYW1WamREb2dhVzV6ZEdGdVkyVXNYRzRnSUNBZ0lDQWdJQ0FnSUNCdmJHUldZV3gxWlRvZ2IySnpaWEoyWVdKc1pTNTJZV3gxWlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVoYldVNklHNWhiV1VzSUc1bGQxWmhiSFZsT2lCdVpYZFdZV3gxWlZ4dUlDQWdJQ0FnSUNCOUlEb2diblZzYkR0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzV2ZEdsbWVWTndlU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lITndlVkpsY0c5eWRGTjBZWEowS0dOb1lXNW5aU2s3WEc0Z0lDQWdJQ0FnSUc5aWMyVnlkbUZpYkdVdWMyVjBUbVYzVm1Gc2RXVW9ibVYzVm1Gc2RXVXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2JtOTBhV1o1S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdibTkwYVdaNVRHbHpkR1Z1WlhKektHRmtiU3dnWTJoaGJtZGxLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTbGNiaUFnSUNBZ0lDQWdJQ0FnSUhOd2VWSmxjRzl5ZEVWdVpDZ3BPMXh1SUNBZ0lIMWNibjFjYm1aMWJtTjBhVzl1SUc1dmRHbG1lVkJ5YjNCbGNuUjVRV1JrYVhScGIyNG9ZV1J0TENCdlltcGxZM1FzSUc1aGJXVXNJRzVsZDFaaGJIVmxLU0I3WEc0Z0lDQWdkbUZ5SUc1dmRHbG1lU0E5SUdoaGMweHBjM1JsYm1WeWN5aGhaRzBwTzF4dUlDQWdJSFpoY2lCdWIzUnBabmxUY0hrZ1BTQnBjMU53ZVVWdVlXSnNaV1FvS1R0Y2JpQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2JtOTBhV1o1SUh4OElHNXZkR2xtZVZOd2VTQS9JSHRjYmlBZ0lDQWdJQ0FnZEhsd1pUb2dYQ0poWkdSY0lpeGNiaUFnSUNBZ0lDQWdiMkpxWldOME9pQnZZbXBsWTNRc0lHNWhiV1U2SUc1aGJXVXNJRzVsZDFaaGJIVmxPaUJ1WlhkV1lXeDFaVnh1SUNBZ0lIMGdPaUJ1ZFd4c08xeHVJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BYRzRnSUNBZ0lDQWdJSE53ZVZKbGNHOXlkRk4wWVhKMEtHTm9ZVzVuWlNrN1hHNGdJQ0FnYVdZZ0tHNXZkR2xtZVNsY2JpQWdJQ0FnSUNBZ2JtOTBhV1o1VEdsemRHVnVaWEp6S0dGa2JTd2dZMmhoYm1kbEtUdGNiaUFnSUNCcFppQW9ibTkwYVdaNVUzQjVLVnh1SUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJGYm1Rb0tUdGNibjFjYm1aMWJtTjBhVzl1SUdselQySnpaWEoyWVdKc1pVOWlhbVZqZENoMGFHbHVaeWtnZTF4dUlDQWdJR2xtSUNoMGVYQmxiMllnZEdocGJtY2dQVDA5SUZ3aWIySnFaV04wWENJZ0ppWWdkR2hwYm1jZ0lUMDlJRzUxYkd3cElIdGNiaUFnSUNBZ0lDQWdjblZ1VEdGNmVVbHVhWFJwWVd4cGVtVnljeWgwYUdsdVp5azdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x1Wnk0a2JXOWllQ0JwYm5OMFlXNWpaVzltSUU5aWMyVnlkbUZpYkdWUFltcGxZM1JCWkcxcGJtbHpkSEpoZEdsdmJqdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVmVnh1Wlhod2IzSjBjeTVwYzA5aWMyVnlkbUZpYkdWUFltcGxZM1FnUFNCcGMwOWljMlZ5ZG1GaWJHVlBZbXBsWTNRN1hHNTJZWElnVlU1RFNFRk9SMFZFSUQwZ2UzMDdYRzUyWVhJZ1QySnpaWEoyWVdKc1pWWmhiSFZsSUQwZ0tHWjFibU4wYVc5dUlDaGZjM1Z3WlhJcElIdGNiaUFnSUNCZlgyVjRkR1Z1WkhNb1QySnpaWEoyWVdKc1pWWmhiSFZsTENCZmMzVndaWElwTzF4dUlDQWdJR1oxYm1OMGFXOXVJRTlpYzJWeWRtRmliR1ZXWVd4MVpTaDJZV3gxWlN3Z2JXOWtaU3dnYm1GdFpTd2dibTkwYVdaNVUzQjVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHVZVzFsSUQwOVBTQjJiMmxrSURBcElIc2dibUZ0WlNBOUlGd2lUMkp6WlhKMllXSnNaVlpoYkhWbFFGd2lJQ3NnWjJWMFRtVjRkRWxrS0NrN0lIMWNiaUFnSUNBZ0lDQWdhV1lnS0c1dmRHbG1lVk53ZVNBOVBUMGdkbTlwWkNBd0tTQjdJRzV2ZEdsbWVWTndlU0E5SUhSeWRXVTdJSDFjYmlBZ0lDQWdJQ0FnWDNOMWNHVnlMbU5oYkd3b2RHaHBjeXdnYm1GdFpTazdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJXOWtaU0E5SUcxdlpHVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWFHRnpWVzV5WlhCdmNuUmxaRU5vWVc1blpTQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNCMllYSWdYMkVnUFNCblpYUldZV3gxWlUxdlpHVkdjbTl0Vm1Gc2RXVW9kbUZzZFdVc0lGWmhiSFZsVFc5a1pTNVNaV04xY25OcGRtVXBMQ0JqYUdsc1pHMXZaR1VnUFNCZllWc3dYU3dnZFc1M2NtRndjR1ZrVm1Gc2RXVWdQU0JmWVZzeFhUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXViVzlrWlNBOVBUMGdWbUZzZFdWTmIyUmxMbEpsWTNWeWMybDJaU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Ylc5a1pTQTlJR05vYVd4a2JXOWtaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBOUlHMWhhMlZEYUdsc1pFOWljMlZ5ZG1GaWJHVW9kVzUzY21Gd2NHVmtWbUZzZFdVc0lIUm9hWE11Ylc5a1pTd2dkR2hwY3k1dVlXMWxLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHNXZkR2xtZVZOd2VTQW1KaUJwYzFOd2VVVnVZV0pzWldRb0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MzQjVVbVZ3YjNKMEtIc2dkSGx3WlRvZ1hDSmpjbVZoZEdWY0lpd2diMkpxWldOME9pQjBhR2x6TENCdVpYZFdZV3gxWlRvZ2RHaHBjeTUyWVd4MVpTQjlLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQlBZbk5sY25aaFlteGxWbUZzZFdVdWNISnZkRzkwZVhCbExuTmxkQ0E5SUdaMWJtTjBhVzl1SUNodVpYZFdZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYjJ4a1ZtRnNkV1VnUFNCMGFHbHpMblpoYkhWbE8xeHVJQ0FnSUNBZ0lDQnVaWGRXWVd4MVpTQTlJSFJvYVhNdWNISmxjR0Z5WlU1bGQxWmhiSFZsS0c1bGQxWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzVsZDFaaGJIVmxJQ0U5UFNCVlRrTklRVTVIUlVRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5sVGNIa2dQU0JwYzFOd2VVVnVZV0pzWldRb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHViM1JwWm5sVGNIa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Y0hsU1pYQnZjblJUZEdGeWRDaDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRndpZFhCa1lYUmxYQ0lzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOWlhbVZqZERvZ2RHaHBjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVNklHNWxkMVpoYkhWbExDQnZiR1JXWVd4MVpUb2diMnhrVm1Gc2RXVmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlYwVG1WM1ZtRnNkV1VvYm1WM1ZtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c1dmRHbG1lVk53ZVNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemNIbFNaWEJ2Y25SRmJtUW9LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc0Z0lDQWdUMkp6WlhKMllXSnNaVlpoYkhWbExuQnliM1J2ZEhsd1pTNXdjbVZ3WVhKbFRtVjNWbUZzZFdVZ1BTQm1kVzVqZEdsdmJpQW9ibVYzVm1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnWVhOelpYSjBWVzUzY21Gd2NHVmtLRzVsZDFaaGJIVmxMQ0JjSWsxdlpHbG1hV1Z5Y3lCallXNXViM1FnWW1VZ2RYTmxaQ0J2YmlCdWIyNHRhVzVwZEdsaGJDQjJZV3gxWlhNdVhDSXBPMXh1SUNBZ0lDQWdJQ0JqYUdWamEwbG1VM1JoZEdWTmIyUnBabWxqWVhScGIyNXpRWEpsUVd4c2IzZGxaQ2dwTzF4dUlDQWdJQ0FnSUNCcFppQW9hR0Z6U1c1MFpYSmpaWEIwYjNKektIUm9hWE1wS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kyaGhibWRsSUQwZ2FXNTBaWEpqWlhCMFEyaGhibWRsS0hSb2FYTXNJSHNnYjJKcVpXTjBPaUIwYUdsekxDQjBlWEJsT2lCY0luVndaR0YwWlZ3aUxDQnVaWGRXWVd4MVpUb2dibVYzVm1Gc2RXVWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdOb1lXNW5aU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdWVTVEU0VGT1IwVkVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JtVjNWbUZzZFdVZ1BTQmphR0Z1WjJVdWJtVjNWbUZzZFdVN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkbUZ5SUdOb1lXNW5aV1FnUFNCMllXeDFaVVJwWkVOb1lXNW5aU2gwYUdsekxtMXZaR1VnUFQwOUlGWmhiSFZsVFc5a1pTNVRkSEoxWTNSMWNtVXNJSFJvYVhNdWRtRnNkV1VzSUc1bGQxWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLR05vWVc1blpXUXBYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYldGclpVTm9hV3hrVDJKelpYSjJZV0pzWlNodVpYZFdZV3gxWlN3Z2RHaHBjeTV0YjJSbExDQjBhR2x6TG01aGJXVXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdWVTVEU0VGT1IwVkVPMXh1SUNBZ0lIMDdYRzRnSUNBZ1QySnpaWEoyWVdKc1pWWmhiSFZsTG5CeWIzUnZkSGx3WlM1elpYUk9aWGRXWVd4MVpTQTlJR1oxYm1OMGFXOXVJQ2h1WlhkV1lXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdiMnhrVm1Gc2RXVWdQU0IwYUdsekxuWmhiSFZsTzF4dUlDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdibVYzVm1Gc2RXVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWNtVndiM0owUTJoaGJtZGxaQ2dwTzF4dUlDQWdJQ0FnSUNCcFppQW9hR0Z6VEdsemRHVnVaWEp6S0hSb2FYTXBLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtOTBhV1o1VEdsemRHVnVaWEp6S0hSb2FYTXNJRnR1WlhkV1lXeDFaU3dnYjJ4a1ZtRnNkV1ZkS1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZXWVd4MVpTNXdjbTkwYjNSNWNHVXVaMlYwSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxuSmxjRzl5ZEU5aWMyVnlkbVZrS0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblpoYkhWbE8xeHVJQ0FnSUgwN1hHNGdJQ0FnVDJKelpYSjJZV0pzWlZaaGJIVmxMbkJ5YjNSdmRIbHdaUzVwYm5SbGNtTmxjSFFnUFNCbWRXNWpkR2x2YmlBb2FHRnVaR3hsY2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVm5hWE4wWlhKSmJuUmxjbU5sY0hSdmNpaDBhR2x6TENCb1lXNWtiR1Z5S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJRTlpYzJWeWRtRmliR1ZXWVd4MVpTNXdjbTkwYjNSNWNHVXViMkp6WlhKMlpTQTlJR1oxYm1OMGFXOXVJQ2hzYVhOMFpXNWxjaXdnWm1seVpVbHRiV1ZrYVdGMFpXeDVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaG1hWEpsU1cxdFpXUnBZWFJsYkhrcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVhOMFpXNWxjaWgwYUdsekxuWmhiSFZsTENCMWJtUmxabWx1WldRcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVm5hWE4wWlhKTWFYTjBaVzVsY2loMGFHbHpMQ0JzYVhOMFpXNWxjaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxWbUZzZFdVdWNISnZkRzkwZVhCbExuUnZTbE5QVGlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVoyVjBLQ2s3WEc0Z0lDQWdmVHRjYmlBZ0lDQlBZbk5sY25aaFlteGxWbUZzZFdVdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXVZVzFsSUNzZ1hDSmJYQ0lnS3lCMGFHbHpMblpoYkhWbElDc2dYQ0pkWENJN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J5WlhSMWNtNGdUMkp6WlhKMllXSnNaVlpoYkhWbE8xeHVmU2hDWVhObFFYUnZiU2twTzF4dVpuVnVZM1JwYjI0Z1oyVjBRWFJ2YlNoMGFHbHVaeXdnY0hKdmNHVnlkSGtwSUh0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhSb2FXNW5JRDA5UFNCY0ltOWlhbVZqZEZ3aUlDWW1JSFJvYVc1bklDRTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNocGMwOWljMlZ5ZG1GaWJHVkJjbkpoZVNoMGFHbHVaeWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2h3Y205d1pYSjBlU0E5UFQwZ2RXNWtaV1pwYm1Wa0xDQmNJa2wwSUdseklHNXZkQ0J3YjNOemFXSnNaU0IwYnlCblpYUWdhVzVrWlhnZ1lYUnZiWE1nWm5KdmJTQmhjbkpoZVhOY0lpazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGJtY3VKRzF2WW5ndVlYUnZiVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppQW9hWE5QWW5ObGNuWmhZbXhsVFdGd0tIUm9hVzVuS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIQnliM0JsY25SNUlEMDlQU0IxYm1SbFptbHVaV1FwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2RsZEVGMGIyMG9kR2hwYm1jdVgydGxlWE1wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbUZpYkdWZk1pQTlJSFJvYVc1bkxsOWtZWFJoVzNCeWIzQmxjblI1WFNCOGZDQjBhR2x1Wnk1ZmFHRnpUV0Z3VzNCeWIzQmxjblI1WFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x1ZG1GeWFXRnVkQ2doSVc5aWMyVnlkbUZpYkdWZk1pd2dYQ0owYUdVZ1pXNTBjbmtnSjF3aUlDc2djSEp2Y0dWeWRIa2dLeUJjSWljZ1pHOWxjeUJ1YjNRZ1pYaHBjM1FnYVc0Z2RHaGxJRzlpYzJWeWRtRmliR1VnYldGd0lDZGNJaUFySUdkbGRFUmxZblZuVG1GdFpTaDBhR2x1WnlrZ0t5QmNJaWRjSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiMkp6WlhKMllXSnNaVjh5TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISjFia3hoZW5sSmJtbDBhV0ZzYVhwbGNuTW9kR2hwYm1jcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYVhOUFluTmxjblpoWW14bFQySnFaV04wS0hSb2FXNW5LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhVzUyWVhKcFlXNTBLQ0VoY0hKdmNHVnlkSGtzSUZ3aWNHeGxZWE5sSUhOd1pXTnBabmtnWVNCd2NtOXdaWEowZVZ3aUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnZZbk5sY25aaFlteGxYek1nUFNCMGFHbHVaeTRrYlc5aWVDNTJZV3gxWlhOYmNISnZjR1Z5ZEhsZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVc1MllYSnBZVzUwS0NFaGIySnpaWEoyWVdKc1pWOHpMQ0JjSW01dklHOWljMlZ5ZG1GaWJHVWdjSEp2Y0dWeWRIa2dKMXdpSUNzZ2NISnZjR1Z5ZEhrZ0t5QmNJaWNnWm05MWJtUWdiMjRnZEdobElHOWljMlZ5ZG1GaWJHVWdiMkpxWldOMElDZGNJaUFySUdkbGRFUmxZblZuVG1GdFpTaDBhR2x1WnlrZ0t5QmNJaWRjSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiMkp6WlhKMllXSnNaVjh6TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsdVp5QnBibk4wWVc1alpXOW1JRUpoYzJWQmRHOXRJSHg4SUhSb2FXNW5JR2x1YzNSaGJtTmxiMllnUTI5dGNIVjBaV1JXWVd4MVpTQjhmQ0IwYUdsdVp5QnBibk4wWVc1alpXOW1JRkpsWVdOMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBibWM3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdaV3h6WlNCcFppQW9kSGx3Wlc5bUlIUm9hVzVuSUQwOVBTQmNJbVoxYm1OMGFXOXVYQ0lwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVc1bkxpUnRiMko0SUdsdWMzUmhibU5sYjJZZ1VtVmhZM1JwYjI0cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsdVp5NGtiVzlpZUR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0JwYm5aaGNtbGhiblFvWm1Gc2MyVXNJRndpUTJGdWJtOTBJRzlpZEdGcGJpQmhkRzl0SUdaeWIyMGdYQ0lnS3lCMGFHbHVaeWs3WEc1OVhHNW1kVzVqZEdsdmJpQm5aWFJCWkcxcGJtbHpkSEpoZEdsdmJpaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcElIdGNiaUFnSUNCcGJuWmhjbWxoYm5Rb2RHaHBibWNzSUZ3aVJYaHdaV04wYVc5dUlITnZiV1VnYjJKcVpXTjBYQ0lwTzF4dUlDQWdJR2xtSUNod2NtOXdaWEowZVNBaFBUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaMlYwUVdSdGFXNXBjM1J5WVhScGIyNG9aMlYwUVhSdmJTaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcEtUdGNiaUFnSUNCcFppQW9kR2hwYm1jZ2FXNXpkR0Z1WTJWdlppQkNZWE5sUVhSdmJTQjhmQ0IwYUdsdVp5QnBibk4wWVc1alpXOW1JRU52YlhCMWRHVmtWbUZzZFdVZ2ZId2dkR2hwYm1jZ2FXNXpkR0Z1WTJWdlppQlNaV0ZqZEdsdmJpbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hVzVuTzF4dUlDQWdJR2xtSUNocGMwOWljMlZ5ZG1GaWJHVk5ZWEFvZEdocGJtY3BLVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwYm1jN1hHNGdJQ0FnY25WdVRHRjZlVWx1YVhScFlXeHBlbVZ5Y3loMGFHbHVaeWs3WEc0Z0lDQWdhV1lnS0hSb2FXNW5MaVJ0YjJKNEtWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBibWN1SkcxdlluZzdYRzRnSUNBZ2FXNTJZWEpwWVc1MEtHWmhiSE5sTENCY0lrTmhibTV2ZENCdlluUmhhVzRnWVdSdGFXNXBjM1J5WVhScGIyNGdabkp2YlNCY0lpQXJJSFJvYVc1bktUdGNibjFjYm1aMWJtTjBhVzl1SUdkbGRFUmxZblZuVG1GdFpTaDBhR2x1Wnl3Z2NISnZjR1Z5ZEhrcElIdGNiaUFnSUNCMllYSWdibUZ0WldRN1hHNGdJQ0FnYVdZZ0tIQnliM0JsY25SNUlDRTlQU0IxYm1SbFptbHVaV1FwWEc0Z0lDQWdJQ0FnSUc1aGJXVmtJRDBnWjJWMFFYUnZiU2gwYUdsdVp5d2djSEp2Y0dWeWRIa3BPMXh1SUNBZ0lHVnNjMlVnYVdZZ0tHbHpUMkp6WlhKMllXSnNaVTlpYW1WamRDaDBhR2x1WnlrZ2ZId2dhWE5QWW5ObGNuWmhZbXhsVFdGd0tIUm9hVzVuS1NsY2JpQWdJQ0FnSUNBZ2JtRnRaV1FnUFNCblpYUkJaRzFwYm1semRISmhkR2x2YmloMGFHbHVaeWs3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNCdVlXMWxaQ0E5SUdkbGRFRjBiMjBvZEdocGJtY3BPMXh1SUNBZ0lISmxkSFZ5YmlCdVlXMWxaQzV1WVcxbE8xeHVmVnh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxRMnhoYzNOUWNtOXdaWEowZVVSbFkyOXlZWFJ2Y2lodmJrbHVhWFJwWVd4cGVtVXNJR2RsZEN3Z2MyVjBMQ0JsYm5WdFpYSmhZbXhsTENCaGJHeHZkME4xYzNSdmJVRnlaM1Z0Wlc1MGN5a2dlMXh1SUNBZ0lHWjFibU4wYVc5dUlHTnNZWE56VUhKdmNHVnlkSGxFWldOdmNtRjBiM0lvZEdGeVoyVjBMQ0JyWlhrc0lHUmxjMk55YVhCMGIzSXNJR04xYzNSdmJVRnlaM01wSUh0Y2JpQWdJQ0FnSUNBZ2FXNTJZWEpwWVc1MEtHRnNiRzkzUTNWemRHOXRRWEpuZFcxbGJuUnpJSHg4SUhGMVlXTnJjMHhwYTJWQlJHVmpiM0poZEc5eUtHRnlaM1Z0Wlc1MGN5a3NJRndpVkdocGN5Qm1kVzVqZEdsdmJpQnBjeUJoSUdSbFkyOXlZWFJ2Y2l3Z1luVjBJR2wwSUhkaGMyNG5kQ0JwYm5admEyVmtJR3hwYTJVZ1lTQmtaV052Y21GMGIzSmNJaWs3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2haR1Z6WTNKcGNIUnZjaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc1bGQwUmxjMk55YVhCMGIzSWdQU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlc1MWJXVnlZV0pzWlRvZ1pXNTFiV1Z5WVdKc1pTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjVtYVdkMWNtRmliR1U2SUhSeWRXVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1ZlgyMXZZbmhKYm1sMGFXRnNhWHBsWkZCeWIzQnpJSHg4SUhSb2FYTXVYMTl0YjJKNFNXNXBkR2xoYkdsNlpXUlFjbTl3YzF0clpYbGRJQ0U5UFNCMGNuVmxLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSGx3WlhOamNtbHdkRWx1YVhScFlXeHBlbVZRY205d1pYSjBlU2gwYUdsekxDQnJaWGtzSUhWdVpHVm1hVzVsWkN3Z2IyNUpibWwwYVdGc2FYcGxMQ0JqZFhOMGIyMUJjbWR6TENCa1pYTmpjbWx3ZEc5eUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2RsZEM1allXeHNLSFJvYVhNc0lHdGxlU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpYUTZJR1oxYm1OMGFXOXVJQ2gyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVmWDIxdlluaEpibWwwYVdGc2FYcGxaRkJ5YjNCeklIeDhJSFJvYVhNdVgxOXRiMko0U1c1cGRHbGhiR2w2WldSUWNtOXdjMXRyWlhsZElDRTlQU0IwY25WbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBlWEJsYzJOeWFYQjBTVzVwZEdsaGJHbDZaVkJ5YjNCbGNuUjVLSFJvYVhNc0lHdGxlU3dnZGl3Z2IyNUpibWwwYVdGc2FYcGxMQ0JqZFhOMGIyMUJjbWR6TENCa1pYTmpjbWx3ZEc5eUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGRDNWpZV3hzS0hSb2FYTXNJR3RsZVN3Z2RpazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUENBektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdUMkpxWldOMExtUmxabWx1WlZCeWIzQmxjblI1S0hSaGNtZGxkQ3dnYTJWNUxDQnVaWGRFWlhOamNtbHdkRzl5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYZEVaWE5qY21sd2RHOXlPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZvWVhOUGQyNVFjbTl3WlhKMGVTaDBZWEpuWlhRc0lGd2lYMTl0YjJKNFRHRjZlVWx1YVhScFlXeHBlbVZ5YzF3aUtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZrWkVocFpHUmxibEJ5YjNBb2RHRnlaMlYwTENCY0lsOWZiVzlpZUV4aGVubEpibWwwYVdGc2FYcGxjbk5jSWl3Z0tIUmhjbWRsZEM1ZlgyMXZZbmhNWVhwNVNXNXBkR2xoYkdsNlpYSnpJQ1ltSUhSaGNtZGxkQzVmWDIxdlluaE1ZWHA1U1c1cGRHbGhiR2w2WlhKekxuTnNhV05sS0NrcElIeDhJRnRkS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUIyWVd4MVpWOHhJRDBnWkdWelkzSnBjSFJ2Y2k1MllXeDFaU3dnYVc1cGRHbGhiR2w2WlhKZk1TQTlJR1JsYzJOeWFYQjBiM0l1YVc1cGRHbGhiR2w2WlhJN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwWVhKblpYUXVYMTl0YjJKNFRHRjZlVWx1YVhScFlXeHBlbVZ5Y3k1d2RYTm9LR1oxYm1OMGFXOXVJQ2hwYm5OMFlXNWpaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5dVNXNXBkR2xoYkdsNlpTaHBibk4wWVc1alpTd2dhMlY1TENBb2FXNXBkR2xoYkdsNlpYSmZNU0EvSUdsdWFYUnBZV3hwZW1WeVh6RXVZMkZzYkNocGJuTjBZVzVqWlNrZ09pQjJZV3gxWlY4eEtTd2dZM1Z6ZEc5dFFYSm5jeXdnWkdWelkzSnBjSFJ2Y2lrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaVzUxYldWeVlXSnNaVG9nWlc1MWJXVnlZV0pzWlN3Z1kyOXVabWxuZFhKaFlteGxPaUIwY25WbExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHZGxkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVmWDIxdlluaEVhV1JTZFc1TVlYcDVTVzVwZEdsaGJHbDZaWEp6SUNFOVBTQjBjblZsS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY25WdVRHRjZlVWx1YVhScFlXeHBlbVZ5Y3loMGFHbHpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdkbGRDNWpZV3hzS0hSb2FYTXNJR3RsZVNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWFE2SUdaMWJtTjBhVzl1SUNoMktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TGw5ZmJXOWllRVJwWkZKMWJreGhlbmxKYm1sMGFXRnNhWHBsY25NZ0lUMDlJSFJ5ZFdVcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeWRXNU1ZWHA1U1c1cGRHbGhiR2w2WlhKektIUm9hWE1wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWFF1WTJGc2JDaDBhR2x6TENCclpYa3NJSFlwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0dGc2JHOTNRM1Z6ZEc5dFFYSm5kVzFsYm5SektTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY1hWaFkydHpUR2xyWlVGRVpXTnZjbUYwYjNJb1lYSm5kVzFsYm5SektTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyeGhjM05RY205d1pYSjBlVVJsWTI5eVlYUnZjaTVoY0hCc2VTaHVkV3hzTENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOTFkR1Z5UVhKbmN5QTlJR0Z5WjNWdFpXNTBjenRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb2RHRnlaMlYwTENCclpYa3NJR1JsYzJOeWFYQjBiM0lwSUhzZ2NtVjBkWEp1SUdOc1lYTnpVSEp2Y0dWeWRIbEVaV052Y21GMGIzSW9kR0Z5WjJWMExDQnJaWGtzSUdSbGMyTnlhWEIwYjNJc0lHOTFkR1Z5UVhKbmN5azdJSDA3WEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQmpiR0Z6YzFCeWIzQmxjblI1UkdWamIzSmhkRzl5TzF4dWZWeHVablZ1WTNScGIyNGdkSGx3WlhOamNtbHdkRWx1YVhScFlXeHBlbVZRY205d1pYSjBlU2hwYm5OMFlXNWpaU3dnYTJWNUxDQjJMQ0J2YmtsdWFYUnBZV3hwZW1Vc0lHTjFjM1J2YlVGeVozTXNJR0poYzJWRVpYTmpjbWx3ZEc5eUtTQjdYRzRnSUNBZ2FXWWdLQ0ZvWVhOUGQyNVFjbTl3WlhKMGVTaHBibk4wWVc1alpTd2dYQ0pmWDIxdlluaEpibWwwYVdGc2FYcGxaRkJ5YjNCelhDSXBLVnh1SUNBZ0lDQWdJQ0JoWkdSSWFXUmtaVzVRY205d0tHbHVjM1JoYm1ObExDQmNJbDlmYlc5aWVFbHVhWFJwWVd4cGVtVmtVSEp2Y0hOY0lpd2dlMzBwTzF4dUlDQWdJR2x1YzNSaGJtTmxMbDlmYlc5aWVFbHVhWFJwWVd4cGVtVmtVSEp2Y0hOYmEyVjVYU0E5SUhSeWRXVTdYRzRnSUNBZ2IyNUpibWwwYVdGc2FYcGxLR2x1YzNSaGJtTmxMQ0JyWlhrc0lIWXNJR04xYzNSdmJVRnlaM01zSUdKaGMyVkVaWE5qY21sd2RHOXlLVHRjYm4xY2JtWjFibU4wYVc5dUlISjFia3hoZW5sSmJtbDBhV0ZzYVhwbGNuTW9hVzV6ZEdGdVkyVXBJSHRjYmlBZ0lDQnBaaUFvYVc1emRHRnVZMlV1WDE5dGIySjRSR2xrVW5WdVRHRjZlVWx1YVhScFlXeHBlbVZ5Y3lBOVBUMGdkSEoxWlNsY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJR2xtSUNocGJuTjBZVzVqWlM1ZlgyMXZZbmhNWVhwNVNXNXBkR2xoYkdsNlpYSnpLU0I3WEc0Z0lDQWdJQ0FnSUdGa1pFaHBaR1JsYmxCeWIzQW9hVzV6ZEdGdVkyVXNJRndpWDE5dGIySjRSR2xrVW5WdVRHRjZlVWx1YVhScFlXeHBlbVZ5YzF3aUxDQjBjblZsS1R0Y2JpQWdJQ0FnSUNBZ2FXNXpkR0Z1WTJVdVgxOXRiMko0Ukdsa1VuVnVUR0Y2ZVVsdWFYUnBZV3hwZW1WeWN5QW1KaUJwYm5OMFlXNWpaUzVmWDIxdlluaE1ZWHA1U1c1cGRHbGhiR2w2WlhKekxtWnZja1ZoWTJnb1puVnVZM1JwYjI0Z0tHbHVhWFJwWVd4cGVtVnlLU0I3SUhKbGRIVnliaUJwYm1sMGFXRnNhWHBsY2locGJuTjBZVzVqWlNrN0lIMHBPMXh1SUNBZ0lIMWNibjFjYm1aMWJtTjBhVzl1SUhGMVlXTnJjMHhwYTJWQlJHVmpiM0poZEc5eUtHRnlaM01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdLR0Z5WjNNdWJHVnVaM1JvSUQwOVBTQXlJSHg4SUdGeVozTXViR1Z1WjNSb0lEMDlQU0F6S1NBbUppQjBlWEJsYjJZZ1lYSm5jMXN4WFNBOVBUMGdYQ0p6ZEhKcGJtZGNJanRjYm4xY2JtWjFibU4wYVc5dUlHbDBaWEpoZEc5eVUzbHRZbTlzS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUFvZEhsd1pXOW1JRk41YldKdmJDQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JRk41YldKdmJDNXBkR1Z5WVhSdmNpa2dmSHdnWENKQVFHbDBaWEpoZEc5eVhDSTdYRzU5WEc1MllYSWdTVk5mU1ZSRlVrRlVTVTVIWDAxQlVrdEZVaUE5SUZ3aVgxOGtKR2wwWlhKaGRHbHVaMXdpTzF4dVpuVnVZM1JwYjI0Z1lYSnlZWGxCYzBsMFpYSmhkRzl5S0dGeWNtRjVLU0I3WEc0Z0lDQWdhVzUyWVhKcFlXNTBLR0Z5Y21GNVcwbFRYMGxVUlZKQlZFbE9SMTlOUVZKTFJWSmRJQ0U5UFNCMGNuVmxMQ0JjSWtsc2JHVm5ZV3dnYzNSaGRHVTZJR05oYm01dmRDQnlaV041WTJ4bElHRnljbUY1SUdGeklHbDBaWEpoZEc5eVhDSXBPMXh1SUNBZ0lHRmtaRWhwWkdSbGJrWnBibUZzVUhKdmNDaGhjbkpoZVN3Z1NWTmZTVlJGVWtGVVNVNUhYMDFCVWt0RlVpd2dkSEoxWlNrN1hHNGdJQ0FnZG1GeUlHbGtlQ0E5SUMweE8xeHVJQ0FnSUdGa1pFaHBaR1JsYmtacGJtRnNVSEp2Y0NoaGNuSmhlU3dnWENKdVpYaDBYQ0lzSUdaMWJtTjBhVzl1SUc1bGVIUW9LU0I3WEc0Z0lDQWdJQ0FnSUdsa2VDc3JPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pHOXVaVG9nYVdSNElENDlJSFJvYVhNdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdVNklHbGtlQ0E4SUhSb2FYTXViR1Z1WjNSb0lEOGdkR2hwYzF0cFpIaGRJRG9nZFc1a1pXWnBibVZrWEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnY21WMGRYSnVJR0Z5Y21GNU8xeHVmVnh1Wm5WdVkzUnBiMjRnWkdWamJHRnlaVWwwWlhKaGRHOXlLSEJ5YjNSdmRGUjVjR1VzSUdsMFpYSmhkRzl5Um1GamRHOXllU2tnZTF4dUlDQWdJR0ZrWkVocFpHUmxia1pwYm1Gc1VISnZjQ2h3Y205MGIzUlVlWEJsTENCcGRHVnlZWFJ2Y2xONWJXSnZiQ2dwTENCcGRHVnlZWFJ2Y2taaFkzUnZjbmtwTzF4dWZWeHVkbUZ5SUZOcGJYQnNaVVYyWlc1MFJXMXBkSFJsY2lBOUlDaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdablZ1WTNScGIyNGdVMmx0Y0d4bFJYWmxiblJGYldsMGRHVnlLQ2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbXhwYzNSbGJtVnljeUE5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQmtaWEJ5WldOaGRHVmtLRndpWlhoMGNtRnpMbE5wYlhCc1pVVjJaVzUwUlcxcGRIUmxjaUJwY3lCa1pYQnlaV05oZEdWa0lHRnVaQ0IzYVd4c0lHSmxJSEpsYlc5MlpXUWdhVzRnZEdobElHNWxlSFFnYldGcWIzSWdjbVZzWldGelpWd2lLVHRjYmlBZ0lDQjlYRzRnSUNBZ1UybHRjR3hsUlhabGJuUkZiV2wwZEdWeUxuQnliM1J2ZEhsd1pTNWxiV2wwSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JHbHpkR1Z1WlhKeklEMGdkR2hwY3k1c2FYTjBaVzVsY25NdWMyeHBZMlVvS1R0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUd3Z1BTQnNhWE4wWlc1bGNuTXViR1Z1WjNSb095QnBJRHdnYkRzZ2FTc3JLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2JHbHpkR1Z1WlhKelcybGRMbUZ3Y0d4NUtHNTFiR3dzSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JUYVcxd2JHVkZkbVZ1ZEVWdGFYUjBaWEl1Y0hKdmRHOTBlWEJsTG05dUlEMGdablZ1WTNScGIyNGdLR3hwYzNSbGJtVnlLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmZkR2hwY3lBOUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUhSb2FYTXViR2x6ZEdWdVpYSnpMbkIxYzJnb2JHbHpkR1Z1WlhJcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2IyNWpaU2htZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FXUjRJRDBnWDNSb2FYTXViR2x6ZEdWdVpYSnpMbWx1WkdWNFQyWW9iR2x6ZEdWdVpYSXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2xrZUNBaFBUMGdMVEVwWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWDNSb2FYTXViR2x6ZEdWdVpYSnpMbk53YkdsalpTaHBaSGdzSURFcE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lGTnBiWEJzWlVWMlpXNTBSVzFwZEhSbGNpNXdjbTkwYjNSNWNHVXViMjVqWlNBOUlHWjFibU4wYVc5dUlDaHNhWE4wWlc1bGNpa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2MzVmljMk55YVhCMGFXOXVJRDBnZEdocGN5NXZiaWhtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZFdKelkzSnBjSFJwYjI0b0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUd4cGMzUmxibVZ5TG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYzNWaWMyTnlhWEIwYVc5dU8xeHVJQ0FnSUgwN1hHNGdJQ0FnY21WMGRYSnVJRk5wYlhCc1pVVjJaVzUwUlcxcGRIUmxjanRjYm4wb0tTazdYRzVsZUhCdmNuUnpMbE5wYlhCc1pVVjJaVzUwUlcxcGRIUmxjaUE5SUZOcGJYQnNaVVYyWlc1MFJXMXBkSFJsY2p0Y2JuWmhjaUJGVFZCVVdWOUJVbEpCV1NBOUlGdGRPMXh1VDJKcVpXTjBMbVp5WldWNlpTaEZUVkJVV1Y5QlVsSkJXU2s3WEc1bWRXNWpkR2x2YmlCblpYUk9aWGgwU1dRb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUNzcloyeHZZbUZzVTNSaGRHVXViVzlpZUVkMWFXUTdYRzU5WEc1bWRXNWpkR2x2YmlCcGJuWmhjbWxoYm5Rb1kyaGxZMnNzSUcxbGMzTmhaMlVzSUhSb2FXNW5LU0I3WEc0Z0lDQWdhV1lnS0NGamFHVmpheWxjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpVzIxdlluaGRJRWx1ZG1GeWFXRnVkQ0JtWVdsc1pXUTZJRndpSUNzZ2JXVnpjMkZuWlNBcklDaDBhR2x1WnlBL0lGd2lJR2x1SUNkY0lpQXJJSFJvYVc1bklDc2dYQ0luWENJZ09pQmNJbHdpS1NrN1hHNTlYRzUyWVhJZ1pHVndjbVZqWVhSbFpFMWxjM05oWjJWeklEMGdXMTA3WEc1bWRXNWpkR2x2YmlCa1pYQnlaV05oZEdWa0tHMXpaeWtnZTF4dUlDQWdJR2xtSUNoa1pYQnlaV05oZEdWa1RXVnpjMkZuWlhNdWFXNWtaWGhQWmlodGMyY3BJQ0U5UFNBdE1TbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUdSbGNISmxZMkYwWldSTlpYTnpZV2RsY3k1d2RYTm9LRzF6WnlrN1hHNGdJQ0FnWTI5dWMyOXNaUzVsY25KdmNpaGNJbHR0YjJKNFhTQkVaWEJ5WldOaGRHVmtPaUJjSWlBcklHMXpaeWs3WEc1OVhHNW1kVzVqZEdsdmJpQnZibU5sS0daMWJtTXBJSHRjYmlBZ0lDQjJZWElnYVc1MmIydGxaQ0E5SUdaaGJITmxPMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNocGJuWnZhMlZrS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUNBZ0lDQnBiblp2YTJWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0I5TzF4dWZWeHVkbUZ5SUc1dmIzQWdQU0JtZFc1amRHbHZiaUFvS1NCN0lIMDdYRzVtZFc1amRHbHZiaUIxYm1seGRXVW9iR2x6ZENrZ2UxeHVJQ0FnSUhaaGNpQnlaWE1nUFNCYlhUdGNiaUFnSUNCc2FYTjBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR2wwWlcwcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0hKbGN5NXBibVJsZUU5bUtHbDBaVzBwSUQwOVBTQXRNU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjeTV3ZFhOb0tHbDBaVzBwTzF4dUlDQWdJSDBwTzF4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc1OVhHNW1kVzVqZEdsdmJpQnFiMmx1VTNSeWFXNW5jeWgwYUdsdVozTXNJR3hwYldsMExDQnpaWEJoY21GMGIzSXBJSHRjYmlBZ0lDQnBaaUFvYkdsdGFYUWdQVDA5SUhadmFXUWdNQ2tnZXlCc2FXMXBkQ0E5SURFd01Ec2dmVnh1SUNBZ0lHbG1JQ2h6WlhCaGNtRjBiM0lnUFQwOUlIWnZhV1FnTUNrZ2V5QnpaWEJoY21GMGIzSWdQU0JjSWlBdElGd2lPeUI5WEc0Z0lDQWdhV1lnS0NGMGFHbHVaM01wWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJjSWx3aU8xeHVJQ0FnSUhaaGNpQnpiR2xqWldRZ1BTQjBhR2x1WjNNdWMyeHBZMlVvTUN3Z2JHbHRhWFFwTzF4dUlDQWdJSEpsZEhWeWJpQmNJbHdpSUNzZ2MyeHBZMlZrTG1wdmFXNG9jMlZ3WVhKaGRHOXlLU0FySUNoMGFHbHVaM011YkdWdVozUm9JRDRnYkdsdGFYUWdQeUJjSWlBb0xpNHVJR0Z1WkNCY0lpQXJJQ2gwYUdsdVozTXViR1Z1WjNSb0lDMGdiR2x0YVhRcElDc2dYQ0p0YjNKbEtWd2lJRG9nWENKY0lpazdYRzU5WEc1bWRXNWpkR2x2YmlCcGMxQnNZV2x1VDJKcVpXTjBLSFpoYkhWbEtTQjdYRzRnSUNBZ2FXWWdLSFpoYkhWbElEMDlQU0J1ZFd4c0lIeDhJSFI1Y0dWdlppQjJZV3gxWlNBaFBUMGdYQ0p2WW1wbFkzUmNJaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUhaaGNpQndjbTkwYnlBOUlFOWlhbVZqZEM1blpYUlFjbTkwYjNSNWNHVlBaaWgyWVd4MVpTazdYRzRnSUNBZ2NtVjBkWEp1SUhCeWIzUnZJRDA5UFNCUFltcGxZM1F1Y0hKdmRHOTBlWEJsSUh4OElIQnliM1J2SUQwOVBTQnVkV3hzTzF4dWZWeHVablZ1WTNScGIyNGdiMkpxWldOMFFYTnphV2R1S0NrZ2UxeHVJQ0FnSUhaaGNpQnlaWE1nUFNCaGNtZDFiV1Z1ZEhOYk1GMDdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREVzSUd3Z1BTQmhjbWQxYldWdWRITXViR1Z1WjNSb095QnBJRHdnYkRzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnpiM1Z5WTJVZ1BTQmhjbWQxYldWdWRITmJhVjA3WEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ6YjNWeVkyVXBYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hR0Z6VDNkdVVISnZjR1Z5ZEhrb2MyOTFjbU5sTENCclpYa3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WelcydGxlVjBnUFNCemIzVnlZMlZiYTJWNVhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JtWjFibU4wYVc5dUlIWmhiSFZsUkdsa1EyaGhibWRsS0dOdmJYQmhjbVZUZEhKMVkzUjFjbUZzTENCdmJHUldZV3gxWlN3Z2JtVjNWbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnWTI5dGNHRnlaVk4wY25WamRIVnlZV3hjYmlBZ0lDQWdJQ0FnUHlBaFpHVmxjRVZ4ZFdGc2N5aHZiR1JXWVd4MVpTd2dibVYzVm1Gc2RXVXBYRzRnSUNBZ0lDQWdJRG9nYjJ4a1ZtRnNkV1VnSVQwOUlHNWxkMVpoYkhWbE8xeHVmVnh1ZG1GeUlIQnliM1J2ZEhsd1pVaGhjMDkzYmxCeWIzQmxjblI1SUQwZ1QySnFaV04wTG5CeWIzUnZkSGx3WlM1b1lYTlBkMjVRY205d1pYSjBlVHRjYm1aMWJtTjBhVzl1SUdoaGMwOTNibEJ5YjNCbGNuUjVLRzlpYW1WamRDd2djSEp2Y0U1aGJXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2NISnZkRzkwZVhCbFNHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaHZZbXBsWTNRc0lIQnliM0JPWVcxbEtUdGNibjFjYm1aMWJtTjBhVzl1SUcxaGEyVk9iMjVGYm5WdFpYSmhZbXhsS0c5aWFtVmpkQ3dnY0hKdmNFNWhiV1Z6S1NCN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCd2NtOXdUbUZ0WlhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnWVdSa1NHbGtaR1Z1VUhKdmNDaHZZbXBsWTNRc0lIQnliM0JPWVcxbGMxdHBYU3dnYjJKcVpXTjBXM0J5YjNCT1lXMWxjMXRwWFYwcE8xeHVJQ0FnSUgxY2JuMWNibVoxYm1OMGFXOXVJR0ZrWkVocFpHUmxibEJ5YjNBb2IySnFaV04wTENCd2NtOXdUbUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2IySnFaV04wTENCd2NtOXdUbUZ0WlN3Z2UxeHVJQ0FnSUNBZ0lDQmxiblZ0WlhKaFlteGxPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdkM0pwZEdGaWJHVTZJSFJ5ZFdVc1hHNGdJQ0FnSUNBZ0lHTnZibVpwWjNWeVlXSnNaVG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdkbUZzZFdVNklIWmhiSFZsWEc0Z0lDQWdmU2s3WEc1OVhHNW1kVzVqZEdsdmJpQmhaR1JJYVdSa1pXNUdhVzVoYkZCeWIzQW9iMkpxWldOMExDQndjbTl3VG1GdFpTd2dkbUZzZFdVcElIdGNiaUFnSUNCUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29iMkpxWldOMExDQndjbTl3VG1GdFpTd2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhZbXhsT2lCbVlXeHpaU3hjYmlBZ0lDQWdJQ0FnZDNKcGRHRmliR1U2SUdaaGJITmxMRnh1SUNBZ0lDQWdJQ0JqYjI1bWFXZDFjbUZpYkdVNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUhaaGJIVmxPaUIyWVd4MVpWeHVJQ0FnSUgwcE8xeHVmVnh1Wm5WdVkzUnBiMjRnYVhOUWNtOXdaWEowZVVOdmJtWnBaM1Z5WVdKc1pTaHZZbXBsWTNRc0lIQnliM0FwSUh0Y2JpQWdJQ0IyWVhJZ1pHVnpZM0pwY0hSdmNpQTlJRTlpYW1WamRDNW5aWFJQZDI1UWNtOXdaWEowZVVSbGMyTnlhWEIwYjNJb2IySnFaV04wTENCd2NtOXdLVHRjYmlBZ0lDQnlaWFIxY200Z0lXUmxjMk55YVhCMGIzSWdmSHdnS0dSbGMyTnlhWEIwYjNJdVkyOXVabWxuZFhKaFlteGxJQ0U5UFNCbVlXeHpaU0FtSmlCa1pYTmpjbWx3ZEc5eUxuZHlhWFJoWW14bElDRTlQU0JtWVd4elpTazdYRzU5WEc1bWRXNWpkR2x2YmlCaGMzTmxjblJRY205d1pYSjBlVU52Ym1acFozVnlZV0pzWlNodlltcGxZM1FzSUhCeWIzQXBJSHRjYmlBZ0lDQnBiblpoY21saGJuUW9hWE5RY205d1pYSjBlVU52Ym1acFozVnlZV0pzWlNodlltcGxZM1FzSUhCeWIzQXBMQ0JjSWtOaGJtNXZkQ0J0WVd0bElIQnliM0JsY25SNUlDZGNJaUFySUhCeWIzQWdLeUJjSWljZ2IySnpaWEoyWVdKc1pTd2dhWFFnYVhNZ2JtOTBJR052Ym1acFozVnlZV0pzWlNCaGJtUWdkM0pwZEdGaWJHVWdhVzRnZEdobElIUmhjbWRsZENCdlltcGxZM1JjSWlrN1hHNTlYRzVtZFc1amRHbHZiaUJuWlhSRmJuVnRaWEpoWW14bFMyVjVjeWh2WW1vcElIdGNiaUFnSUNCMllYSWdjbVZ6SUQwZ1cxMDdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2EyVjVJR2x1SUc5aWFpbGNiaUFnSUNBZ0lDQWdjbVZ6TG5CMWMyZ29hMlY1S1R0Y2JpQWdJQ0J5WlhSMWNtNGdjbVZ6TzF4dWZWeHVablZ1WTNScGIyNGdaR1ZsY0VWeGRXRnNjeWhoTENCaUtTQjdYRzRnSUNBZ2FXWWdLR0VnUFQwOUlHNTFiR3dnSmlZZ1lpQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUnlkV1U3WEc0Z0lDQWdhV1lnS0dFZ1BUMDlJSFZ1WkdWbWFXNWxaQ0FtSmlCaUlEMDlQU0IxYm1SbFptbHVaV1FwWEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHVJQ0FnSUhaaGNpQmhTWE5CY25KaGVTQTlJRUZ5Y21GNUxtbHpRWEp5WVhrb1lTa2dmSHdnYVhOUFluTmxjblpoWW14bFFYSnlZWGtvWVNrN1hHNGdJQ0FnYVdZZ0tHRkpjMEZ5Y21GNUlDRTlQU0FvUVhKeVlYa3VhWE5CY25KaGVTaGlLU0I4ZkNCcGMwOWljMlZ5ZG1GaWJHVkJjbkpoZVNoaUtTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0JsYkhObElHbG1JQ2hoU1hOQmNuSmhlU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9ZUzVzWlc1bmRHZ2dJVDA5SUdJdWJHVnVaM1JvS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdZUzVzWlc1bmRHZ2dMU0F4T3lCcElENDlJREE3SUdrdExTbGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2haR1ZsY0VWeGRXRnNjeWhoVzJsZExDQmlXMmxkS1NsY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBjblZsTzF4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ1lTQTlQVDBnWENKdlltcGxZM1JjSWlBbUppQjBlWEJsYjJZZ1lpQTlQVDBnWENKdlltcGxZM1JjSWlrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWVNBOVBUMGdiblZzYkNCOGZDQmlJRDA5UFNCdWRXeHNLVnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0JwWmlBb1oyVjBSVzUxYldWeVlXSnNaVXRsZVhNb1lTa3ViR1Z1WjNSb0lDRTlQU0JuWlhSRmJuVnRaWEpoWW14bFMyVjVjeWhpS1M1c1pXNW5kR2dwWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUhCeWIzQWdhVzRnWVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRW9jSEp2Y0NCcGJpQmlLU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXUmxaWEJGY1hWaGJITW9ZVnR3Y205d1hTd2dZbHR3Y205d1hTa3BYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnWVNBOVBUMGdZanRjYm4xY2JpSmRmUT09Il19
const mobx = require('mobx');
// Pattern 1, state is updated in autorun (or action)
const state = mobx.observable({
name: 'state1',
isBoolean: false,
isString: false,
input: 1
});
mobx.autorun(() => {
console.log('state someReallyExpensiveTest');
const r = someReallyExpensiveTest(state.input);
state.isBoolean = r.isBoolean;
state.isString = r.isString;
});
state.input = true;
console.log(state.name, state.isBoolean, state.isString);
state.input = 'string';
console.log(state.name, state.isBoolean, state.isString);
// Pattern 2, properties are computed and chained
const state2 = mobx.observable({
name: 'state2',
input: 2,
__result__ () {
console.log('state2 someReallyExpensiveTest');
return someReallyExpensiveTest(this.input);
},
isBoolean () {
return this.__result__.isBoolean;
},
isString () {
return this.__result__.isString;
}
});
state2.input = 'string';
console.log(state2.name, state2.isBoolean, state2.isString);
state2.input = true;
console.log(state2.name, state2.isBoolean, state2.isString);
function someReallyExpensiveTest(input) {
return {
isBoolean: typeof input === 'boolean',
isString: typeof input === 'string'
}
}
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"mobx": "2.5.0"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment