Skip to content

Instantly share code, notes, and snippets.

@arturi
Last active September 25, 2016 03:39
Show Gist options
  • Save arturi/54e076cccc929cc567cb0aba38815105 to your computer and use it in GitHub Desktop.
Save arturi/54e076cccc929cc567cb0aba38815105 to your computer and use it in GitHub Desktop.
requirebin sketch
var Uppy = require('uppy')
var uppy = new Uppy.Core({wait: false, debug: true})
uppy
.use(Uppy.DragDrop, {target: 'body'})
.use(Uppy.Tus10, {endpoint: 'http://master.tus.io:8080/files/'})
.run()
uppy.on('core:upload-success', (fileId, url) => {
console.log(url)
var img = new Image()
img.width = 300
img.alt = fileId
img.src = url
document.body.appendChild(img)
})
This file has been truncated, but you can view the full file.
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
},{}],2:[function(require,module,exports){
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
} else if (last === '..') {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
return splitPathRe.exec(filename).slice(1);
};
// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : process.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};
// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === '/';
// Normalize the path
path = normalizeArray(filter(path.split('/'), function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
};
// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === '/';
};
// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== 'string') {
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};
// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
};
exports.sep = '/';
exports.delimiter = ':';
exports.dirname = function(path) {
var result = splitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
};
exports.basename = function(path, ext) {
var f = splitPath(path)[2];
// TODO: make this comparison case-insensitive on windows?
if (ext && f.substr(-1 * ext.length) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
};
exports.extname = function(path) {
return splitPath(path)[3];
};
function filter (xs, f) {
if (xs.filter) return xs.filter(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
if (f(xs[i], i, xs)) res.push(xs[i]);
}
return res;
}
// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
? function (str, start, len) { return str.substr(start, len) }
: function (str, start, len) {
if (start < 0) start = str.length + start;
return str.substr(start, len);
}
;
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcbiJdfQ==
},{"_process":3}],3:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canMutationObserver = typeof window !== 'undefined'
&& window.MutationObserver;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
var queue = [];
if (canMutationObserver) {
var hiddenDiv = document.createElement("div");
var observer = new MutationObserver(function () {
var queueList = queue.slice();
queue.length = 0;
queueList.forEach(function (fn) {
fn();
});
});
observer.observe(hiddenDiv, { attributes: true });
return function nextTick(fn) {
if (!queue.length) {
hiddenDiv.setAttribute('yes', 'no');
}
queue.push(fn);
};
}
if (canPost) {
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
},{}],4:[function(require,module,exports){
(function (global){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Utils = require('../core/Utils');
var _Utils2 = _interopRequireDefault(_Utils);
var _Translator = require('../core/Translator');
var _Translator2 = _interopRequireDefault(_Translator);
var _namespaceEmitter = require('namespace-emitter');
var _namespaceEmitter2 = _interopRequireDefault(_namespaceEmitter);
var _UppySocket = require('./UppySocket');
var _UppySocket2 = _interopRequireDefault(_UppySocket);
var _en_US = require('../locales/en_US');
var _en_US2 = _interopRequireDefault(_en_US);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// import deepFreeze from 'deep-freeze-strict'
/**
* Main Uppy core
*
* @param {object} opts general options, like locales, to show modal or not to show
*/
var Core = function () {
function Core(opts) {
_classCallCheck(this, Core);
// set default options
var defaultOptions = {
// load English as the default locales
locales: _en_US2.default,
autoProceed: true,
debug: false
};
// Merge default options with the ones set by user
this.opts = _extends({}, defaultOptions, opts);
// Dictates in what order different plugin types are ran:
this.types = ['presetter', 'orchestrator', 'progressindicator', 'acquirer', 'modifier', 'uploader', 'presenter', 'debugger'];
this.type = 'core';
// Container for different types of plugins
this.plugins = {};
this.translator = new _Translator2.default({ locales: this.opts.locales });
this.i18n = this.translator.translate.bind(this.translator);
this.getState = this.getState.bind(this);
this.updateMeta = this.updateMeta.bind(this);
this.initSocket = this.initSocket.bind(this);
this.log = this.log.bind(this);
this.addFile = this.addFile.bind(this);
this.bus = this.emitter = (0, _namespaceEmitter2.default)();
this.on = this.bus.on.bind(this.bus);
this.emit = this.bus.emit.bind(this.bus);
this.state = {
files: {},
capabilities: {},
totalProgress: 0
};
if (this.opts.debug) {
// for debugging and testing
global.UppyState = this.state;
global.uppyLog = '';
global.UppyAddFile = this.addFile.bind(this);
global._Uppy = this;
}
}
/**
* Iterate on all plugins and run `update` on them. Called each time when state changes
*
*/
Core.prototype.updateAll = function updateAll(state) {
var _this = this;
Object.keys(this.plugins).forEach(function (pluginType) {
_this.plugins[pluginType].forEach(function (plugin) {
plugin.update(state);
});
});
};
/**
* Updates state
*
* @param {newState} object
*/
Core.prototype.setState = function setState(stateUpdate) {
var newState = _extends({}, this.state, stateUpdate);
this.bus.emit('core:state-update', this.state, newState, stateUpdate);
this.state = newState;
this.updateAll(this.state);
// this.log('Updating state with: ')
// this.log(newState)
};
/**
* Gets current state, making sure to make a copy of the state object and pass that,
* instead of an actual reference to `this.state`
*
*/
Core.prototype.getState = function getState() {
// return deepFreeze(this.state)
return this.state;
};
Core.prototype.updateMeta = function updateMeta(data, fileID) {
var updatedFiles = _extends({}, this.getState().files);
var newMeta = _extends({}, updatedFiles[fileID].meta, data);
updatedFiles[fileID] = _extends({}, updatedFiles[fileID], {
meta: newMeta
});
this.setState({ files: updatedFiles });
};
Core.prototype.addFile = function addFile(file) {
var updatedFiles = _extends({}, this.state.files);
var fileName = file.name || 'noname';
var fileType = _Utils2.default.getFileType(file) ? _Utils2.default.getFileType(file).split('/') : ['', ''];
var fileTypeGeneral = fileType[0];
var fileTypeSpecific = fileType[1];
var fileExtension = _Utils2.default.getFileNameAndExtension(fileName)[1];
var isRemote = file.isRemote || false;
var fileID = _Utils2.default.generateFileID(fileName);
var newFile = {
source: file.source || '',
id: fileID,
name: fileName,
extension: fileExtension || '',
meta: {
name: fileName
},
type: {
general: fileTypeGeneral,
specific: fileTypeSpecific
},
data: file.data,
progress: {
percentage: 0,
uploadComplete: false,
uploadStarted: false
},
size: file.data.size || 0,
isRemote: isRemote,
remote: file.remote || ''
};
updatedFiles[fileID] = newFile;
this.setState({ files: updatedFiles });
this.bus.emit('file-added', fileID);
this.log('Added file: ' + fileName + ', ' + fileID);
if (fileTypeGeneral === 'image' && !isRemote) {
this.addThumbnail(newFile.id);
}
if (this.opts.autoProceed) {
this.bus.emit('core:upload');
}
};
Core.prototype.removeFile = function removeFile(fileID) {
var updatedFiles = _extends({}, this.getState().files);
delete updatedFiles[fileID];
this.setState({ files: updatedFiles });
};
Core.prototype.addThumbnail = function addThumbnail(fileID) {
var _this2 = this;
var file = this.getState().files[fileID];
_Utils2.default.readFile(file.data).then(function (imgDataURI) {
return _Utils2.default.createImageThumbnail(imgDataURI, 200);
}).then(function (thumbnail) {
var updatedFiles = _extends({}, _this2.getState().files);
var updatedFile = _extends({}, updatedFiles[fileID], {
preview: thumbnail
});
updatedFiles[fileID] = updatedFile;
_this2.setState({ files: updatedFiles });
});
};
/**
* Registers listeners for all global actions, like:
* `file-add`, `file-remove`, `upload-progress`, `reset`
*
*/
Core.prototype.actions = function actions() {
var _this3 = this;
// this.bus.on('*', (payload) => {
// console.log('emitted: ', this.event)
// console.log('with payload: ', payload)
// })
// const bus = this.bus
this.on('core:file-add', function (data) {
_this3.addFile(data);
});
// `remove-file` removes a file from `state.files`, for example when
// a user decides not to upload particular file and clicks a button to remove it
this.on('core:file-remove', function (fileID) {
_this3.removeFile(fileID);
});
this.on('core:upload-started', function (fileID, upload) {
var updatedFiles = _extends({}, _this3.getState().files);
var updatedFile = _extends({}, updatedFiles[fileID], _extends({}, {
progress: _extends({}, updatedFiles[fileID].progress, {
uploadStarted: Date.now()
})
}));
updatedFiles[fileID] = updatedFile;
_this3.setState({ files: updatedFiles });
});
this.on('core:upload-progress', function (data) {
var fileID = data.id;
var updatedFiles = _extends({}, _this3.getState().files);
if (!updatedFiles[fileID]) {
console.error('Trying to set progress for a file that’s not with us anymore: ', fileID);
return;
}
var updatedFile = _extends({}, updatedFiles[fileID], _extends({}, {
progress: _extends({}, updatedFiles[fileID].progress, {
bytesUploaded: data.bytesUploaded,
bytesTotal: data.bytesTotal,
percentage: Math.round((data.bytesUploaded / data.bytesTotal * 100).toFixed(2))
})
}));
updatedFiles[data.id] = updatedFile;
// calculate total progress, using the number of files currently uploading,
// multiplied by 100 and the summ of individual progress of each file
var inProgress = Object.keys(updatedFiles).filter(function (file) {
return updatedFiles[file].progress.uploadStarted;
});
var progressMax = inProgress.length * 100;
var progressAll = 0;
inProgress.forEach(function (file) {
progressAll = progressAll + updatedFiles[file].progress.percentage;
});
var totalProgress = Math.round((progressAll * 100 / progressMax).toFixed(2));
if (totalProgress === 100) {
var completeFiles = Object.keys(updatedFiles).filter(function (file) {
// this should be `uploadComplete`
return updatedFiles[file].progress.percentage === 100;
});
_this3.emit('core:success', completeFiles.length);
}
_this3.setState({
totalProgress: totalProgress,
files: updatedFiles
});
});
this.on('core:upload-success', function (fileID, uploadURL) {
var updatedFiles = _extends({}, _this3.getState().files);
var updatedFile = _extends({}, updatedFiles[fileID], {
progress: _extends({}, updatedFiles[fileID].progress, {
uploadComplete: true
}),
uploadURL: uploadURL
});
updatedFiles[fileID] = updatedFile;
_this3.setState({
files: updatedFiles
});
});
this.on('core:update-meta', function (data, fileID) {
_this3.updateMeta(data, fileID);
});
// show informer if offline
if (typeof window !== 'undefined') {
window.addEventListener('online', function () {
return _this3.isOnline(true);
});
window.addEventListener('offline', function () {
return _this3.isOnline(false);
});
setTimeout(function () {
return _this3.isOnline();
}, 3000);
}
};
Core.prototype.isOnline = function isOnline(status) {
var online = status || window.navigator.onLine;
if (!online) {
this.emit('is-offline');
this.emit('informer', 'No internet connection', 'error', 0);
this.wasOffline = true;
} else {
this.emit('is-online');
if (this.wasOffline) {
this.emit('informer', 'Connected!', 'success', 3000);
this.wasOffline = false;
}
}
};
/**
* Registers a plugin with Core
*
* @param {Class} Plugin object
* @param {Object} options object that will be passed to Plugin later
* @return {Object} self for chaining
*/
Core.prototype.use = function use(Plugin, opts) {
// Prepare props to pass to plugins
var props = {
getState: this.getState.bind(this),
setState: this.setState.bind(this),
updateMeta: this.updateMeta.bind(this),
addFile: this.addFile.bind(this),
i18n: this.i18n.bind(this),
bus: this.ee,
log: this.log.bind(this)
};
// Instantiate
var plugin = new Plugin(this, opts, props);
var pluginName = plugin.id;
this.plugins[plugin.type] = this.plugins[plugin.type] || [];
if (!pluginName) {
throw new Error('Your plugin must have a name');
}
if (!plugin.type) {
throw new Error('Your plugin must have a type');
}
var existsPluginAlready = this.getPlugin(pluginName);
if (existsPluginAlready) {
var msg = 'Already found a plugin named \'' + existsPluginAlready.name + '\'.\n Tried to use: \'' + pluginName + '\'.\n Uppy is currently limited to running one of every plugin.\n Share your use case with us over at\n https://github.com/transloadit/uppy/issues/\n if you want us to reconsider.';
throw new Error(msg);
}
this.plugins[plugin.type].push(plugin);
return this;
};
/**
* Find one Plugin by name
*
* @param string name description
*/
Core.prototype.getPlugin = function getPlugin(name) {
var foundPlugin = false;
this.iteratePlugins(function (plugin) {
var pluginName = plugin.id;
if (pluginName === name) {
foundPlugin = plugin;
return false;
}
});
return foundPlugin;
};
/**
* Iterate through all `use`d plugins
*
* @param function method description
*/
Core.prototype.iteratePlugins = function iteratePlugins(method) {
var _this4 = this;
Object.keys(this.plugins).forEach(function (pluginType) {
_this4.plugins[pluginType].forEach(method);
});
};
/**
* Logs stuff to console, only if `debug` is set to true. Silent in production.
*
* @return {String|Object} to log
*/
Core.prototype.log = function log(msg) {
if (!this.opts.debug) {
return;
}
if (msg === '' + msg) {
console.log('LOG: ' + msg);
} else {
console.dir(msg);
}
global.uppyLog = global.uppyLog + '\n' + 'DEBUG LOG: ' + msg;
};
Core.prototype.initSocket = function initSocket(opts) {
if (!this.socket) {
this.socket = new _UppySocket2.default(opts);
}
return this.socket;
};
Core.prototype.installAll = function installAll() {
var _this5 = this;
Object.keys(this.plugins).forEach(function (pluginType) {
_this5.plugins[pluginType].forEach(function (plugin) {
plugin.install();
});
});
};
/**
* Initializes actions, installs all plugins (by iterating on them and calling `install`), sets options
*
* (In the past was used to run a waterfall of runType plugin packs, like so:
* All preseters(data) --> All acquirers(data) --> All uploaders(data) --> done)
*/
Core.prototype.run = function run() {
this.log('Core is run, initializing actions, installing plugins...');
// setInterval(() => {
// this.updateAll(this.state)
// }, 1000)
this.actions();
// Forse set `autoProceed` option to false if there are multiple selector Plugins active
if (this.plugins.acquirer && this.plugins.acquirer.length > 1) {
this.opts.autoProceed = false;
}
// Install all plugins
this.installAll();
return;
};
return Core;
}();
exports.default = Core;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb3JlL0NvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9VdGlscyA9IHJlcXVpcmUoJy4uL2NvcmUvVXRpbHMnKTtcblxudmFyIF9VdGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VdGlscyk7XG5cbnZhciBfVHJhbnNsYXRvciA9IHJlcXVpcmUoJy4uL2NvcmUvVHJhbnNsYXRvcicpO1xuXG52YXIgX1RyYW5zbGF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVHJhbnNsYXRvcik7XG5cbnZhciBfbmFtZXNwYWNlRW1pdHRlciA9IHJlcXVpcmUoJ25hbWVzcGFjZS1lbWl0dGVyJyk7XG5cbnZhciBfbmFtZXNwYWNlRW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9uYW1lc3BhY2VFbWl0dGVyKTtcblxudmFyIF9VcHB5U29ja2V0ID0gcmVxdWlyZSgnLi9VcHB5U29ja2V0Jyk7XG5cbnZhciBfVXBweVNvY2tldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VcHB5U29ja2V0KTtcblxudmFyIF9lbl9VUyA9IHJlcXVpcmUoJy4uL2xvY2FsZXMvZW5fVVMnKTtcblxudmFyIF9lbl9VUzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbl9VUyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG4vLyBpbXBvcnQgZGVlcEZyZWV6ZSBmcm9tICdkZWVwLWZyZWV6ZS1zdHJpY3QnXG5cblxuLyoqXG4gKiBNYWluIFVwcHkgY29yZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIGdlbmVyYWwgb3B0aW9ucywgbGlrZSBsb2NhbGVzLCB0byBzaG93IG1vZGFsIG9yIG5vdCB0byBzaG93XG4gKi9cbnZhciBDb3JlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb3JlKG9wdHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29yZSk7XG5cbiAgICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgLy8gbG9hZCBFbmdsaXNoIGFzIHRoZSBkZWZhdWx0IGxvY2FsZXNcbiAgICAgIGxvY2FsZXM6IF9lbl9VUzIuZGVmYXVsdCxcbiAgICAgIGF1dG9Qcm9jZWVkOiB0cnVlLFxuICAgICAgZGVidWc6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBvbmVzIHNldCBieSB1c2VyXG4gICAgdGhpcy5vcHRzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRzKTtcblxuICAgIC8vIERpY3RhdGVzIGluIHdoYXQgb3JkZXIgZGlmZmVyZW50IHBsdWdpbiB0eXBlcyBhcmUgcmFuOlxuICAgIHRoaXMudHlwZXMgPSBbJ3ByZXNldHRlcicsICdvcmNoZXN0cmF0b3InLCAncHJvZ3Jlc3NpbmRpY2F0b3InLCAnYWNxdWlyZXInLCAnbW9kaWZpZXInLCAndXBsb2FkZXInLCAncHJlc2VudGVyJywgJ2RlYnVnZ2VyJ107XG5cbiAgICB0aGlzLnR5cGUgPSAnY29yZSc7XG5cbiAgICAvLyBDb250YWluZXIgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwbHVnaW5zXG4gICAgdGhpcy5wbHVnaW5zID0ge307XG5cbiAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgX1RyYW5zbGF0b3IyLmRlZmF1bHQoeyBsb2NhbGVzOiB0aGlzLm9wdHMubG9jYWxlcyB9KTtcbiAgICB0aGlzLmkxOG4gPSB0aGlzLnRyYW5zbGF0b3IudHJhbnNsYXRlLmJpbmQodGhpcy50cmFuc2xhdG9yKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMudXBkYXRlTWV0YSA9IHRoaXMudXBkYXRlTWV0YS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdFNvY2tldCA9IHRoaXMuaW5pdFNvY2tldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubG9nID0gdGhpcy5sb2cuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEZpbGUgPSB0aGlzLmFkZEZpbGUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuYnVzID0gdGhpcy5lbWl0dGVyID0gKDAsIF9uYW1lc3BhY2VFbWl0dGVyMi5kZWZhdWx0KSgpO1xuICAgIHRoaXMub24gPSB0aGlzLmJ1cy5vbi5iaW5kKHRoaXMuYnVzKTtcbiAgICB0aGlzLmVtaXQgPSB0aGlzLmJ1cy5lbWl0LmJpbmQodGhpcy5idXMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGZpbGVzOiB7fSxcbiAgICAgIGNhcGFiaWxpdGllczoge30sXG4gICAgICB0b3RhbFByb2dyZXNzOiAwXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuZGVidWcpIHtcbiAgICAgIC8vIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmdcbiAgICAgIGdsb2JhbC5VcHB5U3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgZ2xvYmFsLnVwcHlMb2cgPSAnJztcbiAgICAgIGdsb2JhbC5VcHB5QWRkRmlsZSA9IHRoaXMuYWRkRmlsZS5iaW5kKHRoaXMpO1xuICAgICAgZ2xvYmFsLl9VcHB5ID0gdGhpcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvbiBhbGwgcGx1Z2lucyBhbmQgcnVuIGB1cGRhdGVgIG9uIHRoZW0uIENhbGxlZCBlYWNoIHRpbWUgd2hlbiBzdGF0ZSBjaGFuZ2VzXG4gICAqXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUudXBkYXRlQWxsID0gZnVuY3Rpb24gdXBkYXRlQWxsKHN0YXRlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIE9iamVjdC5rZXlzKHRoaXMucGx1Z2lucykuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luVHlwZSkge1xuICAgICAgX3RoaXMucGx1Z2luc1twbHVnaW5UeXBlXS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcGx1Z2luLnVwZGF0ZShzdGF0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyBzdGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge25ld1N0YXRlfSBvYmplY3RcbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIHNldFN0YXRlKHN0YXRlVXBkYXRlKSB7XG4gICAgdmFyIG5ld1N0YXRlID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUsIHN0YXRlVXBkYXRlKTtcbiAgICB0aGlzLmJ1cy5lbWl0KCdjb3JlOnN0YXRlLXVwZGF0ZScsIHRoaXMuc3RhdGUsIG5ld1N0YXRlLCBzdGF0ZVVwZGF0ZSk7XG5cbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgdGhpcy51cGRhdGVBbGwodGhpcy5zdGF0ZSk7XG5cbiAgICAvLyB0aGlzLmxvZygnVXBkYXRpbmcgc3RhdGUgd2l0aDogJylcbiAgICAvLyB0aGlzLmxvZyhuZXdTdGF0ZSlcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBjdXJyZW50IHN0YXRlLCBtYWtpbmcgc3VyZSB0byBtYWtlIGEgY29weSBvZiB0aGUgc3RhdGUgb2JqZWN0IGFuZCBwYXNzIHRoYXQsXG4gICAqIGluc3RlYWQgb2YgYW4gYWN0dWFsIHJlZmVyZW5jZSB0byBgdGhpcy5zdGF0ZWBcbiAgICpcbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIC8vIHJldHVybiBkZWVwRnJlZXplKHRoaXMuc3RhdGUpXG4gICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUudXBkYXRlTWV0YSA9IGZ1bmN0aW9uIHVwZGF0ZU1ldGEoZGF0YSwgZmlsZUlEKSB7XG4gICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCB0aGlzLmdldFN0YXRlKCkuZmlsZXMpO1xuICAgIHZhciBuZXdNZXRhID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLm1ldGEsIGRhdGEpO1xuICAgIHVwZGF0ZWRGaWxlc1tmaWxlSURdID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLCB7XG4gICAgICBtZXRhOiBuZXdNZXRhXG4gICAgfSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVzOiB1cGRhdGVkRmlsZXMgfSk7XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUuYWRkRmlsZSA9IGZ1bmN0aW9uIGFkZEZpbGUoZmlsZSkge1xuICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS5maWxlcyk7XG5cbiAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgJ25vbmFtZSc7XG4gICAgdmFyIGZpbGVUeXBlID0gX1V0aWxzMi5kZWZhdWx0LmdldEZpbGVUeXBlKGZpbGUpID8gX1V0aWxzMi5kZWZhdWx0LmdldEZpbGVUeXBlKGZpbGUpLnNwbGl0KCcvJykgOiBbJycsICcnXTtcbiAgICB2YXIgZmlsZVR5cGVHZW5lcmFsID0gZmlsZVR5cGVbMF07XG4gICAgdmFyIGZpbGVUeXBlU3BlY2lmaWMgPSBmaWxlVHlwZVsxXTtcbiAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IF9VdGlsczIuZGVmYXVsdC5nZXRGaWxlTmFtZUFuZEV4dGVuc2lvbihmaWxlTmFtZSlbMV07XG4gICAgdmFyIGlzUmVtb3RlID0gZmlsZS5pc1JlbW90ZSB8fCBmYWxzZTtcblxuICAgIHZhciBmaWxlSUQgPSBfVXRpbHMyLmRlZmF1bHQuZ2VuZXJhdGVGaWxlSUQoZmlsZU5hbWUpO1xuXG4gICAgdmFyIG5ld0ZpbGUgPSB7XG4gICAgICBzb3VyY2U6IGZpbGUuc291cmNlIHx8ICcnLFxuICAgICAgaWQ6IGZpbGVJRCxcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgZXh0ZW5zaW9uOiBmaWxlRXh0ZW5zaW9uIHx8ICcnLFxuICAgICAgbWV0YToge1xuICAgICAgICBuYW1lOiBmaWxlTmFtZVxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgZ2VuZXJhbDogZmlsZVR5cGVHZW5lcmFsLFxuICAgICAgICBzcGVjaWZpYzogZmlsZVR5cGVTcGVjaWZpY1xuICAgICAgfSxcbiAgICAgIGRhdGE6IGZpbGUuZGF0YSxcbiAgICAgIHByb2dyZXNzOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IDAsXG4gICAgICAgIHVwbG9hZENvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgdXBsb2FkU3RhcnRlZDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBzaXplOiBmaWxlLmRhdGEuc2l6ZSB8fCAwLFxuICAgICAgaXNSZW1vdGU6IGlzUmVtb3RlLFxuICAgICAgcmVtb3RlOiBmaWxlLnJlbW90ZSB8fCAnJ1xuICAgIH07XG5cbiAgICB1cGRhdGVkRmlsZXNbZmlsZUlEXSA9IG5ld0ZpbGU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVzOiB1cGRhdGVkRmlsZXMgfSk7XG5cbiAgICB0aGlzLmJ1cy5lbWl0KCdmaWxlLWFkZGVkJywgZmlsZUlEKTtcbiAgICB0aGlzLmxvZygnQWRkZWQgZmlsZTogJyArIGZpbGVOYW1lICsgJywgJyArIGZpbGVJRCk7XG5cbiAgICBpZiAoZmlsZVR5cGVHZW5lcmFsID09PSAnaW1hZ2UnICYmICFpc1JlbW90ZSkge1xuICAgICAgdGhpcy5hZGRUaHVtYm5haWwobmV3RmlsZS5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5hdXRvUHJvY2VlZCkge1xuICAgICAgdGhpcy5idXMuZW1pdCgnY29yZTp1cGxvYWQnKTtcbiAgICB9XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUucmVtb3ZlRmlsZSA9IGZ1bmN0aW9uIHJlbW92ZUZpbGUoZmlsZUlEKSB7XG4gICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCB0aGlzLmdldFN0YXRlKCkuZmlsZXMpO1xuICAgIGRlbGV0ZSB1cGRhdGVkRmlsZXNbZmlsZUlEXTtcbiAgICB0aGlzLnNldFN0YXRlKHsgZmlsZXM6IHVwZGF0ZWRGaWxlcyB9KTtcbiAgfTtcblxuICBDb3JlLnByb3RvdHlwZS5hZGRUaHVtYm5haWwgPSBmdW5jdGlvbiBhZGRUaHVtYm5haWwoZmlsZUlEKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgZmlsZSA9IHRoaXMuZ2V0U3RhdGUoKS5maWxlc1tmaWxlSURdO1xuXG4gICAgX1V0aWxzMi5kZWZhdWx0LnJlYWRGaWxlKGZpbGUuZGF0YSkudGhlbihmdW5jdGlvbiAoaW1nRGF0YVVSSSkge1xuICAgICAgcmV0dXJuIF9VdGlsczIuZGVmYXVsdC5jcmVhdGVJbWFnZVRodW1ibmFpbChpbWdEYXRhVVJJLCAyMDApO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHRodW1ibmFpbCkge1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCBfdGhpczIuZ2V0U3RhdGUoKS5maWxlcyk7XG4gICAgICB2YXIgdXBkYXRlZEZpbGUgPSBfZXh0ZW5kcyh7fSwgdXBkYXRlZEZpbGVzW2ZpbGVJRF0sIHtcbiAgICAgICAgcHJldmlldzogdGh1bWJuYWlsXG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZWRGaWxlc1tmaWxlSURdID0gdXBkYXRlZEZpbGU7XG4gICAgICBfdGhpczIuc2V0U3RhdGUoeyBmaWxlczogdXBkYXRlZEZpbGVzIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbGlzdGVuZXJzIGZvciBhbGwgZ2xvYmFsIGFjdGlvbnMsIGxpa2U6XG4gICAqIGBmaWxlLWFkZGAsIGBmaWxlLXJlbW92ZWAsIGB1cGxvYWQtcHJvZ3Jlc3NgLCBgcmVzZXRgXG4gICAqXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUuYWN0aW9ucyA9IGZ1bmN0aW9uIGFjdGlvbnMoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAvLyB0aGlzLmJ1cy5vbignKicsIChwYXlsb2FkKSA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnZW1pdHRlZDogJywgdGhpcy5ldmVudClcbiAgICAvLyAgIGNvbnNvbGUubG9nKCd3aXRoIHBheWxvYWQ6ICcsIHBheWxvYWQpXG4gICAgLy8gfSlcblxuICAgIC8vIGNvbnN0IGJ1cyA9IHRoaXMuYnVzXG5cbiAgICB0aGlzLm9uKCdjb3JlOmZpbGUtYWRkJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIF90aGlzMy5hZGRGaWxlKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gYHJlbW92ZS1maWxlYCByZW1vdmVzIGEgZmlsZSBmcm9tIGBzdGF0ZS5maWxlc2AsIGZvciBleGFtcGxlIHdoZW5cbiAgICAvLyBhIHVzZXIgZGVjaWRlcyBub3QgdG8gdXBsb2FkIHBhcnRpY3VsYXIgZmlsZSBhbmQgY2xpY2tzIGEgYnV0dG9uIHRvIHJlbW92ZSBpdFxuICAgIHRoaXMub24oJ2NvcmU6ZmlsZS1yZW1vdmUnLCBmdW5jdGlvbiAoZmlsZUlEKSB7XG4gICAgICBfdGhpczMucmVtb3ZlRmlsZShmaWxlSUQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY29yZTp1cGxvYWQtc3RhcnRlZCcsIGZ1bmN0aW9uIChmaWxlSUQsIHVwbG9hZCkge1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCBfdGhpczMuZ2V0U3RhdGUoKS5maWxlcyk7XG4gICAgICB2YXIgdXBkYXRlZEZpbGUgPSBfZXh0ZW5kcyh7fSwgdXBkYXRlZEZpbGVzW2ZpbGVJRF0sIF9leHRlbmRzKHt9LCB7XG4gICAgICAgIHByb2dyZXNzOiBfZXh0ZW5kcyh7fSwgdXBkYXRlZEZpbGVzW2ZpbGVJRF0ucHJvZ3Jlc3MsIHtcbiAgICAgICAgICB1cGxvYWRTdGFydGVkOiBEYXRlLm5vdygpXG4gICAgICAgIH0pXG4gICAgICB9KSk7XG4gICAgICB1cGRhdGVkRmlsZXNbZmlsZUlEXSA9IHVwZGF0ZWRGaWxlO1xuXG4gICAgICBfdGhpczMuc2V0U3RhdGUoeyBmaWxlczogdXBkYXRlZEZpbGVzIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY29yZTp1cGxvYWQtcHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIGZpbGVJRCA9IGRhdGEuaWQ7XG4gICAgICB2YXIgdXBkYXRlZEZpbGVzID0gX2V4dGVuZHMoe30sIF90aGlzMy5nZXRTdGF0ZSgpLmZpbGVzKTtcbiAgICAgIGlmICghdXBkYXRlZEZpbGVzW2ZpbGVJRF0pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVHJ5aW5nIHRvIHNldCBwcm9ncmVzcyBmb3IgYSBmaWxlIHRoYXTigJlzIG5vdCB3aXRoIHVzIGFueW1vcmU6ICcsIGZpbGVJRCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHVwZGF0ZWRGaWxlID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLCBfZXh0ZW5kcyh7fSwge1xuICAgICAgICBwcm9ncmVzczogX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLnByb2dyZXNzLCB7XG4gICAgICAgICAgYnl0ZXNVcGxvYWRlZDogZGF0YS5ieXRlc1VwbG9hZGVkLFxuICAgICAgICAgIGJ5dGVzVG90YWw6IGRhdGEuYnl0ZXNUb3RhbCxcbiAgICAgICAgICBwZXJjZW50YWdlOiBNYXRoLnJvdW5kKChkYXRhLmJ5dGVzVXBsb2FkZWQgLyBkYXRhLmJ5dGVzVG90YWwgKiAxMDApLnRvRml4ZWQoMikpXG4gICAgICAgIH0pXG4gICAgICB9KSk7XG4gICAgICB1cGRhdGVkRmlsZXNbZGF0YS5pZF0gPSB1cGRhdGVkRmlsZTtcblxuICAgICAgLy8gY2FsY3VsYXRlIHRvdGFsIHByb2dyZXNzLCB1c2luZyB0aGUgbnVtYmVyIG9mIGZpbGVzIGN1cnJlbnRseSB1cGxvYWRpbmcsXG4gICAgICAvLyBtdWx0aXBsaWVkIGJ5IDEwMCBhbmQgdGhlIHN1bW0gb2YgaW5kaXZpZHVhbCBwcm9ncmVzcyBvZiBlYWNoIGZpbGVcbiAgICAgIHZhciBpblByb2dyZXNzID0gT2JqZWN0LmtleXModXBkYXRlZEZpbGVzKS5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRGaWxlc1tmaWxlXS5wcm9ncmVzcy51cGxvYWRTdGFydGVkO1xuICAgICAgfSk7XG4gICAgICB2YXIgcHJvZ3Jlc3NNYXggPSBpblByb2dyZXNzLmxlbmd0aCAqIDEwMDtcbiAgICAgIHZhciBwcm9ncmVzc0FsbCA9IDA7XG4gICAgICBpblByb2dyZXNzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcHJvZ3Jlc3NBbGwgPSBwcm9ncmVzc0FsbCArIHVwZGF0ZWRGaWxlc1tmaWxlXS5wcm9ncmVzcy5wZXJjZW50YWdlO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciB0b3RhbFByb2dyZXNzID0gTWF0aC5yb3VuZCgocHJvZ3Jlc3NBbGwgKiAxMDAgLyBwcm9ncmVzc01heCkudG9GaXhlZCgyKSk7XG5cbiAgICAgIGlmICh0b3RhbFByb2dyZXNzID09PSAxMDApIHtcbiAgICAgICAgdmFyIGNvbXBsZXRlRmlsZXMgPSBPYmplY3Qua2V5cyh1cGRhdGVkRmlsZXMpLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGB1cGxvYWRDb21wbGV0ZWBcbiAgICAgICAgICByZXR1cm4gdXBkYXRlZEZpbGVzW2ZpbGVdLnByb2dyZXNzLnBlcmNlbnRhZ2UgPT09IDEwMDtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzMy5lbWl0KCdjb3JlOnN1Y2Nlc3MnLCBjb21wbGV0ZUZpbGVzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMy5zZXRTdGF0ZSh7XG4gICAgICAgIHRvdGFsUHJvZ3Jlc3M6IHRvdGFsUHJvZ3Jlc3MsXG4gICAgICAgIGZpbGVzOiB1cGRhdGVkRmlsZXNcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY29yZTp1cGxvYWQtc3VjY2VzcycsIGZ1bmN0aW9uIChmaWxlSUQsIHVwbG9hZFVSTCkge1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCBfdGhpczMuZ2V0U3RhdGUoKS5maWxlcyk7XG4gICAgICB2YXIgdXBkYXRlZEZpbGUgPSBfZXh0ZW5kcyh7fSwgdXBkYXRlZEZpbGVzW2ZpbGVJRF0sIHtcbiAgICAgICAgcHJvZ3Jlc3M6IF9leHRlbmRzKHt9LCB1cGRhdGVkRmlsZXNbZmlsZUlEXS5wcm9ncmVzcywge1xuICAgICAgICAgIHVwbG9hZENvbXBsZXRlOiB0cnVlXG4gICAgICAgIH0pLFxuICAgICAgICB1cGxvYWRVUkw6IHVwbG9hZFVSTFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVkRmlsZXNbZmlsZUlEXSA9IHVwZGF0ZWRGaWxlO1xuXG4gICAgICBfdGhpczMuc2V0U3RhdGUoe1xuICAgICAgICBmaWxlczogdXBkYXRlZEZpbGVzXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2NvcmU6dXBkYXRlLW1ldGEnLCBmdW5jdGlvbiAoZGF0YSwgZmlsZUlEKSB7XG4gICAgICBfdGhpczMudXBkYXRlTWV0YShkYXRhLCBmaWxlSUQpO1xuICAgIH0pO1xuXG4gICAgLy8gc2hvdyBpbmZvcm1lciBpZiBvZmZsaW5lXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmlzT25saW5lKHRydWUpO1xuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5pc09ubGluZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmlzT25saW5lKCk7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUuaXNPbmxpbmUgPSBmdW5jdGlvbiBpc09ubGluZShzdGF0dXMpIHtcbiAgICB2YXIgb25saW5lID0gc3RhdHVzIHx8IHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lO1xuICAgIGlmICghb25saW5lKSB7XG4gICAgICB0aGlzLmVtaXQoJ2lzLW9mZmxpbmUnKTtcbiAgICAgIHRoaXMuZW1pdCgnaW5mb3JtZXInLCAnTm8gaW50ZXJuZXQgY29ubmVjdGlvbicsICdlcnJvcicsIDApO1xuICAgICAgdGhpcy53YXNPZmZsaW5lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdpcy1vbmxpbmUnKTtcbiAgICAgIGlmICh0aGlzLndhc09mZmxpbmUpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdpbmZvcm1lcicsICdDb25uZWN0ZWQhJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgdGhpcy53YXNPZmZsaW5lID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBwbHVnaW4gd2l0aCBDb3JlXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xhc3N9IFBsdWdpbiBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gUGx1Z2luIGxhdGVyXG4gICAqIEByZXR1cm4ge09iamVjdH0gc2VsZiBmb3IgY2hhaW5pbmdcbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoUGx1Z2luLCBvcHRzKSB7XG4gICAgLy8gUHJlcGFyZSBwcm9wcyB0byBwYXNzIHRvIHBsdWdpbnNcbiAgICB2YXIgcHJvcHMgPSB7XG4gICAgICBnZXRTdGF0ZTogdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2V0U3RhdGU6IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKSxcbiAgICAgIHVwZGF0ZU1ldGE6IHRoaXMudXBkYXRlTWV0YS5iaW5kKHRoaXMpLFxuICAgICAgYWRkRmlsZTogdGhpcy5hZGRGaWxlLmJpbmQodGhpcyksXG4gICAgICBpMThuOiB0aGlzLmkxOG4uYmluZCh0aGlzKSxcbiAgICAgIGJ1czogdGhpcy5lZSxcbiAgICAgIGxvZzogdGhpcy5sb2cuYmluZCh0aGlzKVxuICAgIH07XG4gICAgLy8gSW5zdGFudGlhdGVcbiAgICB2YXIgcGx1Z2luID0gbmV3IFBsdWdpbih0aGlzLCBvcHRzLCBwcm9wcyk7XG4gICAgdmFyIHBsdWdpbk5hbWUgPSBwbHVnaW4uaWQ7XG4gICAgdGhpcy5wbHVnaW5zW3BsdWdpbi50eXBlXSA9IHRoaXMucGx1Z2luc1twbHVnaW4udHlwZV0gfHwgW107XG5cbiAgICBpZiAoIXBsdWdpbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBwbHVnaW4gbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIGlmICghcGx1Z2luLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBwbHVnaW4gbXVzdCBoYXZlIGEgdHlwZScpO1xuICAgIH1cblxuICAgIHZhciBleGlzdHNQbHVnaW5BbHJlYWR5ID0gdGhpcy5nZXRQbHVnaW4ocGx1Z2luTmFtZSk7XG4gICAgaWYgKGV4aXN0c1BsdWdpbkFscmVhZHkpIHtcbiAgICAgIHZhciBtc2cgPSAnQWxyZWFkeSBmb3VuZCBhIHBsdWdpbiBuYW1lZCBcXCcnICsgZXhpc3RzUGx1Z2luQWxyZWFkeS5uYW1lICsgJ1xcJy5cXG4gICAgICAgIFRyaWVkIHRvIHVzZTogXFwnJyArIHBsdWdpbk5hbWUgKyAnXFwnLlxcbiAgICAgICAgVXBweSBpcyBjdXJyZW50bHkgbGltaXRlZCB0byBydW5uaW5nIG9uZSBvZiBldmVyeSBwbHVnaW4uXFxuICAgICAgICBTaGFyZSB5b3VyIHVzZSBjYXNlIHdpdGggdXMgb3ZlciBhdFxcbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3RyYW5zbG9hZGl0L3VwcHkvaXNzdWVzL1xcbiAgICAgICAgaWYgeW91IHdhbnQgdXMgdG8gcmVjb25zaWRlci4nO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5wbHVnaW5zW3BsdWdpbi50eXBlXS5wdXNoKHBsdWdpbik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRmluZCBvbmUgUGx1Z2luIGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBuYW1lIGRlc2NyaXB0aW9uXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUuZ2V0UGx1Z2luID0gZnVuY3Rpb24gZ2V0UGx1Z2luKG5hbWUpIHtcbiAgICB2YXIgZm91bmRQbHVnaW4gPSBmYWxzZTtcbiAgICB0aGlzLml0ZXJhdGVQbHVnaW5zKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHZhciBwbHVnaW5OYW1lID0gcGx1Z2luLmlkO1xuICAgICAgaWYgKHBsdWdpbk5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgZm91bmRQbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmRQbHVnaW47XG4gIH07XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYHVzZWBkIHBsdWdpbnNcbiAgICpcbiAgICogQHBhcmFtIGZ1bmN0aW9uIG1ldGhvZCBkZXNjcmlwdGlvblxuICAgKi9cblxuXG4gIENvcmUucHJvdG90eXBlLml0ZXJhdGVQbHVnaW5zID0gZnVuY3Rpb24gaXRlcmF0ZVBsdWdpbnMobWV0aG9kKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpblR5cGUpIHtcbiAgICAgIF90aGlzNC5wbHVnaW5zW3BsdWdpblR5cGVdLmZvckVhY2gobWV0aG9kKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogTG9ncyBzdHVmZiB0byBjb25zb2xlLCBvbmx5IGlmIGBkZWJ1Z2AgaXMgc2V0IHRvIHRydWUuIFNpbGVudCBpbiBwcm9kdWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd8T2JqZWN0fSB0byBsb2dcbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiBsb2cobXNnKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuZGVidWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1zZyA9PT0gJycgKyBtc2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdMT0c6ICcgKyBtc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmRpcihtc2cpO1xuICAgIH1cbiAgICBnbG9iYWwudXBweUxvZyA9IGdsb2JhbC51cHB5TG9nICsgJ1xcbicgKyAnREVCVUcgTE9HOiAnICsgbXNnO1xuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLmluaXRTb2NrZXQgPSBmdW5jdGlvbiBpbml0U29ja2V0KG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBfVXBweVNvY2tldDIuZGVmYXVsdChvcHRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUuaW5zdGFsbEFsbCA9IGZ1bmN0aW9uIGluc3RhbGxBbGwoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpblR5cGUpIHtcbiAgICAgIF90aGlzNS5wbHVnaW5zW3BsdWdpblR5cGVdLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgICBwbHVnaW4uaW5zdGFsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFjdGlvbnMsIGluc3RhbGxzIGFsbCBwbHVnaW5zIChieSBpdGVyYXRpbmcgb24gdGhlbSBhbmQgY2FsbGluZyBgaW5zdGFsbGApLCBzZXRzIG9wdGlvbnNcbiAgICpcbiAgICogKEluIHRoZSBwYXN0IHdhcyB1c2VkIHRvIHJ1biBhIHdhdGVyZmFsbCBvZiBydW5UeXBlIHBsdWdpbiBwYWNrcywgbGlrZSBzbzpcbiAgICogQWxsIHByZXNldGVycyhkYXRhKSAtLT4gQWxsIGFjcXVpcmVycyhkYXRhKSAtLT4gQWxsIHVwbG9hZGVycyhkYXRhKSAtLT4gZG9uZSlcbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiBydW4oKSB7XG4gICAgdGhpcy5sb2coJ0NvcmUgaXMgcnVuLCBpbml0aWFsaXppbmcgYWN0aW9ucywgaW5zdGFsbGluZyBwbHVnaW5zLi4uJyk7XG5cbiAgICAvLyBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gICB0aGlzLnVwZGF0ZUFsbCh0aGlzLnN0YXRlKVxuICAgIC8vIH0sIDEwMDApXG5cbiAgICB0aGlzLmFjdGlvbnMoKTtcblxuICAgIC8vIEZvcnNlIHNldCBgYXV0b1Byb2NlZWRgIG9wdGlvbiB0byBmYWxzZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2VsZWN0b3IgUGx1Z2lucyBhY3RpdmVcbiAgICBpZiAodGhpcy5wbHVnaW5zLmFjcXVpcmVyICYmIHRoaXMucGx1Z2lucy5hY3F1aXJlci5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLm9wdHMuYXV0b1Byb2NlZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGFsbCBwbHVnaW5zXG4gICAgdGhpcy5pbnN0YWxsQWxsKCk7XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgcmV0dXJuIENvcmU7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IENvcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3JlLmpzLm1hcCJdfQ==
},{"../core/Translator":5,"../core/Utils":7,"../locales/en_US":10,"./UppySocket":6,"namespace-emitter":55}],5:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _en_US = require('../locales/en_US');
var _en_US2 = _interopRequireDefault(_en_US);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Translates strings with interpolation & pluralization support.Extensible with custom dictionaries
* and pluralization functions.
*
* Borrows heavily from and inspired by Polyglot https://github.com/airbnb/polyglot.js,
* basically a stripped-down version of it. Differences: pluralization functions are not hardcoded
* and can be easily added among with dictionaries, nested objects are used for pluralization
* as opposed to `||||` delimeter
*
* Usage example: `translator.translate('files_chosen', {smart_count: 3})`
*
* @param {object} opts
*/
var Translator = function () {
function Translator(opts) {
_classCallCheck(this, Translator);
var defaultOptions = {
locales: _en_US2.default
};
this.opts = _extends({}, defaultOptions, opts);
this.locales = this.opts.locales;
this.locales.strings = _extends({}, _en_US2.default.strings, this.opts.locales.strings);
}
/**
* Takes a string with placeholder variables like `%{smart_count} file selected`
* and replaces it with values from options `{smart_count: 5}`
*
* @license https://github.com/airbnb/polyglot.js/blob/master/LICENSE
* taken from https://github.com/airbnb/polyglot.js/blob/master/lib/polyglot.js#L299
*
* @param {string} phrase that needs interpolation, with placeholders
* @param {object} options with values that will be used to replace placeholders
* @return {string} interpolated
*/
Translator.prototype.interpolate = function interpolate(phrase, options) {
var replace = String.prototype.replace;
var dollarRegex = /\$/g;
var dollarBillsYall = '$$$$';
for (var arg in options) {
if (arg !== '_' && options.hasOwnProperty(arg)) {
// Ensure replacement value is escaped to prevent special $-prefixed
// regex replace tokens. the "$$$$" is needed because each "$" needs to
// be escaped with "$" itself, and we need two in the resulting output.
var replacement = options[arg];
if (typeof replacement === 'string') {
replacement = replace.call(options[arg], dollarRegex, dollarBillsYall);
}
// We create a new `RegExp` each time instead of using a more-efficient
// string replace so that the same argument can be replaced multiple times
// in the same phrase.
phrase = replace.call(phrase, new RegExp('%\\{' + arg + '\\}', 'g'), replacement);
}
}
return phrase;
};
/**
* Public translate method
*
* @param {string} key
* @param {object} options with values that will be used later to replace placeholders in string
* @return {string} translated (and interpolated)
*/
Translator.prototype.translate = function translate(key, options) {
if (options && options.smart_count) {
var plural = this.locales.pluralize(options.smart_count);
return this.interpolate(this.opts.locales.strings[key][plural], options);
}
return this.interpolate(this.opts.locales.strings[key], options);
};
return Translator;
}();
exports.default = Translator;
//# sourceMappingURL=Translator.js.map
},{"../locales/en_US":10}],6:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _namespaceEmitter = require('namespace-emitter');
var _namespaceEmitter2 = _interopRequireDefault(_namespaceEmitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var UppySocket = function () {
function UppySocket(opts) {
var _this = this;
_classCallCheck(this, UppySocket);
this.queued = [];
this.isOpen = false;
this.socket = new WebSocket(opts.target);
this.emitter = (0, _namespaceEmitter2.default)();
this.socket.onopen = function (e) {
_this.isOpen = true;
while (_this.queued.length > 0 && _this.isOpen) {
var first = _this.queued[0];
_this.send(first.action, first.payload);
_this.queued = _this.queued.slice(1);
}
};
this.socket.onclose = function (e) {
_this.isOpen = false;
};
this._handleMessage = this._handleMessage.bind(this);
this.socket.onmessage = this._handleMessage;
this.close = this.close.bind(this);
this.emit = this.emit.bind(this);
this.on = this.on.bind(this);
this.once = this.once.bind(this);
this.send = this.send.bind(this);
}
UppySocket.prototype.close = function close() {
return this.socket.close();
};
UppySocket.prototype.send = function send(action, payload) {
// attach uuid
if (!this.isOpen) {
this.queued.push({ action: action, payload: payload });
return;
}
this.socket.send(JSON.stringify({
action: action,
payload: payload
}));
};
UppySocket.prototype.on = function on(action, handler) {
this.emitter.on(action, handler);
};
UppySocket.prototype.emit = function emit(action, payload) {
this.emitter.emit(action, payload);
};
UppySocket.prototype.once = function once(action, handler) {
this.emitter.once(action, handler);
};
UppySocket.prototype._handleMessage = function _handleMessage(e) {
try {
var message = JSON.parse(e.data);
this.emit(message.action, message.payload);
} catch (err) {
console.log(err);
}
};
return UppySocket;
}();
exports.default = UppySocket;
//# sourceMappingURL=UppySocket.js.map
},{"namespace-emitter":55}],7:[function(require,module,exports){
'use strict';
exports.__esModule = true;
exports.flatten = flatten;
exports.isTouchDevice = isTouchDevice;
exports.$ = $;
exports.$$ = $$;
exports.truncateString = truncateString;
exports.secondsToTime = secondsToTime;
exports.groupBy = groupBy;
exports.every = every;
exports.toArray = toArray;
exports.generateFileID = generateFileID;
exports.extend = extend;
exports.getProportionalImageHeight = getProportionalImageHeight;
exports.getFileType = getFileType;
exports.getFileNameAndExtension = getFileNameAndExtension;
exports.readFile = readFile;
exports.createImageThumbnail = createImageThumbnail;
exports.dataURItoBlob = dataURItoBlob;
exports.dataURItoFile = dataURItoFile;
exports.copyToClipboard = copyToClipboard;
exports.makeWorker = makeWorker;
exports.getSpeed = getSpeed;
exports.getETA = getETA;
exports.prettyETA = prettyETA;
var _mimeTypes = require('mime-types');
var _mimeTypes2 = _interopRequireDefault(_mimeTypes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;
// import pica from 'pica'
/**
* A collection of small utility functions that help with dom manipulation, adding listeners,
* promises and other good things.
*
* @module Utils
*/
/**
* Shallow flatten nested arrays.
*/
function flatten(arr) {
return [].concat.apply([], arr);
}
function isTouchDevice() {
return 'ontouchstart' in window || // works on most browsers
navigator.maxTouchPoints; // works on IE10/11 and Surface
}
/**
* Shorter and fast way to select a single node in the DOM
* @param { String } selector - unique dom selector
* @param { Object } ctx - DOM node where the target of our search will is located
* @returns { Object } dom node found
*/
function $(selector, ctx) {
return (ctx || document).querySelector(selector);
}
/**
* Shorter and fast way to select multiple nodes in the DOM
* @param { String|Array } selector - DOM selector or nodes list
* @param { Object } ctx - DOM node where the targets of our search will is located
* @returns { Object } dom nodes found
*/
function $$(selector, ctx) {
var els;
if (typeof selector === 'string') {
els = (ctx || document).querySelectorAll(selector);
} else {
els = selector;
return Array.prototype.slice.call(els);
}
}
function truncateString(str, length) {
if (str.length > length) {
return str.substr(0, length / 2) + '...' + str.substr(str.length - length / 4, str.length);
}
return str;
// more precise version if needed
// http://stackoverflow.com/a/831583
}
function secondsToTime(rawSeconds) {
var hours = Math.floor(rawSeconds / 3600) % 24;
var minutes = Math.floor(rawSeconds / 60) % 60;
var seconds = Math.floor(rawSeconds % 60);
return { hours: hours, minutes: minutes, seconds: seconds };
}
/**
* Partition array by a grouping function.
* @param {[type]} array Input array
* @param {[type]} groupingFn Grouping function
* @return {[type]} Array of arrays
*/
function groupBy(array, groupingFn) {
return array.reduce(function (result, item) {
var key = groupingFn(item);
var xs = result.get(key) || [];
xs.push(item);
result.set(key, xs);
return result;
}, new Map());
}
/**
* Tests if every array element passes predicate
* @param {Array} array Input array
* @param {Object} predicateFn Predicate
* @return {bool} Every element pass
*/
function every(array, predicateFn) {
return array.reduce(function (result, item) {
if (!result) {
return false;
}
return predicateFn(item);
}, true);
}
/**
* Converts list into array
*/
function toArray(list) {
return Array.prototype.slice.call(list || [], 0);
}
/**
* Takes a fileName and turns it into fileID, by converting to lowercase,
* removing extra characters and adding unix timestamp
*
* @param {String} fileName
*
*/
function generateFileID(fileName) {
var fileID = fileName.toLowerCase();
fileID = fileID.replace(/[^A-Z0-9]/ig, '');
fileID = fileID + Date.now();
return fileID;
}
function extend() {
for (var _len = arguments.length, objs = Array(_len), _key = 0; _key < _len; _key++) {
objs[_key] = arguments[_key];
}
return Object.assign.apply(this, [{}].concat(objs));
}
/**
* Takes function or class, returns its name.
* Because IE doesn’t support `constructor.name`.
* https://gist.github.com/dfkaye/6384439, http://stackoverflow.com/a/15714445
*
* @param {Object} fn — function
*
*/
// function getFnName (fn) {
// var f = typeof fn === 'function'
// var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/))
// return (!f && 'not a function') || (s && s[1] || 'anonymous')
// }
function getProportionalImageHeight(img, newWidth) {
var aspect = img.width / img.height;
var newHeight = Math.round(newWidth / aspect);
return newHeight;
}
function getFileType(file) {
if (file.type) {
return file.type;
}
return _mimeTypes2.default.lookup(file.name);
}
// returns [fileName, fileExt]
function getFileNameAndExtension(fullFileName) {
var re = /(?:\.([^.]+))?$/;
var fileExt = re.exec(fullFileName)[1];
var fileName = fullFileName.replace('.' + fileExt, '');
return [fileName, fileExt];
}
/**
* Reads file as data URI from file object,
* the one you get from input[type=file] or drag & drop.
*
* @param {Object} file object
* @return {Promise} dataURL of the file
*
*/
function readFile(fileObj) {
return new _Promise(function (resolve, reject) {
var reader = new FileReader();
reader.addEventListener('load', function (ev) {
return resolve(ev.target.result);
});
reader.readAsDataURL(fileObj);
// function workerScript () {
// self.addEventListener('message', (e) => {
// const file = e.data.file
// try {
// const reader = new FileReaderSync()
// postMessage({
// file: reader.readAsDataURL(file)
// })
// } catch (err) {
// console.log(err)
// }
// })
// }
//
// const worker = makeWorker(workerScript)
// worker.postMessage({file: fileObj})
// worker.addEventListener('message', (e) => {
// const fileDataURL = e.data.file
// console.log('FILE _ DATA _ URL')
// return resolve(fileDataURL)
// })
});
}
/**
* Resizes an image to specified width and proportional height, using canvas
* See https://davidwalsh.name/resize-image-canvas,
* http://babalan.com/resizing-images-with-javascript/
* @TODO see if we need https://github.com/stomita/ios-imagefile-megapixel for iOS
*
* @param {String} Data URI of the original image
* @param {String} width of the resulting image
* @return {String} Data URI of the resized image
*/
function createImageThumbnail(imgDataURI, newWidth) {
return new _Promise(function (resolve, reject) {
var img = new Image();
img.addEventListener('load', function () {
var newImageWidth = newWidth;
var newImageHeight = getProportionalImageHeight(img, newImageWidth);
// create an off-screen canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// set its dimension to target size
canvas.width = newImageWidth;
canvas.height = newImageHeight;
// draw source image into the off-screen canvas:
// ctx.clearRect(0, 0, width, height)
ctx.drawImage(img, 0, 0, newImageWidth, newImageHeight);
// pica.resizeCanvas(img, canvas, (err) => {
// if (err) console.log(err)
// const thumbnail = canvas.toDataURL('image/png')
// return resolve(thumbnail)
// })
// encode image to data-uri with base64 version of compressed image
// canvas.toDataURL('image/jpeg', quality); // quality = [0.0, 1.0]
var thumbnail = canvas.toDataURL('image/png');
return resolve(thumbnail);
});
img.src = imgDataURI;
});
}
function dataURItoBlob(dataURI, opts, toFile) {
// get the base64 data
var data = dataURI.split(',')[1];
// user may provide mime type, if not get it from data URI
var mimeType = opts.mimeType || dataURI.split(',')[0].split(':')[1].split(';')[0];
// default to plain/text if data URI has no mimeType
if (mimeType == null) {
mimeType = 'plain/text';
}
var binary = atob(data);
var array = [];
for (var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
// Convert to a File?
if (toFile) {
return new File([new Uint8Array(array)], opts.name || '', { type: mimeType });
}
return new Blob([new Uint8Array(array)], { type: mimeType });
}
function dataURItoFile(dataURI, opts) {
return dataURItoBlob(dataURI, opts, true);
}
/**
* Copies text to clipboard by creating an almost invisible textarea,
* adding text there, then running execCommand('copy').
* Falls back to prompt() when the easy way fails (hello, Safari!)
* From http://stackoverflow.com/a/30810322
*
* @param {String} textToCopy
* @param {String} fallbackString
* @return {Promise}
*/
function copyToClipboard(textToCopy, fallbackString) {
fallbackString = fallbackString || 'Copy the URL below';
return new _Promise(function (resolve, reject) {
var textArea = document.createElement('textarea');
textArea.setAttribute('style', {
position: 'fixed',
top: 0,
left: 0,
width: '2em',
height: '2em',
padding: 0,
border: 'none',
outline: 'none',
boxShadow: 'none',
background: 'transparent'
});
textArea.value = textToCopy;
document.body.appendChild(textArea);
textArea.select();
var magicCopyFailed = function magicCopyFailed(err) {
document.body.removeChild(textArea);
window.prompt(fallbackString, textToCopy);
return reject('Oops, unable to copy displayed fallback prompt: ' + err);
};
try {
var successful = document.execCommand('copy');
if (!successful) {
return magicCopyFailed('copy command unavailable');
}
document.body.removeChild(textArea);
return resolve();
} catch (err) {
document.body.removeChild(textArea);
return magicCopyFailed(err);
}
});
}
// export function createInlineWorker (workerFunction) {
// let code = workerFunction.toString()
// code = code.substring(code.indexOf('{') + 1, code.lastIndexOf('}'))
//
// const blob = new Blob([code], {type: 'application/javascript'})
// const worker = new Worker(URL.createObjectURL(blob))
//
// return worker
// }
function makeWorker(script) {
var URL = window.URL || window.webkitURL;
var Blob = window.Blob;
var Worker = window.Worker;
if (!URL || !Blob || !Worker || !script) {
return null;
}
var code = script.toString();
code = code.substring(code.indexOf('{') + 1, code.lastIndexOf('}'));
var blob = new Blob([code]);
var worker = new Worker(URL.createObjectURL(blob));
return worker;
}
function getSpeed(fileProgress) {
if (!fileProgress.bytesUploaded) return 0;
var timeElapsed = new Date() - fileProgress.uploadStarted;
var uploadSpeed = fileProgress.bytesUploaded / (timeElapsed / 1000);
return uploadSpeed;
}
function getETA(fileProgress) {
if (!fileProgress.bytesUploaded) return 0;
var uploadSpeed = getSpeed(fileProgress);
var bytesRemaining = fileProgress.bytesTotal - fileProgress.bytesUploaded;
var secondsRemaining = Math.round(bytesRemaining / uploadSpeed * 10) / 10;
return secondsRemaining;
}
function prettyETA(seconds) {
var time = secondsToTime(seconds);
// Only display hours and minutes if they are greater than 0 but always
// display minutes if hours is being displayed
var hoursStr = time.hours ? time.hours + 'h' : '';
var minutesStr = time.hours || time.minutes ? time.minutes + 'm' : '';
var secondsStr = time.seconds + 's';
return hoursStr + ' ' + minutesStr + ' ' + secondsStr;
}
exports.default = {
generateFileID: generateFileID,
toArray: toArray,
every: every,
flatten: flatten,
groupBy: groupBy,
$: $,
$$: $$,
extend: extend,
readFile: readFile,
createImageThumbnail: createImageThumbnail,
getProportionalImageHeight: getProportionalImageHeight,
isTouchDevice: isTouchDevice,
getFileNameAndExtension: getFileNameAndExtension,
truncateString: truncateString,
getFileType: getFileType,
secondsToTime: secondsToTime,
dataURItoBlob: dataURItoBlob,
dataURItoFile: dataURItoFile,
getSpeed: getSpeed,
getETA: getETA,
makeWorker: makeWorker
};
//# sourceMappingURL=Utils.js.map
},{"es6-promise":51,"mime-types":52}],8:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _yoYo = require('yo-yo');
var _yoYo2 = _interopRequireDefault(_yoYo);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = _yoYo2.default;
//# sourceMappingURL=html.js.map
},{"yo-yo":67}],9:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _Core = require('./Core');
var _Core2 = _interopRequireDefault(_Core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = _Core2.default;
//# sourceMappingURL=index.js.map
},{"./Core":4}],10:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var en_US = {};
en_US.strings = {
chooseFile: 'Choose a file',
youHaveChosen: 'You have chosen: %{fileName}',
orDragDrop: 'or drag it here',
filesChosen: {
0: '%{smart_count} file selected',
1: '%{smart_count} files selected'
},
filesUploaded: {
0: '%{smart_count} file uploaded',
1: '%{smart_count} files uploaded'
},
files: {
0: '%{smart_count} file',
1: '%{smart_count} files'
},
uploadFiles: {
0: 'Upload %{smart_count} file',
1: 'Upload %{smart_count} files'
},
selectToUpload: 'Select files to upload',
closeModal: 'Close Modal',
upload: 'Upload',
importFrom: 'Import files from',
dashboardWindowTitle: 'Uppy Dashboard Window (Press escape to close)',
dashboardTitle: 'Uppy Dashboard',
copyLinkToClipboardSuccess: 'Link copied to clipboard.',
copyLinkToClipboardFallback: 'Copy the URL below',
done: 'Done',
localDisk: 'Local Disk',
dropPasteImport: 'Drop files here, paste or import from:',
fileProgress: 'File progress: upload speed and ETA',
numberOfSelectedFiles: 'Number of selected files',
uploadAllNewFiles: 'Upload all new files'
};
en_US.pluralize = function (n) {
if (n === 1) {
return 0;
}
return 1;
};
if (typeof window !== 'undefined' && typeof window.Uppy !== 'undefined') {
window.Uppy.locales.en_US = en_US;
}
exports.default = en_US;
//# sourceMappingURL=en_US.js.map
},{}],11:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<div class="Uppy UppyTheme--default UppyDashboard\n ', '\n ', '\n ', '"\n aria-hidden="', '"\n aria-label="', '"\n role="dialog"\n onpaste=', '>\n\n <div class="UppyDashboard-overlay"\n onclick=', '></div>\n\n <button class="UppyDashboard-close"\n aria-label="', '"\n title="', '"\n onclick=', '>', '</button>\n\n <div class="UppyDashboard-inner" tabindex="0">\n <div class="UppyDashboard-innerWrap">\n\n ', '\n\n ', '\n\n ', '\n\n <div class="UppyDashboard-actions">\n ', '\n\n ', '\n </div>\n\n ', '\n\n ', '\n\n <div class="UppyDashboard-progressindicators">\n ', '\n </div>\n\n </div>\n </div>\n </div>'], ['<div class="Uppy UppyTheme--default UppyDashboard\n ', '\n ', '\n ', '"\n aria-hidden="', '"\n aria-label="', '"\n role="dialog"\n onpaste=', '>\n\n <div class="UppyDashboard-overlay"\n onclick=', '></div>\n\n <button class="UppyDashboard-close"\n aria-label="', '"\n title="', '"\n onclick=', '>', '</button>\n\n <div class="UppyDashboard-inner" tabindex="0">\n <div class="UppyDashboard-innerWrap">\n\n ', '\n\n ', '\n\n ', '\n\n <div class="UppyDashboard-actions">\n ', '\n\n ', '\n </div>\n\n ', '\n\n ', '\n\n <div class="UppyDashboard-progressindicators">\n ', '\n </div>\n\n </div>\n </div>\n </div>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<div class="UppyDashboardContent-panel"\n id="', '--', '"\n role="tabpanel"\n aria-hidden="', '">\n <div class="UppyDashboardContent-bar">\n <h2 class="UppyDashboardContent-title">', ' ', '</h2>\n <button class="UppyDashboardContent-back"\n onclick=', '>', '</button>\n </div>\n ', '\n </div>'], ['<div class="UppyDashboardContent-panel"\n id="', '--', '"\n role="tabpanel"\n aria-hidden="', '">\n <div class="UppyDashboardContent-bar">\n <h2 class="UppyDashboardContent-title">', ' ', '</h2>\n <button class="UppyDashboardContent-back"\n onclick=', '>', '</button>\n </div>\n ', '\n </div>']);
exports.default = Dashboard;
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _FileList = require('./FileList');
var _FileList2 = _interopRequireDefault(_FileList);
var _Tabs = require('./Tabs');
var _Tabs2 = _interopRequireDefault(_Tabs);
var _FileCard = require('./FileCard');
var _FileCard2 = _interopRequireDefault(_FileCard);
var _UploadBtn = require('./UploadBtn');
var _UploadBtn2 = _interopRequireDefault(_UploadBtn);
var _ProgressCircle = require('./ProgressCircle');
var _ProgressCircle2 = _interopRequireDefault(_ProgressCircle);
var _StatusBar = require('./StatusBar');
var _StatusBar2 = _interopRequireDefault(_StatusBar);
var _Utils = require('../../core/Utils');
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function Dashboard(props) {
// http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
// const uploadStartedFilesCount = uploadStartedFiles.length
// const completeFilesCount = completeFiles.length
// const inProgressFilesCount = inProgressFiles.length
// const totalFileCount = Object.keys(files).length
// const newFileCount = newFiles.length
var handleInputChange = function handleInputChange(ev) {
ev.preventDefault();
var files = (0, _Utils.toArray)(ev.target.files);
files.forEach(function (file) {
props.addFile({
source: props.id,
name: file.name,
type: file.type,
data: file
});
});
};
// @TODO Exprimental, work in progress
// no names, weird API, Chrome-only http://stackoverflow.com/a/22940020
var handlePaste = function handlePaste(ev) {
ev.preventDefault();
var files = (0, _Utils.toArray)(ev.clipboardData.items);
files.forEach(function (file) {
if (file.kind !== 'file') return;
var blob = file.getAsFile();
// console.log(blob)
// console.log(blob.size)
props.log('File pasted');
props.addFile({
source: props.id,
name: file.name,
type: file.type,
data: blob
});
});
};
return (0, _html2.default)(_templateObject, (0, _Utils.isTouchDevice)() ? 'Uppy--isTouchDevice' : '', props.semiTransparent ? 'UppyDashboard--semiTransparent' : '', !props.inline ? 'UppyDashboard--modal' : '', props.inline ? 'false' : props.modal.isHidden, !props.inline ? props.i18n('dashboardWindowTitle') : props.i18n('dashboardTitle'), handlePaste, props.hideModal, props.i18n('closeModal'), props.i18n('closeModal'), props.hideModal, (0, _icons.closeIcon)(), (0, _Tabs2.default)({
handleInputChange: handleInputChange,
acquirers: props.acquirers,
container: props.container,
panelSelectorPrefix: props.panelSelectorPrefix,
showPanel: props.showPanel,
i18n: props.i18n
}), (0, _FileCard2.default)({
files: props.files,
fileCardFor: props.fileCardFor,
done: props.fileCardDone,
metaFields: props.metaFields,
log: props.log,
i18n: props.i18n
}), (0, _FileList2.default)({
files: props.files,
showFileCard: props.showFileCard,
showProgressDetails: props.showProgressDetails,
totalProgress: props.totalProgress,
totalFileCount: props.totalFileCount,
info: props.info,
i18n: props.i18n,
log: props.log,
removeFile: props.removeFile,
pauseAll: props.pauseAll,
resumeAll: props.resumeAll,
pauseUpload: props.pauseUpload,
startUpload: props.startUpload
}), !props.autoProceed && props.newFiles.length > 0 ? (0, _UploadBtn2.default)({
i18n: props.i18n,
startUpload: props.startUpload,
newFileCount: props.newFiles.length
}) : null, props.uploadStartedFiles.length > 0 ? (0, _ProgressCircle2.default)({
totalProgress: props.totalProgress,
isAllPaused: props.isAllPaused,
isAllComplete: props.isAllComplete,
pauseAll: props.pauseAll,
resumeAll: props.resumeAll
}) : null, props.uploadStartedFiles.length > 0 ? (0, _StatusBar2.default)({
totalProgress: props.totalProgress,
isAllComplete: props.isAllComplete,
isAllPaused: props.isAllPaused,
complete: props.completeFiles.length,
inProgress: props.uploadStartedFiles.length,
totalSpeed: props.totalSpeed,
totalETA: props.totalETA
}) : null, props.acquirers.map(function (target) {
return (0, _html2.default)(_templateObject2, props.panelSelectorPrefix, target.id, target.isHidden, props.i18n('importFrom'), target.name, props.hideAllPanels, props.i18n('done'), target.render(props.state));
}), props.progressindicators.map(function (target) {
return target.render(props.state);
}));
}
//# sourceMappingURL=Dashboard.js.map
},{"../../core/Utils":7,"../../core/html":8,"./FileCard":12,"./FileList":15,"./ProgressCircle":16,"./StatusBar":17,"./Tabs":18,"./UploadBtn":19,"./icons":20}],12:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<fieldset class="UppyDashboardFileCard-fieldset">\n <label class="UppyDashboardFileCard-label">', '</label>\n <input class="UppyDashboardFileCard-input"\n name="', '"\n type="text"\n value="', '"\n placeholder="', '"\n onkeyup=', ' /></fieldset>'], ['<fieldset class="UppyDashboardFileCard-fieldset">\n <label class="UppyDashboardFileCard-label">', '</label>\n <input class="UppyDashboardFileCard-input"\n name="', '"\n type="text"\n value="', '"\n placeholder="', '"\n onkeyup=', ' /></fieldset>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<div class="UppyDashboardFileCard" aria-hidden="', '">\n <div class="UppyDashboardContent-bar">\n <h2 class="UppyDashboardContent-title">Editing <span class="UppyDashboardContent-titleFile">', '</span></h2>\n <button class="UppyDashboardContent-back" title="Finish editing file"\n onclick=', '>Done</button>\n </div>\n ', '\n <button class="UppyButton--circular UppyButton--blue UppyButton--sizeM UppyDashboardFileCard-done" type="button"\n title="Finish editing file" onclick=', '>', '</button>\n </div>'], ['<div class="UppyDashboardFileCard" aria-hidden="', '">\n <div class="UppyDashboardContent-bar">\n <h2 class="UppyDashboardContent-title">Editing <span class="UppyDashboardContent-titleFile">', '</span></h2>\n <button class="UppyDashboardContent-back" title="Finish editing file"\n onclick=', '>Done</button>\n </div>\n ', '\n <button class="UppyButton--circular UppyButton--blue UppyButton--sizeM UppyDashboardFileCard-done" type="button"\n title="Finish editing file" onclick=', '>', '</button>\n </div>']),
_templateObject3 = _taggedTemplateLiteralLoose(['<div class="UppyDashboardFileCard-inner">\n <div class="UppyDashboardFileCard-preview">\n ', '\n </div>\n <div class="UppyDashboardFileCard-info">\n <fieldset class="UppyDashboardFileCard-fieldset">\n <label class="UppyDashboardFileCard-label">Name</label>\n <input class="UppyDashboardFileCard-input" name="name" type="text" value="', '"\n onkeyup=', ' />\n </fieldset>\n ', '\n </div>\n </div>'], ['<div class="UppyDashboardFileCard-inner">\n <div class="UppyDashboardFileCard-preview">\n ', '\n </div>\n <div class="UppyDashboardFileCard-info">\n <fieldset class="UppyDashboardFileCard-fieldset">\n <label class="UppyDashboardFileCard-label">Name</label>\n <input class="UppyDashboardFileCard-input" name="name" type="text" value="', '"\n onkeyup=', ' />\n </fieldset>\n ', '\n </div>\n </div>']),
_templateObject4 = _taggedTemplateLiteralLoose(['<img alt="', '" src="', '">'], ['<img alt="', '" src="', '">']),
_templateObject5 = _taggedTemplateLiteralLoose(['<div class="UppyDashboardItem-previewIcon">', '</div>'], ['<div class="UppyDashboardItem-previewIcon">', '</div>']);
exports.default = fileCard;
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function getIconByMime(fileTypeGeneral) {
switch (fileTypeGeneral) {
case 'text':
return (0, _icons.iconText)();
case 'audio':
return (0, _icons.iconAudio)();
default:
return (0, _icons.iconFile)();
}
}
function fileCard(props) {
var file = props.fileCardFor ? props.files[props.fileCardFor] : false;
var meta = {};
function tempStoreMeta(ev) {
var value = ev.target.value;
var name = ev.target.attributes.name.value;
meta[name] = value;
}
function renderMetaFields(file) {
var metaFields = props.metaFields || [];
return metaFields.map(function (field) {
return (0, _html2.default)(_templateObject, field.name, field.id, file.meta[field.id], field.placeholder || '', tempStoreMeta);
});
}
return (0, _html2.default)(_templateObject2, !props.fileCardFor, file.meta ? file.meta.name : file.name, function () {
return props.done(meta, file.id);
}, props.fileCardFor ? (0, _html2.default)(_templateObject3, file.preview ? (0, _html2.default)(_templateObject4, file.name, file.preview) : (0, _html2.default)(_templateObject5, getIconByMime(file.type.general)), file.meta.name, tempStoreMeta, renderMetaFields(file)) : null, function () {
return props.done(meta, file.id);
}, (0, _icons.checkIcon)());
}
//# sourceMappingURL=FileCard.js.map
},{"../../core/html":8,"./icons":20}],13:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<li class="UppyDashboardItem\n ', '\n ', '\n ', '"\n id="uppy_', '"\n title="', '">\n <div class="UppyDashboardItem-preview">\n ', '\n <div class="UppyDashboardItem-progress">\n <button class="UppyDashboardItem-progressBtn"\n title="', '"\n onclick=', '>\n ', '\n </button>\n ', '\n </div>\n </div>\n <div class="UppyDashboardItem-info">\n <h4 class="UppyDashboardItem-name" title="', '">\n ', '\n </h4>\n <div class="UppyDashboardItem-status">\n <span class="UppyDashboardItem-statusSize">', '</span>\n </div>\n ', '\n ', '\n </div>\n <div class="UppyDashboardItem-action">\n ', '\n </div>\n </li>'], ['<li class="UppyDashboardItem\n ', '\n ', '\n ', '"\n id="uppy_', '"\n title="', '">\n <div class="UppyDashboardItem-preview">\n ', '\n <div class="UppyDashboardItem-progress">\n <button class="UppyDashboardItem-progressBtn"\n title="', '"\n onclick=', '>\n ', '\n </button>\n ', '\n </div>\n </div>\n <div class="UppyDashboardItem-info">\n <h4 class="UppyDashboardItem-name" title="', '">\n ', '\n </h4>\n <div class="UppyDashboardItem-status">\n <span class="UppyDashboardItem-statusSize">', '</span>\n </div>\n ', '\n ', '\n </div>\n <div class="UppyDashboardItem-action">\n ', '\n </div>\n </li>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<img alt="', '" src="', '">'], ['<img alt="', '" src="', '">']),
_templateObject3 = _taggedTemplateLiteralLoose(['<div class="UppyDashboardItem-progressInfo"\n title="', '"\n aria-label="', '">\n ', '\n </div>'], ['<div class="UppyDashboardItem-progressInfo"\n title="', '"\n aria-label="', '">\n ', '\n </div>']),
_templateObject4 = _taggedTemplateLiteralLoose(['<span>', ' ・ ↑ ', '/s</span>'], ['<span>', ' ・ ↑ ', '/s</span>']),
_templateObject5 = _taggedTemplateLiteralLoose(['<a href="', '" target="_blank">\n ', '\n </a>'], ['<a href="', '" target="_blank">\n ', '\n </a>']),
_templateObject6 = _taggedTemplateLiteralLoose(['<button class="UppyDashboardItem-edit"\n aria-label="Edit file"\n title="Edit file"\n onclick=', '>\n ', '</button>'], ['<button class="UppyDashboardItem-edit"\n aria-label="Edit file"\n title="Edit file"\n onclick=', '>\n ', '</button>']),
_templateObject7 = _taggedTemplateLiteralLoose(['<button class="UppyDashboardItem-copyLink"\n aria-label="Copy link"\n title="Copy link"\n onclick=', '>', '</button>'], ['<button class="UppyDashboardItem-copyLink"\n aria-label="Copy link"\n title="Copy link"\n onclick=', '>', '</button>']),
_templateObject8 = _taggedTemplateLiteralLoose(['<button class="UppyDashboardItem-remove"\n aria-label="Remove file"\n title="Remove file"\n onclick=', '>\n <svg width="22" height="21" viewBox="0 0 18 17">\n <ellipse fill="#000" cx="8.62" cy="8.383" rx="8.62" ry="8.383"/>\n <path stroke="#FFF" fill="#FFF" d="M11 6.147L10.85 6 8.5 8.284 6.15 6 6 6.147 8.35 8.43 6 10.717l.15.146L8.5 8.578l2.35 2.284.15-.146L8.65 8.43z"/>\n </svg>\n </button>'], ['<button class="UppyDashboardItem-remove"\n aria-label="Remove file"\n title="Remove file"\n onclick=', '>\n <svg width="22" height="21" viewBox="0 0 18 17">\n <ellipse fill="#000" cx="8.62" cy="8.383" rx="8.62" ry="8.383"/>\n <path stroke="#FFF" fill="#FFF" d="M11 6.147L10.85 6 8.5 8.284 6.15 6 6 6.147 8.35 8.43 6 10.717l.15.146L8.5 8.578l2.35 2.284.15-.146L8.65 8.43z"/>\n </svg>\n </button>']);
exports.default = fileItem;
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _Utils = require('../../core/Utils');
var _prettyBytes = require('pretty-bytes');
var _prettyBytes2 = _interopRequireDefault(_prettyBytes);
var _FileItemProgress = require('./FileItemProgress');
var _FileItemProgress2 = _interopRequireDefault(_FileItemProgress);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function getIconByMime(fileTypeGeneral) {
switch (fileTypeGeneral) {
case 'text':
return (0, _icons.iconText)();
case 'audio':
return (0, _icons.iconAudio)();
default:
return (0, _icons.iconFile)();
}
}
function fileItem(props) {
var file = props.file;
var isUploaded = file.progress.uploadComplete;
var uploadInProgressOrComplete = file.progress.uploadStarted;
var uploadInProgress = file.progress.uploadStarted && !file.progress.uploadComplete;
var isPaused = file.isPaused || false;
var fileName = (0, _Utils.getFileNameAndExtension)(file.meta.name)[0];
var truncatedFileName = (0, _Utils.truncateString)(fileName, 15);
return (0, _html2.default)(_templateObject, uploadInProgress ? 'is-inprogress' : '', isUploaded ? 'is-complete' : '', isPaused ? 'is-paused' : '', file.id, file.meta.name, file.preview ? (0, _html2.default)(_templateObject2, file.name, file.preview) : getIconByMime(file.type.general), isUploaded ? 'upload complete' : file.isPaused ? 'resume upload' : 'pause upload', function (ev) {
if (isUploaded) return;
props.pauseUpload(file.id);
}, (0, _FileItemProgress2.default)({
progress: file.progress.percentage,
fileID: file.id
}), props.showProgressDetails ? (0, _html2.default)(_templateObject3, props.i18n('localDisk'), props.i18n('localDisk'), !file.isPaused && !isUploaded ? (0, _html2.default)(_templateObject4, (0, _Utils.prettyETA)((0, _Utils.getETA)(file.progress)), (0, _prettyBytes2.default)((0, _Utils.getSpeed)(file.progress))) : null) : null, fileName, file.uploadURL ? (0, _html2.default)(_templateObject5, file.uploadURL, file.extension ? truncatedFileName + '.' + file.extension : truncatedFileName) : file.extension ? truncatedFileName + '.' + file.extension : truncatedFileName, file.data.size ? (0, _prettyBytes2.default)(file.data.size) : '?', !uploadInProgressOrComplete ? (0, _html2.default)(_templateObject6, function (e) {
return props.showFileCard(file.id);
}, (0, _icons.iconEdit)()) : null, file.uploadURL ? (0, _html2.default)(_templateObject7, function () {
(0, _Utils.copyToClipboard)(file.uploadURL, props.i18n('copyLinkToClipboardFallback')).then(function () {
props.log('Link copied to clipboard.');
props.info(props.i18n('copyLinkToClipboardSuccess'), 'info', 3000);
}).catch(props.log);
}, (0, _icons.iconCopy)()) : null, !isUploaded ? (0, _html2.default)(_templateObject8, function () {
return props.removeFile(file.id);
}) : null);
}
//# sourceMappingURL=FileItem.js.map
},{"../../core/Utils":7,"../../core/html":8,"./FileItemProgress":14,"./icons":20,"pretty-bytes":56}],14:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <svg width="70" height="70" viewBox="0 0 36 36" class="UppyIcon UppyIcon-progressCircle">\n <g class="progress-group">\n <circle r="15" cx="18" cy="18" stroke-width="2" fill="none" class="bg"/>\n <circle r="15" cx="18" cy="18" transform="rotate(-90, 18, 18)" stroke-width="2" fill="none" stroke-dasharray="100" stroke-dashoffset="', '" class="progress"/>\n </g>\n <polygon transform="translate(3, 3)" points="12 20 12 10 20 15" class="play"/>\n <g transform="translate(14.5, 13)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="5" y="0" width="2" height="10" rx="0" />\n </g>\n <polygon transform="translate(2, 3)" points="14 22.5 7 15.2457065 8.99985857 13.1732815 14 18.3547104 22.9729883 9 25 11.1005634" class="check"/>\n </svg>'], ['\n <svg width="70" height="70" viewBox="0 0 36 36" class="UppyIcon UppyIcon-progressCircle">\n <g class="progress-group">\n <circle r="15" cx="18" cy="18" stroke-width="2" fill="none" class="bg"/>\n <circle r="15" cx="18" cy="18" transform="rotate(-90, 18, 18)" stroke-width="2" fill="none" stroke-dasharray="100" stroke-dashoffset="', '" class="progress"/>\n </g>\n <polygon transform="translate(3, 3)" points="12 20 12 10 20 15" class="play"/>\n <g transform="translate(14.5, 13)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="5" y="0" width="2" height="10" rx="0" />\n </g>\n <polygon transform="translate(2, 3)" points="14 22.5 7 15.2457065 8.99985857 13.1732815 14 18.3547104 22.9729883 9 25 11.1005634" class="check"/>\n </svg>']);
exports.default = function (props) {
return (0, _html2.default)(_templateObject, 100 - props.progress || 100);
};
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
// http://codepen.io/Harkko/pen/rVxvNM
// https://gist.github.com/eswak/ad4ea57bcd5ff7aa5d42
//# sourceMappingURL=FileItemProgress.js.map
},{"../../core/html":8}],15:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<ul class="UppyDashboard-files\n ', '">\n ', '\n ', '\n </ul>'], ['<ul class="UppyDashboard-files\n ', '">\n ', '\n ', '\n </ul>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<div class="UppyDashboard-bgIcon">\n ', '\n <h4 class="UppyDashboard-dropFilesTitle">Drop or paste files here</h4>\n </div>'], ['<div class="UppyDashboard-bgIcon">\n ', '\n <h4 class="UppyDashboard-dropFilesTitle">Drop or paste files here</h4>\n </div>']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _FileItem = require('./FileItem');
var _FileItem2 = _interopRequireDefault(_FileItem);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.totalFileCount === 0 ? 'UppyDashboard-files--noFiles' : '', props.totalFileCount === 0 ? (0, _html2.default)(_templateObject2, (0, _icons.dashboardBgIcon)()) : null, Object.keys(props.files).map(function (fileID) {
return (0, _FileItem2.default)({
file: props.files[fileID],
showFileCard: props.showFileCard,
showProgressDetails: props.showProgressDetails,
info: props.info,
log: props.log,
i18n: props.i18n,
removeFile: props.removeFile,
pauseUpload: props.pauseUpload
});
}));
};
//# sourceMappingURL=FileList.js.map
},{"../../core/html":8,"./FileItem":13,"./icons":20}],16:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <div class="UppyDashboard-actionsItem">\n <button class="UppyTotalProgress\n ', '\n ', '"\n onclick=', '>\n <svg width="70" height="70" viewBox="0 0 36 36" class="UppyIcon">\n <g class="progress-group">\n <circle r="15" cx="18" cy="18" stroke-width="2" fill="none" class="bg"/>\n <circle r="15" cx="18" cy="18" transform="rotate(-90, 18, 18)" stroke-width="2" fill="none" stroke-dasharray="100" stroke-dashoffset="', '" class="progress"/>\n </g>\n <polygon transform="translate(3, 3)" points="12 20 12 10 20 15" class="play"/>\n <g transform="translate(14.5, 13)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="5" y="0" width="2" height="10" rx="0" />\n </g>\n <polygon transform="translate(2, 3)" points="14 22.5 7 15.2457065 8.99985857 13.1732815 14 18.3547104 22.9729883 9 25 11.1005634" class="check"/>\n </svg>\n </button>\n </div>'], ['\n <div class="UppyDashboard-actionsItem">\n <button class="UppyTotalProgress\n ', '\n ', '"\n onclick=', '>\n <svg width="70" height="70" viewBox="0 0 36 36" class="UppyIcon">\n <g class="progress-group">\n <circle r="15" cx="18" cy="18" stroke-width="2" fill="none" class="bg"/>\n <circle r="15" cx="18" cy="18" transform="rotate(-90, 18, 18)" stroke-width="2" fill="none" stroke-dasharray="100" stroke-dashoffset="', '" class="progress"/>\n </g>\n <polygon transform="translate(3, 3)" points="12 20 12 10 20 15" class="play"/>\n <g transform="translate(14.5, 13)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="5" y="0" width="2" height="10" rx="0" />\n </g>\n <polygon transform="translate(2, 3)" points="14 22.5 7 15.2457065 8.99985857 13.1732815 14 18.3547104 22.9729883 9 25 11.1005634" class="check"/>\n </svg>\n </button>\n </div>']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
props = props || {};
var togglePauseResume = function togglePauseResume() {
if (props.isAllComplete) return;
if (props.isAllPaused) {
return props.resumeAll();
}
return props.pauseAll();
};
return (0, _html2.default)(_templateObject, props.isAllPaused ? 'UppyTotalProgress--is-paused' : '', props.isAllComplete ? 'UppyTotalProgress--is-complete' : '', togglePauseResume, 100 - props.totalProgress || 100);
};
//# sourceMappingURL=ProgressCircle.js.map
},{"../../core/html":8}],17:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <div class="UppyDashboard-statusBar">\n ', '\n </div>'], ['\n <div class="UppyDashboard-statusBar">\n ', '\n </div>']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
props = props || {};
return (0, _html2.default)(_templateObject, !props.isAllComplete ? !props.isAllPaused ? 'Uploading... ' + props.complete + ' / ' + props.inProgress + '・' + (props.totalProgress || 0) + '%・' + props.totalETA + '・↑ ' + props.totalSpeed + '/s' : 'Paused ・' + props.totalProgress + '%' : null);
};
//# sourceMappingURL=StatusBar.js.map
},{"../../core/html":8}],18:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<div class="UppyDashboardTabs">\n <h3 class="UppyDashboardTabs-title">', ':</h3>\n <nav>\n <ul class="UppyDashboardTabs-list" role="tablist">\n <li class="UppyDashboardTab">\n <button class="UppyDashboardTab-btn UppyDashboard-focus"\n role="tab"\n tabindex="0"\n onclick=', '>\n ', '\n <h5 class="UppyDashboardTab-name">', '</h5>\n </button>\n <input class="UppyDashboard-input" type="file" name="files[]" multiple="true"\n onchange=', ' />\n </li>\n ', '\n </ul>\n </nav>\n </div>'], ['<div class="UppyDashboardTabs">\n <h3 class="UppyDashboardTabs-title">', ':</h3>\n <nav>\n <ul class="UppyDashboardTabs-list" role="tablist">\n <li class="UppyDashboardTab">\n <button class="UppyDashboardTab-btn UppyDashboard-focus"\n role="tab"\n tabindex="0"\n onclick=', '>\n ', '\n <h5 class="UppyDashboardTab-name">', '</h5>\n </button>\n <input class="UppyDashboard-input" type="file" name="files[]" multiple="true"\n onchange=', ' />\n </li>\n ', '\n </ul>\n </nav>\n </div>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<li class="UppyDashboardTab">\n <button class="UppyDashboardTab-btn"\n role="tab"\n tabindex="0"\n aria-controls="', '--', '"\n aria-selected="', '"\n onclick=', '>\n ', '\n <h5 class="UppyDashboardTab-name">', '</h5>\n </button>\n </li>'], ['<li class="UppyDashboardTab">\n <button class="UppyDashboardTab-btn"\n role="tab"\n tabindex="0"\n aria-controls="', '--', '"\n aria-selected="', '"\n onclick=', '>\n ', '\n <h5 class="UppyDashboardTab-name">', '</h5>\n </button>\n </li>']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.i18n('importFrom'), function (ev) {
var input = document.querySelector(props.container + ' .UppyDashboard-input');
input.click();
}, (0, _icons.localIcon)(), props.i18n('localDisk'), props.handleInputChange, props.acquirers.map(function (target) {
return (0, _html2.default)(_templateObject2, props.panelSelectorPrefix, target.id, target.isHidden ? 'false' : 'true', function () {
return props.showPanel(target.id);
}, target.icon, target.name);
}));
};
//# sourceMappingURL=Tabs.js.map
},{"../../core/html":8,"./icons":20}],19:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<button class="UppyButton--circular\n UppyButton--blue\n UppyButton--sizeM\n UppyDashboard-upload"\n type="button"\n title="', '"\n aria-label="', '"\n onclick=', '>\n ', '\n <sup class="UppyDashboard-uploadCount"\n title="', '"\n aria-label="', '">\n ', '</sup>\n </button>\n '], ['<button class="UppyButton--circular\n UppyButton--blue\n UppyButton--sizeM\n UppyDashboard-upload"\n type="button"\n title="', '"\n aria-label="', '"\n onclick=', '>\n ', '\n <sup class="UppyDashboard-uploadCount"\n title="', '"\n aria-label="', '">\n ', '</sup>\n </button>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
props = props || {};
return (0, _html2.default)(_templateObject, props.i18n('uploadAllNewFiles'), props.i18n('uploadAllNewFiles'), props.startUpload, (0, _icons.uploadIcon)(), props.i18n('numberOfSelectedFiles'), props.i18n('numberOfSelectedFiles'), props.newFileCount);
};
//# sourceMappingURL=UploadBtn.js.map
},{"../../core/html":8,"./icons":20}],20:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="30" height="30" viewBox="0 0 30 30">\n <path d="M15 30c8.284 0 15-6.716 15-15 0-8.284-6.716-15-15-15C6.716 0 0 6.716 0 15c0 8.284 6.716 15 15 15zm4.258-12.676v6.846h-8.426v-6.846H5.204l9.82-12.364 9.82 12.364H19.26z" />\n </svg>'], ['<svg class="UppyIcon" width="30" height="30" viewBox="0 0 30 30">\n <path d="M15 30c8.284 0 15-6.716 15-15 0-8.284-6.716-15-15-15C6.716 0 0 6.716 0 15c0 8.284 6.716 15 15 15zm4.258-12.676v6.846h-8.426v-6.846H5.204l9.82-12.364 9.82 12.364H19.26z" />\n </svg>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="51" height="51" viewBox="0 0 51 51">\n <path d="M17.21 45.765a5.394 5.394 0 0 1-7.62 0l-4.12-4.122a5.393 5.393 0 0 1 0-7.618l6.774-6.775-2.404-2.404-6.775 6.776c-3.424 3.427-3.424 9 0 12.426l4.12 4.123a8.766 8.766 0 0 0 6.216 2.57c2.25 0 4.5-.858 6.214-2.57l13.55-13.552a8.72 8.72 0 0 0 2.575-6.213 8.73 8.73 0 0 0-2.575-6.213l-4.123-4.12-2.404 2.404 4.123 4.12a5.352 5.352 0 0 1 1.58 3.81c0 1.438-.562 2.79-1.58 3.808l-13.55 13.55z"/>\n <path d="M44.256 2.858A8.728 8.728 0 0 0 38.043.283h-.002a8.73 8.73 0 0 0-6.212 2.574l-13.55 13.55a8.725 8.725 0 0 0-2.575 6.214 8.73 8.73 0 0 0 2.574 6.216l4.12 4.12 2.405-2.403-4.12-4.12a5.357 5.357 0 0 1-1.58-3.812c0-1.437.562-2.79 1.58-3.808l13.55-13.55a5.348 5.348 0 0 1 3.81-1.58c1.44 0 2.792.562 3.81 1.58l4.12 4.12c2.1 2.1 2.1 5.518 0 7.617L39.2 23.775l2.404 2.404 6.775-6.777c3.426-3.427 3.426-9 0-12.426l-4.12-4.12z"/>\n </svg>'], ['<svg class="UppyIcon" width="51" height="51" viewBox="0 0 51 51">\n <path d="M17.21 45.765a5.394 5.394 0 0 1-7.62 0l-4.12-4.122a5.393 5.393 0 0 1 0-7.618l6.774-6.775-2.404-2.404-6.775 6.776c-3.424 3.427-3.424 9 0 12.426l4.12 4.123a8.766 8.766 0 0 0 6.216 2.57c2.25 0 4.5-.858 6.214-2.57l13.55-13.552a8.72 8.72 0 0 0 2.575-6.213 8.73 8.73 0 0 0-2.575-6.213l-4.123-4.12-2.404 2.404 4.123 4.12a5.352 5.352 0 0 1 1.58 3.81c0 1.438-.562 2.79-1.58 3.808l-13.55 13.55z"/>\n <path d="M44.256 2.858A8.728 8.728 0 0 0 38.043.283h-.002a8.73 8.73 0 0 0-6.212 2.574l-13.55 13.55a8.725 8.725 0 0 0-2.575 6.214 8.73 8.73 0 0 0 2.574 6.216l4.12 4.12 2.405-2.403-4.12-4.12a5.357 5.357 0 0 1-1.58-3.812c0-1.437.562-2.79 1.58-3.808l13.55-13.55a5.348 5.348 0 0 1 3.81-1.58c1.44 0 2.792.562 3.81 1.58l4.12 4.12c2.1 2.1 2.1 5.518 0 7.617L39.2 23.775l2.404 2.404 6.775-6.777c3.426-3.427 3.426-9 0-12.426l-4.12-4.12z"/>\n </svg>']),
_templateObject3 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="25" height="25" viewBox="0 0 44 44">\n <polygon class="play" transform="translate(6, 5.5)" points="13 21.6666667 13 11 21 16.3333333" />\n </svg>'], ['<svg class="UppyIcon" width="25" height="25" viewBox="0 0 44 44">\n <polygon class="play" transform="translate(6, 5.5)" points="13 21.6666667 13 11 21 16.3333333" />\n </svg>']),
_templateObject4 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="25px" height="25px" viewBox="0 0 44 44">\n <g transform="translate(18, 17)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="6" y="0" width="2" height="10" rx="0" />\n </g>\n </svg>'], ['<svg class="UppyIcon" width="25px" height="25px" viewBox="0 0 44 44">\n <g transform="translate(18, 17)" class="pause">\n <rect x="0" y="0" width="2" height="10" rx="0" />\n <rect x="6" y="0" width="2" height="10" rx="0" />\n </g>\n </svg>']),
_templateObject5 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="28" height="28" viewBox="0 0 28 28">\n <path d="M25.436 2.566a7.98 7.98 0 0 0-2.078-1.51C22.638.703 21.906.5 21.198.5a3 3 0 0 0-1.023.17 2.436 2.436 0 0 0-.893.562L2.292 18.217.5 27.5l9.28-1.796 16.99-16.99c.255-.254.444-.56.562-.888a3 3 0 0 0 .17-1.023c0-.708-.205-1.44-.555-2.16a8 8 0 0 0-1.51-2.077zM9.01 24.252l-4.313.834c0-.03.008-.06.012-.09.007-.944-.74-1.715-1.67-1.723-.04 0-.078.007-.118.01l.83-4.29L17.72 5.024l5.264 5.264L9.01 24.252zm16.84-16.96a.818.818 0 0 1-.194.31l-1.57 1.57-5.26-5.26 1.57-1.57a.82.82 0 0 1 .31-.194 1.45 1.45 0 0 1 .492-.074c.397 0 .917.126 1.468.397.55.27 1.13.678 1.656 1.21.53.53.94 1.11 1.208 1.655.272.55.397 1.07.393 1.468.004.193-.027.358-.074.488z" />\n </svg>'], ['<svg class="UppyIcon" width="28" height="28" viewBox="0 0 28 28">\n <path d="M25.436 2.566a7.98 7.98 0 0 0-2.078-1.51C22.638.703 21.906.5 21.198.5a3 3 0 0 0-1.023.17 2.436 2.436 0 0 0-.893.562L2.292 18.217.5 27.5l9.28-1.796 16.99-16.99c.255-.254.444-.56.562-.888a3 3 0 0 0 .17-1.023c0-.708-.205-1.44-.555-2.16a8 8 0 0 0-1.51-2.077zM9.01 24.252l-4.313.834c0-.03.008-.06.012-.09.007-.944-.74-1.715-1.67-1.723-.04 0-.078.007-.118.01l.83-4.29L17.72 5.024l5.264 5.264L9.01 24.252zm16.84-16.96a.818.818 0 0 1-.194.31l-1.57 1.57-5.26-5.26 1.57-1.57a.82.82 0 0 1 .31-.194 1.45 1.45 0 0 1 .492-.074c.397 0 .917.126 1.468.397.55.27 1.13.678 1.656 1.21.53.53.94 1.11 1.208 1.655.272.55.397 1.07.393 1.468.004.193-.027.358-.074.488z" />\n </svg>']),
_templateObject6 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="27" height="25" viewBox="0 0 27 25">\n <path d="M5.586 9.288a.313.313 0 0 0 .282.176h4.84v3.922c0 1.514 1.25 2.24 2.792 2.24 1.54 0 2.79-.726 2.79-2.24V9.464h4.84c.122 0 .23-.068.284-.176a.304.304 0 0 0-.046-.324L13.735.106a.316.316 0 0 0-.472 0l-7.63 8.857a.302.302 0 0 0-.047.325z"/>\n <path d="M24.3 5.093c-.218-.76-.54-1.187-1.208-1.187h-4.856l1.018 1.18h3.948l2.043 11.038h-7.193v2.728H9.114v-2.725h-7.36l2.66-11.04h3.33l1.018-1.18H3.907c-.668 0-1.06.46-1.21 1.186L0 16.456v7.062C0 24.338.676 25 1.51 25h23.98c.833 0 1.51-.663 1.51-1.482v-7.062L24.3 5.093z"/>\n </svg>'], ['<svg class="UppyIcon" width="27" height="25" viewBox="0 0 27 25">\n <path d="M5.586 9.288a.313.313 0 0 0 .282.176h4.84v3.922c0 1.514 1.25 2.24 2.792 2.24 1.54 0 2.79-.726 2.79-2.24V9.464h4.84c.122 0 .23-.068.284-.176a.304.304 0 0 0-.046-.324L13.735.106a.316.316 0 0 0-.472 0l-7.63 8.857a.302.302 0 0 0-.047.325z"/>\n <path d="M24.3 5.093c-.218-.76-.54-1.187-1.208-1.187h-4.856l1.018 1.18h3.948l2.043 11.038h-7.193v2.728H9.114v-2.725h-7.36l2.66-11.04h3.33l1.018-1.18H3.907c-.668 0-1.06.46-1.21 1.186L0 16.456v7.062C0 24.338.676 25 1.51 25h23.98c.833 0 1.51-.663 1.51-1.482v-7.062L24.3 5.093z"/>\n </svg>']),
_templateObject7 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="14px" height="14px" viewBox="0 0 19 19">\n <polygon points="17.3182539 17.2324466 9.93955339 9.85374611 9.586 9.50019272 9.23244661 9.85374611 1.85374611 17.2324466 2.56085289 17.2324466 1.93955339 16.6111471 1.93955865 17.3182486 9.31803946 9.93954813 9.67158232 9.58599474 9.31803419 9.23244661 1.93955339 1.85396581 1.93961588 2.56101008 2.56091538 1.93949089 1.85375137 1.93955865 9.23245187 9.31803946 9.586 9.67157706 9.93954813 9.31803946 17.3182486 1.93955865 16.6111471 1.93955339 17.2324466 2.56085289 17.2324466 1.85374611 9.85374611 9.23244661 9.50019272 9.586 9.85374611 9.93955339 17.2324466 17.3182539 17.9395534 16.6111471 10.5608529 9.23244661 10.5608529 9.93955339 17.9395534 2.56085289 18.2931068 2.2072995 17.9395534 1.85374611 17.3182539 1.23244661 16.9647058 0.878898482 16.6111524 1.23244135 9.23245187 8.61092215 9.93954813 8.61092215 2.56084763 1.23244135 2.20723173 0.87883598 1.85368362 1.23250911 1.23238412 1.85402831 0.878955712 2.20758169 1.23244661 2.56107259 8.61092741 9.93955339 8.61092215 9.23245187 1.23244135 16.6111524 0.878898482 16.9647058 1.23244661 17.3182539 1.85374611 17.9395534 2.2072995 18.2931068 2.56085289 17.9395534 9.93955339 10.5608529 9.23244661 10.5608529 16.6111471 17.9395534"></polygon>\n </svg>'], ['<svg class="UppyIcon" width="14px" height="14px" viewBox="0 0 19 19">\n <polygon points="17.3182539 17.2324466 9.93955339 9.85374611 9.586 9.50019272 9.23244661 9.85374611 1.85374611 17.2324466 2.56085289 17.2324466 1.93955339 16.6111471 1.93955865 17.3182486 9.31803946 9.93954813 9.67158232 9.58599474 9.31803419 9.23244661 1.93955339 1.85396581 1.93961588 2.56101008 2.56091538 1.93949089 1.85375137 1.93955865 9.23245187 9.31803946 9.586 9.67157706 9.93954813 9.31803946 17.3182486 1.93955865 16.6111471 1.93955339 17.2324466 2.56085289 17.2324466 1.85374611 9.85374611 9.23244661 9.50019272 9.586 9.85374611 9.93955339 17.2324466 17.3182539 17.9395534 16.6111471 10.5608529 9.23244661 10.5608529 9.93955339 17.9395534 2.56085289 18.2931068 2.2072995 17.9395534 1.85374611 17.3182539 1.23244661 16.9647058 0.878898482 16.6111524 1.23244135 9.23245187 8.61092215 9.93954813 8.61092215 2.56084763 1.23244135 2.20723173 0.87883598 1.85368362 1.23250911 1.23238412 1.85402831 0.878955712 2.20758169 1.23244661 2.56107259 8.61092741 9.93955339 8.61092215 9.23245187 1.23244135 16.6111524 0.878898482 16.9647058 1.23244661 17.3182539 1.85374611 17.9395534 2.2072995 18.2931068 2.56085289 17.9395534 9.93955339 10.5608529 9.23244661 10.5608529 16.6111471 17.9395534"></polygon>\n </svg>']),
_templateObject8 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="16px" height="16px" viewBox="0 0 32 30">\n <path d="M6.6209894,11.1451162 C6.6823051,11.2751669 6.81374248,11.3572188 6.95463813,11.3572188 L12.6925482,11.3572188 L12.6925482,16.0630427 C12.6925482,17.880509 14.1726048,18.75 16.0000083,18.75 C17.8261072,18.75 19.3074684,17.8801847 19.3074684,16.0630427 L19.3074684,11.3572188 L25.0437478,11.3572188 C25.1875787,11.3572188 25.3164069,11.2751669 25.3790272,11.1451162 C25.4370814,11.0173358 25.4171865,10.8642587 25.3252129,10.7562615 L16.278212,0.127131837 C16.2093949,0.0463771751 16.1069846,0 15.9996822,0 C15.8910751,0 15.7886648,0.0463771751 15.718217,0.127131837 L6.6761083,10.7559371 C6.58250402,10.8642587 6.56293518,11.0173358 6.6209894,11.1451162 L6.6209894,11.1451162 Z"/>\n <path d="M28.8008722,6.11142645 C28.5417891,5.19831555 28.1583331,4.6875 27.3684848,4.6875 L21.6124454,4.6875 L22.8190234,6.10307874 L27.4986725,6.10307874 L29.9195817,19.3486449 L21.3943891,19.3502502 L21.3943891,22.622552 L10.8023461,22.622552 L10.8023461,19.3524977 L2.07815702,19.3534609 L5.22979699,6.10307874 L9.17871529,6.10307874 L10.3840011,4.6875 L4.6308691,4.6875 C3.83940559,4.6875 3.37421888,5.2390909 3.19815864,6.11142645 L0,19.7470874 L0,28.2212959 C0,29.2043992 0.801477937,30 1.78870751,30 L30.2096773,30 C31.198199,30 32,29.2043992 32,28.2212959 L32,19.7470874 L28.8008722,6.11142645 L28.8008722,6.11142645 Z"/>\n </svg>'], ['<svg class="UppyIcon" width="16px" height="16px" viewBox="0 0 32 30">\n <path d="M6.6209894,11.1451162 C6.6823051,11.2751669 6.81374248,11.3572188 6.95463813,11.3572188 L12.6925482,11.3572188 L12.6925482,16.0630427 C12.6925482,17.880509 14.1726048,18.75 16.0000083,18.75 C17.8261072,18.75 19.3074684,17.8801847 19.3074684,16.0630427 L19.3074684,11.3572188 L25.0437478,11.3572188 C25.1875787,11.3572188 25.3164069,11.2751669 25.3790272,11.1451162 C25.4370814,11.0173358 25.4171865,10.8642587 25.3252129,10.7562615 L16.278212,0.127131837 C16.2093949,0.0463771751 16.1069846,0 15.9996822,0 C15.8910751,0 15.7886648,0.0463771751 15.718217,0.127131837 L6.6761083,10.7559371 C6.58250402,10.8642587 6.56293518,11.0173358 6.6209894,11.1451162 L6.6209894,11.1451162 Z"/>\n <path d="M28.8008722,6.11142645 C28.5417891,5.19831555 28.1583331,4.6875 27.3684848,4.6875 L21.6124454,4.6875 L22.8190234,6.10307874 L27.4986725,6.10307874 L29.9195817,19.3486449 L21.3943891,19.3502502 L21.3943891,22.622552 L10.8023461,22.622552 L10.8023461,19.3524977 L2.07815702,19.3534609 L5.22979699,6.10307874 L9.17871529,6.10307874 L10.3840011,4.6875 L4.6308691,4.6875 C3.83940559,4.6875 3.37421888,5.2390909 3.19815864,6.11142645 L0,19.7470874 L0,28.2212959 C0,29.2043992 0.801477937,30 1.78870751,30 L30.2096773,30 C31.198199,30 32,29.2043992 32,28.2212959 L32,19.7470874 L28.8008722,6.11142645 L28.8008722,6.11142645 Z"/>\n </svg>']),
_templateObject9 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon UppyIcon-check" width="13px" height="9px" viewBox="0 0 13 9">\n <polygon points="5 7.293 1.354 3.647 0.646 4.354 5 8.707 12.354 1.354 11.646 0.647"></polygon>\n </svg>'], ['<svg class="UppyIcon UppyIcon-check" width="13px" height="9px" viewBox="0 0 13 9">\n <polygon points="5 7.293 1.354 3.647 0.646 4.354 5 8.707 12.354 1.354 11.646 0.647"></polygon>\n </svg>']),
_templateObject10 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="34" height="91" viewBox="0 0 34 91">\n <path d="M22.366 43.134V29.33c5.892-6.588 10.986-14.507 10.986-22.183 0-4.114-2.986-7.1-7.1-7.1-3.914 0-7.1 3.186-7.1 7.1v20.936a92.562 92.562 0 0 1-5.728 5.677l-.384.348C4.643 41.762.428 45.604.428 54.802c0 8.866 7.214 16.08 16.08 16.08.902 0 1.784-.074 2.644-.216v11.26c0 2.702-2.198 4.9-4.9 4.9a4.855 4.855 0 0 1-2.95-1.015c2.364-.24 4.222-2.218 4.222-4.643a4.698 4.698 0 0 0-4.692-4.692 4.738 4.738 0 0 0-4.213 2.628c-.923 1.874-.56 4.386.277 6.228a7.82 7.82 0 0 0 .9 1.502 8.178 8.178 0 0 0 4.23 2.896c.723.207 1.474.31 2.226.31 4.474 0 8.113-3.64 8.113-8.113V69.78c5.98-2.345 10.225-8.176 10.225-14.977 0-5.975-4.464-10.876-10.224-11.67zm0-35.987a3.89 3.89 0 0 1 3.887-3.885c1.933 0 3.885 1.202 3.885 3.885 0 4.95-2.702 10.862-7.772 17.204V7.148zM16.51 67.67c-7.096 0-12.867-5.77-12.867-12.867 0-7.78 3.385-10.865 11.563-18.32l.384-.35c1.166-1.064 2.365-2.2 3.562-3.402v10.404c-5.758.793-10.223 5.695-10.223 11.67 0 3.935 1.948 7.603 5.212 9.81a1.605 1.605 0 1 0 1.8-2.66 8.622 8.622 0 0 1-3.8-7.15c0-4.2 3.025-7.7 7.01-8.456v21.05c-.853.178-1.736.272-2.642.272zm5.856-1.412v-19.91c3.985.756 7.01 4.253 7.01 8.455 0 4.987-2.85 9.32-7.01 11.455z" />\n </svg>'], ['<svg class="UppyIcon" width="34" height="91" viewBox="0 0 34 91">\n <path d="M22.366 43.134V29.33c5.892-6.588 10.986-14.507 10.986-22.183 0-4.114-2.986-7.1-7.1-7.1-3.914 0-7.1 3.186-7.1 7.1v20.936a92.562 92.562 0 0 1-5.728 5.677l-.384.348C4.643 41.762.428 45.604.428 54.802c0 8.866 7.214 16.08 16.08 16.08.902 0 1.784-.074 2.644-.216v11.26c0 2.702-2.198 4.9-4.9 4.9a4.855 4.855 0 0 1-2.95-1.015c2.364-.24 4.222-2.218 4.222-4.643a4.698 4.698 0 0 0-4.692-4.692 4.738 4.738 0 0 0-4.213 2.628c-.923 1.874-.56 4.386.277 6.228a7.82 7.82 0 0 0 .9 1.502 8.178 8.178 0 0 0 4.23 2.896c.723.207 1.474.31 2.226.31 4.474 0 8.113-3.64 8.113-8.113V69.78c5.98-2.345 10.225-8.176 10.225-14.977 0-5.975-4.464-10.876-10.224-11.67zm0-35.987a3.89 3.89 0 0 1 3.887-3.885c1.933 0 3.885 1.202 3.885 3.885 0 4.95-2.702 10.862-7.772 17.204V7.148zM16.51 67.67c-7.096 0-12.867-5.77-12.867-12.867 0-7.78 3.385-10.865 11.563-18.32l.384-.35c1.166-1.064 2.365-2.2 3.562-3.402v10.404c-5.758.793-10.223 5.695-10.223 11.67 0 3.935 1.948 7.603 5.212 9.81a1.605 1.605 0 1 0 1.8-2.66 8.622 8.622 0 0 1-3.8-7.15c0-4.2 3.025-7.7 7.01-8.456v21.05c-.853.178-1.736.272-2.642.272zm5.856-1.412v-19.91c3.985.756 7.01 4.253 7.01 8.455 0 4.987-2.85 9.32-7.01 11.455z" />\n </svg>']),
_templateObject11 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="44" height="58" viewBox="0 0 44 58">\n <path d="M27.437.517a1 1 0 0 0-.094.03H4.25C2.037.548.217 2.368.217 4.58v48.405c0 2.212 1.82 4.03 4.03 4.03H39.03c2.21 0 4.03-1.818 4.03-4.03V15.61a1 1 0 0 0-.03-.28 1 1 0 0 0 0-.093 1 1 0 0 0-.03-.032 1 1 0 0 0 0-.03 1 1 0 0 0-.032-.063 1 1 0 0 0-.03-.063 1 1 0 0 0-.032 0 1 1 0 0 0-.03-.063 1 1 0 0 0-.032-.03 1 1 0 0 0-.03-.063 1 1 0 0 0-.063-.062l-14.593-14a1 1 0 0 0-.062-.062A1 1 0 0 0 28 .708a1 1 0 0 0-.374-.157 1 1 0 0 0-.156 0 1 1 0 0 0-.03-.03l-.003-.003zM4.25 2.547h22.218v9.97c0 2.21 1.82 4.03 4.03 4.03h10.564v36.438a2.02 2.02 0 0 1-2.032 2.032H4.25c-1.13 0-2.032-.9-2.032-2.032V4.58c0-1.13.902-2.032 2.03-2.032zm24.218 1.345l10.375 9.937.75.718H30.5c-1.13 0-2.032-.9-2.032-2.03V3.89z" />\n </svg>'], ['<svg class="UppyIcon" width="44" height="58" viewBox="0 0 44 58">\n <path d="M27.437.517a1 1 0 0 0-.094.03H4.25C2.037.548.217 2.368.217 4.58v48.405c0 2.212 1.82 4.03 4.03 4.03H39.03c2.21 0 4.03-1.818 4.03-4.03V15.61a1 1 0 0 0-.03-.28 1 1 0 0 0 0-.093 1 1 0 0 0-.03-.032 1 1 0 0 0 0-.03 1 1 0 0 0-.032-.063 1 1 0 0 0-.03-.063 1 1 0 0 0-.032 0 1 1 0 0 0-.03-.063 1 1 0 0 0-.032-.03 1 1 0 0 0-.03-.063 1 1 0 0 0-.063-.062l-14.593-14a1 1 0 0 0-.062-.062A1 1 0 0 0 28 .708a1 1 0 0 0-.374-.157 1 1 0 0 0-.156 0 1 1 0 0 0-.03-.03l-.003-.003zM4.25 2.547h22.218v9.97c0 2.21 1.82 4.03 4.03 4.03h10.564v36.438a2.02 2.02 0 0 1-2.032 2.032H4.25c-1.13 0-2.032-.9-2.032-2.032V4.58c0-1.13.902-2.032 2.03-2.032zm24.218 1.345l10.375 9.937.75.718H30.5c-1.13 0-2.032-.9-2.032-2.03V3.89z" />\n </svg>']),
_templateObject12 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="50" height="63" viewBox="0 0 50 63">\n <path d="M0 .5v15.617h6.25l1.7-5.1a6.242 6.242 0 0 1 5.933-4.267h8V50.5c0 3.45-2.8 6.25-6.25 6.25H12.5V63h25v-6.25h-3.133c-3.45 0-6.25-2.8-6.25-6.25V6.75h8a6.257 6.257 0 0 1 5.933 4.267l1.7 5.1H50V.5H0z" />\n </svg>'], ['<svg class="UppyIcon" width="50" height="63" viewBox="0 0 50 63">\n <path d="M0 .5v15.617h6.25l1.7-5.1a6.242 6.242 0 0 1 5.933-4.267h8V50.5c0 3.45-2.8 6.25-6.25 6.25H12.5V63h25v-6.25h-3.133c-3.45 0-6.25-2.8-6.25-6.25V6.75h8a6.257 6.257 0 0 1 5.933 4.267l1.7 5.1H50V.5H0z" />\n </svg>']),
_templateObject13 = _taggedTemplateLiteralLoose(['<svg width="22" height="21" viewBox="0 0 18 17">\n <ellipse fill="#000" cx="8.62" cy="8.383" rx="8.62" ry="8.383"/>\n <path stroke="#FFF" fill="#FFF" d="M11 6.147L10.85 6 8.5 8.284 6.15 6 6 6.147 8.35 8.43 6 10.717l.15.146L8.5 8.578l2.35 2.284.15-.146L8.65 8.43z"/>\n </svg>'], ['<svg width="22" height="21" viewBox="0 0 18 17">\n <ellipse fill="#000" cx="8.62" cy="8.383" rx="8.62" ry="8.383"/>\n <path stroke="#FFF" fill="#FFF" d="M11 6.147L10.85 6 8.5 8.284 6.15 6 6 6.147 8.35 8.43 6 10.717l.15.146L8.5 8.578l2.35 2.284.15-.146L8.65 8.43z"/>\n </svg>']),
_templateObject14 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="37" height="33" viewBox="0 0 37 33">\n <path d="M29.107 24.5c4.07 0 7.393-3.355 7.393-7.442 0-3.994-3.105-7.307-7.012-7.502l.468.415C29.02 4.52 24.34.5 18.886.5c-4.348 0-8.27 2.522-10.138 6.506l.446-.288C4.394 6.782.5 10.758.5 15.608c0 4.924 3.906 8.892 8.76 8.892h4.872c.635 0 1.095-.467 1.095-1.104 0-.636-.46-1.103-1.095-1.103H9.26c-3.644 0-6.63-3.035-6.63-6.744 0-3.71 2.926-6.685 6.57-6.685h.964l.14-.28.177-.362c1.477-3.4 4.744-5.576 8.347-5.576 4.58 0 8.45 3.452 9.01 8.072l.06.536.05.446h1.101c2.87 0 5.204 2.37 5.204 5.295s-2.333 5.296-5.204 5.296h-6.062c-.634 0-1.094.467-1.094 1.103 0 .637.46 1.104 1.094 1.104h6.12z"/>\n <path d="M23.196 18.92l-4.828-5.258-.366-.4-.368.398-4.828 5.196a1.13 1.13 0 0 0 0 1.546c.428.46 1.11.46 1.537 0l3.45-3.71-.868-.34v15.03c0 .64.445 1.118 1.075 1.118.63 0 1.075-.48 1.075-1.12V16.35l-.867.34 3.45 3.712a1 1 0 0 0 .767.345 1 1 0 0 0 .77-.345c.416-.33.416-1.036 0-1.485v.003z"/>\n </svg>'], ['<svg class="UppyIcon" width="37" height="33" viewBox="0 0 37 33">\n <path d="M29.107 24.5c4.07 0 7.393-3.355 7.393-7.442 0-3.994-3.105-7.307-7.012-7.502l.468.415C29.02 4.52 24.34.5 18.886.5c-4.348 0-8.27 2.522-10.138 6.506l.446-.288C4.394 6.782.5 10.758.5 15.608c0 4.924 3.906 8.892 8.76 8.892h4.872c.635 0 1.095-.467 1.095-1.104 0-.636-.46-1.103-1.095-1.103H9.26c-3.644 0-6.63-3.035-6.63-6.744 0-3.71 2.926-6.685 6.57-6.685h.964l.14-.28.177-.362c1.477-3.4 4.744-5.576 8.347-5.576 4.58 0 8.45 3.452 9.01 8.072l.06.536.05.446h1.101c2.87 0 5.204 2.37 5.204 5.295s-2.333 5.296-5.204 5.296h-6.062c-.634 0-1.094.467-1.094 1.103 0 .637.46 1.104 1.094 1.104h6.12z"/>\n <path d="M23.196 18.92l-4.828-5.258-.366-.4-.368.398-4.828 5.196a1.13 1.13 0 0 0 0 1.546c.428.46 1.11.46 1.537 0l3.45-3.71-.868-.34v15.03c0 .64.445 1.118 1.075 1.118.63 0 1.075-.48 1.075-1.12V16.35l-.867.34 3.45 3.712a1 1 0 0 0 .767.345 1 1 0 0 0 .77-.345c.416-.33.416-1.036 0-1.485v.003z"/>\n </svg>']),
_templateObject15 = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="102" height="124" viewBox="0 0 102 124">\n <g>\n <path d="M69.125 124c7.363 0 13.353-5.975 13.353-13.322v-6.15h4c8.56 0 15.522-6.946 15.522-15.482v-59.16c0-2.033-1.087-4.65-2.53-6.088L78.14 2.52C76.7 1.085 74.075 0 72.038 0H32.873c-7.36 0-13.35 6.947-13.35 15.483v3.99h-6.168C5.99 19.472 0 25.445 0 32.792v77.885C0 118.025 5.99 124 13.355 124h55.77zM76.903 7.488l17.59 17.55h-13.13c-2.46 0-4.46-2-4.46-4.454V7.488zm-52.985 7.995c0-6.12 4.016-11.1 8.955-11.1h39.165c.14 0 .3.022.466.05v16.15c0 4.873 3.973 8.837 8.86 8.837h16.19c.028.165.048.323.048.467v59.158c0 6.118-4.99 11.097-11.125 11.097H35.043c-6.135 0-11.127-4.978-11.127-11.096V15.483h.002zm-19.52 95.195V32.792c0-4.928 4.018-8.934 8.957-8.934h6.167v65.188c0 8.536 6.963 15.482 15.52 15.482H78.08v6.15c0 4.927-4.017 8.935-8.955 8.935h-55.77c-4.94 0-8.957-4.008-8.957-8.935z"/><path d="M40.218 76h40.564C82.007 76 83 75.106 83 74c0-1.106-.993-2-2.218-2H40.218C38.995 72 38 72.894 38 74c0 1.106.995 2 2.218 2zM40.218 57h40.564C82.007 57 83 56.105 83 55c0-1.106-.993-2-2.218-2H40.218C38.995 53 38 53.894 38 55c0 1.105.995 2 2.218 2zM40.208 37h23.584c1.22 0 2.208-.896 2.208-2s-.987-2-2.208-2H40.208C38.99 33 38 33.896 38 35s.99 2 2.208 2z"/>\n </g>\n </svg>'], ['<svg class="UppyIcon" width="102" height="124" viewBox="0 0 102 124">\n <g>\n <path d="M69.125 124c7.363 0 13.353-5.975 13.353-13.322v-6.15h4c8.56 0 15.522-6.946 15.522-15.482v-59.16c0-2.033-1.087-4.65-2.53-6.088L78.14 2.52C76.7 1.085 74.075 0 72.038 0H32.873c-7.36 0-13.35 6.947-13.35 15.483v3.99h-6.168C5.99 19.472 0 25.445 0 32.792v77.885C0 118.025 5.99 124 13.355 124h55.77zM76.903 7.488l17.59 17.55h-13.13c-2.46 0-4.46-2-4.46-4.454V7.488zm-52.985 7.995c0-6.12 4.016-11.1 8.955-11.1h39.165c.14 0 .3.022.466.05v16.15c0 4.873 3.973 8.837 8.86 8.837h16.19c.028.165.048.323.048.467v59.158c0 6.118-4.99 11.097-11.125 11.097H35.043c-6.135 0-11.127-4.978-11.127-11.096V15.483h.002zm-19.52 95.195V32.792c0-4.928 4.018-8.934 8.957-8.934h6.167v65.188c0 8.536 6.963 15.482 15.52 15.482H78.08v6.15c0 4.927-4.017 8.935-8.955 8.935h-55.77c-4.94 0-8.957-4.008-8.957-8.935z"/><path d="M40.218 76h40.564C82.007 76 83 75.106 83 74c0-1.106-.993-2-2.218-2H40.218C38.995 72 38 72.894 38 74c0 1.106.995 2 2.218 2zM40.218 57h40.564C82.007 57 83 56.105 83 55c0-1.106-.993-2-2.218-2H40.218C38.995 53 38 53.894 38 55c0 1.105.995 2 2.218 2zM40.208 37h23.584c1.22 0 2.208-.896 2.208-2s-.987-2-2.208-2H40.208C38.99 33 38 33.896 38 35s.99 2 2.208 2z"/>\n </g>\n </svg>']);
exports.defaultTabIcon = defaultTabIcon;
exports.iconCopy = iconCopy;
exports.iconResume = iconResume;
exports.iconPause = iconPause;
exports.iconEdit = iconEdit;
exports.localIcon = localIcon;
exports.closeIcon = closeIcon;
exports.pluginIcon = pluginIcon;
exports.checkIcon = checkIcon;
exports.iconAudio = iconAudio;
exports.iconFile = iconFile;
exports.iconText = iconText;
exports.removeIcon = removeIcon;
exports.uploadIcon = uploadIcon;
exports.dashboardBgIcon = dashboardBgIcon;
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
// https://css-tricks.com/creating-svg-icon-system-react/
function defaultTabIcon() {
return (0, _html2.default)(_templateObject);
}
function iconCopy() {
return (0, _html2.default)(_templateObject2);
}
function iconResume() {
return (0, _html2.default)(_templateObject3);
}
function iconPause() {
return (0, _html2.default)(_templateObject4);
}
function iconEdit() {
return (0, _html2.default)(_templateObject5);
}
function localIcon() {
return (0, _html2.default)(_templateObject6);
}
function closeIcon() {
return (0, _html2.default)(_templateObject7);
}
function pluginIcon() {
return (0, _html2.default)(_templateObject8);
}
function checkIcon() {
return (0, _html2.default)(_templateObject9);
}
function iconAudio() {
return (0, _html2.default)(_templateObject10);
}
function iconFile() {
return (0, _html2.default)(_templateObject11);
}
function iconText() {
return (0, _html2.default)(_templateObject12);
}
function removeIcon() {
return (0, _html2.default)(_templateObject13);
}
function uploadIcon() {
return (0, _html2.default)(_templateObject14);
}
function dashboardBgIcon() {
return (0, _html2.default)(_templateObject15);
}
//# sourceMappingURL=icons.js.map
},{"../../core/html":8}],21:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Plugin2 = require('../Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _dragDrop = require('drag-drop');
var _dragDrop2 = _interopRequireDefault(_dragDrop);
var _Dashboard = require('./Dashboard');
var _Dashboard2 = _interopRequireDefault(_Dashboard);
var _Utils = require('../../core/Utils');
var _prettyBytes = require('pretty-bytes');
var _prettyBytes2 = _interopRequireDefault(_prettyBytes);
var _icons = require('./icons');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Modal Dialog & Dashboard
*/
var DashboardUI = function (_Plugin) {
_inherits(DashboardUI, _Plugin);
function DashboardUI(core, opts) {
_classCallCheck(this, DashboardUI);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.id = 'DashboardUI';
_this.title = 'Dashboard UI';
_this.type = 'orchestrator';
// set default options
var defaultOptions = {
target: 'body',
inline: false,
semiTransparent: false,
defaultTabIcon: (0, _icons.defaultTabIcon)(),
panelSelectorPrefix: 'UppyDashboardContent-panel',
showProgressDetails: true
};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
_this.hideModal = _this.hideModal.bind(_this);
_this.showModal = _this.showModal.bind(_this);
_this.addTarget = _this.addTarget.bind(_this);
_this.actions = _this.actions.bind(_this);
_this.hideAllPanels = _this.hideAllPanels.bind(_this);
_this.showPanel = _this.showPanel.bind(_this);
_this.initEvents = _this.initEvents.bind(_this);
_this.handleDrop = _this.handleDrop.bind(_this);
_this.pauseAll = _this.pauseAll.bind(_this);
_this.resumeAll = _this.resumeAll.bind(_this);
_this.render = _this.render.bind(_this);
_this.install = _this.install.bind(_this);
return _this;
}
DashboardUI.prototype.addTarget = function addTarget(plugin) {
var callerPluginId = plugin.constructor.name;
var callerPluginName = plugin.title || callerPluginId;
var callerPluginIcon = plugin.icon || this.opts.defaultTabIcon;
var callerPluginType = plugin.type;
if (callerPluginType !== 'acquirer' && callerPluginType !== 'progressindicator' && callerPluginType !== 'presenter') {
var msg = 'Error: Modal can only be used by plugins of types: acquirer, progressindicator, presenter';
this.core.log(msg);
return;
}
var target = {
id: callerPluginId,
name: callerPluginName,
icon: callerPluginIcon,
type: callerPluginType,
focus: plugin.focus,
render: plugin.render,
isHidden: true
};
var modal = this.core.getState().modal;
var newTargets = modal.targets.slice();
newTargets.push(target);
this.core.setState({
modal: _extends({}, modal, {
targets: newTargets
})
});
return this.opts.target;
};
DashboardUI.prototype.hideAllPanels = function hideAllPanels() {
var modal = this.core.getState().modal;
var newTargets = modal.targets.map(function (target) {
return _extends({}, target, {
isHidden: true
});
});
this.core.setState({ modal: _extends({}, modal, {
targets: newTargets
}) });
};
DashboardUI.prototype.showPanel = function showPanel(id) {
var modal = this.core.getState().modal;
// hide all panels, except the one that matches current id
var newTargets = modal.targets.map(function (target) {
if (target.type === 'acquirer') {
if (target.id === id) {
target.focus();
return _extends({}, target, {
isHidden: false
});
}
return _extends({}, target, {
isHidden: true
});
}
return target;
});
this.core.setState({ modal: _extends({}, modal, {
targets: newTargets
}) });
};
DashboardUI.prototype.hideModal = function hideModal() {
var modal = this.core.getState().modal;
this.core.setState({
modal: _extends({}, modal, {
isHidden: true
})
});
document.body.classList.remove('is-UppyDashboard-open');
};
DashboardUI.prototype.showModal = function showModal() {
var modal = this.core.getState().modal;
this.core.setState({
modal: _extends({}, modal, {
isHidden: false
})
});
// add class to body that sets position fixed
document.body.classList.add('is-UppyDashboard-open');
// focus on modal inner block
document.querySelector('.UppyDashboard-inner').focus();
};
DashboardUI.prototype.initEvents = function initEvents() {
var _this2 = this;
// const dashboardEl = document.querySelector(`${this.opts.target} .UppyDashboard`)
// Modal open button
var showModalTrigger = document.querySelector(this.opts.trigger);
showModalTrigger.addEventListener('click', this.showModal);
// Close the Modal on esc key press
document.body.addEventListener('keyup', function (event) {
if (event.keyCode === 27) {
_this2.hideModal();
}
});
// Drag Drop
(0, _dragDrop2.default)(this.el, function (files) {
_this2.handleDrop(files);
});
};
DashboardUI.prototype.actions = function actions() {
var _this3 = this;
var bus = this.core.bus;
bus.on('core:file-add', function () {
_this3.hideAllPanels();
});
bus.on('dashboard:file-card', function (fileId) {
var modal = _this3.core.getState().modal;
_this3.core.setState({
modal: _extends({}, modal, {
fileCardFor: fileId || false
})
});
});
bus.on('core:success', function (uploadedCount) {
bus.emit('informer', _this3.core.i18n('files', { 'smart_count': uploadedCount }) + ' successfully uploaded, Sir!', 'info', 6000);
});
};
DashboardUI.prototype.handleDrop = function handleDrop(files) {
var _this4 = this;
this.core.log('All right, someone dropped something...');
files.forEach(function (file) {
_this4.core.bus.emit('core:file-add', {
source: _this4.id,
name: file.name,
type: file.type,
data: file
});
});
};
DashboardUI.prototype.pauseAll = function pauseAll() {
this.core.bus.emit('core:pause-all');
};
DashboardUI.prototype.resumeAll = function resumeAll() {
this.core.bus.emit('core:resume-all');
};
DashboardUI.prototype.getTotalSpeed = function getTotalSpeed(files) {
var totalSpeed = 0;
files.forEach(function (file) {
totalSpeed = totalSpeed + (0, _Utils.getSpeed)(file.progress);
});
return totalSpeed;
};
DashboardUI.prototype.getTotalETA = function getTotalETA(files) {
var totalSeconds = 0;
files.forEach(function (file) {
totalSeconds = totalSeconds + (0, _Utils.getETA)(file.progress);
});
return totalSeconds;
};
DashboardUI.prototype.render = function render(state) {
var _this5 = this;
var files = state.files;
var newFiles = Object.keys(files).filter(function (file) {
return !files[file].progress.uploadStarted;
});
var uploadStartedFiles = Object.keys(files).filter(function (file) {
return files[file].progress.uploadStarted;
});
var completeFiles = Object.keys(files).filter(function (file) {
return files[file].progress.uploadComplete;
});
var inProgressFiles = Object.keys(files).filter(function (file) {
return !files[file].progress.uploadComplete && files[file].progress.uploadStarted && !files[file].isPaused;
});
var inProgressFilesArray = [];
inProgressFiles.forEach(function (file) {
inProgressFilesArray.push(files[file]);
});
var totalSpeed = (0, _prettyBytes2.default)(this.getTotalSpeed(inProgressFilesArray));
var totalETA = (0, _Utils.prettyETA)(this.getTotalETA(inProgressFilesArray));
var isAllComplete = state.totalProgress === 100;
var isAllPaused = inProgressFiles.length === 0 && !isAllComplete;
var acquirers = state.modal.targets.filter(function (target) {
return target.type === 'acquirer';
});
var progressindicators = state.modal.targets.filter(function (target) {
return target.type === 'progressindicator';
});
var addFile = function addFile(file) {
_this5.core.emitter.emit('core:file-add', file);
};
var removeFile = function removeFile(fileID) {
_this5.core.emitter.emit('core:file-remove', fileID);
};
var startUpload = function startUpload(ev) {
_this5.core.emitter.emit('core:upload');
};
var pauseUpload = function pauseUpload(fileID) {
_this5.core.emitter.emit('core:upload-pause', fileID);
};
var showFileCard = function showFileCard(fileID) {
_this5.core.emitter.emit('dashboard:file-card', fileID);
};
var fileCardDone = function fileCardDone(meta, fileID) {
// console.log(meta, fileID)
// console.log('ФАЙЛ КАРД СОХРАНЯЮ, НАХУЙ')
_this5.core.emitter.emit('core:update-meta', meta, fileID);
_this5.core.emitter.emit('dashboard:file-card');
};
var info = function info(text, type, duration) {
_this5.core.emitter.emit('informer', text, type, duration);
};
return (0, _Dashboard2.default)({
state: state,
modal: state.modal,
newFiles: newFiles,
files: files,
totalFileCount: Object.keys(files).length,
uploadStartedFiles: uploadStartedFiles,
completeFiles: completeFiles,
inProgressFiles: inProgressFiles,
totalSpeed: totalSpeed,
totalETA: totalETA,
totalProgress: state.totalProgress,
isAllComplete: isAllComplete,
isAllPaused: isAllPaused,
acquirers: acquirers,
progressindicators: progressindicators,
autoProceed: this.core.opts.autoProceed,
id: this.id,
container: this.opts.target,
hideModal: this.hideModal,
panelSelectorPrefix: this.opts.panelSelectorPrefix,
showProgressDetails: this.opts.showProgressDetails,
inline: this.opts.inline,
semiTransparent: this.opts.semiTransparent,
onPaste: this.handlePaste,
showPanel: this.showPanel,
hideAllPanels: this.hideAllPanels,
log: this.core.log,
bus: this.core.emitter,
i18n: this.core.i18n,
pauseAll: this.pauseAll,
resumeAll: this.resumeAll,
addFile: addFile,
removeFile: removeFile,
info: info,
metaFields: state.metaFields,
startUpload: startUpload,
pauseUpload: pauseUpload,
fileCardFor: state.modal.fileCardFor,
showFileCard: showFileCard,
fileCardDone: fileCardDone
});
};
DashboardUI.prototype.install = function install() {
// Set default state for Modal
this.core.setState({ modal: {
isHidden: true,
showFileCard: false,
targets: []
} });
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
this.initEvents();
this.actions();
};
return DashboardUI;
}(_Plugin3.default);
exports.default = DashboardUI;
//# sourceMappingURL=index.js.map
},{"../../core/Utils":7,"../Plugin":37,"./Dashboard":11,"./icons":20,"drag-drop":48,"pretty-bytes":56}],22:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['\n <svg class="UppyIcon" width="28" height="28" viewBox="0 0 16 16">\n <path d="M15.982 2.97c0-.02 0-.02-.018-.037 0-.017-.017-.035-.035-.053 0 0 0-.018-.02-.018-.017-.018-.034-.053-.052-.07L13.19.123c-.017-.017-.034-.035-.07-.053h-.018c-.018-.017-.035-.017-.053-.034h-.02c-.017 0-.034-.018-.052-.018h-6.31a.415.415 0 0 0-.446.426V11.11c0 .25.196.446.445.446h8.89A.44.44 0 0 0 16 11.11V3.023c-.018-.018-.018-.035-.018-.053zm-2.65-1.46l1.157 1.157h-1.157V1.51zm1.78 9.157h-8V.89h5.332v2.22c0 .25.196.446.445.446h2.22v7.11z"/>\n <path d="M9.778 12.89H4V2.666a.44.44 0 0 0-.444-.445.44.44 0 0 0-.445.445v10.666c0 .25.197.445.446.445h6.222a.44.44 0 0 0 .444-.445.44.44 0 0 0-.444-.444z"/>\n <path d="M.444 16h6.223a.44.44 0 0 0 .444-.444.44.44 0 0 0-.443-.445H.89V4.89a.44.44 0 0 0-.446-.446A.44.44 0 0 0 0 4.89v10.666c0 .248.196.444.444.444z"/>\n </svg>\n '], ['\n <svg class="UppyIcon" width="28" height="28" viewBox="0 0 16 16">\n <path d="M15.982 2.97c0-.02 0-.02-.018-.037 0-.017-.017-.035-.035-.053 0 0 0-.018-.02-.018-.017-.018-.034-.053-.052-.07L13.19.123c-.017-.017-.034-.035-.07-.053h-.018c-.018-.017-.035-.017-.053-.034h-.02c-.017 0-.034-.018-.052-.018h-6.31a.415.415 0 0 0-.446.426V11.11c0 .25.196.446.445.446h8.89A.44.44 0 0 0 16 11.11V3.023c-.018-.018-.018-.035-.018-.053zm-2.65-1.46l1.157 1.157h-1.157V1.51zm1.78 9.157h-8V.89h5.332v2.22c0 .25.196.446.445.446h2.22v7.11z"/>\n <path d="M9.778 12.89H4V2.666a.44.44 0 0 0-.444-.445.44.44 0 0 0-.445.445v10.666c0 .25.197.445.446.445h6.222a.44.44 0 0 0 .444-.445.44.44 0 0 0-.444-.444z"/>\n <path d="M.444 16h6.223a.44.44 0 0 0 .444-.444.44.44 0 0 0-.443-.445H.89V4.89a.44.44 0 0 0-.446-.446A.44.44 0 0 0 0 4.89v10.666c0 .248.196.444.444.444z"/>\n </svg>\n ']),
_templateObject2 = _taggedTemplateLiteralLoose(['\n <div class="UppyDragDrop-container ', '">\n <form class="UppyDragDrop-inner"\n onsubmit=', '>\n <input class="UppyDragDrop-input UppyDragDrop-focus"\n type="file"\n name="files[]"\n multiple="true"\n value=""\n onchange=', ' />\n <label class="UppyDragDrop-label" onclick=', '>\n <strong>', '</strong>\n <span class="UppyDragDrop-dragText">', '</span>\n </label>\n ', '\n </form>\n </div>\n '], ['\n <div class="UppyDragDrop-container ', '">\n <form class="UppyDragDrop-inner"\n onsubmit=', '>\n <input class="UppyDragDrop-input UppyDragDrop-focus"\n type="file"\n name="files[]"\n multiple="true"\n value=""\n onchange=', ' />\n <label class="UppyDragDrop-label" onclick=', '>\n <strong>', '</strong>\n <span class="UppyDragDrop-dragText">', '</span>\n </label>\n ', '\n </form>\n </div>\n ']),
_templateObject3 = _taggedTemplateLiteralLoose(['<button class="UppyDragDrop-uploadBtn UppyNextBtn"\n type="submit"\n onclick=', '>\n ', '\n </button>'], ['<button class="UppyDragDrop-uploadBtn UppyNextBtn"\n type="submit"\n onclick=', '>\n ', '\n </button>']);
var _Plugin2 = require('./../Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _Utils = require('../../core/Utils');
var _dragDrop = require('drag-drop');
var _dragDrop2 = _interopRequireDefault(_dragDrop);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Drag & Drop plugin
*
*/
var DragDrop = function (_Plugin) {
_inherits(DragDrop, _Plugin);
function DragDrop(core, opts, props) {
_classCallCheck(this, DragDrop);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'acquirer';
_this.id = 'DragDrop';
_this.title = 'Drag & Drop';
_this.props = props;
_this.icon = (0, _html2.default)(_templateObject);
// Default options
var defaultOpts = {
target: '.UppyDragDrop'
};
// Merge default options with the ones set by user
_this.opts = _extends({}, defaultOpts, opts);
// Check for browser dragDrop support
_this.isDragDropSupported = _this.checkDragDropSupport();
// Bind `this` to class methods
_this.handleDrop = _this.handleDrop.bind(_this);
_this.checkDragDropSupport = _this.checkDragDropSupport.bind(_this);
_this.handleInputChange = _this.handleInputChange.bind(_this);
_this.render = _this.render.bind(_this);
return _this;
}
/**
* Checks if the browser supports Drag & Drop (not supported on mobile devices, for example).
* @return {Boolean} true if supported, false otherwise
*/
DragDrop.prototype.checkDragDropSupport = function checkDragDropSupport() {
var div = document.createElement('div');
if (!('draggable' in div) || !('ondragstart' in div && 'ondrop' in div)) {
return false;
}
if (!('FormData' in window)) {
return false;
}
if (!('FileReader' in window)) {
return false;
}
return true;
};
DragDrop.prototype.handleDrop = function handleDrop(files) {
var _this2 = this;
this.core.log('All right, someone dropped something...');
files.forEach(function (file) {
_this2.props.addFile({
source: _this2.id,
name: file.name,
type: file.type,
data: file
});
// this.core.emitter.emit('file-add', {
// source: this.id,
// name: file.name,
// type: file.type,
// data: file
// })
});
};
DragDrop.prototype.handleInputChange = function handleInputChange(ev) {
var _this3 = this;
this.core.log('All right, something selected through input...');
var files = (0, _Utils.toArray)(ev.target.files);
files.forEach(function (file) {
_this3.core.emitter.emit('core:file-add', {
source: _this3.id,
name: file.name,
type: file.type,
data: file
});
});
};
DragDrop.prototype.focus = function focus() {
var firstInput = document.querySelector(this.target + ' .UppyDragDrop-focus');
// only works for the first time if wrapped in setTimeout for some reason
setTimeout(function () {
firstInput.focus();
}, 10);
};
DragDrop.prototype.render = function render(state) {
var _this4 = this;
// Another way not to render next/upload button — if Modal is used as a target
var target = this.opts.target.name;
var onSelect = function onSelect(ev) {
var input = document.querySelector(_this4.target + ' .UppyDragDrop-input');
input.click();
};
var next = function next(ev) {
ev.preventDefault();
ev.stopPropagation();
_this4.core.emitter.emit('core:upload');
};
var onSubmit = function onSubmit(ev) {
ev.preventDefault();
};
return (0, _html2.default)(_templateObject2, this.isDragDropSupported ? 'is-dragdrop-supported' : '', onSubmit, this.handleInputChange.bind(this), onSelect, this.core.i18n('chooseFile'), this.core.i18n('orDragDrop'), !this.core.opts.autoProceed && target !== 'Dashboard' ? (0, _html2.default)(_templateObject3, next, this.core.i18n('upload')) : '');
};
DragDrop.prototype.install = function install() {
var _this5 = this;
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
(0, _dragDrop2.default)(this.target + ' .UppyDragDrop-container', function (files) {
_this5.handleDrop(files);
_this5.core.log(files);
});
};
return DragDrop;
}(_Plugin3.default);
exports.default = DragDrop;
//# sourceMappingURL=index.js.map
},{"../../core/Utils":7,"../../core/html":8,"./../Plugin":37,"drag-drop":48}],23:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['<h1>this is strange 1</h1>'], ['<h1>this is strange 1</h1>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<h2>this is strange 2</h2>'], ['<h2>this is strange 2</h2>']),
_templateObject3 = _taggedTemplateLiteralLoose(['\n <div class="wow-this-works">\n <input class="UppyDummy-firstInput" type="text" value="hello">\n ', '\n ', '\n </div>\n '], ['\n <div class="wow-this-works">\n <input class="UppyDummy-firstInput" type="text" value="hello">\n ', '\n ', '\n </div>\n ']);
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _html = require('../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// import { createInlineWorker } from '../core/Utils'
/**
* Dummy
*
*/
var Dummy = function (_Plugin) {
_inherits(Dummy, _Plugin);
function Dummy(core, opts, props) {
_classCallCheck(this, Dummy);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'acquirer';
_this.id = 'Dummy';
_this.title = 'Mr. Plugin';
_this.props = props;
// set default options
var defaultOptions = {};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
_this.strange = (0, _html2.default)(_templateObject);
_this.render = _this.render.bind(_this);
_this.install = _this.install.bind(_this);
return _this;
}
Dummy.prototype.addFakeFileJustToTest = function addFakeFileJustToTest() {
var blob = new Blob(['data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCI+CiAgPGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNTAiLz4KPC9zdmc+Cg=='], { type: 'image/svg+xml' });
var file = {
source: 'acceptance-test',
name: 'test-file',
type: 'image/svg+xml',
data: blob
};
this.props.log('Adding fake file blob');
this.props.addFile(file);
};
Dummy.prototype.render = function render() {
var bla = (0, _html2.default)(_templateObject2);
return (0, _html2.default)(_templateObject3, this.strange, bla);
};
Dummy.prototype.focus = function focus() {
var _this2 = this;
var firstInput = document.querySelector(this.target + ' .UppyDummy-firstInput');
// only works for the first time if wrapped in setTimeout for some reason
// firstInput.focus()
setTimeout(function () {
firstInput.focus();
}, 10);
setTimeout(function () {
_this2.core.emit('informer', 'Hello! I’m a test Informer message', 'info', 4500);
_this2.addFakeFileJustToTest();
}, 1000);
};
Dummy.prototype.install = function install() {
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
//
// function workerFunc () {
// self.addEventListener('message', (e) => {
// const file = e.data.file
// const reader = new FileReaderSync()
// const dataURL = reader.readAsDataURL(file)
// postMessage({file: dataURL})
// })
// }
//
// const worker = createInlineWorker(workerFunc)
// const testFileBlob = new Blob(
// ['data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCI+CiAgPGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNTAiLz4KPC9zdmc+Cg=='],
// {type: 'image/svg+xml'}
// )
// worker.postMessage({file: testFileBlob})
// worker.addEventListener('message', (e) => {
// console.log(e)
// })
};
return Dummy;
}(_Plugin3.default);
exports.default = Dummy;
//# sourceMappingURL=Dummy.js.map
},{"../core/html":8,"./Plugin":37}],24:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['<form class="UppyFormContainer">\n <input class="UppyForm-input"\n type="file"\n name="files[]"\n onchange=', '\n multiple="', '"\n value="">\n ', '\n </form>'], ['<form class="UppyFormContainer">\n <input class="UppyForm-input"\n type="file"\n name="files[]"\n onchange=', '\n multiple="', '"\n value="">\n ', '\n </form>']),
_templateObject2 = _taggedTemplateLiteralLoose(['<button class="UppyForm-uploadBtn UppyNextBtn"\n type="submit"\n onclick=', '>\n ', '\n </button>'], ['<button class="UppyForm-uploadBtn UppyNextBtn"\n type="submit"\n onclick=', '>\n ', '\n </button>']);
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _Utils = require('../core/Utils');
var _Utils2 = _interopRequireDefault(_Utils);
var _html = require('../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Formtag = function (_Plugin) {
_inherits(Formtag, _Plugin);
function Formtag(core, opts) {
_classCallCheck(this, Formtag);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.id = 'Formtag';
_this.title = 'Formtag';
_this.type = 'acquirer';
// Default options
var defaultOptions = {
target: '.UppyForm',
replaceTargetContent: true,
multipleFiles: true
};
// Merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
_this.render = _this.render.bind(_this);
return _this;
}
Formtag.prototype.handleInputChange = function handleInputChange(ev) {
var _this2 = this;
this.core.log('All right, something selected through input...');
// this added rubbish keys like “length” to the resulting array
// const files = Object.keys(ev.target.files).map((key) => {
// return ev.target.files[key]
// })
var files = _Utils2.default.toArray(ev.target.files);
files.forEach(function (file) {
_this2.core.emitter.emit('core:file-add', {
source: _this2.id,
name: file.name,
type: file.type,
data: file
});
});
};
Formtag.prototype.render = function render(state) {
var _this3 = this;
var upload = function upload(ev) {
ev.preventDefault();
ev.stopPropagation();
_this3.core.emitter.emit('core:upload');
};
return (0, _html2.default)(_templateObject, this.handleInputChange.bind(this), this.opts.multipleFiles ? 'true' : 'false', !this.core.opts.autoProceed && this.opts.target.name !== 'Modal' ? (0, _html2.default)(_templateObject2, upload, this.core.i18n('upload')) : '');
};
Formtag.prototype.install = function install() {
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
};
// run (results) {
// console.log({
// class: 'Formtag',
// method: 'run',
// results: results
// })
//
// const button = document.querySelector(this.opts.doneButtonSelector)
// var self = this
//
// return new Promise((resolve, reject) => {
// button.addEventListener('click', (e) => {
// var fields = document.querySelectorAll(self.opts.selector)
// var selected = [];
//
// [].forEach.call(fields, (field, i) => {
// selected.push({
// from: 'Formtag',
// files: field.files
// })
// })
// resolve(selected)
// })
// })
// }
return Formtag;
}(_Plugin3.default);
exports.default = Formtag;
//# sourceMappingURL=Formtag.js.map
},{"../core/Utils":7,"../core/html":8,"./Plugin":37}],25:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<a onclick=', '>Proceed with Demo Account</a>'], ['<a onclick=', '>Proceed with Demo Account</a>']),
_templateObject2 = _taggedTemplateLiteralLoose(['\n <div class="UppyGoogleDrive-authenticate">\n <h1>You need to authenticate with Google before selecting files.</h1>\n <a href=', '>Authenticate</a>\n ', '\n </div>\n '], ['\n <div class="UppyGoogleDrive-authenticate">\n <h1>You need to authenticate with Google before selecting files.</h1>\n <a href=', '>Authenticate</a>\n ', '\n </div>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
var demoLink = props.demo ? (0, _html2.default)(_templateObject, props.handleDemoAuth) : null;
return (0, _html2.default)(_templateObject2, props.link, demoLink);
};
//# sourceMappingURL=AuthView.js.map
},{"../../core/html":8}],26:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <div>\n <span>\n Something went wrong. Probably our fault. ', '\n </span>\n </div>\n '], ['\n <div>\n <span>\n Something went wrong. Probably our fault. ', '\n </span>\n </div>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.error);
};
//# sourceMappingURL=Error.js.map
},{"../../core/html":8}],27:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['\n <svg class="UppyIcon UppyModalTab-icon" width="28" height="28" viewBox="0 0 16 16">\n <path d="M2.955 14.93l2.667-4.62H16l-2.667 4.62H2.955zm2.378-4.62l-2.666 4.62L0 10.31l5.19-8.99 2.666 4.62-2.523 4.37zm10.523-.25h-5.333l-5.19-8.99h5.334l5.19 8.99z"/>\n </svg>\n '], ['\n <svg class="UppyIcon UppyModalTab-icon" width="28" height="28" viewBox="0 0 16 16">\n <path d="M2.955 14.93l2.667-4.62H16l-2.667 4.62H2.955zm2.378-4.62l-2.666 4.62L0 10.31l5.19-8.99 2.666 4.62-2.523 4.37zm10.523-.25h-5.333l-5.19-8.99h5.334l5.19 8.99z"/>\n </svg>\n ']);
var _Utils = require('../../core/Utils');
var _Utils2 = _interopRequireDefault(_Utils);
var _Plugin2 = require('../Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
require('whatwg-fetch');
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _Provider = require('../../uppy-base/src/plugins/Provider');
var _Provider2 = _interopRequireDefault(_Provider);
var _AuthView = require('./AuthView');
var _AuthView2 = _interopRequireDefault(_AuthView);
var _Browser = require('./new/Browser');
var _Browser2 = _interopRequireDefault(_Browser);
var _Error = require('./Error');
var _Error2 = _interopRequireDefault(_Error);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Google = function (_Plugin) {
_inherits(Google, _Plugin);
function Google(core, opts) {
_classCallCheck(this, Google);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'acquirer';
_this.id = 'GoogleDrive';
_this.title = 'Google Drive';
_this.icon = (0, _html2.default)(_templateObject);
_this.GoogleDrive = new _Provider2.default({
host: _this.opts.host,
provider: 'google'
});
_this.files = [];
// this.core.socket.on('')
// Logic
_this.addFile = _this.addFile.bind(_this);
_this.filterItems = _this.filterItems.bind(_this);
_this.filterQuery = _this.filterQuery.bind(_this);
_this.getFolder = _this.getFolder.bind(_this);
_this.getNextFolder = _this.getNextFolder.bind(_this);
_this.handleRowClick = _this.handleRowClick.bind(_this);
_this.logout = _this.logout.bind(_this);
_this.handleDemoAuth = _this.handleDemoAuth.bind(_this);
_this.sortByTitle = _this.sortByTitle.bind(_this);
_this.sortByDate = _this.sortByDate.bind(_this);
// Visual
_this.render = _this.render.bind(_this);
// set default options
var defaultOptions = {};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
return _this;
}
Google.prototype.install = function install() {
var _this2 = this;
// Set default state for Google Drive
this.core.setState({
googleDrive: {
authenticated: false,
files: [],
folders: [],
directories: [{
title: 'My Drive',
id: 'root'
}],
activeRow: -1,
filterInput: ''
}
});
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
this.checkAuthentication().then(function (authenticated) {
_this2.updateState({ authenticated: authenticated });
console.log('are we authenticated?');
console.log(authenticated);
if (authenticated) {
return _this2.getFolder('root');
}
return authenticated;
}).then(function (newState) {
_this2.updateState(newState);
});
return;
};
Google.prototype.focus = function focus() {};
/**
* Little shorthand to update the state with my new state
*/
Google.prototype.updateState = function updateState(newState) {
var state = this.core.state;
var googleDrive = _extends({}, state.googleDrive, newState);
this.core.setState({ googleDrive: googleDrive });
};
/**
* Check to see if the user is authenticated.
* @return {Promise} authentication status
*/
Google.prototype.checkAuthentication = function checkAuthentication() {
var _this3 = this;
return fetch(this.opts.host + '/google/authorize', {
method: 'get',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then(function (res) {
console.log(res.status);
if (res.status < 200 || res.status > 300) {
_this3.updateState({
authenticated: false,
error: true
});
var error = new Error(res.statusText);
error.response = res;
throw error;
}
return res.json();
}).then(function (data) {
return data.isAuthenticated;
}).catch(function (err) {
return err;
});
};
/**
* Based on folder ID, fetch a new folder
* @param {String} id Folder id
* @return {Promise} Folders/files in folder
*/
Google.prototype.getFolder = function getFolder() {
var id = arguments.length <= 0 || arguments[0] === undefined ? 'root' : arguments[0];
return this.GoogleDrive.list(id).then(function (res) {
// let result = Utils.groupBy(data.items, (item) => item.mimeType)
var folders = [];
var files = [];
res.items.forEach(function (item) {
if (item.mimeType === 'application/vnd.google-apps.folder') {
folders.push(item);
} else {
files.push(item);
}
});
return {
folders: folders,
files: files
};
}).catch(function (err) {
return err;
});
};
/**
* Fetches new folder and adds to breadcrumb nav
* @param {String} id Folder id
* @param {String} title Folder title
*/
Google.prototype.getNextFolder = function getNextFolder(id, title) {
var _this4 = this;
this.getFolder(id).then(function (data) {
var state = _this4.core.getState().googleDrive;
var index = state.directories.findIndex(function (dir) {
return id === dir.id;
});
var updatedDirectories = void 0;
if (index !== -1) {
updatedDirectories = state.directories.slice(0, index + 1);
} else {
updatedDirectories = state.directories.concat([{
id: id,
title: title
}]);
}
_this4.updateState(_Utils2.default.extend(data, {
directories: updatedDirectories
}));
});
};
Google.prototype.addFile = function addFile(file) {
var tagFile = {
source: this.id,
data: file,
name: file.title,
type: file.mimeType,
isRemote: true,
body: {
fileId: file.id
},
remote: {
host: this.opts.host,
url: this.opts.host + '/google/get?fileId=' + file.id,
body: {
fileId: file.id
}
}
};
console.log('adding file');
this.core.emitter.emit('core:file-add', tagFile);
};
Google.prototype.handleError = function handleError(response) {
var _this5 = this;
this.checkAuthentication().then(function (authenticated) {
_this5.updateState({ authenticated: authenticated });
});
};
/**
* Removes session token on client side.
*/
Google.prototype.logout = function logout() {
var _this6 = this;
this.GoogleDrive.logout(location.href).then(function (res) {
return res.json();
}).then(function (res) {
if (res.ok) {
console.log('ok');
var newState = {
authenticated: false,
files: [],
folders: [],
directories: [{
title: 'My Drive',
id: 'root'
}]
};
_this6.updateState(newState);
}
});
};
Google.prototype.getFileType = function getFileType(file) {
var fileTypes = {
'application/vnd.google-apps.folder': 'Folder',
'application/vnd.google-apps.document': 'Google Docs',
'application/vnd.google-apps.spreadsheet': 'Google Sheets',
'application/vnd.google-apps.presentation': 'Google Slides',
'image/jpeg': 'JPEG Image',
'image/png': 'PNG Image'
};
return fileTypes[file.mimeType] ? fileTypes[file.mimeType] : file.fileExtension.toUpperCase();
};
/**
* Used to set active file/folder.
* @param {Object} file Active file/folder
*/
Google.prototype.handleRowClick = function handleRowClick(fileId) {
var state = this.core.getState().googleDrive;
var newState = _extends({}, state, {
activeRow: fileId
});
this.updateState(newState);
};
Google.prototype.filterQuery = function filterQuery(e) {
var state = this.core.getState().googleDrive;
this.updateState(_extends({}, state, {
filterInput: e.target.value
}));
};
Google.prototype.filterItems = function filterItems(items) {
var state = this.core.getState().googleDrive;
return items.filter(function (folder) {
return folder.title.toLowerCase().indexOf(state.filterInput.toLowerCase()) !== -1;
});
};
Google.prototype.sortByTitle = function sortByTitle() {
var state = _extends({}, this.core.getState().googleDrive);
var files = state.files;
var folders = state.folders;
var sorting = state.sorting;
var sortedFiles = files.sort(function (fileA, fileB) {
if (sorting === 'titleDescending') {
return fileB.title.localeCompare(fileA.title);
}
return fileA.title.localeCompare(fileB.title);
});
var sortedFolders = folders.sort(function (folderA, folderB) {
if (sorting === 'titleDescending') {
return folderB.title.localeCompare(folderA.title);
}
return folderA.title.localeCompare(folderB.title);
});
this.updateState(_extends({}, state, {
files: sortedFiles,
folders: sortedFolders,
sorting: sorting === 'titleDescending' ? 'titleAscending' : 'titleDescending'
}));
};
Google.prototype.sortByDate = function sortByDate() {
var state = _extends({}, this.core.getState().googleDrive);
var files = state.files;
var folders = state.folders;
var sorting = state.sorting;
var sortedFiles = files.sort(function (fileA, fileB) {
var a = new Date(fileA.modifiedByMeDate);
var b = new Date(fileB.modifiedByMeDate);
if (sorting === 'dateDescending') {
return a > b ? -1 : a < b ? 1 : 0;
}
return a > b ? 1 : a < b ? -1 : 0;
});
var sortedFolders = folders.sort(function (folderA, folderB) {
var a = new Date(folderA.modifiedByMeDate);
var b = new Date(folderB.modifiedByMeDate);
if (sorting === 'dateDescending') {
return a > b ? -1 : a < b ? 1 : 0;
}
return a > b ? 1 : a < b ? -1 : 0;
});
this.updateState(_extends({}, state, {
files: sortedFiles,
folders: sortedFolders,
sorting: sorting === 'dateDescending' ? 'dateAscending' : 'dateDescending'
}));
};
Google.prototype.handleDemoAuth = function handleDemoAuth() {
var state = this.core.getState().googleDrive;
this.updateState({}, state, {
authenticated: true
});
};
Google.prototype.render = function render(state) {
var _state$googleDrive = state.googleDrive;
var authenticated = _state$googleDrive.authenticated;
var error = _state$googleDrive.error;
if (error) {
return (0, _Error2.default)({ error: error });
}
if (!authenticated) {
var authState = btoa(JSON.stringify({
redirect: location.href.split('#')[0]
}));
var link = this.opts.host + '/connect/google?state=' + authState;
return (0, _AuthView2.default)({
link: link,
demo: this.opts.demo,
handleDemoAuth: this.handleDemoAuth
});
}
var browserProps = _extends({}, state.googleDrive, {
getNextFolder: this.getNextFolder,
getFolder: this.getFolder,
addFile: this.addFile,
filterItems: this.filterItems,
filterQuery: this.filterQuery,
handleRowClick: this.handleRowClick,
sortByTitle: this.sortByTitle,
sortByDate: this.sortByDate,
logout: this.logout,
demo: this.opts.demo
});
return (0, _Browser2.default)(browserProps);
};
return Google;
}(_Plugin3.default);
exports.default = Google;
//# sourceMappingURL=index.js.map
},{"../../core/Utils":7,"../../core/html":8,"../../uppy-base/src/plugins/Provider":45,"../Plugin":37,"./AuthView":25,"./Error":26,"./new/Browser":30,"whatwg-fetch":66}],28:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <li>\n <button onclick=', '>', '</button>\n </li>\n '], ['\n <li>\n <button onclick=', '>', '</button>\n </li>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.getNextFolder, props.title);
};
//# sourceMappingURL=Breadcrumb.js.map
},{"../../../core/html":8}],29:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <ul class="UppyGoogleDrive-breadcrumbs">\n ', '\n </ul>\n '], ['\n <ul class="UppyGoogleDrive-breadcrumbs">\n ', '\n </ul>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
var _Breadcrumb = require('./Breadcrumb');
var _Breadcrumb2 = _interopRequireDefault(_Breadcrumb);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.directories.map(function (directory) {
return (0, _Breadcrumb2.default)({
getNextFolder: function getNextFolder() {
return props.getNextFolder(directory.id, directory.title);
},
title: directory.title
});
}));
};
//# sourceMappingURL=Breadcrumbs.js.map
},{"../../../core/html":8,"./Breadcrumb":28}],30:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <div class="Browser">\n <header>\n <input\n type="text"\n class="Browser-search"\n placeholder="Search Drive"\n onkeyup=', '\n value=', '/>\n </header>\n <div class="Browser-subHeader">\n ', '\n </div>\n <div class="Browser-body">\n <main class="Browser-content">\n ', '\n </main>\n </div>\n </div>\n '], ['\n <div class="Browser">\n <header>\n <input\n type="text"\n class="Browser-search"\n placeholder="Search Drive"\n onkeyup=', '\n value=', '/>\n </header>\n <div class="Browser-subHeader">\n ', '\n </div>\n <div class="Browser-body">\n <main class="Browser-content">\n ', '\n </main>\n </div>\n </div>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
var _Breadcrumbs = require('./Breadcrumbs');
var _Breadcrumbs2 = _interopRequireDefault(_Breadcrumbs);
var _Table = require('./Table');
var _Table2 = _interopRequireDefault(_Table);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
var filteredFolders = props.folders;
var filteredFiles = props.files;
if (props.filterInput !== '') {
filteredFolders = props.filterItems(props.folders);
filteredFiles = props.filterItems(props.files);
}
return (0, _html2.default)(_templateObject, props.filterQuery, props.filterInput, (0, _Breadcrumbs2.default)({
getNextFolder: props.getNextFolder,
directories: props.directories
}), (0, _Table2.default)({
columns: [{
name: 'Name',
key: 'title'
}],
folders: filteredFolders,
files: filteredFiles,
activeRow: props.activeRow,
sortByTitle: props.sortByTitle,
sortByDate: props.sortByDate,
handleRowClick: props.handleRowClick,
handleFileDoubleClick: props.addFile,
handleFolderDoubleClick: props.getNextFolder
}));
};
//# sourceMappingURL=Browser.js.map
},{"../../../core/html":8,"./Breadcrumbs":29,"./Table":31}],31:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <th class="BrowserTable-headerColumn BrowserTable-column" onclick=', '>\n ', '\n </th>\n '], ['\n <th class="BrowserTable-headerColumn BrowserTable-column" onclick=', '>\n ', '\n </th>\n ']),
_templateObject2 = _taggedTemplateLiteralLoose(['\n <table class="BrowserTable">\n <thead class="BrowserTable-header">\n <tr>\n ', '\n </tr>\n </thead>\n <tbody>\n ', '\n ', '\n </tbody>\n </table>\n '], ['\n <table class="BrowserTable">\n <thead class="BrowserTable-header">\n <tr>\n ', '\n </tr>\n </thead>\n <tbody>\n ', '\n ', '\n </tbody>\n </table>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
var _TableRow = require('./TableRow');
var _TableRow2 = _interopRequireDefault(_TableRow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
var headers = props.columns.map(function (column) {
return (0, _html2.default)(_templateObject, props.sortByTitle, column.name);
});
return (0, _html2.default)(_templateObject2, headers, props.folders.map(function (folder) {
return (0, _TableRow2.default)({
title: folder.title,
active: props.activeRow === folder.id,
iconLink: folder.iconLink,
modifiedByMeDate: folder.modifiedByMeDate,
handleClick: function handleClick() {
return props.handleRowClick(folder.id);
},
handleDoubleClick: function handleDoubleClick() {
return props.handleFolderDoubleClick(folder.id, folder.title);
},
columns: props.columns
});
}), props.files.map(function (file) {
return (0, _TableRow2.default)({
title: file.title,
active: props.activeRow === file.id,
iconLink: file.iconLink,
modifiedByMeDate: file.modifiedByMeDate,
handleClick: function handleClick() {
return props.handleRowClick(file.id);
},
handleDoubleClick: function handleDoubleClick() {
return props.handleFileDoubleClick(file);
},
columns: props.columns,
owner: 'Joe Mama'
});
}));
};
//# sourceMappingURL=Table.js.map
},{"../../../core/html":8,"./TableRow":33}],32:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <td class="BrowserTable-rowColumn BrowserTable-column">\n <img src=', '/> ', '\n </td>\n '], ['\n <td class="BrowserTable-rowColumn BrowserTable-column">\n <img src=', '/> ', '\n </td>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject, props.iconLink, props.value);
};
//# sourceMappingURL=TableColumn.js.map
},{"../../../core/html":8}],33:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <tr onclick=', ' ondblclick=', ' class=', '>\n ', '\n </tr>\n '], ['\n <tr onclick=', ' ondblclick=', ' class=', '>\n ', '\n </tr>\n ']);
var _html = require('../../../core/html');
var _html2 = _interopRequireDefault(_html);
var _TableColumn = require('./TableColumn');
var _TableColumn2 = _interopRequireDefault(_TableColumn);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
var classes = props.active ? 'BrowserTable-row is-active' : 'BrowserTable-row';
return (0, _html2.default)(_templateObject, props.handleClick, props.handleDoubleClick, classes, (0, _TableColumn2.default)({
iconLink: props.iconLink,
value: props.title || ''
}));
};
//# sourceMappingURL=TableRow.js.map
},{"../../../core/html":8,"./TableColumn":32}],34:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['<div class="UppyInformer" aria-hidden="', '">\n <p>', '</p>\n </div>'], ['<div class="UppyInformer" aria-hidden="', '">\n <p>', '</p>\n </div>']);
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _html = require('../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Informer
* Shows rad message bubbles
* used like this: `bus.emit('informer', 'hello world', 'info', 5000)`
* or for errors: `bus.emit('informer', 'Error uploading img.jpg', 'error', 5000)`
*
*/
var Informer = function (_Plugin) {
_inherits(Informer, _Plugin);
function Informer(core, opts) {
_classCallCheck(this, Informer);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'progressindicator';
_this.id = 'Informer';
_this.title = 'Informer';
// set default options
var defaultOptions = {};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
return _this;
}
Informer.prototype.showInformer = function showInformer(msg, type, duration) {
var _this2 = this;
this.core.setState({
informer: {
isHidden: false,
msg: msg
}
});
if (duration === 0) return;
// hide the informer after `duration` milliseconds
setTimeout(function () {
var newInformer = _extends({}, _this2.core.getState().informer, {
isHidden: true
});
_this2.core.setState({
informer: newInformer
});
}, duration);
};
Informer.prototype.hideInformer = function hideInformer() {
var newInformer = _extends({}, this.core.getState().informer, {
isHidden: true
});
this.core.setState({
informer: newInformer
});
};
Informer.prototype.render = function render(state) {
var msg = state.informer.msg;
var isHidden = state.informer.isHidden;
// @TODO add aria-live for screen-readers
return (0, _html2.default)(_templateObject, isHidden, msg);
};
Informer.prototype.install = function install() {
var _this3 = this;
// Set default state for Google Drive
this.core.setState({
informer: {
isHidden: true,
msg: ''
}
});
var bus = this.core.bus;
bus.on('informer', function (msg, type, duration) {
_this3.showInformer(msg, type, duration);
});
bus.on('informer-hide', function () {
_this3.hideInformer();
});
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
};
return Informer;
}(_Plugin3.default);
exports.default = Informer;
//# sourceMappingURL=Informer.js.map
},{"../core/html":8,"./Plugin":37}],35:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Meta Data
* Adds metadata fields to Uppy
*
*/
var MetaData = function (_Plugin) {
_inherits(MetaData, _Plugin);
function MetaData(core, opts) {
_classCallCheck(this, MetaData);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'modifier';
_this.id = 'MetaData';
_this.title = 'Meta Data';
// set default options
var defaultOptions = {};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
return _this;
}
MetaData.prototype.addInitialMeta = function addInitialMeta() {
var _this2 = this;
var metaFields = this.opts.fields;
this.core.setState({
metaFields: metaFields
});
this.core.emitter.on('file-added', function (fileID) {
metaFields.forEach(function (item) {
var obj = {};
obj[item.id] = item.value;
_this2.core.updateMeta(obj, fileID);
});
});
};
MetaData.prototype.install = function install() {
this.addInitialMeta();
};
return MetaData;
}(_Plugin3.default);
exports.default = MetaData;
//# sourceMappingURL=MetaData.js.map
},{"./Plugin":37}],36:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;
var Multipart = function (_Plugin) {
_inherits(Multipart, _Plugin);
function Multipart(core, opts) {
_classCallCheck(this, Multipart);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'uploader';
_this.id = 'Multipart';
_this.title = 'Multipart';
// Default options
var defaultOptions = {
fieldName: 'files[]',
responseUrlFieldName: 'url',
bundle: true
};
// Merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
return _this;
}
Multipart.prototype.upload = function upload(file, current, total) {
var _this2 = this;
this.core.log('uploading ' + current + ' of ' + total);
return new _Promise(function (resolve, reject) {
// turn file into an array so we can use bundle
// if (!this.opts.bundle) {
// files = [files[current]]
// }
// for (let i in files) {
// formPost.append(this.opts.fieldName, files[i])
// }
var formPost = new FormData();
formPost.append(_this2.opts.fieldName, file.data);
Object.keys(file.meta).forEach(function (item) {
console.log(file.meta, file.meta[item]);
formPost.append(file.meta, file.meta[item]);
});
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function (ev) {
if (ev.lengthComputable) {
// Dispatch progress event
_this2.core.emitter.emit('core:upload-progress', {
uploader: _this2,
id: file.id,
bytesUploaded: ev.loaded,
bytesTotal: ev.total
});
}
});
xhr.addEventListener('load', function (ev) {
if (ev.target.status === 200) {
var resp = JSON.parse(xhr.response);
var uploadURL = resp[_this2.opts.responseUrlFieldName];
_this2.core.emitter.emit('core:upload-success', file.id, uploadURL);
_this2.core.log('Download ' + file.name + ' from ' + file.uploadURL);
return resolve(file);
}
// var upload = {}
//
// if (this.opts.bundle) {
// upload = {files: files}
// } else {
// upload = {file: files[current]}
// }
});
xhr.addEventListener('error', function (ev) {
_this2.core.emitter.emit('core:upload-error', file.id);
return reject('Upload error');
});
xhr.open('POST', _this2.opts.endpoint, true);
xhr.send(formPost);
_this2.core.emitter.emit('core:upload-started', file.id);
});
};
Multipart.prototype.selectForUpload = function selectForUpload(files) {
var _this3 = this;
if (Object.keys(files).length === 0) {
this.core.log('no files to upload!');
return;
}
var filesForUpload = [];
Object.keys(files).forEach(function (file) {
if (files[file].progress.percentage === 0) {
filesForUpload.push(files[file]);
}
});
var uploaders = [];
filesForUpload.forEach(function (file, i) {
var current = parseInt(i, 10) + 1;
var total = filesForUpload.length;
uploaders.push(_this3.upload(file, current, total));
});
return Promise.all(uploaders).then(function (result) {
_this3.core.log('Multipart has finished uploading!');
});
// if (this.opts.bundle) {
// uploaders.push(this.upload(files, 0, files.length))
// } else {
// for (let i in files) {
// uploaders.push(this.upload(files, i, files.length))
// }
// }
};
Multipart.prototype.install = function install() {
var _this4 = this;
var bus = this.core.emitter;
bus.on('core:upload', function () {
_this4.core.log('Multipart is uploading...');
var files = _this4.core.getState().files;
_this4.selectForUpload(files);
});
};
return Multipart;
}(_Plugin3.default);
exports.default = Multipart;
//# sourceMappingURL=Multipart.js.map
},{"./Plugin":37,"es6-promise":51}],37:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _yoYo = require('yo-yo');
var _yoYo2 = _interopRequireDefault(_yoYo);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Boilerplate that all Plugins share - and should not be used
* directly. It also shows which methods final plugins should implement/override,
* this deciding on structure.
*
* @param {object} main Uppy core object
* @param {object} object with plugin options
* @return {array | string} files or success/fail message
*/
var Plugin = function () {
function Plugin(core, opts) {
_classCallCheck(this, Plugin);
this.core = core;
this.opts = opts || {};
this.type = 'none';
// clear everything inside the target selector
this.opts.replaceTargetContent === this.opts.replaceTargetContent || true;
this.update = this.update.bind(this);
this.mount = this.mount.bind(this);
this.focus = this.focus.bind(this);
this.install = this.install.bind(this);
}
Plugin.prototype.update = function update(state) {
if (typeof this.el === 'undefined') {
return;
}
var newEl = this.render(state);
_yoYo2.default.update(this.el, newEl);
// optimizes performance?
// requestAnimationFrame(() => {
// const newEl = this.render(state)
// yo.update(this.el, newEl)
// })
};
/**
* Check if supplied `target` is a `string` or an `object`.
* If it’s an object — target is a plugin, and we search `plugins`
* for a plugin with same name and return its target.
*
* @param {String|Object} target
*
*/
Plugin.prototype.mount = function mount(target, plugin) {
var callerPluginName = plugin.id;
if (typeof target === 'string') {
this.core.log('Installing ' + callerPluginName + ' to ' + target);
// clear everything inside the target container
if (this.opts.replaceTargetContent) {
document.querySelector(target).innerHTML = '';
}
this.el = plugin.render(this.core.state);
document.querySelector(target).appendChild(this.el);
return target;
} else {
// TODO: is instantiating the plugin really the way to roll
// just to get the plugin name?
var Target = target;
var targetPluginName = new Target().id;
this.core.log('Installing ' + callerPluginName + ' to ' + targetPluginName);
var targetPlugin = this.core.getPlugin(targetPluginName);
var selectorTarget = targetPlugin.addTarget(plugin);
return selectorTarget;
}
};
Plugin.prototype.focus = function focus() {
return;
};
Plugin.prototype.install = function install() {
return;
};
return Plugin;
}();
exports.default = Plugin;
//# sourceMappingURL=Plugin.js.map
},{"yo-yo":67}],38:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _templateObject = _taggedTemplateLiteralLoose(['<div class="UppyProgressBar" style="', '">\n <div class="UppyProgressBar-inner" style="width: ', '%"></div>\n <div class="UppyProgressBar-percentage">', '</div>\n </div>'], ['<div class="UppyProgressBar" style="', '">\n <div class="UppyProgressBar-inner" style="width: ', '%"></div>\n <div class="UppyProgressBar-percentage">', '</div>\n </div>']);
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _html = require('../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Progress bar
*
*/
var ProgressBar = function (_Plugin) {
_inherits(ProgressBar, _Plugin);
function ProgressBar(core, opts) {
_classCallCheck(this, ProgressBar);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.id = 'ProgressBar';
_this.title = 'Progress Bar';
_this.type = 'progressindicator';
// set default options
var defaultOptions = {
replaceTargetContent: false,
fixed: false
};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
_this.render = _this.render.bind(_this);
return _this;
}
ProgressBar.prototype.render = function render(state) {
var progress = state.totalProgress || 0;
return (0, _html2.default)(_templateObject, this.opts.fixed ? 'position: fixed' : 'null', progress, progress);
};
ProgressBar.prototype.install = function install() {
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
};
return ProgressBar;
}(_Plugin3.default);
exports.default = ProgressBar;
//# sourceMappingURL=ProgressBar.js.map
},{"../core/html":8,"./Plugin":37}],39:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Plugin2 = require('./Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _tusJsClient = require('tus-js-client');
var _tusJsClient2 = _interopRequireDefault(_tusJsClient);
var _UppySocket = require('../core/UppySocket');
var _UppySocket2 = _interopRequireDefault(_UppySocket);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;
/**
* Tus resumable file uploader
*
*/
var Tus10 = function (_Plugin) {
_inherits(Tus10, _Plugin);
function Tus10(core, opts) {
_classCallCheck(this, Tus10);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.type = 'uploader';
_this.id = 'Tus';
_this.title = 'Tus';
// set default options
var defaultOptions = {
resume: true,
allowPause: true
};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
return _this;
}
Tus10.prototype.pauseResume = function pauseResume(action, fileID) {
var updatedFiles = _extends({}, this.core.getState().files);
var inProgressUpdatedFiles = Object.keys(updatedFiles).filter(function (file) {
return !updatedFiles[file].progress.uploadComplete && updatedFiles[file].progress.uploadStarted;
});
switch (action) {
case 'toggle':
if (updatedFiles[fileID].uploadComplete) return;
var wasPaused = updatedFiles[fileID].isPaused || false;
var isPaused = !wasPaused;
var updatedFile = void 0;
if (wasPaused) {
updatedFile = _extends({}, updatedFiles[fileID], {
isPaused: false
});
} else {
updatedFile = _extends({}, updatedFiles[fileID], {
isPaused: true
});
}
updatedFiles[fileID] = updatedFile;
this.core.setState({ files: updatedFiles });
return isPaused;
case 'pauseAll':
inProgressUpdatedFiles.forEach(function (file) {
var updatedFile = _extends({}, updatedFiles[file], {
isPaused: true
});
updatedFiles[file] = updatedFile;
});
this.core.setState({ files: updatedFiles });
return;
case 'resumeAll':
inProgressUpdatedFiles.forEach(function (file) {
var updatedFile = _extends({}, updatedFiles[file], {
isPaused: false
});
updatedFiles[file] = updatedFile;
});
this.core.setState({ files: updatedFiles });
return;
}
};
/**
* Create a new Tus upload
*
* @param {object} file for use with upload
* @param {integer} current file in a queue
* @param {integer} total number of files in a queue
* @returns {Promise}
*/
Tus10.prototype.upload = function upload(file, current, total) {
var _this2 = this;
this.core.log('uploading ' + current + ' of ' + total);
// Create a new tus upload
return new _Promise(function (resolve, reject) {
var upload = new _tusJsClient2.default.Upload(file.data, {
// TODO merge this.opts or this.opts.tus here
metadata: file.meta,
resume: _this2.opts.resume,
endpoint: _this2.opts.endpoint,
onError: function onError(err) {
_this2.core.log(err);
_this2.core.emitter.emit('core:upload-error', file.id);
reject('Failed because: ' + err);
},
onProgress: function onProgress(bytesUploaded, bytesTotal) {
// Dispatch progress event
_this2.core.emitter.emit('core:upload-progress', {
uploader: _this2,
id: file.id,
bytesUploaded: bytesUploaded,
bytesTotal: bytesTotal
});
},
onSuccess: function onSuccess() {
_this2.core.emitter.emit('core:upload-success', file.id, upload.url);
_this2.core.log('Download ' + upload.file.name + ' from ' + upload.url);
resolve(upload);
}
});
_this2.core.emitter.on('core:file-remove', function (fileID) {
if (fileID === file.id) {
console.log('removing file: ', fileID);
upload.abort();
resolve('upload ' + fileID + ' was removed');
}
});
_this2.core.emitter.on('core:upload-pause', function (fileID) {
if (fileID === file.id) {
var isPaused = _this2.pauseResume('toggle', fileID);
isPaused ? upload.abort() : upload.start();
}
});
_this2.core.emitter.on('core:pause-all', function () {
var files = _this2.core.getState().files;
if (!files[file.id]) return;
upload.abort();
});
_this2.core.emitter.on('core:resume-all', function () {
var files = _this2.core.getState().files;
if (!files[file.id]) return;
upload.start();
});
upload.start();
_this2.core.emitter.emit('core:upload-started', file.id, upload);
});
};
Tus10.prototype.uploadRemote = function uploadRemote(file, current, total) {
var _this3 = this;
return new _Promise(function (resolve, reject) {
_this3.core.log(file.remote.url);
fetch(file.remote.url, {
method: 'post',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(_extends({}, file.remote.body, {
target: _this3.opts.endpoint,
protocol: 'tus'
}))
}).then(function (res) {
if (res.status < 200 && res.status > 300) {
return reject(res.statusText);
}
res.json().then(function (data) {
// get the host domain
var regex = /^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)/;
var host = regex.exec(file.remote.host)[1];
var token = data.token;
var socket = new _UppySocket2.default({
target: 'ws://' + host + ':3020/api/' + token
});
socket.on('progress', function (progressData) {
var progress = progressData.progress;
var bytesUploaded = progressData.bytesUploaded;
var bytesTotal = progressData.bytesTotal;
if (progress) {
_this3.core.log('Upload progress: ' + progress);
// Dispatch progress event
_this3.core.emitter.emit('core:upload-progress', {
uploader: _this3,
id: file.id,
bytesUploaded: bytesUploaded,
bytesTotal: bytesTotal
});
if (progress === '100.00') {
_this3.core.emitter.emit('core:upload-success', file.id);
socket.close();
return resolve();
}
}
});
});
});
});
};
Tus10.prototype.uploadFiles = function uploadFiles(files) {
var _this4 = this;
if (Object.keys(files).length === 0) {
this.core.log('no files to upload!');
return;
}
var uploaders = [];
files.forEach(function (file, index) {
var current = parseInt(index, 10) + 1;
var total = files.length;
if (!file.isRemote) {
uploaders.push(_this4.upload(file, current, total));
} else {
uploaders.push(_this4.uploadRemote(file, current, total));
}
});
return Promise.all(uploaders).then(function () {
_this4.core.log('All files uploaded');
return { uploadedCount: files.length };
}).catch(function (err) {
_this4.core.log('Upload error: ' + err);
});
};
Tus10.prototype.selectForUpload = function selectForUpload(files) {
// TODO: replace files[file].isRemote with some logic
//
// filter files that are now yet being uploaded / haven’t been uploaded
// and remote too
var filesForUpload = Object.keys(files).filter(function (file) {
if (files[file].progress.percentage === 0 || files[file].isRemote) {
return true;
}
return false;
}).map(function (file) {
return files[file];
});
this.uploadFiles(filesForUpload);
};
Tus10.prototype.actions = function actions() {
var _this5 = this;
this.core.emitter.on('core:pause-all', function () {
_this5.pauseResume('pauseAll');
});
this.core.emitter.on('core:resume-all', function () {
_this5.pauseResume('resumeAll');
});
this.core.emitter.on('core:upload', function () {
_this5.core.log('Tus is uploading...');
var files = _this5.core.getState().files;
_this5.selectForUpload(files);
});
};
Tus10.prototype.addResumableUploadsCapabilityFlag = function addResumableUploadsCapabilityFlag() {
var newCapabilities = _extends({}, this.core.getState().capabilities);
newCapabilities.resumableUploads = true;
this.core.setState({
capabilities: newCapabilities
});
};
Tus10.prototype.install = function install() {
this.addResumableUploadsCapabilityFlag();
this.actions();
};
return Tus10;
}(_Plugin3.default);
exports.default = Tus10;
//# sourceMappingURL=Tus10.js.map
},{"../core/UppySocket":6,"./Plugin":37,"es6-promise":51,"tus-js-client":63}],40:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<svg class="UppyIcon" width="100" height="77" viewBox="0 0 100 77">\n <g>\n <path d="M50 32c-7.168 0-13 5.832-13 13s5.832 13 13 13 13-5.832 13-13-5.832-13-13-13z"/>\n <path d="M87 13H72c0-7.18-5.82-13-13-13H41c-7.18 0-13 5.82-13 13H13C5.82 13 0 18.82 0 26v38c0 7.18 5.82 13 13 13h74c7.18 0 13-5.82 13-13V26c0-7.18-5.82-13-13-13zM50 68c-12.683 0-23-10.318-23-23s10.317-23 23-23 23 10.318 23 23-10.317 23-23 23z"/>\n <g>\n </svg>'], ['<svg class="UppyIcon" width="100" height="77" viewBox="0 0 100 77">\n <g>\n <path d="M50 32c-7.168 0-13 5.832-13 13s5.832 13 13 13 13-5.832 13-13-5.832-13-13-13z"/>\n <path d="M87 13H72c0-7.18-5.82-13-13-13H41c-7.18 0-13 5.82-13 13H13C5.82 13 0 18.82 0 26v38c0 7.18 5.82 13 13 13h74c7.18 0 13-5.82 13-13V26c0-7.18-5.82-13-13-13zM50 68c-12.683 0-23-10.318-23-23s10.317-23 23-23 23 10.318 23 23-10.317 23-23 23z"/>\n <g>\n </svg>']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject);
};
//# sourceMappingURL=CameraIcon.js.map
},{"../../core/html":8}],41:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['<video class="UppyWebcam-video" autoplay src="', '"></video>'], ['<video class="UppyWebcam-video" autoplay src="', '"></video>']),
_templateObject2 = _taggedTemplateLiteralLoose(['\n <div class="UppyWebcam-container">\n <div class=\'UppyWebcam-videoContainer\'>\n ', '\n </div>\n <div class=\'UppyWebcam-buttonContainer\'>\n <button class="UppyButton--circular UppyButton--red UppyButton--sizeM UppyWebcam-stopRecordBtn"\n type="button"\n title="Take a snapshot"\n aria-label="Take a snapshot"\n onclick=', '>\n ', '\n </button>\n </div>\n <canvas class="UppyWebcam-canvas" style="display: none;"></canvas>\n </div>\n '], ['\n <div class="UppyWebcam-container">\n <div class=\'UppyWebcam-videoContainer\'>\n ', '\n </div>\n <div class=\'UppyWebcam-buttonContainer\'>\n <button class="UppyButton--circular UppyButton--red UppyButton--sizeM UppyWebcam-stopRecordBtn"\n type="button"\n title="Take a snapshot"\n aria-label="Take a snapshot"\n onclick=', '>\n ', '\n </button>\n </div>\n <canvas class="UppyWebcam-canvas" style="display: none;"></canvas>\n </div>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
var _CameraIcon = require('./CameraIcon');
var _CameraIcon2 = _interopRequireDefault(_CameraIcon);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
var video = void 0;
if (props.useTheFlash) {
video = props.getSWFHTML();
} else {
video = (0, _html2.default)(_templateObject, props.src);
}
return (0, _html2.default)(_templateObject2, video, props.onSnapshot, (0, _CameraIcon2.default)());
};
//# sourceMappingURL=CameraScreen.js.map
},{"../../core/html":8,"./CameraIcon":40}],42:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <div>\n <h1>Please allow access to your camera</h1>\n <span>You have been prompted to allow camera access from this site. In order to take pictures with your camera you must approve this request.</span>\n </div>\n '], ['\n <div>\n <h1>Please allow access to your camera</h1>\n <span>You have been prompted to allow camera access from this site. In order to take pictures with your camera you must approve this request.</span>\n </div>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject);
};
//# sourceMappingURL=PermissionsScreen.js.map
},{"../../core/html":8}],43:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['\n <svg class="UppyIcon UppyModalTab-icon" width="18" height="21" viewBox="0 0 18 21">\n <g>\n <path d="M14.8 16.9c1.9-1.7 3.2-4.1 3.2-6.9 0-5-4-9-9-9s-9 4-9 9c0 2.8 1.2 5.2 3.2 6.9C1.9 17.9.5 19.4 0 21h3c1-1.9 11-1.9 12 0h3c-.5-1.6-1.9-3.1-3.2-4.1zM9 4c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6z"/>\n <path d="M9 14c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4zM8 8c.6 0 1 .4 1 1s-.4 1-1 1-1-.4-1-1c0-.5.4-1 1-1z"/>\n </g>\n </svg>\n '], ['\n <svg class="UppyIcon UppyModalTab-icon" width="18" height="21" viewBox="0 0 18 21">\n <g>\n <path d="M14.8 16.9c1.9-1.7 3.2-4.1 3.2-6.9 0-5-4-9-9-9s-9 4-9 9c0 2.8 1.2 5.2 3.2 6.9C1.9 17.9.5 19.4 0 21h3c1-1.9 11-1.9 12 0h3c-.5-1.6-1.9-3.1-3.2-4.1zM9 4c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6z"/>\n <path d="M9 14c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4zM8 8c.6 0 1 .4 1 1s-.4 1-1 1-1-.4-1-1c0-.5.4-1 1-1z"/>\n </g>\n </svg>\n ']);
var _html = require('../../core/html');
var _html2 = _interopRequireDefault(_html);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
exports.default = function (props) {
return (0, _html2.default)(_templateObject);
};
//# sourceMappingURL=WebcamIcon.js.map
},{"../../core/html":8}],44:[function(require,module,exports){
'use strict';
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _Plugin2 = require('../Plugin');
var _Plugin3 = _interopRequireDefault(_Plugin2);
var _Webcam = require('../../uppy-base/src/plugins/Webcam');
var _Webcam2 = _interopRequireDefault(_Webcam);
var _Utils = require('../../core/Utils');
var _WebcamIcon = require('./WebcamIcon');
var _WebcamIcon2 = _interopRequireDefault(_WebcamIcon);
var _CameraScreen = require('./CameraScreen');
var _CameraScreen2 = _interopRequireDefault(_CameraScreen);
var _PermissionsScreen = require('./PermissionsScreen');
var _PermissionsScreen2 = _interopRequireDefault(_PermissionsScreen);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Webcam
*/
var Webcam = function (_Plugin) {
_inherits(Webcam, _Plugin);
function Webcam(core, opts) {
_classCallCheck(this, Webcam);
var _this = _possibleConstructorReturn(this, _Plugin.call(this, core, opts));
_this.userMedia = true;
_this.protocol = location.protocol.match(/https/i) ? 'https' : 'http';
_this.type = 'acquirer';
_this.id = 'Webcam';
_this.title = 'Webcam';
_this.icon = (0, _WebcamIcon2.default)();
// set default options
var defaultOptions = {
enableFlash: true
};
_this.params = {
swfURL: 'webcam.swf',
width: 400,
height: 300,
dest_width: 800, // size of captured image
dest_height: 600, // these default to width/height
image_format: 'jpeg', // image format (may be jpeg or png)
jpeg_quality: 90, // jpeg image quality from 0 (worst) to 100 (best)
enable_flash: true, // enable flash fallback,
force_flash: false, // force flash mode,
flip_horiz: false, // flip image horiz (mirror mode)
fps: 30, // camera frames per second
upload_name: 'webcam', // name of file in upload post data
constraints: null, // custom user media constraints,
flashNotDetectedText: 'ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).',
noInterfaceFoundText: 'No supported webcam interface found.',
unfreeze_snap: true // Whether to unfreeze the camera after snap (defaults to true)
};
// merge default options with the ones set by user
_this.opts = _extends({}, defaultOptions, opts);
_this.install = _this.install.bind(_this);
_this.updateState = _this.updateState.bind(_this);
_this.render = _this.render.bind(_this);
// Camera controls
_this.start = _this.start.bind(_this);
_this.takeSnapshot = _this.takeSnapshot.bind(_this);
_this.webcam = new _Webcam2.default(_this.opts, _this.params);
return _this;
}
Webcam.prototype.start = function start() {
var _this2 = this;
this.webcam.start().then(function (stream) {
_this2.updateState({
videoStream: stream,
cameraReady: true
});
}).catch(function (err) {
_this2.updateState({
cameraError: err
});
});
};
Webcam.prototype.takeSnapshot = function takeSnapshot() {
var opts = {
name: 'webcam-' + Date.now() + '.jpg',
mimeType: 'image/jpeg'
};
var video = document.querySelector('.UppyWebcam-video');
var image = this.webcam.getImage(video, opts);
var tagFile = {
source: this.id,
name: opts.name,
data: image.data,
type: opts.mimeType
};
this.core.emitter.emit('core:file-add', tagFile);
};
Webcam.prototype.render = function render(state) {
if (!state.webcam.cameraReady && !state.webcam.useTheFlash) {
return (0, _PermissionsScreen2.default)(state.webcam);
}
var stream = state.webcam.videoStream ? URL.createObjectURL(state.webcam.videoStream) : null;
return (0, _CameraScreen2.default)((0, _Utils.extend)(state.webcam, {
onSnapshot: this.takeSnapshot,
getSWFHTML: this.webcam.getSWFHTML,
src: stream
}));
};
Webcam.prototype.focus = function focus() {
var _this3 = this;
var firstInput = document.querySelector('.UppyWebcam-stopRecordBtn');
// only works for the first time if wrapped in setTimeout for some reason
// firstInput.focus()
if (firstInput) {
setTimeout(function () {
firstInput.focus();
}, 10);
}
this.start();
setTimeout(function () {
_this3.core.emitter.emit('informer', 'Smile!', 'info', 3500);
}, 1000);
};
Webcam.prototype.install = function install() {
this.webcam.init();
this.core.setState({
webcam: {
cameraReady: false
}
});
var target = this.opts.target;
var plugin = this;
this.target = this.mount(target, plugin);
};
/**
* Little shorthand to update the state with my new state
*/
Webcam.prototype.updateState = function updateState(newState) {
var state = this.core.state;
var webcam = _extends({}, state.webcam, newState);
this.core.setState({ webcam: webcam });
};
return Webcam;
}(_Plugin3.default);
exports.default = Webcam;
//# sourceMappingURL=index.js.map
},{"../../core/Utils":7,"../../uppy-base/src/plugins/Webcam":46,"../Plugin":37,"./CameraScreen":41,"./PermissionsScreen":42,"./WebcamIcon":43}],45:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _getName = function _getName(id) {
return id.split('-').map(function (s) {
return s.charAt(0).toUpperCase() + s.slice(1);
}).join(' ');
};
var Provider = function () {
function Provider(opts) {
_classCallCheck(this, Provider);
this.opts = opts;
this.provider = opts.provider;
this.id = this.provider;
this.name = this.opts.name || _getName(this.id);
}
_createClass(Provider, [{
key: 'auth',
value: function auth() {
return fetch(this.opts.host + '/' + this.provider + '/authorize', {
method: 'get',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application.json'
}
}).then(function (res) {
return res.json().then(function (payload) {
return payload.isAuthenticated;
});
});
}
}, {
key: 'list',
value: function list() {
var directory = arguments.length <= 0 || arguments[0] === undefined ? 'root' : arguments[0];
return fetch(this.opts.host + '/' + this.provider + '/list?dir=' + directory, {
method: 'get',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then(function (res) {
return res.json();
});
}
}, {
key: 'logout',
value: function logout() {
var redirect = arguments.length <= 0 || arguments[0] === undefined ? location.href : arguments[0];
return fetch(this.opts.host + '/' + this.provider + '/logout?redirect=' + redirect, {
method: 'get',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
});
}
}]);
return Provider;
}();
exports.default = Provider;
//# sourceMappingURL=Provider.js.map
},{}],46:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _dataURItoFile = require('../utils/dataURItoFile');
var _dataURItoFile2 = _interopRequireDefault(_dataURItoFile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Webcam Plugin
*/
var Webcam = function () {
function Webcam() {
var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, Webcam);
this._userMedia;
this.userMedia = true;
this.protocol = location.protocol.match(/https/i) ? 'https' : 'http';
// set default options
var defaultOptions = {
enableFlash: true
};
var defaultParams = {
swfURL: 'webcam.swf',
width: 400,
height: 300,
dest_width: 800, // size of captured image
dest_height: 600, // these default to width/height
image_format: 'jpeg', // image format (may be jpeg or png)
jpeg_quality: 90, // jpeg image quality from 0 (worst) to 100 (best)
enable_flash: true, // enable flash fallback,
force_flash: false, // force flash mode,
flip_horiz: false, // flip image horiz (mirror mode)
fps: 30, // camera frames per second
upload_name: 'webcam', // name of file in upload post data
constraints: null, // custom user media constraints,
flashNotDetectedText: 'ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).',
noInterfaceFoundText: 'No supported webcam interface found.',
unfreeze_snap: true // Whether to unfreeze the camera after snap (defaults to true)
};
this.params = Object.assign({}, defaultParams, params);
// merge default options with the ones set by user
this.opts = Object.assign({}, defaultOptions, opts);
// Camera controls
this.start = this.start.bind(this);
this.init = this.init.bind(this);
this.stop = this.stop.bind(this);
// this.startRecording = this.startRecording.bind(this)
// this.stopRecording = this.stopRecording.bind(this)
this.takeSnapshot = this.takeSnapshot.bind(this);
this.getImage = this.getImage.bind(this);
this.getSWFHTML = this.getSWFHTML.bind(this);
this.detectFlash = this.detectFlash.bind(this);
this.getUserMedia = this.getUserMedia.bind(this);
this.getMediaDevices = this.getMediaDevices.bind(this);
}
/**
* Checks for getUserMedia support
*/
_createClass(Webcam, [{
key: 'init',
value: function init() {
var _this = this;
// initialize, check for getUserMedia support
this.mediaDevices = this.getMediaDevices();
this.userMedia = this.getUserMedia(this.mediaDevices);
// Make sure media stream is closed when navigating away from page
if (this.userMedia) {
window.addEventListener('beforeunload', function (event) {
_this.reset();
});
}
return {
mediaDevices: this.mediaDevices,
userMedia: this.userMedia
};
}
// Setup getUserMedia, with polyfill for older browsers
// Adapted from: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
}, {
key: 'getMediaDevices',
value: function getMediaDevices() {
return navigator.mediaDevices && navigator.mediaDevices.getUserMedia ? navigator.mediaDevices : navigator.mozGetUserMedia || navigator.webkitGetUserMedia ? {
getUserMedia: function getUserMedia(opts) {
return new Promise(function (resolve, reject) {
(navigator.mozGetUserMedia || navigator.webkitGetUserMedia).call(navigator, opts, resolve, reject);
});
}
} : null;
}
}, {
key: 'getUserMedia',
value: function getUserMedia(mediaDevices) {
var userMedia = true;
// Older versions of firefox (< 21) apparently claim support but user media does not actually work
if (navigator.userAgent.match(/Firefox\D+(\d+)/)) {
if (parseInt(RegExp.$1, 10) < 21) {
return null;
}
}
window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
return userMedia && !!mediaDevices && !!window.URL;
}
}, {
key: 'start',
value: function start() {
var _this2 = this;
this.userMedia = this._userMedia === undefined ? this.userMedia : this._userMedia;
return new Promise(function (resolve, reject) {
if (_this2.userMedia) {
// ask user for access to their camera
_this2.mediaDevices.getUserMedia({
audio: false,
video: true
}).then(function (stream) {
return resolve(stream);
}).catch(function (err) {
return reject(err);
});
}
});
}
/**
* Detects if browser supports flash
* Code snippet borrowed from: https://github.com/swfobject/swfobject
*
* @return {bool} flash supported
*/
}, {
key: 'detectFlash',
value: function detectFlash() {
var SHOCKWAVE_FLASH = 'Shockwave Flash';
var SHOCKWAVE_FLASH_AX = 'ShockwaveFlash.ShockwaveFlash';
var FLASH_MIME_TYPE = 'application/x-shockwave-flash';
var win = window;
var nav = navigator;
var hasFlash = false;
if (typeof nav.plugins !== 'undefined' && _typeof(nav.plugins[SHOCKWAVE_FLASH]) === 'object') {
var desc = nav.plugins[SHOCKWAVE_FLASH].description;
if (desc && typeof nav.mimeTypes !== 'undefined' && nav.mimeTypes[FLASH_MIME_TYPE] && nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin) {
hasFlash = true;
}
} else if (typeof win.ActiveXObject !== 'undefined') {
try {
var ax = new win.ActiveXObject(SHOCKWAVE_FLASH_AX);
if (ax) {
var ver = ax.GetVariable('$version');
if (ver) hasFlash = true;
}
} catch (e) {}
}
return hasFlash;
}
}, {
key: 'reset',
value: function reset() {
// shutdown camera, reset to potentially attach again
if (this.preview_active) this.unfreeze();
if (this.userMedia) {
if (this.stream) {
if (this.stream.getVideoTracks) {
// get video track to call stop on it
var tracks = this.stream.getVideoTracks();
if (tracks && tracks[0] && tracks[0].stop) tracks[0].stop();
} else if (this.stream.stop) {
// deprecated, may be removed in future
this.stream.stop();
}
}
delete this.stream;
delete this.video;
}
if (this.userMedia !== true) {
// call for turn off camera in flash
this.getMovie()._releaseCamera();
}
}
}, {
key: 'getSWFHTML',
value: function getSWFHTML() {
// Return HTML for embedding flash based webcam capture movie
var swfURL = this.params.swfURL;
// make sure we aren't running locally (flash doesn't work)
if (location.protocol.match(/file/)) {
return '<h3 style="color:red">ERROR: the Webcam.js Flash fallback does not work from local disk. Please run it from a web server.</h3>';
}
// make sure we have flash
if (!this.detectFlash()) {
return '<h3 style="color:red">No flash</h3>';
}
// set default swfURL if not explicitly set
if (!swfURL) {
// find our script tag, and use that base URL
var base_url = '';
var scpts = document.getElementsByTagName('script');
for (var idx = 0, len = scpts.length; idx < len; idx++) {
var src = scpts[idx].getAttribute('src');
if (src && src.match(/\/webcam(\.min)?\.js/)) {
base_url = src.replace(/\/webcam(\.min)?\.js.*$/, '');
idx = len;
}
}
if (base_url) swfURL = base_url + '/webcam.swf';else swfURL = 'webcam.swf';
}
// // if this is the user's first visit, set flashvar so flash privacy settings panel is shown first
// if (window.localStorage && !localStorage.getItem('visited')) {
// // this.params.new_user = 1
// localStorage.setItem('visited', 1)
// }
// this.params.new_user = 1
// construct flashvars string
var flashvars = '';
for (var key in this.params) {
if (flashvars) flashvars += '&';
flashvars += key + '=' + escape(this.params[key]);
}
// construct object/embed tag
return '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="' + this.protocol + '://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="' + this.params.width + '" height="' + this.params.height + '" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="' + swfURL + '" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="' + flashvars + '"/><embed id="webcam_movie_embed" src="' + swfURL + '" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="' + this.params.width + '" height="' + this.params.height + '" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="' + flashvars + '"></embed></object>';
}
}, {
key: 'getMovie',
value: function getMovie() {
// get reference to movie object/embed in DOM
var movie = document.getElementById('webcam_movie_obj');
if (!movie || !movie._snap) movie = document.getElementById('webcam_movie_embed');
if (!movie) console.log('getMovie error');
return movie;
}
/**
* Stops the webcam capture and video playback.
*/
}, {
key: 'stop',
value: function stop() {
var video = this.video;
var videoStream = this.videoStream;
this.updateState({
cameraReady: false
});
if (videoStream) {
if (videoStream.stop) {
videoStream.stop();
} else if (videoStream.msStop) {
videoStream.msStop();
}
videoStream.onended = null;
videoStream = null;
}
if (video) {
video.onerror = null;
video.pause();
if (video.mozSrcObject) {
video.mozSrcObject = null;
}
video.src = '';
}
this.video = document.querySelector('.UppyWebcam-video');
this.canvas = document.querySelector('.UppyWebcam-canvas');
}
}, {
key: 'flashNotify',
value: function flashNotify(type, msg) {
// receive notification from flash about event
switch (type) {
case 'flashLoadComplete':
// movie loaded successfully
break;
case 'cameraLive':
// camera is live and ready to snap
this.live = true;
break;
case 'error':
// Flash error
console.log('There was a flash error', msg);
break;
default:
// catch-all event, just in case
console.log('webcam flash_notify: ' + type + ': ' + msg);
break;
}
}
}, {
key: 'configure',
value: function configure(panel) {
// open flash configuration panel -- specify tab name:
// 'camera', 'privacy', 'default', 'localStorage', 'microphone', 'settingsManager'
if (!panel) panel = 'camera';
this.getMovie()._configure(panel);
}
/**
* Takes a snapshot and displays it in a canvas.
*/
}, {
key: 'getImage',
value: function getImage(video, opts) {
var canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
var dataUrl = canvas.toDataURL(opts.mimeType);
var file = (0, _dataURItoFile2.default)(dataUrl, {
name: opts.name
});
return {
dataUrl: dataUrl,
data: file,
type: opts.mimeType
};
}
}, {
key: 'takeSnapshot',
value: function takeSnapshot(video, canvas) {
var opts = {
name: 'webcam-' + Date.now() + '.jpg',
mimeType: 'image/jpeg'
};
var image = this.getImage(video, canvas, opts);
var tagFile = {
source: this.id,
name: opts.name,
data: image.data,
type: opts.type
};
return tagFile;
}
}]);
return Webcam;
}();
exports.default = Webcam;
//# sourceMappingURL=Webcam.js.map
},{"../utils/dataURItoFile":47}],47:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (dataURI, opts) {
return dataURItoBlob(dataURI, opts, true);
};
function dataURItoBlob(dataURI, opts, toFile) {
// get the base64 data
var data = dataURI.split(',')[1];
// user may provide mime type, if not get it from data URI
var mimeType = opts.mimeType || dataURI.split(',')[0].split(':')[1].split(';')[0];
// default to plain/text if data URI has no mimeType
if (mimeType == null) {
mimeType = 'plain/text';
}
var binary = atob(data);
var array = [];
for (var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
// Convert to a File?
if (toFile) {
return new File([new Uint8Array(array)], opts.name || '', { type: mimeType });
}
return new Blob([new Uint8Array(array)], { type: mimeType });
}
//# sourceMappingURL=dataURItoFile.js.map
},{}],48:[function(require,module,exports){
module.exports = dragDrop
var flatten = require('flatten')
var parallel = require('run-parallel')
function dragDrop (elem, listeners) {
if (typeof elem === 'string') {
elem = window.document.querySelector(elem)
}
if (typeof listeners === 'function') {
listeners = { onDrop: listeners }
}
var timeout
elem.addEventListener('dragenter', stopEvent, false)
elem.addEventListener('dragover', onDragOver, false)
elem.addEventListener('dragleave', onDragLeave, false)
elem.addEventListener('drop', onDrop, false)
// Function to remove drag-drop listeners
return function remove () {
removeDragClass()
elem.removeEventListener('dragenter', stopEvent, false)
elem.removeEventListener('dragover', onDragOver, false)
elem.removeEventListener('dragleave', onDragLeave, false)
elem.removeEventListener('drop', onDrop, false)
}
function onDragOver (e) {
e.stopPropagation()
e.preventDefault()
if (e.dataTransfer.items) {
// Only add "drag" class when `items` contains a file
var items = toArray(e.dataTransfer.items).filter(function (item) {
return item.kind === 'file'
})
if (items.length === 0) return
}
elem.classList.add('drag')
clearTimeout(timeout)
if (listeners.onDragOver) {
listeners.onDragOver(e)
}
e.dataTransfer.dropEffect = 'copy'
return false
}
function onDragLeave (e) {
e.stopPropagation()
e.preventDefault()
if (listeners.onDragLeave) {
listeners.onDragLeave(e)
}
clearTimeout(timeout)
timeout = setTimeout(removeDragClass, 50)
return false
}
function onDrop (e) {
e.stopPropagation()
e.preventDefault()
if (listeners.onDragLeave) {
listeners.onDragLeave(e)
}
clearTimeout(timeout)
removeDragClass()
var pos = {
x: e.clientX,
y: e.clientY
}
if (e.dataTransfer.items) {
// Handle directories in Chrome using the proprietary FileSystem API
var items = toArray(e.dataTransfer.items).filter(function (item) {
return item.kind === 'file'
})
if (items.length === 0) return
parallel(items.map(function (item) {
return function (cb) {
processEntry(item.webkitGetAsEntry(), cb)
}
}), function (err, results) {
// This catches permission errors with file:// in Chrome. This should never
// throw in production code, so the user does not need to use try-catch.
if (err) throw err
if (listeners.onDrop) {
listeners.onDrop(flatten(results), pos)
}
})
} else {
var files = toArray(e.dataTransfer.files)
if (files.length === 0) return
files.forEach(function (file) {
file.fullPath = '/' + file.name
})
if (listeners.onDrop) {
listeners.onDrop(files, pos)
}
}
return false
}
function removeDragClass () {
elem.classList.remove('drag')
}
}
function stopEvent (e) {
e.stopPropagation()
e.preventDefault()
return false
}
function processEntry (entry, cb) {
var entries = []
if (entry.isFile) {
entry.file(function (file) {
file.fullPath = entry.fullPath // preserve pathing for consumer
cb(null, file)
}, function (err) {
cb(err)
})
} else if (entry.isDirectory) {
var reader = entry.createReader()
readEntries()
}
function readEntries () {
reader.readEntries(function (entries_) {
if (entries_.length > 0) {
entries = entries.concat(toArray(entries_))
readEntries() // continue reading entries until `readEntries` returns no more
} else {
doneEntries()
}
})
}
function doneEntries () {
parallel(entries.map(function (entry) {
return function (cb) {
processEntry(entry, cb)
}
}), cb)
}
}
function toArray (list) {
return Array.prototype.slice.call(list || [], 0)
}
},{"flatten":49,"run-parallel":50}],49:[function(require,module,exports){
module.exports = function flatten(list, depth) {
depth = (typeof depth == 'number') ? depth : Infinity;
if (!depth) {
if (Array.isArray(list)) {
return list.map(function(i) { return i; });
}
return list;
}
return _flatten(list, 1);
function _flatten(list, d) {
return list.reduce(function (acc, item) {
if (Array.isArray(item) && d < depth) {
return acc.concat(_flatten(item, d + 1));
}
else {
return acc.concat(item);
}
}, []);
}
};
},{}],50:[function(require,module,exports){
(function (process){
module.exports = function (tasks, cb) {
var results, pending, keys
var isSync = true
if (Array.isArray(tasks)) {
results = []
pending = tasks.length
} else {
keys = Object.keys(tasks)
results = {}
pending = keys.length
}
function done (err) {
function end () {
if (cb) cb(err, results)
cb = null
}
if (isSync) process.nextTick(end)
else end()
}
function each (i, err, result) {
results[i] = result
if (--pending === 0 || err) {
done(err)
}
}
if (!pending) {
// empty
done(null)
} else if (keys) {
// object
keys.forEach(function (key) {
tasks[key](function (err, result) { each(key, err, result) })
})
} else {
// array
tasks.forEach(function (task, i) {
task(function (err, result) { each(i, err, result) })
})
}
isSync = false
}
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9kcmFnLWRyb3Avbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFza3MsIGNiKSB7XG4gIHZhciByZXN1bHRzLCBwZW5kaW5nLCBrZXlzXG4gIHZhciBpc1N5bmMgPSB0cnVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgcmVzdWx0cyA9IFtdXG4gICAgcGVuZGluZyA9IHRhc2tzLmxlbmd0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh0YXNrcylcbiAgICByZXN1bHRzID0ge31cbiAgICBwZW5kaW5nID0ga2V5cy5sZW5ndGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUgKGVycikge1xuICAgIGZ1bmN0aW9uIGVuZCAoKSB7XG4gICAgICBpZiAoY2IpIGNiKGVyciwgcmVzdWx0cylcbiAgICAgIGNiID0gbnVsbFxuICAgIH1cbiAgICBpZiAoaXNTeW5jKSBwcm9jZXNzLm5leHRUaWNrKGVuZClcbiAgICBlbHNlIGVuZCgpXG4gIH1cblxuICBmdW5jdGlvbiBlYWNoIChpLCBlcnIsIHJlc3VsdCkge1xuICAgIHJlc3VsdHNbaV0gPSByZXN1bHRcbiAgICBpZiAoLS1wZW5kaW5nID09PSAwIHx8IGVycikge1xuICAgICAgZG9uZShlcnIpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgLy8gZW1wdHlcbiAgICBkb25lKG51bGwpXG4gIH0gZWxzZSBpZiAoa2V5cykge1xuICAgIC8vIG9iamVjdFxuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB0YXNrc1trZXldKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyBlYWNoKGtleSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBhcnJheVxuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2ssIGkpIHtcbiAgICAgIHRhc2soZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goaSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlzU3luYyA9IGZhbHNlXG59XG4iXX0=
},{"_process":3}],51:[function(require,module,exports){
(function (process,global){
/*!
* @overview es6-promise - a tiny implementation of Promises/A+.
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
* @license Licensed under MIT license
* See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
* @version 3.2.1
*/
(function() {
"use strict";
function lib$es6$promise$utils$$objectOrFunction(x) {
return typeof x === 'function' || (typeof x === 'object' && x !== null);
}
function lib$es6$promise$utils$$isFunction(x) {
return typeof x === 'function';
}
function lib$es6$promise$utils$$isMaybeThenable(x) {
return typeof x === 'object' && x !== null;
}
var lib$es6$promise$utils$$_isArray;
if (!Array.isArray) {
lib$es6$promise$utils$$_isArray = function (x) {
return Object.prototype.toString.call(x) === '[object Array]';
};
} else {
lib$es6$promise$utils$$_isArray = Array.isArray;
}
var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;
var lib$es6$promise$asap$$len = 0;
var lib$es6$promise$asap$$vertxNext;
var lib$es6$promise$asap$$customSchedulerFn;
var lib$es6$promise$asap$$asap = function asap(callback, arg) {
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;
lib$es6$promise$asap$$len += 2;
if (lib$es6$promise$asap$$len === 2) {
// If len is 2, that means that we need to schedule an async flush.
// If additional callbacks are queued before the queue is flushed, they
// will be processed by this flush that we are scheduling.
if (lib$es6$promise$asap$$customSchedulerFn) {
lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);
} else {
lib$es6$promise$asap$$scheduleFlush();
}
}
}
function lib$es6$promise$asap$$setScheduler(scheduleFn) {
lib$es6$promise$asap$$customSchedulerFn = scheduleFn;
}
function lib$es6$promise$asap$$setAsap(asapFn) {
lib$es6$promise$asap$$asap = asapFn;
}
var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;
var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
var lib$es6$promise$asap$$isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
// test for web worker but not in IE10
var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&
typeof importScripts !== 'undefined' &&
typeof MessageChannel !== 'undefined';
// node
function lib$es6$promise$asap$$useNextTick() {
// node version 0.10.x displays a deprecation warning when nextTick is used recursively
// see https://github.com/cujojs/when/issues/410 for details
return function() {
process.nextTick(lib$es6$promise$asap$$flush);
};
}
// vertx
function lib$es6$promise$asap$$useVertxTimer() {
return function() {
lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);
};
}
function lib$es6$promise$asap$$useMutationObserver() {
var iterations = 0;
var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);
var node = document.createTextNode('');
observer.observe(node, { characterData: true });
return function() {
node.data = (iterations = ++iterations % 2);
};
}
// web worker
function lib$es6$promise$asap$$useMessageChannel() {
var channel = new MessageChannel();
channel.port1.onmessage = lib$es6$promise$asap$$flush;
return function () {
channel.port2.postMessage(0);
};
}
function lib$es6$promise$asap$$useSetTimeout() {
return function() {
setTimeout(lib$es6$promise$asap$$flush, 1);
};
}
var lib$es6$promise$asap$$queue = new Array(1000);
function lib$es6$promise$asap$$flush() {
for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {
var callback = lib$es6$promise$asap$$queue[i];
var arg = lib$es6$promise$asap$$queue[i+1];
callback(arg);
lib$es6$promise$asap$$queue[i] = undefined;
lib$es6$promise$asap$$queue[i+1] = undefined;
}
lib$es6$promise$asap$$len = 0;
}
function lib$es6$promise$asap$$attemptVertx() {
try {
var r = require;
var vertx = r('vertx');
lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;
return lib$es6$promise$asap$$useVertxTimer();
} catch(e) {
return lib$es6$promise$asap$$useSetTimeout();
}
}
var lib$es6$promise$asap$$scheduleFlush;
// Decide what async method to use to triggering processing of queued callbacks:
if (lib$es6$promise$asap$$isNode) {
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();
} else if (lib$es6$promise$asap$$BrowserMutationObserver) {
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();
} else if (lib$es6$promise$asap$$isWorker) {
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();
} else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx();
} else {
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();
}
function lib$es6$promise$then$$then(onFulfillment, onRejection) {
var parent = this;
var child = new this.constructor(lib$es6$promise$$internal$$noop);
if (child[lib$es6$promise$$internal$$PROMISE_ID] === undefined) {
lib$es6$promise$$internal$$makePromise(child);
}
var state = parent._state;
if (state) {
var callback = arguments[state - 1];
lib$es6$promise$asap$$asap(function(){
lib$es6$promise$$internal$$invokeCallback(state, child, callback, parent._result);
});
} else {
lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
}
return child;
}
var lib$es6$promise$then$$default = lib$es6$promise$then$$then;
function lib$es6$promise$promise$resolve$$resolve(object) {
/*jshint validthis:true */
var Constructor = this;
if (object && typeof object === 'object' && object.constructor === Constructor) {
return object;
}
var promise = new Constructor(lib$es6$promise$$internal$$noop);
lib$es6$promise$$internal$$resolve(promise, object);
return promise;
}
var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
var lib$es6$promise$$internal$$PROMISE_ID = Math.random().toString(36).substring(16);
function lib$es6$promise$$internal$$noop() {}
var lib$es6$promise$$internal$$PENDING = void 0;
var lib$es6$promise$$internal$$FULFILLED = 1;
var lib$es6$promise$$internal$$REJECTED = 2;
var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();
function lib$es6$promise$$internal$$selfFulfillment() {
return new TypeError("You cannot resolve a promise with itself");
}
function lib$es6$promise$$internal$$cannotReturnOwn() {
return new TypeError('A promises callback cannot return that same promise.');
}
function lib$es6$promise$$internal$$getThen(promise) {
try {
return promise.then;
} catch(error) {
lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;
return lib$es6$promise$$internal$$GET_THEN_ERROR;
}
}
function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {
try {
then.call(value, fulfillmentHandler, rejectionHandler);
} catch(e) {
return e;
}
}
function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {
lib$es6$promise$asap$$asap(function(promise) {
var sealed = false;
var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {
if (sealed) { return; }
sealed = true;
if (thenable !== value) {
lib$es6$promise$$internal$$resolve(promise, value);
} else {
lib$es6$promise$$internal$$fulfill(promise, value);
}
}, function(reason) {
if (sealed) { return; }
sealed = true;
lib$es6$promise$$internal$$reject(promise, reason);
}, 'Settle: ' + (promise._label || ' unknown promise'));
if (!sealed && error) {
sealed = true;
lib$es6$promise$$internal$$reject(promise, error);
}
}, promise);
}
function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {
if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {
lib$es6$promise$$internal$$fulfill(promise, thenable._result);
} else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {
lib$es6$promise$$internal$$reject(promise, thenable._result);
} else {
lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {
lib$es6$promise$$internal$$resolve(promise, value);
}, function(reason) {
lib$es6$promise$$internal$$reject(promise, reason);
});
}
}
function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable, then) {
if (maybeThenable.constructor === promise.constructor &&
then === lib$es6$promise$then$$default &&
constructor.resolve === lib$es6$promise$promise$resolve$$default) {
lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);
} else {
if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);
} else if (then === undefined) {
lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
} else if (lib$es6$promise$utils$$isFunction(then)) {
lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);
} else {
lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
}
}
}
function lib$es6$promise$$internal$$resolve(promise, value) {
if (promise === value) {
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment());
} else if (lib$es6$promise$utils$$objectOrFunction(value)) {
lib$es6$promise$$internal$$handleMaybeThenable(promise, value, lib$es6$promise$$internal$$getThen(value));
} else {
lib$es6$promise$$internal$$fulfill(promise, value);
}
}
function lib$es6$promise$$internal$$publishRejection(promise) {
if (promise._onerror) {
promise._onerror(promise._result);
}
lib$es6$promise$$internal$$publish(promise);
}
function lib$es6$promise$$internal$$fulfill(promise, value) {
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
promise._result = value;
promise._state = lib$es6$promise$$internal$$FULFILLED;
if (promise._subscribers.length !== 0) {
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);
}
}
function lib$es6$promise$$internal$$reject(promise, reason) {
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
promise._state = lib$es6$promise$$internal$$REJECTED;
promise._result = reason;
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);
}
function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {
var subscribers = parent._subscribers;
var length = subscribers.length;
parent._onerror = null;
subscribers[length] = child;
subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;
subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;
if (length === 0 && parent._state) {
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);
}
}
function lib$es6$promise$$internal$$publish(promise) {
var subscribers = promise._subscribers;
var settled = promise._state;
if (subscribers.length === 0) { return; }
var child, callback, detail = promise._result;
for (var i = 0; i < subscribers.length; i += 3) {
child = subscribers[i];
callback = subscribers[i + settled];
if (child) {
lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);
} else {
callback(detail);
}
}
promise._subscribers.length = 0;
}
function lib$es6$promise$$internal$$ErrorObject() {
this.error = null;
}
var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();
function lib$es6$promise$$internal$$tryCatch(callback, detail) {
try {
return callback(detail);
} catch(e) {
lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;
return lib$es6$promise$$internal$$TRY_CATCH_ERROR;
}
}
function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {
var hasCallback = lib$es6$promise$utils$$isFunction(callback),
value, error, succeeded, failed;
if (hasCallback) {
value = lib$es6$promise$$internal$$tryCatch(callback, detail);
if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {
failed = true;
error = value.error;
value = null;
} else {
succeeded = true;
}
if (promise === value) {
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());
return;
}
} else {
value = detail;
succeeded = true;
}
if (promise._state !== lib$es6$promise$$internal$$PENDING) {
// noop
} else if (hasCallback && succeeded) {
lib$es6$promise$$internal$$resolve(promise, value);
} else if (failed) {
lib$es6$promise$$internal$$reject(promise, error);
} else if (settled === lib$es6$promise$$internal$$FULFILLED) {
lib$es6$promise$$internal$$fulfill(promise, value);
} else if (settled === lib$es6$promise$$internal$$REJECTED) {
lib$es6$promise$$internal$$reject(promise, value);
}
}
function lib$es6$promise$$internal$$initializePromise(promise, resolver) {
try {
resolver(function resolvePromise(value){
lib$es6$promise$$internal$$resolve(promise, value);
}, function rejectPromise(reason) {
lib$es6$promise$$internal$$reject(promise, reason);
});
} catch(e) {
lib$es6$promise$$internal$$reject(promise, e);
}
}
var lib$es6$promise$$internal$$id = 0;
function lib$es6$promise$$internal$$nextId() {
return lib$es6$promise$$internal$$id++;
}
function lib$es6$promise$$internal$$makePromise(promise) {
promise[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$id++;
promise._state = undefined;
promise._result = undefined;
promise._subscribers = [];
}
function lib$es6$promise$promise$all$$all(entries) {
return new lib$es6$promise$enumerator$$default(this, entries).promise;
}
var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;
function lib$es6$promise$promise$race$$race(entries) {
/*jshint validthis:true */
var Constructor = this;
if (!lib$es6$promise$utils$$isArray(entries)) {
return new Constructor(function(resolve, reject) {
reject(new TypeError('You must pass an array to race.'));
});
} else {
return new Constructor(function(resolve, reject) {
var length = entries.length;
for (var i = 0; i < length; i++) {
Constructor.resolve(entries[i]).then(resolve, reject);
}
});
}
}
var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
function lib$es6$promise$promise$reject$$reject(reason) {
/*jshint validthis:true */
var Constructor = this;
var promise = new Constructor(lib$es6$promise$$internal$$noop);
lib$es6$promise$$internal$$reject(promise, reason);
return promise;
}
var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
function lib$es6$promise$promise$$needsResolver() {
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
}
function lib$es6$promise$promise$$needsNew() {
throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
}
var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;
/**
Promise objects represent the eventual result of an asynchronous operation. The
primary way of interacting with a promise is through its `then` method, which
registers callbacks to receive either a promise's eventual value or the reason
why the promise cannot be fulfilled.
Terminology
-----------
- `promise` is an object or function with a `then` method whose behavior conforms to this specification.
- `thenable` is an object or function that defines a `then` method.
- `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
- `exception` is a value that is thrown using the throw statement.
- `reason` is a value that indicates why a promise was rejected.
- `settled` the final resting state of a promise, fulfilled or rejected.
A promise can be in one of three states: pending, fulfilled, or rejected.
Promises that are fulfilled have a fulfillment value and are in the fulfilled
state. Promises that are rejected have a rejection reason and are in the
rejected state. A fulfillment value is never a thenable.
Promises can also be said to *resolve* a value. If this value is also a
promise, then the original promise's settled state will match the value's
settled state. So a promise that *resolves* a promise that rejects will
itself reject, and a promise that *resolves* a promise that fulfills will
itself fulfill.
Basic Usage:
------------
```js
var promise = new Promise(function(resolve, reject) {
// on success
resolve(value);
// on failure
reject(reason);
});
promise.then(function(value) {
// on fulfillment
}, function(reason) {
// on rejection
});
```
Advanced Usage:
---------------
Promises shine when abstracting away asynchronous interactions such as
`XMLHttpRequest`s.
```js
function getJSON(url) {
return new Promise(function(resolve, reject){
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onreadystatechange = handler;
xhr.responseType = 'json';
xhr.setRequestHeader('Accept', 'application/json');
xhr.send();
function handler() {
if (this.readyState === this.DONE) {
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
}
}
};
});
}
getJSON('/posts.json').then(function(json) {
// on fulfillment
}, function(reason) {
// on rejection
});
```
Unlike callbacks, promises are great composable primitives.
```js
Promise.all([
getJSON('/posts'),
getJSON('/comments')
]).then(function(values){
values[0] // => postsJSON
values[1] // => commentsJSON
return values;
});
```
@class Promise
@param {function} resolver
Useful for tooling.
@constructor
*/
function lib$es6$promise$promise$$Promise(resolver) {
this[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$nextId();
this._result = this._state = undefined;
this._subscribers = [];
if (lib$es6$promise$$internal$$noop !== resolver) {
typeof resolver !== 'function' && lib$es6$promise$promise$$needsResolver();
this instanceof lib$es6$promise$promise$$Promise ? lib$es6$promise$$internal$$initializePromise(this, resolver) : lib$es6$promise$promise$$needsNew();
}
}
lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;
lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;
lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;
lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;
lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;
lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;
lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;
lib$es6$promise$promise$$Promise.prototype = {
constructor: lib$es6$promise$promise$$Promise,
/**
The primary way of interacting with a promise is through its `then` method,
which registers callbacks to receive either a promise's eventual value or the
reason why the promise cannot be fulfilled.
```js
findUser().then(function(user){
// user is available
}, function(reason){
// user is unavailable, and you are given the reason why
});
```
Chaining
--------
The return value of `then` is itself a promise. This second, 'downstream'
promise is resolved with the return value of the first promise's fulfillment
or rejection handler, or rejected if the handler throws an exception.
```js
findUser().then(function (user) {
return user.name;
}, function (reason) {
return 'default name';
}).then(function (userName) {
// If `findUser` fulfilled, `userName` will be the user's name, otherwise it
// will be `'default name'`
});
findUser().then(function (user) {
throw new Error('Found user, but still unhappy');
}, function (reason) {
throw new Error('`findUser` rejected and we're unhappy');
}).then(function (value) {
// never reached
}, function (reason) {
// if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
// If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
});
```
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
```js
findUser().then(function (user) {
throw new PedagogicalException('Upstream error');
}).then(function (value) {
// never reached
}).then(function (value) {
// never reached
}, function (reason) {
// The `PedgagocialException` is propagated all the way down to here
});
```
Assimilation
------------
Sometimes the value you want to propagate to a downstream promise can only be
retrieved asynchronously. This can be achieved by returning a promise in the
fulfillment or rejection handler. The downstream promise will then be pending
until the returned promise is settled. This is called *assimilation*.
```js
findUser().then(function (user) {
return findCommentsByAuthor(user);
}).then(function (comments) {
// The user's comments are now available
});
```
If the assimliated promise rejects, then the downstream promise will also reject.
```js
findUser().then(function (user) {
return findCommentsByAuthor(user);
}).then(function (comments) {
// If `findCommentsByAuthor` fulfills, we'll have the value here
}, function (reason) {
// If `findCommentsByAuthor` rejects, we'll have the reason here
});
```
Simple Example
--------------
Synchronous Example
```javascript
var result;
try {
result = findResult();
// success
} catch(reason) {
// failure
}
```
Errback Example
```js
findResult(function(result, err){
if (err) {
// failure
} else {
// success
}
});
```
Promise Example;
```javascript
findResult().then(function(result){
// success
}, function(reason){
// failure
});
```
Advanced Example
--------------
Synchronous Example
```javascript
var author, books;
try {
author = findAuthor();
books = findBooksByAuthor(author);
// success
} catch(reason) {
// failure
}
```
Errback Example
```js
function foundBooks(books) {
}
function failure(reason) {
}
findAuthor(function(author, err){
if (err) {
failure(err);
// failure
} else {
try {
findBoooksByAuthor(author, function(books, err) {
if (err) {
failure(err);
} else {
try {
foundBooks(books);
} catch(reason) {
failure(reason);
}
}
});
} catch(error) {
failure(err);
}
// success
}
});
```
Promise Example;
```javascript
findAuthor().
then(findBooksByAuthor).
then(function(books){
// found books
}).catch(function(reason){
// something went wrong
});
```
@method then
@param {Function} onFulfilled
@param {Function} onRejected
Useful for tooling.
@return {Promise}
*/
then: lib$es6$promise$then$$default,
/**
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
as the catch block of a try/catch statement.
```js
function findAuthor(){
throw new Error('couldn't find that author');
}
// synchronous
try {
findAuthor();
} catch(reason) {
// something went wrong
}
// async with promises
findAuthor().catch(function(reason){
// something went wrong
});
```
@method catch
@param {Function} onRejection
Useful for tooling.
@return {Promise}
*/
'catch': function(onRejection) {
return this.then(null, onRejection);
}
};
var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;
function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {
this._instanceConstructor = Constructor;
this.promise = new Constructor(lib$es6$promise$$internal$$noop);
if (!this.promise[lib$es6$promise$$internal$$PROMISE_ID]) {
lib$es6$promise$$internal$$makePromise(this.promise);
}
if (lib$es6$promise$utils$$isArray(input)) {
this._input = input;
this.length = input.length;
this._remaining = input.length;
this._result = new Array(this.length);
if (this.length === 0) {
lib$es6$promise$$internal$$fulfill(this.promise, this._result);
} else {
this.length = this.length || 0;
this._enumerate();
if (this._remaining === 0) {
lib$es6$promise$$internal$$fulfill(this.promise, this._result);
}
}
} else {
lib$es6$promise$$internal$$reject(this.promise, lib$es6$promise$enumerator$$validationError());
}
}
function lib$es6$promise$enumerator$$validationError() {
return new Error('Array Methods must be provided an Array');
}
lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {
var length = this.length;
var input = this._input;
for (var i = 0; this._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
this._eachEntry(input[i], i);
}
};
lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {
var c = this._instanceConstructor;
var resolve = c.resolve;
if (resolve === lib$es6$promise$promise$resolve$$default) {
var then = lib$es6$promise$$internal$$getThen(entry);
if (then === lib$es6$promise$then$$default &&
entry._state !== lib$es6$promise$$internal$$PENDING) {
this._settledAt(entry._state, i, entry._result);
} else if (typeof then !== 'function') {
this._remaining--;
this._result[i] = entry;
} else if (c === lib$es6$promise$promise$$default) {
var promise = new c(lib$es6$promise$$internal$$noop);
lib$es6$promise$$internal$$handleMaybeThenable(promise, entry, then);
this._willSettleAt(promise, i);
} else {
this._willSettleAt(new c(function(resolve) { resolve(entry); }), i);
}
} else {
this._willSettleAt(resolve(entry), i);
}
};
lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {
var promise = this.promise;
if (promise._state === lib$es6$promise$$internal$$PENDING) {
this._remaining--;
if (state === lib$es6$promise$$internal$$REJECTED) {
lib$es6$promise$$internal$$reject(promise, value);
} else {
this._result[i] = value;
}
}
if (this._remaining === 0) {
lib$es6$promise$$internal$$fulfill(promise, this._result);
}
};
lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {
var enumerator = this;
lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {
enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);
}, function(reason) {
enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);
});
};
function lib$es6$promise$polyfill$$polyfill() {
var local;
if (typeof global !== 'undefined') {
local = global;
} else if (typeof self !== 'undefined') {
local = self;
} else {
try {
local = Function('return this')();
} catch (e) {
throw new Error('polyfill failed because global object is unavailable in this environment');
}
}
var P = local.Promise;
if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {
return;
}
local.Promise = lib$es6$promise$promise$$default;
}
var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;
var lib$es6$promise$umd$$ES6Promise = {
'Promise': lib$es6$promise$promise$$default,
'polyfill': lib$es6$promise$polyfill$$default
};
/* global define:true module:true window: true */
if (typeof define === 'function' && define['amd']) {
define(function() { return lib$es6$promise$umd$$ES6Promise; });
} else if (typeof module !== 'undefined' && module['exports']) {
module['exports'] = lib$es6$promise$umd$$ES6Promise;
} else if (typeof this !== 'undefined') {
this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;
}
lib$es6$promise$polyfill$$default();
}).call(this);
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQG92ZXJ2aWV3IGVzNi1wcm9taXNlIC0gYSB0aW55IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2VzL0ErLlxuICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTQgWWVodWRhIEthdHosIFRvbSBEYWxlLCBTdGVmYW4gUGVubmVyIGFuZCBjb250cmlidXRvcnMgKENvbnZlcnNpb24gdG8gRVM2IEFQSSBieSBKYWtlIEFyY2hpYmFsZClcbiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2VcbiAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qYWtlYXJjaGliYWxkL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIDMuMi4xXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheSA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm47XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuXSA9IGNhbGxiYWNrO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKyAxXSA9IGFyZztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKz0gMjtcbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID09PSAyKSB7XG4gICAgICAgIC8vIElmIGxlbiBpcyAyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAgICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAgICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcChhc2FwRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gYXNhcEZuO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgfHwge307XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSA9IHR5cGVvZiBzZWxmID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4gICAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgLy8gbm9kZVxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpIHtcbiAgICAgIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jdWpvanMvd2hlbi9pc3N1ZXMvNDEwIGZvciBkZXRhaWxzXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2sobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gdmVydHhcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbm9kZS5kYXRhID0gKGl0ZXJhdGlvbnMgPSArK2l0ZXJhdGlvbnMgJSAyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gd2ViIHdvcmtlclxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpIHtcbiAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCwgMSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWUgPSBuZXcgQXJyYXkoMTAwMCk7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuOyBpKz0yKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXTtcbiAgICAgICAgdmFyIGFyZyA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdO1xuXG4gICAgICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0eCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByID0gcmVxdWlyZTtcbiAgICAgICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dCA9IHZlcnR4LnJ1bk9uTG9vcCB8fCB2ZXJ0eC5ydW5PbkNvbnRleHQ7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaDtcbiAgICAvLyBEZWNpZGUgd2hhdCBhc3luYyBtZXRob2QgdG8gdXNlIHRvIHRyaWdnZXJpbmcgcHJvY2Vzc2luZyBvZiBxdWV1ZWQgY2FsbGJhY2tzOlxuICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydHgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdGhlbiQkdGhlbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoY2hpbGRbbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUFJPTUlTRV9JRF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRtYWtlUHJvbWlzZShjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGF0ZSA9IHBhcmVudC5fc3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbc3RhdGUgLSAxXTtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCBwYXJlbnQuX3Jlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHRoZW4kJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkdGhlbiQkdGhlbjtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlKG9iamVjdCkge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmU7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBST01JU0VfSUQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMTYpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCgpIHt9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAgID0gdm9pZCAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgPSAxO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAgPSAyO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsZmlsbG1lbnQoKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW47XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB0aGVuYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoZW5hYmxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICAgICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gICAgICBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbikge1xuICAgICAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IgJiZcbiAgICAgICAgICB0aGVuID09PSBsaWIkZXM2JHByb21pc2UkdGhlbiQkZGVmYXVsdCAmJlxuICAgICAgICAgIGNvbnN0cnVjdG9yLnJlc29sdmUgPT09IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxmaWxsbWVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSB2YWx1ZS5lcnJvcjtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpZCA9IDA7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbmV4dElkKCkge1xuICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGlkKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbWFrZVByb21pc2UocHJvbWlzZSkge1xuICAgICAgcHJvbWlzZVtsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQUk9NSVNFX0lEXSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGlkKys7XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzID0gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGwoZW50cmllcykge1xuICAgICAgcmV0dXJuIG5ldyBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCh0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGw7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZShlbnRyaWVzKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBDb25zdHJ1Y3Rvci5yZXNvbHZlKGVudHJpZXNbaV0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2U7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3QocmVhc29uKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0O1xuXG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlO1xuICAgIC8qKlxuICAgICAgUHJvbWlzZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoZVxuICAgICAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgICAgIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvblxuICAgICAgd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIFRlcm1pbm9sb2d5XG4gICAgICAtLS0tLS0tLS0tLVxuXG4gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLlxuICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBhIHByb21pc2UpLlxuICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuXG4gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cblxuICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLlxuXG4gICAgICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZVxuICAgICAgcmVqZWN0ZWQgc3RhdGUuICBBIGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuXG5cbiAgICAgIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICAgICAgcHJvbWlzZSwgdGhlbiB0aGUgb3JpZ2luYWwgcHJvbWlzZSdzIHNldHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0aGUgdmFsdWUnc1xuICAgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsXG4gICAgICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gICAgICBpdHNlbGYgZnVsZmlsbC5cblxuXG4gICAgICBCYXNpYyBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBgYGBqc1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gb24gc3VjY2Vzc1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAvLyBvbiBmYWlsdXJlXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG5cbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS0tLS1cblxuICAgICAgUHJvbWlzZXMgc2hpbmUgd2hlbiBhYnN0cmFjdGluZyBhd2F5IGFzeW5jaHJvbm91cyBpbnRlcmFjdGlvbnMgc3VjaCBhc1xuICAgICAgYFhNTEh0dHBSZXF1ZXN0YHMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxlcjtcbiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICAgIHhoci5zZW5kKCk7XG5cbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdnZXRKU09OOiBgJyArIHVybCArICdgIGZhaWxlZCB3aXRoIHN0YXR1czogWycgKyB0aGlzLnN0YXR1cyArICddJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdldEpTT04oJy9wb3N0cy5qc29uJykudGhlbihmdW5jdGlvbihqc29uKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBVbmxpa2UgY2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLlxuXG4gICAgICBgYGBqc1xuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRKU09OKCcvcG9zdHMnKSxcbiAgICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgICAgIF0pLnRoZW4oZnVuY3Rpb24odmFsdWVzKXtcbiAgICAgICAgdmFsdWVzWzBdIC8vID0+IHBvc3RzSlNPTlxuICAgICAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBjbGFzcyBQcm9taXNlXG4gICAgICBAcGFyYW0ge2Z1bmN0aW9ufSByZXNvbHZlclxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZShyZXNvbHZlcikge1xuICAgICAgdGhpc1tsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQUk9NSVNFX0lEXSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5leHRJZCgpO1xuICAgICAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCAhPT0gcmVzb2x2ZXIpIHtcbiAgICAgICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCk7XG4gICAgICAgIHRoaXMgaW5zdGFuY2VvZiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSA/IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKSA6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLmFsbCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yYWNlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZXNvbHZlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZWplY3QgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldFNjaGVkdWxlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXI7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldEFzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fYXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwO1xuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucHJvdG90eXBlID0ge1xuICAgICAgY29uc3RydWN0b3I6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLFxuXG4gICAgLyoqXG4gICAgICBUaGUgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCxcbiAgICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgICByZWFzb24gd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7XG4gICAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91IGFyZSBnaXZlbiB0aGUgcmVhc29uIHdoeVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQ2hhaW5pbmdcbiAgICAgIC0tLS0tLS0tXG5cbiAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgYHRoZW5gIGlzIGl0c2VsZiBhIHByb21pc2UuICBUaGlzIHNlY29uZCwgJ2Rvd25zdHJlYW0nXG4gICAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgICBvciByZWplY3Rpb24gaGFuZGxlciwgb3IgcmVqZWN0ZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHQgbmFtZSc7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgICAgIC8vIHdpbGwgYmUgYCdkZWZhdWx0IG5hbWUnYFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLlxuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgICAgIH0pO1xuICAgICAgYGBgXG4gICAgICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgUGVkYWdvZ2ljYWxFeGNlcHRpb24oJ1Vwc3RyZWFtIGVycm9yJyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHByb3BhZ2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBc3NpbWlsYXRpb25cbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZVxuICAgICAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICAgIHVudGlsIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyJ3MgY29tbWVudHMgYXJlIG5vdyBhdmFpbGFibGVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgU2ltcGxlIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgYXV0aG9yLCBib29rcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXV0aG9yID0gZmluZEF1dGhvcigpO1xuICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG5cbiAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9va3MpIHtcblxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuXG4gICAgICB9XG5cbiAgICAgIGZpbmRBdXRob3IoZnVuY3Rpb24oYXV0aG9yLCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmluZEJvb29rc0J5QXV0aG9yKGF1dGhvciwgZnVuY3Rpb24oYm9va3MsIGVycikge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgZmFpbHVyZShyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZEF1dGhvcigpLlxuICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgICAgLy8gZm91bmQgYm9va3NcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIHRoZW5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGVkXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICB0aGVuOiBsaWIkZXM2JHByb21pc2UkdGhlbiQkZGVmYXVsdCxcblxuICAgIC8qKlxuICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZVxuICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzXG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQXV0aG9yKCk7XG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfVxuXG4gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzXG4gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgY2F0Y2hcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgICAgdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgICAgdGhpcy5wcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoIXRoaXMucHJvbWlzZVtsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQUk9NSVNFX0lEXSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRtYWtlUHJvbWlzZSh0aGlzLnByb21pc2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGlucHV0KSkge1xuICAgICAgICB0aGlzLl9pbnB1dCAgICAgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICB0aGlzLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgdGhpcy5fZW51bWVyYXRlKCk7XG4gICAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QodGhpcy5wcm9taXNlLCBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkdmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCR2YWxpZGF0aW9uRXJyb3IoKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCAgPSB0aGlzLmxlbmd0aDtcbiAgICAgIHZhciBpbnB1dCAgID0gdGhpcy5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyB0aGlzLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGMgPSB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuICAgICAgdmFyIHJlc29sdmUgPSBjLnJlc29sdmU7XG5cbiAgICAgIGlmIChyZXNvbHZlID09PSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0KSB7XG4gICAgICAgIHZhciB0aGVuID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihlbnRyeSk7XG5cbiAgICAgICAgaWYgKHRoZW4gPT09IGxpYiRlczYkcHJvbWlzZSR0aGVuJCRkZWZhdWx0ICYmXG4gICAgICAgICAgICBlbnRyeS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICB0aGlzLl9zZXR0bGVkQXQoZW50cnkuX3N0YXRlLCBpLCBlbnRyeS5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgICAgIHRoaXMuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgICB9IGVsc2UgaWYgKGMgPT09IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0KSB7XG4gICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgYyhsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIGVudHJ5LCB0aGVuKTtcbiAgICAgICAgICB0aGlzLl93aWxsU2V0dGxlQXQocHJvbWlzZSwgaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBjKGZ1bmN0aW9uKHJlc29sdmUpIHsgcmVzb2x2ZShlbnRyeSk7IH0pLCBpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHJlc29sdmUoZW50cnkpLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVzdWx0W2ldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24ocHJvbWlzZSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVELCBpLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IGdsb2JhbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgICBpZiAoUCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvY2FsLlByb21pc2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGw7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZSA9IHtcbiAgICAgICdQcm9taXNlJzogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1snRVM2UHJvbWlzZSddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQoKTtcbn0pLmNhbGwodGhpcyk7XG5cbiJdfQ==
},{"_process":3}],52:[function(require,module,exports){
/*!
* mime-types
* Copyright(c) 2014 Jonathan Ong
* Copyright(c) 2015 Douglas Christopher Wilson
* MIT Licensed
*/
'use strict'
/**
* Module dependencies.
* @private
*/
var db = require('mime-db')
var extname = require('path').extname
/**
* Module variables.
* @private
*/
var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/
var textTypeRegExp = /^text\//i
/**
* Module exports.
* @public
*/
exports.charset = charset
exports.charsets = { lookup: charset }
exports.contentType = contentType
exports.extension = extension
exports.extensions = Object.create(null)
exports.lookup = lookup
exports.types = Object.create(null)
// Populate the extensions/types maps
populateMaps(exports.extensions, exports.types)
/**
* Get the default charset for a MIME type.
*
* @param {string} type
* @return {boolean|string}
*/
function charset(type) {
if (!type || typeof type !== 'string') {
return false
}
// TODO: use media-typer
var match = extractTypeRegExp.exec(type)
var mime = match && db[match[1].toLowerCase()]
if (mime && mime.charset) {
return mime.charset
}
// default text/* to utf-8
if (match && textTypeRegExp.test(match[1])) {
return 'UTF-8'
}
return false
}
/**
* Create a full Content-Type header given a MIME type or extension.
*
* @param {string} str
* @return {boolean|string}
*/
function contentType(str) {
// TODO: should this even be in this module?
if (!str || typeof str !== 'string') {
return false
}
var mime = str.indexOf('/') === -1
? exports.lookup(str)
: str
if (!mime) {
return false
}
// TODO: use content-type or other module
if (mime.indexOf('charset') === -1) {
var charset = exports.charset(mime)
if (charset) mime += '; charset=' + charset.toLowerCase()
}
return mime
}
/**
* Get the default extension for a MIME type.
*
* @param {string} type
* @return {boolean|string}
*/
function extension(type) {
if (!type || typeof type !== 'string') {
return false
}
// TODO: use media-typer
var match = extractTypeRegExp.exec(type)
// get extensions
var exts = match && exports.extensions[match[1].toLowerCase()]
if (!exts || !exts.length) {
return false
}
return exts[0]
}
/**
* Lookup the MIME type for a file path/extension.
*
* @param {string} path
* @return {boolean|string}
*/
function lookup(path) {
if (!path || typeof path !== 'string') {
return false
}
// get the extension ("ext" or ".ext" or full path)
var extension = extname('x.' + path)
.toLowerCase()
.substr(1)
if (!extension) {
return false
}
return exports.types[extension] || false
}
/**
* Populate the extensions and types maps.
* @private
*/
function populateMaps(extensions, types) {
// source preference (least -> most)
var preference = ['nginx', 'apache', undefined, 'iana']
Object.keys(db).forEach(function forEachMimeType(type) {
var mime = db[type]
var exts = mime.extensions
if (!exts || !exts.length) {
return
}
// mime -> extensions
extensions[type] = exts
// extension -> mime
for (var i = 0; i < exts.length; i++) {
var extension = exts[i]
if (types[extension]) {
var from = preference.indexOf(db[types[extension]].source)
var to = preference.indexOf(mime.source)
if (types[extension] !== 'application/octet-stream'
&& from > to || (from === to && types[extension].substr(0, 12) === 'application/')) {
// skip the remapping
continue
}
}
// set the extension -> mime
types[extension] = type
}
})
}
},{"mime-db":54,"path":2}],53:[function(require,module,exports){
module.exports={
"application/1d-interleaved-parityfec": {
"source": "iana"
},
"application/3gpdash-qoe-report+xml": {
"source": "iana"
},
"application/3gpp-ims+xml": {
"source": "iana"
},
"application/a2l": {
"source": "iana"
},
"application/activemessage": {
"source": "iana"
},
"application/alto-costmap+json": {
"source": "iana",
"compressible": true
},
"application/alto-costmapfilter+json": {
"source": "iana",
"compressible": true
},
"application/alto-directory+json": {
"source": "iana",
"compressible": true
},
"application/alto-endpointcost+json": {
"source": "iana",
"compressible": true
},
"application/alto-endpointcostparams+json": {
"source": "iana",
"compressible": true
},
"application/alto-endpointprop+json": {
"source": "iana",
"compressible": true
},
"application/alto-endpointpropparams+json": {
"source": "iana",
"compressible": true
},
"application/alto-error+json": {
"source": "iana",
"compressible": true
},
"application/alto-networkmap+json": {
"source": "iana",
"compressible": true
},
"application/alto-networkmapfilter+json": {
"source": "iana",
"compressible": true
},
"application/aml": {
"source": "iana"
},
"application/andrew-inset": {
"source": "iana",
"extensions": ["ez"]
},
"application/applefile": {
"source": "iana"
},
"application/applixware": {
"source": "apache",
"extensions": ["aw"]
},
"application/atf": {
"source": "iana"
},
"application/atfx": {
"source": "iana"
},
"application/atom+xml": {
"source": "iana",
"compressible": true,
"extensions": ["atom"]
},
"application/atomcat+xml": {
"source": "iana",
"extensions": ["atomcat"]
},
"application/atomdeleted+xml": {
"source": "iana"
},
"application/atomicmail": {
"source": "iana"
},
"application/atomsvc+xml": {
"source": "iana",
"extensions": ["atomsvc"]
},
"application/atxml": {
"source": "iana"
},
"application/auth-policy+xml": {
"source": "iana"
},
"application/bacnet-xdd+zip": {
"source": "iana"
},
"application/batch-smtp": {
"source": "iana"
},
"application/bdoc": {
"compressible": false,
"extensions": ["bdoc"]
},
"application/beep+xml": {
"source": "iana"
},
"application/calendar+json": {
"source": "iana",
"compressible": true
},
"application/calendar+xml": {
"source": "iana"
},
"application/call-completion": {
"source": "iana"
},
"application/cals-1840": {
"source": "iana"
},
"application/cbor": {
"source": "iana"
},
"application/ccmp+xml": {
"source": "iana"
},
"application/ccxml+xml": {
"source": "iana",
"extensions": ["ccxml"]
},
"application/cdfx+xml": {
"source": "iana"
},
"application/cdmi-capability": {
"source": "iana",
"extensions": ["cdmia"]
},
"application/cdmi-container": {
"source": "iana",
"extensions": ["cdmic"]
},
"application/cdmi-domain": {
"source": "iana",
"extensions": ["cdmid"]
},
"application/cdmi-object": {
"source": "iana",
"extensions": ["cdmio"]
},
"application/cdmi-queue": {
"source": "iana",
"extensions": ["cdmiq"]
},
"application/cdni": {
"source": "iana"
},
"application/cea": {
"source": "iana"
},
"application/cea-2018+xml": {
"source": "iana"
},
"application/cellml+xml": {
"source": "iana"
},
"application/cfw": {
"source": "iana"
},
"application/cms": {
"source": "iana"
},
"application/cnrp+xml": {
"source": "iana"
},
"application/coap-group+json": {
"source": "iana",
"compressible": true
},
"application/commonground": {
"source": "iana"
},
"application/conference-info+xml": {
"source": "iana"
},
"application/cpl+xml": {
"source": "iana"
},
"application/csrattrs": {
"source": "iana"
},
"application/csta+xml": {
"source": "iana"
},
"application/cstadata+xml": {
"source": "iana"
},
"application/csvm+json": {
"source": "iana",
"compressible": true
},
"application/cu-seeme": {
"source": "apache",
"extensions": ["cu"]
},
"application/cybercash": {
"source": "iana"
},
"application/dart": {
"compressible": true
},
"application/dash+xml": {
"source": "iana",
"extensions": ["mpd"]
},
"application/dashdelta": {
"source": "iana"
},
"application/davmount+xml": {
"source": "iana",
"extensions": ["davmount"]
},
"application/dca-rft": {
"source": "iana"
},
"application/dcd": {
"source": "iana"
},
"application/dec-dx": {
"source": "iana"
},
"application/dialog-info+xml": {
"source": "iana"
},
"application/dicom": {
"source": "iana"
},
"application/dii": {
"source": "iana"
},
"application/dit": {
"source": "iana"
},
"application/dns": {
"source": "iana"
},
"application/docbook+xml": {
"source": "apache",
"extensions": ["dbk"]
},
"application/dskpp+xml": {
"source": "iana"
},
"application/dssc+der": {
"source": "iana",
"extensions": ["dssc"]
},
"application/dssc+xml": {
"source": "iana",
"extensions": ["xdssc"]
},
"application/dvcs": {
"source": "iana"
},
"application/ecmascript": {
"source": "iana",
"compressible": true,
"extensions": ["ecma"]
},
"application/edi-consent": {
"source": "iana"
},
"application/edi-x12": {
"source": "iana",
"compressible": false
},
"application/edifact": {
"source": "iana",
"compressible": false
},
"application/efi": {
"source": "iana"
},
"application/emergencycalldata.comment+xml": {
"source": "iana"
},
"application/emergencycalldata.deviceinfo+xml": {
"source": "iana"
},
"application/emergencycalldata.providerinfo+xml": {
"source": "iana"
},
"application/emergencycalldata.serviceinfo+xml": {
"source": "iana"
},
"application/emergencycalldata.subscriberinfo+xml": {
"source": "iana"
},
"application/emma+xml": {
"source": "iana",
"extensions": ["emma"]
},
"application/emotionml+xml": {
"source": "iana"
},
"application/encaprtp": {
"source": "iana"
},
"application/epp+xml": {
"source": "iana"
},
"application/epub+zip": {
"source": "iana",
"extensions": ["epub"]
},
"application/eshop": {
"source": "iana"
},
"application/exi": {
"source": "iana",
"extensions": ["exi"]
},
"application/fastinfoset": {
"source": "iana"
},
"application/fastsoap": {
"source": "iana"
},
"application/fdt+xml": {
"source": "iana"
},
"application/fits": {
"source": "iana"
},
"application/font-sfnt": {
"source": "iana"
},
"application/font-tdpfr": {
"source": "iana",
"extensions": ["pfr"]
},
"application/font-woff": {
"source": "iana",
"compressible": false,
"extensions": ["woff"]
},
"application/font-woff2": {
"compressible": false,
"extensions": ["woff2"]
},
"application/framework-attributes+xml": {
"source": "iana"
},
"application/gml+xml": {
"source": "apache",
"extensions": ["gml"]
},
"application/gpx+xml": {
"source": "apache",
"extensions": ["gpx"]
},
"application/gxf": {
"source": "apache",
"extensions": ["gxf"]
},
"application/gzip": {
"source": "iana",
"compressible": false
},
"application/h224": {
"source": "iana"
},
"application/held+xml": {
"source": "iana"
},
"application/http": {
"source": "iana"
},
"application/hyperstudio": {
"source": "iana",
"extensions": ["stk"]
},
"application/ibe-key-request+xml": {
"source": "iana"
},
"application/ibe-pkg-reply+xml": {
"source": "iana"
},
"application/ibe-pp-data": {
"source": "iana"
},
"application/iges": {
"source": "iana"
},
"application/im-iscomposing+xml": {
"source": "iana"
},
"application/index": {
"source": "iana"
},
"application/index.cmd": {
"source": "iana"
},
"application/index.obj": {
"source": "iana"
},
"application/index.response": {
"source": "iana"
},
"application/index.vnd": {
"source": "iana"
},
"application/inkml+xml": {
"source": "iana",
"extensions": ["ink","inkml"]
},
"application/iotp": {
"source": "iana"
},
"application/ipfix": {
"source": "iana",
"extensions": ["ipfix"]
},
"application/ipp": {
"source": "iana"
},
"application/isup": {
"source": "iana"
},
"application/its+xml": {
"source": "iana"
},
"application/java-archive": {
"source": "apache",
"compressible": false,
"extensions": ["jar","war","ear"]
},
"application/java-serialized-object": {
"source": "apache",
"compressible": false,
"extensions": ["ser"]
},
"application/java-vm": {
"source": "apache",
"compressible": false,
"extensions": ["class"]
},
"application/javascript": {
"source": "iana",
"charset": "UTF-8",
"compressible": true,
"extensions": ["js"]
},
"application/jose": {
"source": "iana"
},
"application/jose+json": {
"source": "iana",
"compressible": true
},
"application/jrd+json": {
"source": "iana",
"compressible": true
},
"application/json": {
"source": "iana",
"charset": "UTF-8",
"compressible": true,
"extensions": ["json","map"]
},
"application/json-patch+json": {
"source": "iana",
"compressible": true
},
"application/json-seq": {
"source": "iana"
},
"application/json5": {
"extensions": ["json5"]
},
"application/jsonml+json": {
"source": "apache",
"compressible": true,
"extensions": ["jsonml"]
},
"application/jwk+json": {
"source": "iana",
"compressible": true
},
"application/jwk-set+json": {
"source": "iana",
"compressible": true
},
"application/jwt": {
"source": "iana"
},
"application/kpml-request+xml": {
"source": "iana"
},
"application/kpml-response+xml": {
"source": "iana"
},
"application/ld+json": {
"source": "iana",
"compressible": true,
"extensions": ["jsonld"]
},
"application/link-format": {
"source": "iana"
},
"application/load-control+xml": {
"source": "iana"
},
"application/lost+xml": {
"source": "iana",
"extensions": ["lostxml"]
},
"application/lostsync+xml": {
"source": "iana"
},
"application/lxf": {
"source": "iana"
},
"application/mac-binhex40": {
"source": "iana",
"extensions": ["hqx"]
},
"application/mac-compactpro": {
"source": "apache",
"extensions": ["cpt"]
},
"application/macwriteii": {
"source": "iana"
},
"application/mads+xml": {
"source": "iana",
"extensions": ["mads"]
},
"application/manifest+json": {
"charset": "UTF-8",
"compressible": true,
"extensions": ["webmanifest"]
},
"application/marc": {
"source": "iana",
"extensions": ["mrc"]
},
"application/marcxml+xml": {
"source": "iana",
"extensions": ["mrcx"]
},
"application/mathematica": {
"source": "iana",
"extensions": ["ma","nb","mb"]
},
"application/mathml+xml": {
"source": "iana",
"extensions": ["mathml"]
},
"application/mathml-content+xml": {
"source": "iana"
},
"application/mathml-presentation+xml": {
"source": "iana"
},
"application/mbms-associated-procedure-description+xml": {
"source": "iana"
},
"application/mbms-deregister+xml": {
"source": "iana"
},
"application/mbms-envelope+xml": {
"source": "iana"
},
"application/mbms-msk+xml": {
"source": "iana"
},
"application/mbms-msk-response+xml": {
"source": "iana"
},
"application/mbms-protection-description+xml": {
"source": "iana"
},
"application/mbms-reception-report+xml": {
"source": "iana"
},
"application/mbms-register+xml": {
"source": "iana"
},
"application/mbms-register-response+xml": {
"source": "iana"
},
"application/mbms-schedule+xml": {
"source": "iana"
},
"application/mbms-user-service-description+xml": {
"source": "iana"
},
"application/mbox": {
"source": "iana",
"extensions": ["mbox"]
},
"application/media-policy-dataset+xml": {
"source": "iana"
},
"application/media_control+xml": {
"source": "iana"
},
"application/mediaservercontrol+xml": {
"source": "iana",
"extensions": ["mscml"]
},
"application/merge-patch+json": {
"source": "iana",
"compressible": true
},
"application/metalink+xml": {
"source": "apache",
"extensions": ["metalink"]
},
"application/metalink4+xml": {
"source": "iana",
"extensions": ["meta4"]
},
"application/mets+xml": {
"source": "iana",
"extensions": ["mets"]
},
"application/mf4": {
"source": "iana"
},
"application/mikey": {
"source": "iana"
},
"application/mods+xml": {
"source": "iana",
"extensions": ["mods"]
},
"application/moss-keys": {
"source": "iana"
},
"application/moss-signature": {
"source": "iana"
},
"application/mosskey-data": {
"source": "iana"
},
"application/mosskey-request": {
"source": "iana"
},
"application/mp21": {
"source": "iana",
"extensions": ["m21","mp21"]
},
"application/mp4": {
"source": "iana",
"extensions": ["mp4s","m4p"]
},
"application/mpeg4-generic": {
"source": "iana"
},
"application/mpeg4-iod": {
"source": "iana"
},
"application/mpeg4-iod-xmt": {
"source": "iana"
},
"application/mrb-consumer+xml": {
"source": "iana"
},
"application/mrb-publish+xml": {
"source": "iana"
},
"application/msc-ivr+xml": {
"source": "iana"
},
"application/msc-mixer+xml": {
"source": "iana"
},
"application/msword": {
"source": "iana",
"compressible": false,
"extensions": ["doc","dot"]
},
"application/mxf": {
"source": "iana",
"extensions": ["mxf"]
},
"application/nasdata": {
"source": "iana"
},
"application/news-checkgroups": {
"source": "iana"
},
"application/news-groupinfo": {
"source": "iana"
},
"application/news-transmission": {
"source": "iana"
},
"application/nlsml+xml": {
"source": "iana"
},
"application/nss": {
"source": "iana"
},
"application/ocsp-request": {
"source": "iana"
},
"application/ocsp-response": {
"source": "iana"
},
"application/octet-stream": {
"source": "iana",
"compressible": false,
"extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
},
"application/oda": {
"source": "iana",
"extensions": ["oda"]
},
"application/odx": {
"source": "iana"
},
"application/oebps-package+xml": {
"source": "iana",
"extensions": ["opf"]
},
"application/ogg": {
"source": "iana",
"compressible": false,
"extensions": ["ogx"]
},
"application/omdoc+xml": {
"source": "apache",
"extensions": ["omdoc"]
},
"application/onenote": {
"source": "apache",
"extensions": ["onetoc","onetoc2","onetmp","onepkg"]
},
"application/oxps": {
"source": "iana",
"extensions": ["oxps"]
},
"application/p2p-overlay+xml": {
"source": "iana"
},
"application/parityfec": {
"source": "iana"
},
"application/patch-ops-error+xml": {
"source": "iana",
"extensions": ["xer"]
},
"application/pdf": {
"source": "iana",
"compressible": false,
"extensions": ["pdf"]
},
"application/pdx": {
"source": "iana"
},
"application/pgp-encrypted": {
"source": "iana",
"compressible": false,
"extensions": ["pgp"]
},
"application/pgp-keys": {
"source": "iana"
},
"application/pgp-signature": {
"source": "iana",
"extensions": ["asc","sig"]
},
"application/pics-rules": {
"source": "apache",
"extensions": ["prf"]
},
"application/pidf+xml": {
"source": "iana"
},
"application/pidf-diff+xml": {
"source": "iana"
},
"application/pkcs10": {
"source": "iana",
"extensions": ["p10"]
},
"application/pkcs12": {
"source": "iana"
},
"application/pkcs7-mime": {
"source": "iana",
"extensions": ["p7m","p7c"]
},
"application/pkcs7-signature": {
"source": "iana",
"extensions": ["p7s"]
},
"application/pkcs8": {
"source": "iana",
"extensions": ["p8"]
},
"application/pkix-attr-cert": {
"source": "iana",
"extensions": ["ac"]
},
"application/pkix-cert": {
"source": "iana",
"extensions": ["cer"]
},
"application/pkix-crl": {
"source": "iana",
"extensions": ["crl"]
},
"application/pkix-pkipath": {
"source": "iana",
"extensions": ["pkipath"]
},
"application/pkixcmp": {
"source": "iana",
"extensions": ["pki"]
},
"application/pls+xml": {
"source": "iana",
"extensions": ["pls"]
},
"application/poc-settings+xml": {
"source": "iana"
},
"application/postscript": {
"source": "iana",
"compressible": true,
"extensions": ["ai","eps","ps"]
},
"application/ppsp-tracker+json": {
"source": "iana",
"compressible": true
},
"application/problem+json": {
"source": "iana",
"compressible": true
},
"application/problem+xml": {
"source": "iana"
},
"application/provenance+xml": {
"source": "iana"
},
"application/prs.alvestrand.titrax-sheet": {
"source": "iana"
},
"application/prs.cww": {
"source": "iana",
"extensions": ["cww"]
},
"application/prs.hpub+zip": {
"source": "iana"
},
"application/prs.nprend": {
"source": "iana"
},
"application/prs.plucker": {
"source": "iana"
},
"application/prs.rdf-xml-crypt": {
"source": "iana"
},
"application/prs.xsf+xml": {
"source": "iana"
},
"application/pskc+xml": {
"source": "iana",
"extensions": ["pskcxml"]
},
"application/qsig": {
"source": "iana"
},
"application/raptorfec": {
"source": "iana"
},
"application/rdap+json": {
"source": "iana",
"compressible": true
},
"application/rdf+xml": {
"source": "iana",
"compressible": true,
"extensions": ["rdf"]
},
"application/reginfo+xml": {
"source": "iana",
"extensions": ["rif"]
},
"application/relax-ng-compact-syntax": {
"source": "iana",
"extensions": ["rnc"]
},
"application/remote-printing": {
"source": "iana"
},
"application/reputon+json": {
"source": "iana",
"compressible": true
},
"application/resource-lists+xml": {
"source": "iana",
"extensions": ["rl"]
},
"application/resource-lists-diff+xml": {
"source": "iana",
"extensions": ["rld"]
},
"application/rfc+xml": {
"source": "iana"
},
"application/riscos": {
"source": "iana"
},
"application/rlmi+xml": {
"source": "iana"
},
"application/rls-services+xml": {
"source": "iana",
"extensions": ["rs"]
},
"application/rpki-ghostbusters": {
"source": "iana",
"extensions": ["gbr"]
},
"application/rpki-manifest": {
"source": "iana",
"extensions": ["mft"]
},
"application/rpki-roa": {
"source": "iana",
"extensions": ["roa"]
},
"application/rpki-updown": {
"source": "iana"
},
"application/rsd+xml": {
"source": "apache",
"extensions": ["rsd"]
},
"application/rss+xml": {
"source": "apache",
"compressible": true,
"extensions": ["rss"]
},
"application/rtf": {
"source": "iana",
"compressible": true,
"extensions": ["rtf"]
},
"application/rtploopback": {
"source": "iana"
},
"application/rtx": {
"source": "iana"
},
"application/samlassertion+xml": {
"source": "iana"
},
"application/samlmetadata+xml": {
"source": "iana"
},
"application/sbml+xml": {
"source": "iana",
"extensions": ["sbml"]
},
"application/scaip+xml": {
"source": "iana"
},
"application/scim+json": {
"source": "iana",
"compressible": true
},
"application/scvp-cv-request": {
"source": "iana",
"extensions": ["scq"]
},
"application/scvp-cv-response": {
"source": "iana",
"extensions": ["scs"]
},
"application/scvp-vp-request": {
"source": "iana",
"extensions": ["spq"]
},
"application/scvp-vp-response": {
"source": "iana",
"extensions": ["spp"]
},
"application/sdp": {
"source": "iana",
"extensions": ["sdp"]
},
"application/sep+xml": {
"source": "iana"
},
"application/sep-exi": {
"source": "iana"
},
"application/session-info": {
"source": "iana"
},
"application/set-payment": {
"source": "iana"
},
"application/set-payment-initiation": {
"source": "iana",
"extensions": ["setpay"]
},
"application/set-registration": {
"source": "iana"
},
"application/set-registration-initiation": {
"source": "iana",
"extensions": ["setreg"]
},
"application/sgml": {
"source": "iana"
},
"application/sgml-open-catalog": {
"source": "iana"
},
"application/shf+xml": {
"source": "iana",
"extensions": ["shf"]
},
"application/sieve": {
"source": "iana"
},
"application/simple-filter+xml": {
"source": "iana"
},
"application/simple-message-summary": {
"source": "iana"
},
"application/simplesymbolcontainer": {
"source": "iana"
},
"application/slate": {
"source": "iana"
},
"application/smil": {
"source": "iana"
},
"application/smil+xml": {
"source": "iana",
"extensions": ["smi","smil"]
},
"application/smpte336m": {
"source": "iana"
},
"application/soap+fastinfoset": {
"source": "iana"
},
"application/soap+xml": {
"source": "iana",
"compressible": true
},
"application/sparql-query": {
"source": "iana",
"extensions": ["rq"]
},
"application/sparql-results+xml": {
"source": "iana",
"extensions": ["srx"]
},
"application/spirits-event+xml": {
"source": "iana"
},
"application/sql": {
"source": "iana"
},
"application/srgs": {
"source": "iana",
"extensions": ["gram"]
},
"application/srgs+xml": {
"source": "iana",
"extensions": ["grxml"]
},
"application/sru+xml": {
"source": "iana",
"extensions": ["sru"]
},
"application/ssdl+xml": {
"source": "apache",
"extensions": ["ssdl"]
},
"application/ssml+xml": {
"source": "iana",
"extensions": ["ssml"]
},
"application/tamp-apex-update": {
"source": "iana"
},
"application/tamp-apex-update-confirm": {
"source": "iana"
},
"application/tamp-community-update": {
"source": "iana"
},
"application/tamp-community-update-confirm": {
"source": "iana"
},
"application/tamp-error": {
"source": "iana"
},
"application/tamp-sequence-adjust": {
"source": "iana"
},
"application/tamp-sequence-adjust-confirm": {
"source": "iana"
},
"application/tamp-status-query": {
"source": "iana"
},
"application/tamp-status-response": {
"source": "iana"
},
"application/tamp-update": {
"source": "iana"
},
"application/tamp-update-confirm": {
"source": "iana"
},
"application/tar": {
"compressible": true
},
"application/tei+xml": {
"source": "iana",
"extensions": ["tei","teicorpus"]
},
"application/thraud+xml": {
"source": "iana",
"extensions": ["tfi"]
},
"application/timestamp-query": {
"source": "iana"
},
"application/timestamp-reply": {
"source": "iana"
},
"application/timestamped-data": {
"source": "iana",
"extensions": ["tsd"]
},
"application/ttml+xml": {
"source": "iana"
},
"application/tve-trigger": {
"source": "iana"
},
"application/ulpfec": {
"source": "iana"
},
"application/urc-grpsheet+xml": {
"source": "iana"
},
"application/urc-ressheet+xml": {
"source": "iana"
},
"application/urc-targetdesc+xml": {
"source": "iana"
},
"application/urc-uisocketdesc+xml": {
"source": "iana"
},
"application/vcard+json": {
"source": "iana",
"compressible": true
},
"application/vcard+xml": {
"source": "iana"
},
"application/vemmi": {
"source": "iana"
},
"application/vividence.scriptfile": {
"source": "apache"
},
"application/vnd.3gpp-prose+xml": {
"source": "iana"
},
"application/vnd.3gpp-prose-pc3ch+xml": {
"source": "iana"
},
"application/vnd.3gpp.access-transfer-events+xml": {
"source": "iana"
},
"application/vnd.3gpp.bsf+xml": {
"source": "iana"
},
"application/vnd.3gpp.mid-call+xml": {
"source": "iana"
},
"application/vnd.3gpp.pic-bw-large": {
"source": "iana",
"extensions": ["plb"]
},
"application/vnd.3gpp.pic-bw-small": {
"source": "iana",
"extensions": ["psb"]
},
"application/vnd.3gpp.pic-bw-var": {
"source": "iana",
"extensions": ["pvb"]
},
"application/vnd.3gpp.sms": {
"source": "iana"
},
"application/vnd.3gpp.sms+xml": {
"source": "iana"
},
"application/vnd.3gpp.srvcc-ext+xml": {
"source": "iana"
},
"application/vnd.3gpp.srvcc-info+xml": {
"source": "iana"
},
"application/vnd.3gpp.state-and-event-info+xml": {
"source": "iana"
},
"application/vnd.3gpp.ussd+xml": {
"source": "iana"
},
"application/vnd.3gpp2.bcmcsinfo+xml": {
"source": "iana"
},
"application/vnd.3gpp2.sms": {
"source": "iana"
},
"application/vnd.3gpp2.tcap": {
"source": "iana",
"extensions": ["tcap"]
},
"application/vnd.3lightssoftware.imagescal": {
"source": "iana"
},
"application/vnd.3m.post-it-notes": {
"source": "iana",
"extensions": ["pwn"]
},
"application/vnd.accpac.simply.aso": {
"source": "iana",
"extensions": ["aso"]
},
"application/vnd.accpac.simply.imp": {
"source": "iana",
"extensions": ["imp"]
},
"application/vnd.acucobol": {
"source": "iana",
"extensions": ["acu"]
},
"application/vnd.acucorp": {
"source": "iana",
"extensions": ["atc","acutc"]
},
"application/vnd.adobe.air-application-installer-package+zip": {
"source": "apache",
"extensions": ["air"]
},
"application/vnd.adobe.flash.movie": {
"source": "iana"
},
"application/vnd.adobe.formscentral.fcdt": {
"source": "iana",
"extensions": ["fcdt"]
},
"application/vnd.adobe.fxp": {
"source": "iana",
"extensions": ["fxp","fxpl"]
},
"application/vnd.adobe.partial-upload": {
"source": "iana"
},
"application/vnd.adobe.xdp+xml": {
"source": "iana",
"extensions": ["xdp"]
},
"application/vnd.adobe.xfdf": {
"source": "iana",
"extensions": ["xfdf"]
},
"application/vnd.aether.imp": {
"source": "iana"
},
"application/vnd.ah-barcode": {
"source": "iana"
},
"application/vnd.ahead.space": {
"source": "iana",
"extensions": ["ahead"]
},
"application/vnd.airzip.filesecure.azf": {
"source": "iana",
"extensions": ["azf"]
},
"application/vnd.airzip.filesecure.azs": {
"source": "iana",
"extensions": ["azs"]
},
"application/vnd.amazon.ebook": {
"source": "apache",
"extensions": ["azw"]
},
"application/vnd.americandynamics.acc": {
"source": "iana",
"extensions": ["acc"]
},
"application/vnd.amiga.ami": {
"source": "iana",
"extensions": ["ami"]
},
"application/vnd.amundsen.maze+xml": {
"source": "iana"
},
"application/vnd.android.package-archive": {
"source": "apache",
"compressible": false,
"extensions": ["apk"]
},
"application/vnd.anki": {
"source": "iana"
},
"application/vnd.anser-web-certificate-issue-initiation": {
"source": "iana",
"extensions": ["cii"]
},
"application/vnd.anser-web-funds-transfer-initiation": {
"source": "apache",
"extensions": ["fti"]
},
"application/vnd.antix.game-component": {
"source": "iana",
"extensions": ["atx"]
},
"application/vnd.apache.thrift.binary": {
"source": "iana"
},
"application/vnd.apache.thrift.compact": {
"source": "iana"
},
"application/vnd.apache.thrift.json": {
"source": "iana"
},
"application/vnd.api+json": {
"source": "iana",
"compressible": true
},
"application/vnd.apple.installer+xml": {
"source": "iana",
"extensions": ["mpkg"]
},
"application/vnd.apple.mpegurl": {
"source": "iana",
"extensions": ["m3u8"]
},
"application/vnd.apple.pkpass": {
"compressible": false,
"extensions": ["pkpass"]
},
"application/vnd.arastra.swi": {
"source": "iana"
},
"application/vnd.aristanetworks.swi": {
"source": "iana",
"extensions": ["swi"]
},
"application/vnd.artsquare": {
"source": "iana"
},
"application/vnd.astraea-software.iota": {
"source": "iana",
"extensions": ["iota"]
},
"application/vnd.audiograph": {
"source": "iana",
"extensions": ["aep"]
},
"application/vnd.autopackage": {
"source": "iana"
},
"application/vnd.avistar+xml": {
"source": "iana"
},
"application/vnd.balsamiq.bmml+xml": {
"source": "iana"
},
"application/vnd.balsamiq.bmpr": {
"source": "iana"
},
"application/vnd.bekitzur-stech+json": {
"source": "iana",
"compressible": true
},
"application/vnd.biopax.rdf+xml": {
"source": "iana"
},
"application/vnd.blueice.multipass": {
"source": "iana",
"extensions": ["mpm"]
},
"application/vnd.bluetooth.ep.oob": {
"source": "iana"
},
"application/vnd.bluetooth.le.oob": {
"source": "iana"
},
"application/vnd.bmi": {
"source": "iana",
"extensions": ["bmi"]
},
"application/vnd.businessobjects": {
"source": "iana",
"extensions": ["rep"]
},
"application/vnd.cab-jscript": {
"source": "iana"
},
"application/vnd.canon-cpdl": {
"source": "iana"
},
"application/vnd.canon-lips": {
"source": "iana"
},
"application/vnd.cendio.thinlinc.clientconf": {
"source": "iana"
},
"application/vnd.century-systems.tcp_stream": {
"source": "iana"
},
"application/vnd.chemdraw+xml": {
"source": "iana",
"extensions": ["cdxml"]
},
"application/vnd.chipnuts.karaoke-mmd": {
"source": "iana",
"extensions": ["mmd"]
},
"application/vnd.cinderella": {
"source": "iana",
"extensions": ["cdy"]
},
"application/vnd.cirpack.isdn-ext": {
"source": "iana"
},
"application/vnd.citationstyles.style+xml": {
"source": "iana"
},
"application/vnd.claymore": {
"source": "iana",
"extensions": ["cla"]
},
"application/vnd.cloanto.rp9": {
"source": "iana",
"extensions": ["rp9"]
},
"application/vnd.clonk.c4group": {
"source": "iana",
"extensions": ["c4g","c4d","c4f","c4p","c4u"]
},
"application/vnd.cluetrust.cartomobile-config": {
"source": "iana",
"extensions": ["c11amc"]
},
"application/vnd.cluetrust.cartomobile-config-pkg": {
"source": "iana",
"extensions": ["c11amz"]
},
"application/vnd.coffeescript": {
"source": "iana"
},
"application/vnd.collection+json": {
"source": "iana",
"compressible": true
},
"application/vnd.collection.doc+json": {
"source": "iana",
"compressible": true
},
"application/vnd.collection.next+json": {
"source": "iana",
"compressible": true
},
"application/vnd.commerce-battelle": {
"source": "iana"
},
"application/vnd.commonspace": {
"source": "iana",
"extensions": ["csp"]
},
"application/vnd.contact.cmsg": {
"source": "iana",
"extensions": ["cdbcmsg"]
},
"application/vnd.coreos.ignition+json": {
"source": "iana",
"compressible": true
},
"application/vnd.cosmocaller": {
"source": "iana",
"extensions": ["cmc"]
},
"application/vnd.crick.clicker": {
"source": "iana",
"extensions": ["clkx"]
},
"application/vnd.crick.clicker.keyboard": {
"source": "iana",
"extensions": ["clkk"]
},
"application/vnd.crick.clicker.palette": {
"source": "iana",
"extensions": ["clkp"]
},
"application/vnd.crick.clicker.template": {
"source": "iana",
"extensions": ["clkt"]
},
"application/vnd.crick.clicker.wordbank": {
"source": "iana",
"extensions": ["clkw"]
},
"application/vnd.criticaltools.wbs+xml": {
"source": "iana",
"extensions": ["wbs"]
},
"application/vnd.ctc-posml": {
"source": "iana",
"extensions": ["pml"]
},
"application/vnd.ctct.ws+xml": {
"source": "iana"
},
"application/vnd.cups-pdf": {
"source": "iana"
},
"application/vnd.cups-postscript": {
"source": "iana"
},
"application/vnd.cups-ppd": {
"source": "iana",
"extensions": ["ppd"]
},
"application/vnd.cups-raster": {
"source": "iana"
},
"application/vnd.cups-raw": {
"source": "iana"
},
"application/vnd.curl": {
"source": "iana"
},
"application/vnd.curl.car": {
"source": "apache",
"extensions": ["car"]
},
"application/vnd.curl.pcurl": {
"source": "apache",
"extensions": ["pcurl"]
},
"application/vnd.cyan.dean.root+xml": {
"source": "iana"
},
"application/vnd.cybank": {
"source": "iana"
},
"application/vnd.dart": {
"source": "iana",
"compressible": true,
"extensions": ["dart"]
},
"application/vnd.data-vision.rdz": {
"source": "iana",
"extensions": ["rdz"]
},
"application/vnd.debian.binary-package": {
"source": "iana"
},
"application/vnd.dece.data": {
"source": "iana",
"extensions": ["uvf","uvvf","uvd","uvvd"]
},
"application/vnd.dece.ttml+xml": {
"source": "iana",
"extensions": ["uvt","uvvt"]
},
"application/vnd.dece.unspecified": {
"source": "iana",
"extensions": ["uvx","uvvx"]
},
"application/vnd.dece.zip": {
"source": "iana",
"extensions": ["uvz","uvvz"]
},
"application/vnd.denovo.fcselayout-link": {
"source": "iana",
"extensions": ["fe_launch"]
},
"application/vnd.desmume-movie": {
"source": "iana"
},
"application/vnd.desmume.movie": {
"source": "apache"
},
"application/vnd.dir-bi.plate-dl-nosuffix": {
"source": "iana"
},
"application/vnd.dm.delegation+xml": {
"source": "iana"
},
"application/vnd.dna": {
"source": "iana",
"extensions": ["dna"]
},
"application/vnd.document+json": {
"source": "iana",
"compressible": true
},
"application/vnd.dolby.mlp": {
"source": "apache",
"extensions": ["mlp"]
},
"application/vnd.dolby.mobile.1": {
"source": "iana"
},
"application/vnd.dolby.mobile.2": {
"source": "iana"
},
"application/vnd.doremir.scorecloud-binary-document": {
"source": "iana"
},
"application/vnd.dpgraph": {
"source": "iana",
"extensions": ["dpg"]
},
"application/vnd.dreamfactory": {
"source": "iana",
"extensions": ["dfac"]
},
"application/vnd.drive+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ds-keypoint": {
"source": "apache",
"extensions": ["kpxx"]
},
"application/vnd.dtg.local": {
"source": "iana"
},
"application/vnd.dtg.local.flash": {
"source": "iana"
},
"application/vnd.dtg.local.html": {
"source": "iana"
},
"application/vnd.dvb.ait": {
"source": "iana",
"extensions": ["ait"]
},
"application/vnd.dvb.dvbj": {
"source": "iana"
},
"application/vnd.dvb.esgcontainer": {
"source": "iana"
},
"application/vnd.dvb.ipdcdftnotifaccess": {
"source": "iana"
},
"application/vnd.dvb.ipdcesgaccess": {
"source": "iana"
},
"application/vnd.dvb.ipdcesgaccess2": {
"source": "iana"
},
"application/vnd.dvb.ipdcesgpdd": {
"source": "iana"
},
"application/vnd.dvb.ipdcroaming": {
"source": "iana"
},
"application/vnd.dvb.iptv.alfec-base": {
"source": "iana"
},
"application/vnd.dvb.iptv.alfec-enhancement": {
"source": "iana"
},
"application/vnd.dvb.notif-aggregate-root+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-container+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-generic+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-ia-msglist+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-ia-registration-request+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-ia-registration-response+xml": {
"source": "iana"
},
"application/vnd.dvb.notif-init+xml": {
"source": "iana"
},
"application/vnd.dvb.pfr": {
"source": "iana"
},
"application/vnd.dvb.service": {
"source": "iana",
"extensions": ["svc"]
},
"application/vnd.dxr": {
"source": "iana"
},
"application/vnd.dynageo": {
"source": "iana",
"extensions": ["geo"]
},
"application/vnd.dzr": {
"source": "iana"
},
"application/vnd.easykaraoke.cdgdownload": {
"source": "iana"
},
"application/vnd.ecdis-update": {
"source": "iana"
},
"application/vnd.ecowin.chart": {
"source": "iana",
"extensions": ["mag"]
},
"application/vnd.ecowin.filerequest": {
"source": "iana"
},
"application/vnd.ecowin.fileupdate": {
"source": "iana"
},
"application/vnd.ecowin.series": {
"source": "iana"
},
"application/vnd.ecowin.seriesrequest": {
"source": "iana"
},
"application/vnd.ecowin.seriesupdate": {
"source": "iana"
},
"application/vnd.emclient.accessrequest+xml": {
"source": "iana"
},
"application/vnd.enliven": {
"source": "iana",
"extensions": ["nml"]
},
"application/vnd.enphase.envoy": {
"source": "iana"
},
"application/vnd.eprints.data+xml": {
"source": "iana"
},
"application/vnd.epson.esf": {
"source": "iana",
"extensions": ["esf"]
},
"application/vnd.epson.msf": {
"source": "iana",
"extensions": ["msf"]
},
"application/vnd.epson.quickanime": {
"source": "iana",
"extensions": ["qam"]
},
"application/vnd.epson.salt": {
"source": "iana",
"extensions": ["slt"]
},
"application/vnd.epson.ssf": {
"source": "iana",
"extensions": ["ssf"]
},
"application/vnd.ericsson.quickcall": {
"source": "iana"
},
"application/vnd.eszigno3+xml": {
"source": "iana",
"extensions": ["es3","et3"]
},
"application/vnd.etsi.aoc+xml": {
"source": "iana"
},
"application/vnd.etsi.asic-e+zip": {
"source": "iana"
},
"application/vnd.etsi.asic-s+zip": {
"source": "iana"
},
"application/vnd.etsi.cug+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvcommand+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvdiscovery+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvprofile+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvsad-bc+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvsad-cod+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvsad-npvr+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvservice+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvsync+xml": {
"source": "iana"
},
"application/vnd.etsi.iptvueprofile+xml": {
"source": "iana"
},
"application/vnd.etsi.mcid+xml": {
"source": "iana"
},
"application/vnd.etsi.mheg5": {
"source": "iana"
},
"application/vnd.etsi.overload-control-policy-dataset+xml": {
"source": "iana"
},
"application/vnd.etsi.pstn+xml": {
"source": "iana"
},
"application/vnd.etsi.sci+xml": {
"source": "iana"
},
"application/vnd.etsi.simservs+xml": {
"source": "iana"
},
"application/vnd.etsi.timestamp-token": {
"source": "iana"
},
"application/vnd.etsi.tsl+xml": {
"source": "iana"
},
"application/vnd.etsi.tsl.der": {
"source": "iana"
},
"application/vnd.eudora.data": {
"source": "iana"
},
"application/vnd.ezpix-album": {
"source": "iana",
"extensions": ["ez2"]
},
"application/vnd.ezpix-package": {
"source": "iana",
"extensions": ["ez3"]
},
"application/vnd.f-secure.mobile": {
"source": "iana"
},
"application/vnd.fastcopy-disk-image": {
"source": "iana"
},
"application/vnd.fdf": {
"source": "iana",
"extensions": ["fdf"]
},
"application/vnd.fdsn.mseed": {
"source": "iana",
"extensions": ["mseed"]
},
"application/vnd.fdsn.seed": {
"source": "iana",
"extensions": ["seed","dataless"]
},
"application/vnd.ffsns": {
"source": "iana"
},
"application/vnd.filmit.zfc": {
"source": "iana"
},
"application/vnd.fints": {
"source": "iana"
},
"application/vnd.firemonkeys.cloudcell": {
"source": "iana"
},
"application/vnd.flographit": {
"source": "iana",
"extensions": ["gph"]
},
"application/vnd.fluxtime.clip": {
"source": "iana",
"extensions": ["ftc"]
},
"application/vnd.font-fontforge-sfd": {
"source": "iana"
},
"application/vnd.framemaker": {
"source": "iana",
"extensions": ["fm","frame","maker","book"]
},
"application/vnd.frogans.fnc": {
"source": "iana",
"extensions": ["fnc"]
},
"application/vnd.frogans.ltf": {
"source": "iana",
"extensions": ["ltf"]
},
"application/vnd.fsc.weblaunch": {
"source": "iana",
"extensions": ["fsc"]
},
"application/vnd.fujitsu.oasys": {
"source": "iana",
"extensions": ["oas"]
},
"application/vnd.fujitsu.oasys2": {
"source": "iana",
"extensions": ["oa2"]
},
"application/vnd.fujitsu.oasys3": {
"source": "iana",
"extensions": ["oa3"]
},
"application/vnd.fujitsu.oasysgp": {
"source": "iana",
"extensions": ["fg5"]
},
"application/vnd.fujitsu.oasysprs": {
"source": "iana",
"extensions": ["bh2"]
},
"application/vnd.fujixerox.art-ex": {
"source": "iana"
},
"application/vnd.fujixerox.art4": {
"source": "iana"
},
"application/vnd.fujixerox.ddd": {
"source": "iana",
"extensions": ["ddd"]
},
"application/vnd.fujixerox.docuworks": {
"source": "iana",
"extensions": ["xdw"]
},
"application/vnd.fujixerox.docuworks.binder": {
"source": "iana",
"extensions": ["xbd"]
},
"application/vnd.fujixerox.docuworks.container": {
"source": "iana"
},
"application/vnd.fujixerox.hbpl": {
"source": "iana"
},
"application/vnd.fut-misnet": {
"source": "iana"
},
"application/vnd.fuzzysheet": {
"source": "iana",
"extensions": ["fzs"]
},
"application/vnd.genomatix.tuxedo": {
"source": "iana",
"extensions": ["txd"]
},
"application/vnd.geo+json": {
"source": "iana",
"compressible": true
},
"application/vnd.geocube+xml": {
"source": "iana"
},
"application/vnd.geogebra.file": {
"source": "iana",
"extensions": ["ggb"]
},
"application/vnd.geogebra.tool": {
"source": "iana",
"extensions": ["ggt"]
},
"application/vnd.geometry-explorer": {
"source": "iana",
"extensions": ["gex","gre"]
},
"application/vnd.geonext": {
"source": "iana",
"extensions": ["gxt"]
},
"application/vnd.geoplan": {
"source": "iana",
"extensions": ["g2w"]
},
"application/vnd.geospace": {
"source": "iana",
"extensions": ["g3w"]
},
"application/vnd.gerber": {
"source": "iana"
},
"application/vnd.globalplatform.card-content-mgt": {
"source": "iana"
},
"application/vnd.globalplatform.card-content-mgt-response": {
"source": "iana"
},
"application/vnd.gmx": {
"source": "iana",
"extensions": ["gmx"]
},
"application/vnd.google-apps.document": {
"compressible": false,
"extensions": ["gdoc"]
},
"application/vnd.google-apps.presentation": {
"compressible": false,
"extensions": ["gslides"]
},
"application/vnd.google-apps.spreadsheet": {
"compressible": false,
"extensions": ["gsheet"]
},
"application/vnd.google-earth.kml+xml": {
"source": "iana",
"compressible": true,
"extensions": ["kml"]
},
"application/vnd.google-earth.kmz": {
"source": "iana",
"compressible": false,
"extensions": ["kmz"]
},
"application/vnd.gov.sk.e-form+xml": {
"source": "iana"
},
"application/vnd.gov.sk.e-form+zip": {
"source": "iana"
},
"application/vnd.gov.sk.xmldatacontainer+xml": {
"source": "iana"
},
"application/vnd.grafeq": {
"source": "iana",
"extensions": ["gqf","gqs"]
},
"application/vnd.gridmp": {
"source": "iana"
},
"application/vnd.groove-account": {
"source": "iana",
"extensions": ["gac"]
},
"application/vnd.groove-help": {
"source": "iana",
"extensions": ["ghf"]
},
"application/vnd.groove-identity-message": {
"source": "iana",
"extensions": ["gim"]
},
"application/vnd.groove-injector": {
"source": "iana",
"extensions": ["grv"]
},
"application/vnd.groove-tool-message": {
"source": "iana",
"extensions": ["gtm"]
},
"application/vnd.groove-tool-template": {
"source": "iana",
"extensions": ["tpl"]
},
"application/vnd.groove-vcard": {
"source": "iana",
"extensions": ["vcg"]
},
"application/vnd.hal+json": {
"source": "iana",
"compressible": true
},
"application/vnd.hal+xml": {
"source": "iana",
"extensions": ["hal"]
},
"application/vnd.handheld-entertainment+xml": {
"source": "iana",
"extensions": ["zmm"]
},
"application/vnd.hbci": {
"source": "iana",
"extensions": ["hbci"]
},
"application/vnd.hcl-bireports": {
"source": "iana"
},
"application/vnd.hdt": {
"source": "iana"
},
"application/vnd.heroku+json": {
"source": "iana",
"compressible": true
},
"application/vnd.hhe.lesson-player": {
"source": "iana",
"extensions": ["les"]
},
"application/vnd.hp-hpgl": {
"source": "iana",
"extensions": ["hpgl"]
},
"application/vnd.hp-hpid": {
"source": "iana",
"extensions": ["hpid"]
},
"application/vnd.hp-hps": {
"source": "iana",
"extensions": ["hps"]
},
"application/vnd.hp-jlyt": {
"source": "iana",
"extensions": ["jlt"]
},
"application/vnd.hp-pcl": {
"source": "iana",
"extensions": ["pcl"]
},
"application/vnd.hp-pclxl": {
"source": "iana",
"extensions": ["pclxl"]
},
"application/vnd.httphone": {
"source": "iana"
},
"application/vnd.hydrostatix.sof-data": {
"source": "iana",
"extensions": ["sfd-hdstx"]
},
"application/vnd.hyperdrive+json": {
"source": "iana",
"compressible": true
},
"application/vnd.hzn-3d-crossword": {
"source": "iana"
},
"application/vnd.ibm.afplinedata": {
"source": "iana"
},
"application/vnd.ibm.electronic-media": {
"source": "iana"
},
"application/vnd.ibm.minipay": {
"source": "iana",
"extensions": ["mpy"]
},
"application/vnd.ibm.modcap": {
"source": "iana",
"extensions": ["afp","listafp","list3820"]
},
"application/vnd.ibm.rights-management": {
"source": "iana",
"extensions": ["irm"]
},
"application/vnd.ibm.secure-container": {
"source": "iana",
"extensions": ["sc"]
},
"application/vnd.iccprofile": {
"source": "iana",
"extensions": ["icc","icm"]
},
"application/vnd.ieee.1905": {
"source": "iana"
},
"application/vnd.igloader": {
"source": "iana",
"extensions": ["igl"]
},
"application/vnd.immervision-ivp": {
"source": "iana",
"extensions": ["ivp"]
},
"application/vnd.immervision-ivu": {
"source": "iana",
"extensions": ["ivu"]
},
"application/vnd.ims.imsccv1p1": {
"source": "iana"
},
"application/vnd.ims.imsccv1p2": {
"source": "iana"
},
"application/vnd.ims.imsccv1p3": {
"source": "iana"
},
"application/vnd.ims.lis.v2.result+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ims.lti.v2.toolconsumerprofile+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ims.lti.v2.toolproxy+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ims.lti.v2.toolproxy.id+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ims.lti.v2.toolsettings+json": {
"source": "iana",
"compressible": true
},
"application/vnd.ims.lti.v2.toolsettings.simple+json": {
"source": "iana",
"compressible": true
},
"application/vnd.informedcontrol.rms+xml": {
"source": "iana"
},
"application/vnd.informix-visionary": {
"source": "iana"
},
"application/vnd.infotech.project": {
"source": "iana"
},
"application/vnd.infotech.project+xml": {
"source": "iana"
},
"application/vnd.innopath.wamp.notification": {
"source": "iana"
},
"application/vnd.insors.igm": {
"source": "iana",
"extensions": ["igm"]
},
"application/vnd.intercon.formnet": {
"source": "iana",
"extensions": ["xpw","xpx"]
},
"application/vnd.intergeo": {
"source": "iana",
"extensions": ["i2g"]
},
"application/vnd.intertrust.digibox": {
"source": "iana"
},
"application/vnd.intertrust.nncp": {
"source": "iana"
},
"application/vnd.intu.qbo": {
"source": "iana",
"extensions": ["qbo"]
},
"application/vnd.intu.qfx": {
"source": "iana",
"extensions": ["qfx"]
},
"application/vnd.iptc.g2.catalogitem+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.conceptitem+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.knowledgeitem+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.newsitem+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.newsmessage+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.packageitem+xml": {
"source": "iana"
},
"application/vnd.iptc.g2.planningitem+xml": {
"source": "iana"
},
"application/vnd.ipunplugged.rcprofile": {
"source": "iana",
"extensions": ["rcprofile"]
},
"application/vnd.irepository.package+xml": {
"source": "iana",
"extensions": ["irp"]
},
"application/vnd.is-xpr": {
"source": "iana",
"extensions": ["xpr"]
},
"application/vnd.isac.fcs": {
"source": "iana",
"extensions": ["fcs"]
},
"application/vnd.jam": {
"source": "iana",
"extensions": ["jam"]
},
"application/vnd.japannet-directory-service": {
"source": "iana"
},
"application/vnd.japannet-jpnstore-wakeup": {
"source": "iana"
},
"application/vnd.japannet-payment-wakeup": {
"source": "iana"
},
"application/vnd.japannet-registration": {
"source": "iana"
},
"application/vnd.japannet-registration-wakeup": {
"source": "iana"
},
"application/vnd.japannet-setstore-wakeup": {
"source": "iana"
},
"application/vnd.japannet-verification": {
"source": "iana"
},
"application/vnd.japannet-verification-wakeup": {
"source": "iana"
},
"application/vnd.jcp.javame.midlet-rms": {
"source": "iana",
"extensions": ["rms"]
},
"application/vnd.jisp": {
"source": "iana",
"extensions": ["jisp"]
},
"application/vnd.joost.joda-archive": {
"source": "iana",
"extensions": ["joda"]
},
"application/vnd.jsk.isdn-ngn": {
"source": "iana"
},
"application/vnd.kahootz": {
"source": "iana",
"extensions": ["ktz","ktr"]
},
"application/vnd.kde.karbon": {
"source": "iana",
"extensions": ["karbon"]
},
"application/vnd.kde.kchart": {
"source": "iana",
"extensions": ["chrt"]
},
"application/vnd.kde.kformula": {
"source": "iana",
"extensions": ["kfo"]
},
"application/vnd.kde.kivio": {
"source": "iana",
"extensions": ["flw"]
},
"application/vnd.kde.kontour": {
"source": "iana",
"extensions": ["kon"]
},
"application/vnd.kde.kpresenter": {
"source": "iana",
"extensions": ["kpr","kpt"]
},
"application/vnd.kde.kspread": {
"source": "iana",
"extensions": ["ksp"]
},
"application/vnd.kde.kword": {
"source": "iana",
"extensions": ["kwd","kwt"]
},
"application/vnd.kenameaapp": {
"source": "iana",
"extensions": ["htke"]
},
"application/vnd.kidspiration": {
"source": "iana",
"extensions": ["kia"]
},
"application/vnd.kinar": {
"source": "iana",
"extensions": ["kne","knp"]
},
"application/vnd.koan": {
"source": "iana",
"extensions": ["skp","skd","skt","skm"]
},
"application/vnd.kodak-descriptor": {
"source": "iana",
"extensions": ["sse"]
},
"application/vnd.las.las+xml": {
"source": "iana",
"extensions": ["lasxml"]
},
"application/vnd.liberty-request+xml": {
"source": "iana"
},
"application/vnd.llamagraphics.life-balance.desktop": {
"source": "iana",
"extensions": ["lbd"]
},
"application/vnd.llamagraphics.life-balance.exchange+xml": {
"source": "iana",
"extensions": ["lbe"]
},
"application/vnd.lotus-1-2-3": {
"source": "iana",
"extensions": ["123"]
},
"application/vnd.lotus-approach": {
"source": "iana",
"extensions": ["apr"]
},
"application/vnd.lotus-freelance": {
"source": "iana",
"extensions": ["pre"]
},
"application/vnd.lotus-notes": {
"source": "iana",
"extensions": ["nsf"]
},
"application/vnd.lotus-organizer": {
"source": "iana",
"extensions": ["org"]
},
"application/vnd.lotus-screencam": {
"source": "iana",
"extensions": ["scm"]
},
"application/vnd.lotus-wordpro": {
"source": "iana",
"extensions": ["lwp"]
},
"application/vnd.macports.portpkg": {
"source": "iana",
"extensions": ["portpkg"]
},
"application/vnd.mapbox-vector-tile": {
"source": "iana"
},
"application/vnd.marlin.drm.actiontoken+xml": {
"source": "iana"
},
"application/vnd.marlin.drm.conftoken+xml": {
"source": "iana"
},
"application/vnd.marlin.drm.license+xml": {
"source": "iana"
},
"application/vnd.marlin.drm.mdcf": {
"source": "iana"
},
"application/vnd.mason+json": {
"source": "iana",
"compressible": true
},
"application/vnd.maxmind.maxmind-db": {
"source": "iana"
},
"application/vnd.mcd": {
"source": "iana",
"extensions": ["mcd"]
},
"application/vnd.medcalcdata": {
"source": "iana",
"extensions": ["mc1"]
},
"application/vnd.mediastation.cdkey": {
"source": "iana",
"extensions": ["cdkey"]
},
"application/vnd.meridian-slingshot": {
"source": "iana"
},
"application/vnd.mfer": {
"source": "iana",
"extensions": ["mwf"]
},
"application/vnd.mfmp": {
"source": "iana",
"extensions": ["mfm"]
},
"application/vnd.micro+json": {
"source": "iana",
"compressible": true
},
"application/vnd.micrografx.flo": {
"source": "iana",
"extensions": ["flo"]
},
"application/vnd.micrografx.igx": {
"source": "iana",
"extensions": ["igx"]
},
"application/vnd.microsoft.portable-executable": {
"source": "iana"
},
"application/vnd.miele+json": {
"source": "iana",
"compressible": true
},
"application/vnd.mif": {
"source": "iana",
"extensions": ["mif"]
},
"application/vnd.minisoft-hp3000-save": {
"source": "iana"
},
"application/vnd.mitsubishi.misty-guard.trustweb": {
"source": "iana"
},
"application/vnd.mobius.daf": {
"source": "iana",
"extensions": ["daf"]
},
"application/vnd.mobius.dis": {
"source": "iana",
"extensions": ["dis"]
},
"application/vnd.mobius.mbk": {
"source": "iana",
"extensions": ["mbk"]
},
"application/vnd.mobius.mqy": {
"source": "iana",
"extensions": ["mqy"]
},
"application/vnd.mobius.msl": {
"source": "iana",
"extensions": ["msl"]
},
"application/vnd.mobius.plc": {
"source": "iana",
"extensions": ["plc"]
},
"application/vnd.mobius.txf": {
"source": "iana",
"extensions": ["txf"]
},
"application/vnd.mophun.application": {
"source": "iana",
"extensions": ["mpn"]
},
"application/vnd.mophun.certificate": {
"source": "iana",
"extensions": ["mpc"]
},
"application/vnd.motorola.flexsuite": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.adsi": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.fis": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.gotap": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.kmr": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.ttc": {
"source": "iana"
},
"application/vnd.motorola.flexsuite.wem": {
"source": "iana"
},
"application/vnd.motorola.iprm": {
"source": "iana"
},
"application/vnd.mozilla.xul+xml": {
"source": "iana",
"compressible": true,
"extensions": ["xul"]
},
"application/vnd.ms-3mfdocument": {
"source": "iana"
},
"application/vnd.ms-artgalry": {
"source": "iana",
"extensions": ["cil"]
},
"application/vnd.ms-asf": {
"source": "iana"
},
"application/vnd.ms-cab-compressed": {
"source": "iana",
"extensions": ["cab"]
},
"application/vnd.ms-color.iccprofile": {
"source": "apache"
},
"application/vnd.ms-excel": {
"source": "iana",
"compressible": false,
"extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
},
"application/vnd.ms-excel.addin.macroenabled.12": {
"source": "iana",
"extensions": ["xlam"]
},
"application/vnd.ms-excel.sheet.binary.macroenabled.12": {
"source": "iana",
"extensions": ["xlsb"]
},
"application/vnd.ms-excel.sheet.macroenabled.12": {
"source": "iana",
"extensions": ["xlsm"]
},
"application/vnd.ms-excel.template.macroenabled.12": {
"source": "iana",
"extensions": ["xltm"]
},
"application/vnd.ms-fontobject": {
"source": "iana",
"compressible": true,
"extensions": ["eot"]
},
"application/vnd.ms-htmlhelp": {
"source": "iana",
"extensions": ["chm"]
},
"application/vnd.ms-ims": {
"source": "iana",
"extensions": ["ims"]
},
"application/vnd.ms-lrm": {
"source": "iana",
"extensions": ["lrm"]
},
"application/vnd.ms-office.activex+xml": {
"source": "iana"
},
"application/vnd.ms-officetheme": {
"source": "iana",
"extensions": ["thmx"]
},
"application/vnd.ms-opentype": {
"source": "apache",
"compressible": true
},
"application/vnd.ms-package.obfuscated-opentype": {
"source": "apache"
},
"application/vnd.ms-pki.seccat": {
"source": "apache",
"extensions": ["cat"]
},
"application/vnd.ms-pki.stl": {
"source": "apache",
"extensions": ["stl"]
},
"application/vnd.ms-playready.initiator+xml": {
"source": "iana"
},
"application/vnd.ms-powerpoint": {
"source": "iana",
"compressible": false,
"extensions": ["ppt","pps","pot"]
},
"application/vnd.ms-powerpoint.addin.macroenabled.12": {
"source": "iana",
"extensions": ["ppam"]
},
"application/vnd.ms-powerpoint.presentation.macroenabled.12": {
"source": "iana",
"extensions": ["pptm"]
},
"application/vnd.ms-powerpoint.slide.macroenabled.12": {
"source": "iana",
"extensions": ["sldm"]
},
"application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
"source": "iana",
"extensions": ["ppsm"]
},
"application/vnd.ms-powerpoint.template.macroenabled.12": {
"source": "iana",
"extensions": ["potm"]
},
"application/vnd.ms-printdevicecapabilities+xml": {
"source": "iana"
},
"application/vnd.ms-printing.printticket+xml": {
"source": "apache"
},
"application/vnd.ms-printschematicket+xml": {
"source": "iana"
},
"application/vnd.ms-project": {
"source": "iana",
"extensions": ["mpp","mpt"]
},
"application/vnd.ms-tnef": {
"source": "iana"
},
"application/vnd.ms-windows.devicepairing": {
"source": "iana"
},
"application/vnd.ms-windows.nwprinting.oob": {
"source": "iana"
},
"application/vnd.ms-windows.printerpairing": {
"source": "iana"
},
"application/vnd.ms-windows.wsd.oob": {
"source": "iana"
},
"application/vnd.ms-wmdrm.lic-chlg-req": {
"source": "iana"
},
"application/vnd.ms-wmdrm.lic-resp": {
"source": "iana"
},
"application/vnd.ms-wmdrm.meter-chlg-req": {
"source": "iana"
},
"application/vnd.ms-wmdrm.meter-resp": {
"source": "iana"
},
"application/vnd.ms-word.document.macroenabled.12": {
"source": "iana",
"extensions": ["docm"]
},
"application/vnd.ms-word.template.macroenabled.12": {
"source": "iana",
"extensions": ["dotm"]
},
"application/vnd.ms-works": {
"source": "iana",
"extensions": ["wps","wks","wcm","wdb"]
},
"application/vnd.ms-wpl": {
"source": "iana",
"extensions": ["wpl"]
},
"application/vnd.ms-xpsdocument": {
"source": "iana",
"compressible": false,
"extensions": ["xps"]
},
"application/vnd.msa-disk-image": {
"source": "iana"
},
"application/vnd.mseq": {
"source": "iana",
"extensions": ["mseq"]
},
"application/vnd.msign": {
"source": "iana"
},
"application/vnd.multiad.creator": {
"source": "iana"
},
"application/vnd.multiad.creator.cif": {
"source": "iana"
},
"application/vnd.music-niff": {
"source": "iana"
},
"application/vnd.musician": {
"source": "iana",
"extensions": ["mus"]
},
"application/vnd.muvee.style": {
"source": "iana",
"extensions": ["msty"]
},
"application/vnd.mynfc": {
"source": "iana",
"extensions": ["taglet"]
},
"application/vnd.ncd.control": {
"source": "iana"
},
"application/vnd.ncd.reference": {
"source": "iana"
},
"application/vnd.nervana": {
"source": "iana"
},
"application/vnd.netfpx": {
"source": "iana"
},
"application/vnd.neurolanguage.nlu": {
"source": "iana",
"extensions": ["nlu"]
},
"application/vnd.nintendo.nitro.rom": {
"source": "iana"
},
"application/vnd.nintendo.snes.rom": {
"source": "iana"
},
"application/vnd.nitf": {
"source": "iana",
"extensions": ["ntf","nitf"]
},
"application/vnd.noblenet-directory": {
"source": "iana",
"extensions": ["nnd"]
},
"application/vnd.noblenet-sealer": {
"source": "iana",
"extensions": ["nns"]
},
"application/vnd.noblenet-web": {
"source": "iana",
"extensions": ["nnw"]
},
"application/vnd.nokia.catalogs": {
"source": "iana"
},
"application/vnd.nokia.conml+wbxml": {
"source": "iana"
},
"application/vnd.nokia.conml+xml": {
"source": "iana"
},
"application/vnd.nokia.iptv.config+xml": {
"source": "iana"
},
"application/vnd.nokia.isds-radio-presets": {
"source": "iana"
},
"application/vnd.nokia.landmark+wbxml": {
"source": "iana"
},
"application/vnd.nokia.landmark+xml": {
"source": "iana"
},
"application/vnd.nokia.landmarkcollection+xml": {
"source": "iana"
},
"application/vnd.nokia.n-gage.ac+xml": {
"source": "iana"
},
"application/vnd.nokia.n-gage.data": {
"source": "iana",
"extensions": ["ngdat"]
},
"application/vnd.nokia.n-gage.symbian.install": {
"source": "iana",
"extensions": ["n-gage"]
},
"application/vnd.nokia.ncd": {
"source": "iana"
},
"application/vnd.nokia.pcd+wbxml": {
"source": "iana"
},
"application/vnd.nokia.pcd+xml": {
"source": "iana"
},
"application/vnd.nokia.radio-preset": {
"source": "iana",
"extensions": ["rpst"]
},
"application/vnd.nokia.radio-presets": {
"source": "iana",
"extensions": ["rpss"]
},
"application/vnd.novadigm.edm": {
"source": "iana",
"extensions": ["edm"]
},
"application/vnd.novadigm.edx": {
"source": "iana",
"extensions": ["edx"]
},
"application/vnd.novadigm.ext": {
"source": "iana",
"extensions": ["ext"]
},
"application/vnd.ntt-local.content-share": {
"source": "iana"
},
"application/vnd.ntt-local.file-transfer": {
"source": "iana"
},
"application/vnd.ntt-local.ogw_remote-access": {
"source": "iana"
},
"application/vnd.ntt-local.sip-ta_remote": {
"source": "iana"
},
"application/vnd.ntt-local.sip-ta_tcp_stream": {
"source": "iana"
},
"application/vnd.oasis.opendocument.chart": {
"source": "iana",
"extensions": ["odc"]
},
"application/vnd.oasis.opendocument.chart-template": {
"source": "iana",
"extensions": ["otc"]
},
"application/vnd.oasis.opendocument.database": {
"source": "iana",
"extensions": ["odb"]
},
"application/vnd.oasis.opendocument.formula": {
"source": "iana",
"extensions": ["odf"]
},
"application/vnd.oasis.opendocument.formula-template": {
"source": "iana",
"extensions": ["odft"]
},
"application/vnd.oasis.opendocument.graphics": {
"source": "iana",
"compressible": false,
"extensions": ["odg"]
},
"application/vnd.oasis.opendocument.graphics-template": {
"source": "iana",
"extensions": ["otg"]
},
"application/vnd.oasis.opendocument.image": {
"source": "iana",
"extensions": ["odi"]
},
"application/vnd.oasis.opendocument.image-template": {
"source": "iana",
"extensions": ["oti"]
},
"application/vnd.oasis.opendocument.presentation": {
"source": "iana",
"compressible": false,
"extensions": ["odp"]
},
"application/vnd.oasis.opendocument.presentation-template": {
"source": "iana",
"extensions": ["otp"]
},
"application/vnd.oasis.opendocument.spreadsheet": {
"source": "iana",
"compressible": false,
"extensions": ["ods"]
},
"application/vnd.oasis.opendocument.spreadsheet-template": {
"source": "iana",
"extensions": ["ots"]
},
"application/vnd.oasis.opendocument.text": {
"source": "iana",
"compressible": false,
"extensions": ["odt"]
},
"application/vnd.oasis.opendocument.text-master": {
"source": "iana",
"extensions": ["odm"]
},
"application/vnd.oasis.opendocument.text-template": {
"source": "iana",
"extensions": ["ott"]
},
"application/vnd.oasis.opendocument.text-web": {
"source": "iana",
"extensions": ["oth"]
},
"application/vnd.obn": {
"source": "iana"
},
"application/vnd.oftn.l10n+json": {
"source": "iana",
"compressible": true
},
"application/vnd.oipf.contentaccessdownload+xml": {
"source": "iana"
},
"application/vnd.oipf.contentaccessstreaming+xml": {
"source": "iana"
},
"application/vnd.oipf.cspg-hexbinary": {
"source": "iana"
},
"application/vnd.oipf.dae.svg+xml": {
"source": "iana"
},
"application/vnd.oipf.dae.xhtml+xml": {
"source": "iana"
},
"application/vnd.oipf.mippvcontrolmessage+xml": {
"source": "iana"
},
"application/vnd.oipf.pae.gem": {
"source": "iana"
},
"application/vnd.oipf.spdiscovery+xml": {
"source": "iana"
},
"application/vnd.oipf.spdlist+xml": {
"source": "iana"
},
"application/vnd.oipf.ueprofile+xml": {
"source": "iana"
},
"application/vnd.oipf.userprofile+xml": {
"source": "iana"
},
"application/vnd.olpc-sugar": {
"source": "iana",
"extensions": ["xo"]
},
"application/vnd.oma-scws-config": {
"source": "iana"
},
"application/vnd.oma-scws-http-request": {
"source": "iana"
},
"application/vnd.oma-scws-http-response": {
"source": "iana"
},
"application/vnd.oma.bcast.associated-procedure-parameter+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.drm-trigger+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.imd+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.ltkm": {
"source": "iana"
},
"application/vnd.oma.bcast.notification+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.provisioningtrigger": {
"source": "iana"
},
"application/vnd.oma.bcast.sgboot": {
"source": "iana"
},
"application/vnd.oma.bcast.sgdd+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.sgdu": {
"source": "iana"
},
"application/vnd.oma.bcast.simple-symbol-container": {
"source": "iana"
},
"application/vnd.oma.bcast.smartcard-trigger+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.sprov+xml": {
"source": "iana"
},
"application/vnd.oma.bcast.stkm": {
"source": "iana"
},
"application/vnd.oma.cab-address-book+xml": {
"source": "iana"
},
"application/vnd.oma.cab-feature-handler+xml": {
"source": "iana"
},
"application/vnd.oma.cab-pcc+xml": {
"source": "iana"
},
"application/vnd.oma.cab-subs-invite+xml": {
"source": "iana"
},
"application/vnd.oma.cab-user-prefs+xml": {
"source": "iana"
},
"application/vnd.oma.dcd": {
"source": "iana"
},
"application/vnd.oma.dcdc": {
"source": "iana"
},
"application/vnd.oma.dd2+xml": {
"source": "iana",
"extensions": ["dd2"]
},
"application/vnd.oma.drm.risd+xml": {
"source": "iana"
},
"application/vnd.oma.group-usage-list+xml": {
"source": "iana"
},
"application/vnd.oma.pal+xml": {
"source": "iana"
},
"application/vnd.oma.poc.detailed-progress-report+xml": {
"source": "iana"
},
"application/vnd.oma.poc.final-report+xml": {
"source": "iana"
},
"application/vnd.oma.poc.groups+xml": {
"source": "iana"
},
"application/vnd.oma.poc.invocation-descriptor+xml": {
"source": "iana"
},
"application/vnd.oma.poc.optimized-progress-report+xml": {
"source": "iana"
},
"application/vnd.oma.push": {
"source": "iana"
},
"application/vnd.oma.scidm.messages+xml": {
"source": "iana"
},
"application/vnd.oma.xcap-directory+xml": {
"source": "iana"
},
"application/vnd.omads-email+xml": {
"source": "iana"
},
"application/vnd.omads-file+xml": {
"source": "iana"
},
"application/vnd.omads-folder+xml": {
"source": "iana"
},
"application/vnd.omaloc-supl-init": {
"source": "iana"
},
"application/vnd.onepager": {
"source": "iana"
},
"application/vnd.openblox.game+xml": {
"source": "iana"
},
"application/vnd.openblox.game-binary": {
"source": "iana"
},
"application/vnd.openeye.oeb": {
"source": "iana"
},
"application/vnd.openofficeorg.extension": {
"source": "apache",
"extensions": ["oxt"]
},
"application/vnd.openxmlformats-officedocument.custom-properties+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawing+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.extended-properties+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml-template": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.presentation": {
"source": "iana",
"compressible": false,
"extensions": ["pptx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.slide": {
"source": "iana",
"extensions": ["sldx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
"source": "iana",
"extensions": ["ppsx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.template": {
"source": "apache",
"extensions": ["potx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml-template": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
"source": "iana",
"compressible": false,
"extensions": ["xlsx"]
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
"source": "apache",
"extensions": ["xltx"]
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.theme+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.themeoverride+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.vmldrawing": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml-template": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
"source": "iana",
"compressible": false,
"extensions": ["docx"]
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
"source": "apache",
"extensions": ["dotx"]
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-package.core-properties+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
"source": "iana"
},
"application/vnd.openxmlformats-package.relationships+xml": {
"source": "iana"
},
"application/vnd.oracle.resource+json": {
"source": "iana",
"compressible": true
},
"application/vnd.orange.indata": {
"source": "iana"
},
"application/vnd.osa.netdeploy": {
"source": "iana"
},
"application/vnd.osgeo.mapguide.package": {
"source": "iana",
"extensions": ["mgp"]
},
"application/vnd.osgi.bundle": {
"source": "iana"
},
"application/vnd.osgi.dp": {
"source": "iana",
"extensions": ["dp"]
},
"application/vnd.osgi.subsystem": {
"source": "iana",
"extensions": ["esa"]
},
"application/vnd.otps.ct-kip+xml": {
"source": "iana"
},
"application/vnd.oxli.countgraph": {
"source": "iana"
},
"application/vnd.pagerduty+json": {
"source": "iana",
"compressible": true
},
"application/vnd.palm": {
"source": "iana",
"extensions": ["pdb","pqa","oprc"]
},
"application/vnd.panoply": {
"source": "iana"
},
"application/vnd.paos+xml": {
"source": "iana"
},
"application/vnd.paos.xml": {
"source": "apache"
},
"application/vnd.pawaafile": {
"source": "iana",
"extensions": ["paw"]
},
"application/vnd.pcos": {
"source": "iana"
},
"application/vnd.pg.format": {
"source": "iana",
"extensions": ["str"]
},
"application/vnd.pg.osasli": {
"source": "iana",
"extensions": ["ei6"]
},
"application/vnd.piaccess.application-licence": {
"source": "iana"
},
"application/vnd.picsel": {
"source": "iana",
"extensions": ["efif"]
},
"application/vnd.pmi.widget": {
"source": "iana",
"extensions": ["wg"]
},
"application/vnd.poc.group-advertisement+xml": {
"source": "iana"
},
"application/vnd.pocketlearn": {
"source": "iana",
"extensions": ["plf"]
},
"application/vnd.powerbuilder6": {
"source": "iana",
"extensions": ["pbd"]
},
"application/vnd.powerbuilder6-s": {
"source": "iana"
},
"application/vnd.powerbuilder7": {
"source": "iana"
},
"application/vnd.powerbuilder7-s": {
"source": "iana"
},
"application/vnd.powerbuilder75": {
"source": "iana"
},
"application/vnd.powerbuilder75-s": {
"source": "iana"
},
"application/vnd.preminet": {
"source": "iana"
},
"application/vnd.previewsystems.box": {
"source": "iana",
"extensions": ["box"]
},
"application/vnd.proteus.magazine": {
"source": "iana",
"extensions": ["mgz"]
},
"application/vnd.publishare-delta-tree": {
"source": "iana",
"extensions": ["qps"]
},
"application/vnd.pvi.ptid1": {
"source": "iana",
"extensions": ["ptid"]
},
"application/vnd.pwg-multiplexed": {
"source": "iana"
},
"application/vnd.pwg-xhtml-print+xml": {
"source": "iana"
},
"application/vnd.qualcomm.brew-app-res": {
"source": "iana"
},
"application/vnd.quark.quarkxpress": {
"source": "iana",
"extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
},
"application/vnd.quobject-quoxdocument": {
"source": "iana"
},
"application/vnd.radisys.moml+xml": {
"source": "iana"
},
"application/vnd.radisys.msml+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-audit+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-audit-conf+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-audit-conn+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-audit-dialog+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-audit-stream+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-conf+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-base+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-fax-detect+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-group+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-speech+xml": {
"source": "iana"
},
"application/vnd.radisys.msml-dialog-transform+xml": {
"source": "iana"
},
"application/vnd.rainstor.data": {
"source": "iana"
},
"application/vnd.rapid": {
"source": "iana"
},
"application/vnd.realvnc.bed": {
"source": "iana",
"extensions": ["bed"]
},
"application/vnd.recordare.musicxml": {
"source": "iana",
"extensions": ["mxl"]
},
"application/vnd.recordare.musicxml+xml": {
"source": "iana",
"extensions": ["musicxml"]
},
"application/vnd.renlearn.rlprint": {
"source": "iana"
},
"application/vnd.rig.cryptonote": {
"source": "iana",
"extensions": ["cryptonote"]
},
"application/vnd.rim.cod": {
"source": "apache",
"extensions": ["cod"]
},
"application/vnd.rn-realmedia": {
"source": "apache",
"extensions": ["rm"]
},
"application/vnd.rn-realmedia-vbr": {
"source": "apache",
"extensions": ["rmvb"]
},
"application/vnd.route66.link66+xml": {
"source": "iana",
"extensions": ["link66"]
},
"application/vnd.rs-274x": {
"source": "iana"
},
"application/vnd.ruckus.download": {
"source": "iana"
},
"application/vnd.s3sms": {
"source": "iana"
},
"application/vnd.sailingtracker.track": {
"source": "iana",
"extensions": ["st"]
},
"application/vnd.sbm.cid": {
"source": "iana"
},
"application/vnd.sbm.mid2": {
"source": "iana"
},
"application/vnd.scribus": {
"source": "iana"
},
"application/vnd.sealed.3df": {
"source": "iana"
},
"application/vnd.sealed.csf": {
"source": "iana"
},
"application/vnd.sealed.doc": {
"source": "iana"
},
"application/vnd.sealed.eml": {
"source": "iana"
},
"application/vnd.sealed.mht": {
"source": "iana"
},
"application/vnd.sealed.net": {
"source": "iana"
},
"application/vnd.sealed.ppt": {
"source": "iana"
},
"application/vnd.sealed.tiff": {
"source": "iana"
},
"application/vnd.sealed.xls": {
"source": "iana"
},
"application/vnd.sealedmedia.softseal.html": {
"source": "iana"
},
"application/vnd.sealedmedia.softseal.pdf": {
"source": "iana"
},
"application/vnd.seemail": {
"source": "iana",
"extensions": ["see"]
},
"application/vnd.sema": {
"source": "iana",
"extensions": ["sema"]
},
"application/vnd.semd": {
"source": "iana",
"extensions": ["semd"]
},
"application/vnd.semf": {
"source": "iana",
"extensions": ["semf"]
},
"application/vnd.shana.informed.formdata": {
"source": "iana",
"extensions": ["ifm"]
},
"application/vnd.shana.informed.formtemplate": {
"source": "iana",
"extensions": ["itp"]
},
"application/vnd.shana.informed.interchange": {
"source": "iana",
"extensions": ["iif"]
},
"application/vnd.shana.informed.package": {
"source": "iana",
"extensions": ["ipk"]
},
"application/vnd.simtech-mindmapper": {
"source": "iana",
"extensions": ["twd","twds"]
},
"application/vnd.siren+json": {
"source": "iana",
"compressible": true
},
"application/vnd.smaf": {
"source": "iana",
"extensions": ["mmf"]
},
"application/vnd.smart.notebook": {
"source": "iana"
},
"application/vnd.smart.teacher": {
"source": "iana",
"extensions": ["teacher"]
},
"application/vnd.software602.filler.form+xml": {
"source": "iana"
},
"application/vnd.software602.filler.form-xml-zip": {
"source": "iana"
},
"application/vnd.solent.sdkm+xml": {
"source": "iana",
"extensions": ["sdkm","sdkd"]
},
"application/vnd.spotfire.dxp": {
"source": "iana",
"extensions": ["dxp"]
},
"application/vnd.spotfire.sfs": {
"source": "iana",
"extensions": ["sfs"]
},
"application/vnd.sss-cod": {
"source": "iana"
},
"application/vnd.sss-dtf": {
"source": "iana"
},
"application/vnd.sss-ntf": {
"source": "iana"
},
"application/vnd.stardivision.calc": {
"source": "apache",
"extensions": ["sdc"]
},
"application/vnd.stardivision.draw": {
"source": "apache",
"extensions": ["sda"]
},
"application/vnd.stardivision.impress": {
"source": "apache",
"extensions": ["sdd"]
},
"application/vnd.stardivision.math": {
"source": "apache",
"extensions": ["smf"]
},
"application/vnd.stardivision.writer": {
"source": "apache",
"extensions": ["sdw","vor"]
},
"application/vnd.stardivision.writer-global": {
"source": "apache",
"extensions": ["sgl"]
},
"application/vnd.stepmania.package": {
"source": "iana",
"extensions": ["smzip"]
},
"application/vnd.stepmania.stepchart": {
"source": "iana",
"extensions": ["sm"]
},
"application/vnd.street-stream": {
"source": "iana"
},
"application/vnd.sun.wadl+xml": {
"source": "iana"
},
"application/vnd.sun.xml.calc": {
"source": "apache",
"extensions": ["sxc"]
},
"application/vnd.sun.xml.calc.template": {
"source": "apache",
"extensions": ["stc"]
},
"application/vnd.sun.xml.draw": {
"source": "apache",
"extensions": ["sxd"]
},
"application/vnd.sun.xml.draw.template": {
"source": "apache",
"extensions": ["std"]
},
"application/vnd.sun.xml.impress": {
"source": "apache",
"extensions": ["sxi"]
},
"application/vnd.sun.xml.impress.template": {
"source": "apache",
"extensions": ["sti"]
},
"application/vnd.sun.xml.math": {
"source": "apache",
"extensions": ["sxm"]
},
"application/vnd.sun.xml.writer": {
"source": "apache",
"extensions": ["sxw"]
},
"application/vnd.sun.xml.writer.global": {
"source": "apache",
"extensions": ["sxg"]
},
"application/vnd.sun.xml.writer.template": {
"source": "apache",
"extensions": ["stw"]
},
"application/vnd.sus-calendar": {
"source": "iana",
"extensions": ["sus","susp"]
},
"application/vnd.svd": {
"source": "iana",
"extensions": ["svd"]
},
"application/vnd.swiftview-ics": {
"source": "iana"
},
"application/vnd.symbian.install": {
"source": "apache",
"extensions": ["sis","sisx"]
},
"application/vnd.syncml+xml": {
"source": "iana",
"extensions": ["xsm"]
},
"application/vnd.syncml.dm+wbxml": {
"source": "iana",
"extensions": ["bdm"]
},
"application/vnd.syncml.dm+xml": {
"source": "iana",
"extensions": ["xdm"]
},
"application/vnd.syncml.dm.notification": {
"source": "iana"
},
"application/vnd.syncml.dmddf+wbxml": {
"source": "iana"
},
"application/vnd.syncml.dmddf+xml": {
"source": "iana"
},
"application/vnd.syncml.dmtnds+wbxml": {
"source": "iana"
},
"application/vnd.syncml.dmtnds+xml": {
"source": "iana"
},
"application/vnd.syncml.ds.notification": {
"source": "iana"
},
"application/vnd.tao.intent-module-archive": {
"source": "iana",
"extensions": ["tao"]
},
"application/vnd.tcpdump.pcap": {
"source": "iana",
"extensions": ["pcap","cap","dmp"]
},
"application/vnd.tmd.mediaflex.api+xml": {
"source": "iana"
},
"application/vnd.tml": {
"source": "iana"
},
"application/vnd.tmobile-livetv": {
"source": "iana",
"extensions": ["tmo"]
},
"application/vnd.trid.tpt": {
"source": "iana",
"extensions": ["tpt"]
},
"application/vnd.triscape.mxs": {
"source": "iana",
"extensions": ["mxs"]
},
"application/vnd.trueapp": {
"source": "iana",
"extensions": ["tra"]
},
"application/vnd.truedoc": {
"source": "iana"
},
"application/vnd.ubisoft.webplayer": {
"source": "iana"
},
"application/vnd.ufdl": {
"source": "iana",
"extensions": ["ufd","ufdl"]
},
"application/vnd.uiq.theme": {
"source": "iana",
"extensions": ["utz"]
},
"application/vnd.umajin": {
"source": "iana",
"extensions": ["umj"]
},
"application/vnd.unity": {
"source": "iana",
"extensions": ["unityweb"]
},
"application/vnd.uoml+xml": {
"source": "iana",
"extensions": ["uoml"]
},
"application/vnd.uplanet.alert": {
"source": "iana"
},
"application/vnd.uplanet.alert-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.bearer-choice": {
"source": "iana"
},
"application/vnd.uplanet.bearer-choice-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.cacheop": {
"source": "iana"
},
"application/vnd.uplanet.cacheop-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.channel": {
"source": "iana"
},
"application/vnd.uplanet.channel-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.list": {
"source": "iana"
},
"application/vnd.uplanet.list-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.listcmd": {
"source": "iana"
},
"application/vnd.uplanet.listcmd-wbxml": {
"source": "iana"
},
"application/vnd.uplanet.signal": {
"source": "iana"
},
"application/vnd.uri-map": {
"source": "iana"
},
"application/vnd.valve.source.material": {
"source": "iana"
},
"application/vnd.vcx": {
"source": "iana",
"extensions": ["vcx"]
},
"application/vnd.vd-study": {
"source": "iana"
},
"application/vnd.vectorworks": {
"source": "iana"
},
"application/vnd.vel+json": {
"source": "iana",
"compressible": true
},
"application/vnd.verimatrix.vcas": {
"source": "iana"
},
"application/vnd.vidsoft.vidconference": {
"source": "iana"
},
"application/vnd.visio": {
"source": "iana",
"extensions": ["vsd","vst","vss","vsw"]
},
"application/vnd.visionary": {
"source": "iana",
"extensions": ["vis"]
},
"application/vnd.vividence.scriptfile": {
"source": "iana"
},
"application/vnd.vsf": {
"source": "iana",
"extensions": ["vsf"]
},
"application/vnd.wap.sic": {
"source": "iana"
},
"application/vnd.wap.slc": {
"source": "iana"
},
"application/vnd.wap.wbxml": {
"source": "iana",
"extensions": ["wbxml"]
},
"application/vnd.wap.wmlc": {
"source": "iana",
"extensions": ["wmlc"]
},
"application/vnd.wap.wmlscriptc": {
"source": "iana",
"extensions": ["wmlsc"]
},
"application/vnd.webturbo": {
"source": "iana",
"extensions": ["wtb"]
},
"application/vnd.wfa.p2p": {
"source": "iana"
},
"application/vnd.wfa.wsc": {
"source": "iana"
},
"application/vnd.windows.devicepairing": {
"source": "iana"
},
"application/vnd.wmc": {
"source": "iana"
},
"application/vnd.wmf.bootstrap": {
"source": "iana"
},
"application/vnd.wolfram.mathematica": {
"source": "iana"
},
"application/vnd.wolfram.mathematica.package": {
"source": "iana"
},
"application/vnd.wolfram.player": {
"source": "iana",
"extensions": ["nbp"]
},
"application/vnd.wordperfect": {
"source": "iana",
"extensions": ["wpd"]
},
"application/vnd.wqd": {
"source": "iana",
"extensions": ["wqd"]
},
"application/vnd.wrq-hp3000-labelled": {
"source": "iana"
},
"application/vnd.wt.stf": {
"source": "iana",
"extensions": ["stf"]
},
"application/vnd.wv.csp+wbxml": {
"source": "iana"
},
"application/vnd.wv.csp+xml": {
"source": "iana"
},
"application/vnd.wv.ssp+xml": {
"source": "iana"
},
"application/vnd.xacml+json": {
"source": "iana",
"compressible": true
},
"application/vnd.xara": {
"source": "iana",
"extensions": ["xar"]
},
"application/vnd.xfdl": {
"source": "iana",
"extensions": ["xfdl"]
},
"application/vnd.xfdl.webform": {
"source": "iana"
},
"application/vnd.xmi+xml": {
"source": "iana"
},
"application/vnd.xmpie.cpkg": {
"source": "iana"
},
"application/vnd.xmpie.dpkg": {
"source": "iana"
},
"application/vnd.xmpie.plan": {
"source": "iana"
},
"application/vnd.xmpie.ppkg": {
"source": "iana"
},
"application/vnd.xmpie.xlim": {
"source": "iana"
},
"application/vnd.yamaha.hv-dic": {
"source": "iana",
"extensions": ["hvd"]
},
"application/vnd.yamaha.hv-script": {
"source": "iana",
"extensions": ["hvs"]
},
"application/vnd.yamaha.hv-voice": {
"source": "iana",
"extensions": ["hvp"]
},
"application/vnd.yamaha.openscoreformat": {
"source": "iana",
"extensions": ["osf"]
},
"application/vnd.yamaha.openscoreformat.osfpvg+xml": {
"source": "iana",
"extensions": ["osfpvg"]
},
"application/vnd.yamaha.remote-setup": {
"source": "iana"
},
"application/vnd.yamaha.smaf-audio": {
"source": "iana",
"extensions": ["saf"]
},
"application/vnd.yamaha.smaf-phrase": {
"source": "iana",
"extensions": ["spf"]
},
"application/vnd.yamaha.through-ngn": {
"source": "iana"
},
"application/vnd.yamaha.tunnel-udpencap": {
"source": "iana"
},
"application/vnd.yaoweme": {
"source": "iana"
},
"application/vnd.yellowriver-custom-menu": {
"source": "iana",
"extensions": ["cmp"]
},
"application/vnd.zul": {
"source": "iana",
"extensions": ["zir","zirz"]
},
"application/vnd.zzazz.deck+xml": {
"source": "iana",
"extensions": ["zaz"]
},
"application/voicexml+xml": {
"source": "iana",
"extensions": ["vxml"]
},
"application/vq-rtcpxr": {
"source": "iana"
},
"application/watcherinfo+xml": {
"source": "iana"
},
"application/whoispp-query": {
"source": "iana"
},
"application/whoispp-response": {
"source": "iana"
},
"application/widget": {
"source": "iana",
"extensions": ["wgt"]
},
"application/winhlp": {
"source": "apache",
"extensions": ["hlp"]
},
"application/wita": {
"source": "iana"
},
"application/wordperfect5.1": {
"source": "iana"
},
"application/wsdl+xml": {
"source": "iana",
"extensions": ["wsdl"]
},
"application/wspolicy+xml": {
"source": "iana",
"extensions": ["wspolicy"]
},
"application/x-7z-compressed": {
"source": "apache",
"compressible": false,
"extensions": ["7z"]
},
"application/x-abiword": {
"source": "apache",
"extensions": ["abw"]
},
"application/x-ace-compressed": {
"source": "apache",
"extensions": ["ace"]
},
"application/x-amf": {
"source": "apache"
},
"application/x-apple-diskimage": {
"source": "apache",
"extensions": ["dmg"]
},
"application/x-authorware-bin": {
"source": "apache",
"extensions": ["aab","x32","u32","vox"]
},
"application/x-authorware-map": {
"source": "apache",
"extensions": ["aam"]
},
"application/x-authorware-seg": {
"source": "apache",
"extensions": ["aas"]
},
"application/x-bcpio": {
"source": "apache",
"extensions": ["bcpio"]
},
"application/x-bdoc": {
"compressible": false,
"extensions": ["bdoc"]
},
"application/x-bittorrent": {
"source": "apache",
"extensions": ["torrent"]
},
"application/x-blorb": {
"source": "apache",
"extensions": ["blb","blorb"]
},
"application/x-bzip": {
"source": "apache",
"compressible": false,
"extensions": ["bz"]
},
"application/x-bzip2": {
"source": "apache",
"compressible": false,
"extensions": ["bz2","boz"]
},
"application/x-cbr": {
"source": "apache",
"extensions": ["cbr","cba","cbt","cbz","cb7"]
},
"application/x-cdlink": {
"source": "apache",
"extensions": ["vcd"]
},
"application/x-cfs-compressed": {
"source": "apache",
"extensions": ["cfs"]
},
"application/x-chat": {
"source": "apache",
"extensions": ["chat"]
},
"application/x-chess-pgn": {
"source": "apache",
"extensions": ["pgn"]
},
"application/x-chrome-extension": {
"extensions": ["crx"]
},
"application/x-cocoa": {
"source": "nginx",
"extensions": ["cco"]
},
"application/x-compress": {
"source": "apache"
},
"application/x-conference": {
"source": "apache",
"extensions": ["nsc"]
},
"application/x-cpio": {
"source": "apache",
"extensions": ["cpio"]
},
"application/x-csh": {
"source": "apache",
"extensions": ["csh"]
},
"application/x-deb": {
"compressible": false
},
"application/x-debian-package": {
"source": "apache",
"extensions": ["deb","udeb"]
},
"application/x-dgc-compressed": {
"source": "apache",
"extensions": ["dgc"]
},
"application/x-director": {
"source": "apache",
"extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
},
"application/x-doom": {
"source": "apache",
"extensions": ["wad"]
},
"application/x-dtbncx+xml": {
"source": "apache",
"extensions": ["ncx"]
},
"application/x-dtbook+xml": {
"source": "apache",
"extensions": ["dtb"]
},
"application/x-dtbresource+xml": {
"source": "apache",
"extensions": ["res"]
},
"application/x-dvi": {
"source": "apache",
"compressible": false,
"extensions": ["dvi"]
},
"application/x-envoy": {
"source": "apache",
"extensions": ["evy"]
},
"application/x-eva": {
"source": "apache",
"extensions": ["eva"]
},
"application/x-font-bdf": {
"source": "apache",
"extensions": ["bdf"]
},
"application/x-font-dos": {
"source": "apache"
},
"application/x-font-framemaker": {
"source": "apache"
},
"application/x-font-ghostscript": {
"source": "apache",
"extensions": ["gsf"]
},
"application/x-font-libgrx": {
"source": "apache"
},
"application/x-font-linux-psf": {
"source": "apache",
"extensions": ["psf"]
},
"application/x-font-otf": {
"source": "apache",
"compressible": true,
"extensions": ["otf"]
},
"application/x-font-pcf": {
"source": "apache",
"extensions": ["pcf"]
},
"application/x-font-snf": {
"source": "apache",
"extensions": ["snf"]
},
"application/x-font-speedo": {
"source": "apache"
},
"application/x-font-sunos-news": {
"source": "apache"
},
"application/x-font-ttf": {
"source": "apache",
"compressible": true,
"extensions": ["ttf","ttc"]
},
"application/x-font-type1": {
"source": "apache",
"extensions": ["pfa","pfb","pfm","afm"]
},
"application/x-font-vfont": {
"source": "apache"
},
"application/x-freearc": {
"source": "apache",
"extensions": ["arc"]
},
"application/x-futuresplash": {
"source": "apache",
"extensions": ["spl"]
},
"application/x-gca-compressed": {
"source": "apache",
"extensions": ["gca"]
},
"application/x-glulx": {
"source": "apache",
"extensions": ["ulx"]
},
"application/x-gnumeric": {
"source": "apache",
"extensions": ["gnumeric"]
},
"application/x-gramps-xml": {
"source": "apache",
"extensions": ["gramps"]
},
"application/x-gtar": {
"source": "apache",
"extensions": ["gtar"]
},
"application/x-gzip": {
"source": "apache"
},
"application/x-hdf": {
"source": "apache",
"extensions": ["hdf"]
},
"application/x-httpd-php": {
"compressible": true,
"extensions": ["php"]
},
"application/x-install-instructions": {
"source": "apache",
"extensions": ["install"]
},
"application/x-iso9660-image": {
"source": "apache",
"extensions": ["iso"]
},
"application/x-java-archive-diff": {
"source": "nginx",
"extensions": ["jardiff"]
},
"application/x-java-jnlp-file": {
"source": "apache",
"compressible": false,
"extensions": ["jnlp"]
},
"application/x-javascript": {
"compressible": true
},
"application/x-latex": {
"source": "apache",
"compressible": false,
"extensions": ["latex"]
},
"application/x-lua-bytecode": {
"extensions": ["luac"]
},
"application/x-lzh-compressed": {
"source": "apache",
"extensions": ["lzh","lha"]
},
"application/x-makeself": {
"source": "nginx",
"extensions": ["run"]
},
"application/x-mie": {
"source": "apache",
"extensions": ["mie"]
},
"application/x-mobipocket-ebook": {
"source": "apache",
"extensions": ["prc","mobi"]
},
"application/x-mpegurl": {
"compressible": false
},
"application/x-ms-application": {
"source": "apache",
"extensions": ["application"]
},
"application/x-ms-shortcut": {
"source": "apache",
"extensions": ["lnk"]
},
"application/x-ms-wmd": {
"source": "apache",
"extensions": ["wmd"]
},
"application/x-ms-wmz": {
"source": "apache",
"extensions": ["wmz"]
},
"application/x-ms-xbap": {
"source": "apache",
"extensions": ["xbap"]
},
"application/x-msaccess": {
"source": "apache",
"extensions": ["mdb"]
},
"application/x-msbinder": {
"source": "apache",
"extensions": ["obd"]
},
"application/x-mscardfile": {
"source": "apache",
"extensions": ["crd"]
},
"application/x-msclip": {
"source": "apache",
"extensions": ["clp"]
},
"application/x-msdos-program": {
"extensions": ["exe"]
},
"application/x-msdownload": {
"source": "apache",
"extensions": ["exe","dll","com","bat","msi"]
},
"application/x-msmediaview": {
"source": "apache",
"extensions": ["mvb","m13","m14"]
},
"application/x-msmetafile": {
"source": "apache",
"extensions": ["wmf","wmz","emf","emz"]
},
"application/x-msmoney": {
"source": "apache",
"extensions": ["mny"]
},
"application/x-mspublisher": {
"source": "apache",
"extensions": ["pub"]
},
"application/x-msschedule": {
"source": "apache",
"extensions": ["scd"]
},
"application/x-msterminal": {
"source": "apache",
"extensions": ["trm"]
},
"application/x-mswrite": {
"source": "apache",
"extensions": ["wri"]
},
"application/x-netcdf": {
"source": "apache",
"extensions": ["nc","cdf"]
},
"application/x-ns-proxy-autoconfig": {
"compressible": true,
"extensions": ["pac"]
},
"application/x-nzb": {
"source": "apache",
"extensions": ["nzb"]
},
"application/x-perl": {
"source": "nginx",
"extensions": ["pl","pm"]
},
"application/x-pilot": {
"source": "nginx",
"extensions": ["prc","pdb"]
},
"application/x-pkcs12": {
"source": "apache",
"compressible": false,
"extensions": ["p12","pfx"]
},
"application/x-pkcs7-certificates": {
"source": "apache",
"extensions": ["p7b","spc"]
},
"application/x-pkcs7-certreqresp": {
"source": "apache",
"extensions": ["p7r"]
},
"application/x-rar-compressed": {
"source": "apache",
"compressible": false,
"extensions": ["rar"]
},
"application/x-redhat-package-manager": {
"source": "nginx",
"extensions": ["rpm"]
},
"application/x-research-info-systems": {
"source": "apache",
"extensions": ["ris"]
},
"application/x-sea": {
"source": "nginx",
"extensions": ["sea"]
},
"application/x-sh": {
"source": "apache",
"compressible": true,
"extensions": ["sh"]
},
"application/x-shar": {
"source": "apache",
"extensions": ["shar"]
},
"application/x-shockwave-flash": {
"source": "apache",
"compressible": false,
"extensions": ["swf"]
},
"application/x-silverlight-app": {
"source": "apache",
"extensions": ["xap"]
},
"application/x-sql": {
"source": "apache",
"extensions": ["sql"]
},
"application/x-stuffit": {
"source": "apache",
"compressible": false,
"extensions": ["sit"]
},
"application/x-stuffitx": {
"source": "apache",
"extensions": ["sitx"]
},
"application/x-subrip": {
"source": "apache",
"extensions": ["srt"]
},
"application/x-sv4cpio": {
"source": "apache",
"extensions": ["sv4cpio"]
},
"application/x-sv4crc": {
"source": "apache",
"extensions": ["sv4crc"]
},
"application/x-t3vm-image": {
"source": "apache",
"extensions": ["t3"]
},
"application/x-tads": {
"source": "apache",
"extensions": ["gam"]
},
"application/x-tar": {
"source": "apache",
"compressible": true,
"extensions": ["tar"]
},
"application/x-tcl": {
"source": "apache",
"extensions": ["tcl","tk"]
},
"application/x-tex": {
"source": "apache",
"extensions": ["tex"]
},
"application/x-tex-tfm": {
"source": "apache",
"extensions": ["tfm"]
},
"application/x-texinfo": {
"source": "apache",
"extensions": ["texinfo","texi"]
},
"application/x-tgif": {
"source": "apache",
"extensions": ["obj"]
},
"application/x-ustar": {
"source": "apache",
"extensions": ["ustar"]
},
"application/x-wais-source": {
"source": "apache",
"extensions": ["src"]
},
"application/x-web-app-manifest+json": {
"compressible": true,
"extensions": ["webapp"]
},
"application/x-www-form-urlencoded": {
"source": "iana",
"compressible": true
},
"application/x-x509-ca-cert": {
"source": "apache",
"extensions": ["der","crt","pem"]
},
"application/x-xfig": {
"source": "apache",
"extensions": ["fig"]
},
"application/x-xliff+xml": {
"source": "apache",
"extensions": ["xlf"]
},
"application/x-xpinstall": {
"source": "apache",
"compressible": false,
"extensions": ["xpi"]
},
"application/x-xz": {
"source": "apache",
"extensions": ["xz"]
},
"application/x-zmachine": {
"source": "apache",
"extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
},
"application/x400-bp": {
"source": "iana"
},
"application/xacml+xml": {
"source": "iana"
},
"application/xaml+xml": {
"source": "apache",
"extensions": ["xaml"]
},
"application/xcap-att+xml": {
"source": "iana"
},
"application/xcap-caps+xml": {
"source": "iana"
},
"application/xcap-diff+xml": {
"source": "iana",
"extensions": ["xdf"]
},
"application/xcap-el+xml": {
"source": "iana"
},
"application/xcap-error+xml": {
"source": "iana"
},
"application/xcap-ns+xml": {
"source": "iana"
},
"application/xcon-conference-info+xml": {
"source": "iana"
},
"application/xcon-conference-info-diff+xml": {
"source": "iana"
},
"application/xenc+xml": {
"source": "iana",
"extensions": ["xenc"]
},
"application/xhtml+xml": {
"source": "iana",
"compressible": true,
"extensions": ["xhtml","xht"]
},
"application/xhtml-voice+xml": {
"source": "apache"
},
"application/xml": {
"source": "iana",
"compressible": true,
"extensions": ["xml","xsl","xsd","rng"]
},
"application/xml-dtd": {
"source": "iana",
"compressible": true,
"extensions": ["dtd"]
},
"application/xml-external-parsed-entity": {
"source": "iana"
},
"application/xml-patch+xml": {
"source": "iana"
},
"application/xmpp+xml": {
"source": "iana"
},
"application/xop+xml": {
"source": "iana",
"compressible": true,
"extensions": ["xop"]
},
"application/xproc+xml": {
"source": "apache",
"extensions": ["xpl"]
},
"application/xslt+xml": {
"source": "iana",
"extensions": ["xslt"]
},
"application/xspf+xml": {
"source": "apache",
"extensions": ["xspf"]
},
"application/xv+xml": {
"source": "iana",
"extensions": ["mxml","xhvml","xvml","xvm"]
},
"application/yang": {
"source": "iana",
"extensions": ["yang"]
},
"application/yin+xml": {
"source": "iana",
"extensions": ["yin"]
},
"application/zip": {
"source": "iana",
"compressible": false,
"extensions": ["zip"]
},
"application/zlib": {
"source": "iana"
},
"audio/1d-interleaved-parityfec": {
"source": "iana"
},
"audio/32kadpcm": {
"source": "iana"
},
"audio/3gpp": {
"source": "iana",
"compressible": false,
"extensions": ["3gpp"]
},
"audio/3gpp2": {
"source": "iana"
},
"audio/ac3": {
"source": "iana"
},
"audio/adpcm": {
"source": "apache",
"extensions": ["adp"]
},
"audio/amr": {
"source": "iana"
},
"audio/amr-wb": {
"source": "iana"
},
"audio/amr-wb+": {
"source": "iana"
},
"audio/aptx": {
"source": "iana"
},
"audio/asc": {
"source": "iana"
},
"audio/atrac-advanced-lossless": {
"source": "iana"
},
"audio/atrac-x": {
"source": "iana"
},
"audio/atrac3": {
"source": "iana"
},
"audio/basic": {
"source": "iana",
"compressible": false,
"extensions": ["au","snd"]
},
"audio/bv16": {
"source": "iana"
},
"audio/bv32": {
"source": "iana"
},
"audio/clearmode": {
"source": "iana"
},
"audio/cn": {
"source": "iana"
},
"audio/dat12": {
"source": "iana"
},
"audio/dls": {
"source": "iana"
},
"audio/dsr-es201108": {
"source": "iana"
},
"audio/dsr-es202050": {
"source": "iana"
},
"audio/dsr-es202211": {
"source": "iana"
},
"audio/dsr-es202212": {
"source": "iana"
},
"audio/dv": {
"source": "iana"
},
"audio/dvi4": {
"source": "iana"
},
"audio/eac3": {
"source": "iana"
},
"audio/encaprtp": {
"source": "iana"
},
"audio/evrc": {
"source": "iana"
},
"audio/evrc-qcp": {
"source": "iana"
},
"audio/evrc0": {
"source": "iana"
},
"audio/evrc1": {
"source": "iana"
},
"audio/evrcb": {
"source": "iana"
},
"audio/evrcb0": {
"source": "iana"
},
"audio/evrcb1": {
"source": "iana"
},
"audio/evrcnw": {
"source": "iana"
},
"audio/evrcnw0": {
"source": "iana"
},
"audio/evrcnw1": {
"source": "iana"
},
"audio/evrcwb": {
"source": "iana"
},
"audio/evrcwb0": {
"source": "iana"
},
"audio/evrcwb1": {
"source": "iana"
},
"audio/evs": {
"source": "iana"
},
"audio/fwdred": {
"source": "iana"
},
"audio/g711-0": {
"source": "iana"
},
"audio/g719": {
"source": "iana"
},
"audio/g722": {
"source": "iana"
},
"audio/g7221": {
"source": "iana"
},
"audio/g723": {
"source": "iana"
},
"audio/g726-16": {
"source": "iana"
},
"audio/g726-24": {
"source": "iana"
},
"audio/g726-32": {
"source": "iana"
},
"audio/g726-40": {
"source": "iana"
},
"audio/g728": {
"source": "iana"
},
"audio/g729": {
"source": "iana"
},
"audio/g7291": {
"source": "iana"
},
"audio/g729d": {
"source": "iana"
},
"audio/g729e": {
"source": "iana"
},
"audio/gsm": {
"source": "iana"
},
"audio/gsm-efr": {
"source": "iana"
},
"audio/gsm-hr-08": {
"source": "iana"
},
"audio/ilbc": {
"source": "iana"
},
"audio/ip-mr_v2.5": {
"source": "iana"
},
"audio/isac": {
"source": "apache"
},
"audio/l16": {
"source": "iana"
},
"audio/l20": {
"source": "iana"
},
"audio/l24": {
"source": "iana",
"compressible": false
},
"audio/l8": {
"source": "iana"
},
"audio/lpc": {
"source": "iana"
},
"audio/midi": {
"source": "apache",
"extensions": ["mid","midi","kar","rmi"]
},
"audio/mobile-xmf": {
"source": "iana"
},
"audio/mp4": {
"source": "iana",
"compressible": false,
"extensions": ["m4a","mp4a"]
},
"audio/mp4a-latm": {
"source": "iana"
},
"audio/mpa": {
"source": "iana"
},
"audio/mpa-robust": {
"source": "iana"
},
"audio/mpeg": {
"source": "iana",
"compressible": false,
"extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
},
"audio/mpeg4-generic": {
"source": "iana"
},
"audio/musepack": {
"source": "apache"
},
"audio/ogg": {
"source": "iana",
"compressible": false,
"extensions": ["oga","ogg","spx"]
},
"audio/opus": {
"source": "iana"
},
"audio/parityfec": {
"source": "iana"
},
"audio/pcma": {
"source": "iana"
},
"audio/pcma-wb": {
"source": "iana"
},
"audio/pcmu": {
"source": "iana"
},
"audio/pcmu-wb": {
"source": "iana"
},
"audio/prs.sid": {
"source": "iana"
},
"audio/qcelp": {
"source": "iana"
},
"audio/raptorfec": {
"source": "iana"
},
"audio/red": {
"source": "iana"
},
"audio/rtp-enc-aescm128": {
"source": "iana"
},
"audio/rtp-midi": {
"source": "iana"
},
"audio/rtploopback": {
"source": "iana"
},
"audio/rtx": {
"source": "iana"
},
"audio/s3m": {
"source": "apache",
"extensions": ["s3m"]
},
"audio/silk": {
"source": "apache",
"extensions": ["sil"]
},
"audio/smv": {
"source": "iana"
},
"audio/smv-qcp": {
"source": "iana"
},
"audio/smv0": {
"source": "iana"
},
"audio/sp-midi": {
"source": "iana"
},
"audio/speex": {
"source": "iana"
},
"audio/t140c": {
"source": "iana"
},
"audio/t38": {
"source": "iana"
},
"audio/telephone-event": {
"source": "iana"
},
"audio/tone": {
"source": "iana"
},
"audio/uemclip": {
"source": "iana"
},
"audio/ulpfec": {
"source": "iana"
},
"audio/vdvi": {
"source": "iana"
},
"audio/vmr-wb": {
"source": "iana"
},
"audio/vnd.3gpp.iufp": {
"source": "iana"
},
"audio/vnd.4sb": {
"source": "iana"
},
"audio/vnd.audiokoz": {
"source": "iana"
},
"audio/vnd.celp": {
"source": "iana"
},
"audio/vnd.cisco.nse": {
"source": "iana"
},
"audio/vnd.cmles.radio-events": {
"source": "iana"
},
"audio/vnd.cns.anp1": {
"source": "iana"
},
"audio/vnd.cns.inf1": {
"source": "iana"
},
"audio/vnd.dece.audio": {
"source": "iana",
"extensions": ["uva","uvva"]
},
"audio/vnd.digital-winds": {
"source": "iana",
"extensions": ["eol"]
},
"audio/vnd.dlna.adts": {
"source": "iana"
},
"audio/vnd.dolby.heaac.1": {
"source": "iana"
},
"audio/vnd.dolby.heaac.2": {
"source": "iana"
},
"audio/vnd.dolby.mlp": {
"source": "iana"
},
"audio/vnd.dolby.mps": {
"source": "iana"
},
"audio/vnd.dolby.pl2": {
"source": "iana"
},
"audio/vnd.dolby.pl2x": {
"source": "iana"
},
"audio/vnd.dolby.pl2z": {
"source": "iana"
},
"audio/vnd.dolby.pulse.1": {
"source": "iana"
},
"audio/vnd.dra": {
"source": "iana",
"extensions": ["dra"]
},
"audio/vnd.dts": {
"source": "iana",
"extensions": ["dts"]
},
"audio/vnd.dts.hd": {
"source": "iana",
"extensions": ["dtshd"]
},
"audio/vnd.dvb.file": {
"source": "iana"
},
"audio/vnd.everad.plj": {
"source": "iana"
},
"audio/vnd.hns.audio": {
"source": "iana"
},
"audio/vnd.lucent.voice": {
"source": "iana",
"extensions": ["lvp"]
},
"audio/vnd.ms-playready.media.pya": {
"source": "iana",
"extensions": ["pya"]
},
"audio/vnd.nokia.mobile-xmf": {
"source": "iana"
},
"audio/vnd.nortel.vbk": {
"source": "iana"
},
"audio/vnd.nuera.ecelp4800": {
"source": "iana",
"extensions": ["ecelp4800"]
},
"audio/vnd.nuera.ecelp7470": {
"source": "iana",
"extensions": ["ecelp7470"]
},
"audio/vnd.nuera.ecelp9600": {
"source": "iana",
"extensions": ["ecelp9600"]
},
"audio/vnd.octel.sbc": {
"source": "iana"
},
"audio/vnd.qcelp": {
"source": "iana"
},
"audio/vnd.rhetorex.32kadpcm": {
"source": "iana"
},
"audio/vnd.rip": {
"source": "iana",
"extensions": ["rip"]
},
"audio/vnd.rn-realaudio": {
"compressible": false
},
"audio/vnd.sealedmedia.softseal.mpeg": {
"source": "iana"
},
"audio/vnd.vmx.cvsd": {
"source": "iana"
},
"audio/vnd.wave": {
"compressible": false
},
"audio/vorbis": {
"source": "iana",
"compressible": false
},
"audio/vorbis-config": {
"source": "iana"
},
"audio/wav": {
"compressible": false,
"extensions": ["wav"]
},
"audio/wave": {
"compressible": false,
"extensions": ["wav"]
},
"audio/webm": {
"source": "apache",
"compressible": false,
"extensions": ["weba"]
},
"audio/x-aac": {
"source": "apache",
"compressible": false,
"extensions": ["aac"]
},
"audio/x-aiff": {
"source": "apache",
"extensions": ["aif","aiff","aifc"]
},
"audio/x-caf": {
"source": "apache",
"compressible": false,
"extensions": ["caf"]
},
"audio/x-flac": {
"source": "apache",
"extensions": ["flac"]
},
"audio/x-m4a": {
"source": "nginx",
"extensions": ["m4a"]
},
"audio/x-matroska": {
"source": "apache",
"extensions": ["mka"]
},
"audio/x-mpegurl": {
"source": "apache",
"extensions": ["m3u"]
},
"audio/x-ms-wax": {
"source": "apache",
"extensions": ["wax"]
},
"audio/x-ms-wma": {
"source": "apache",
"extensions": ["wma"]
},
"audio/x-pn-realaudio": {
"source": "apache",
"extensions": ["ram","ra"]
},
"audio/x-pn-realaudio-plugin": {
"source": "apache",
"extensions": ["rmp"]
},
"audio/x-realaudio": {
"source": "nginx",
"extensions": ["ra"]
},
"audio/x-tta": {
"source": "apache"
},
"audio/x-wav": {
"source": "apache",
"extensions": ["wav"]
},
"audio/xm": {
"source": "apache",
"extensions": ["xm"]
},
"chemical/x-cdx": {
"source": "apache",
"extensions": ["cdx"]
},
"chemical/x-cif": {
"source": "apache",
"extensions": ["cif"]
},
"chemical/x-cmdf": {
"source": "apache",
"extensions": ["cmdf"]
},
"chemical/x-cml": {
"source": "apache",
"extensions": ["cml"]
},
"chemical/x-csml": {
"source": "apache",
"extensions": ["csml"]
},
"chemical/x-pdb": {
"source": "apache"
},
"chemical/x-xyz": {
"source": "apache",
"extensions": ["xyz"]
},
"font/opentype": {
"compressible": true,
"extensions": ["otf"]
},
"image/bmp": {
"source": "apache",
"compressible": true,
"extensions": ["bmp"]
},
"image/cgm": {
"source": "iana",
"extensions": ["cgm"]
},
"image/fits": {
"source": "iana"
},
"image/g3fax": {
"source": "iana",
"extensions": ["g3"]
},
"image/gif": {
"source": "iana",
"compressible": false,
"extensions": ["gif"]
},
"image/ief": {
"source": "iana",
"extensions": ["ief"]
},
"image/jp2": {
"source": "iana"
},
"image/jpeg": {
"source": "iana",
"compressible": false,
"extensions": ["jpeg","jpg","jpe"]
},
"image/jpm": {
"source": "iana"
},
"image/jpx": {
"source": "iana"
},
"image/ktx": {
"source": "iana",
"extensions": ["ktx"]
},
"image/naplps": {
"source": "iana"
},
"image/pjpeg": {
"compressible": false
},
"image/png": {
"source": "iana",
"compressible": false,
"extensions": ["png"]
},
"image/prs.btif": {
"source": "iana",
"extensions": ["btif"]
},
"image/prs.pti": {
"source": "iana"
},
"image/pwg-raster": {
"source": "iana"
},
"image/sgi": {
"source": "apache",
"extensions": ["sgi"]
},
"image/svg+xml": {
"source": "iana",
"compressible": true,
"extensions": ["svg","svgz"]
},
"image/t38": {
"source": "iana"
},
"image/tiff": {
"source": "iana",
"compressible": false,
"extensions": ["tiff","tif"]
},
"image/tiff-fx": {
"source": "iana"
},
"image/vnd.adobe.photoshop": {
"source": "iana",
"compressible": true,
"extensions": ["psd"]
},
"image/vnd.airzip.accelerator.azv": {
"source": "iana"
},
"image/vnd.cns.inf2": {
"source": "iana"
},
"image/vnd.dece.graphic": {
"source": "iana",
"extensions": ["uvi","uvvi","uvg","uvvg"]
},
"image/vnd.djvu": {
"source": "iana",
"extensions": ["djvu","djv"]
},
"image/vnd.dvb.subtitle": {
"source": "iana",
"extensions": ["sub"]
},
"image/vnd.dwg": {
"source": "iana",
"extensions": ["dwg"]
},
"image/vnd.dxf": {
"source": "iana",
"extensions": ["dxf"]
},
"image/vnd.fastbidsheet": {
"source": "iana",
"extensions": ["fbs"]
},
"image/vnd.fpx": {
"source": "iana",
"extensions": ["fpx"]
},
"image/vnd.fst": {
"source": "iana",
"extensions": ["fst"]
},
"image/vnd.fujixerox.edmics-mmr": {
"source": "iana",
"extensions": ["mmr"]
},
"image/vnd.fujixerox.edmics-rlc": {
"source": "iana",
"extensions": ["rlc"]
},
"image/vnd.globalgraphics.pgb": {
"source": "iana"
},
"image/vnd.microsoft.icon": {
"source": "iana"
},
"image/vnd.mix": {
"source": "iana"
},
"image/vnd.mozilla.apng": {
"source": "iana"
},
"image/vnd.ms-modi": {
"source": "iana",
"extensions": ["mdi"]
},
"image/vnd.ms-photo": {
"source": "apache",
"extensions": ["wdp"]
},
"image/vnd.net-fpx": {
"source": "iana",
"extensions": ["npx"]
},
"image/vnd.radiance": {
"source": "iana"
},
"image/vnd.sealed.png": {
"source": "iana"
},
"image/vnd.sealedmedia.softseal.gif": {
"source": "iana"
},
"image/vnd.sealedmedia.softseal.jpg": {
"source": "iana"
},
"image/vnd.svf": {
"source": "iana"
},
"image/vnd.tencent.tap": {
"source": "iana"
},
"image/vnd.valve.source.texture": {
"source": "iana"
},
"image/vnd.wap.wbmp": {
"source": "iana",
"extensions": ["wbmp"]
},
"image/vnd.xiff": {
"source": "iana",
"extensions": ["xif"]
},
"image/vnd.zbrush.pcx": {
"source": "iana"
},
"image/webp": {
"source": "apache",
"extensions": ["webp"]
},
"image/x-3ds": {
"source": "apache",
"extensions": ["3ds"]
},
"image/x-cmu-raster": {
"source": "apache",
"extensions": ["ras"]
},
"image/x-cmx": {
"source": "apache",
"extensions": ["cmx"]
},
"image/x-freehand": {
"source": "apache",
"extensions": ["fh","fhc","fh4","fh5","fh7"]
},
"image/x-icon": {
"source": "apache",
"compressible": true,
"extensions": ["ico"]
},
"image/x-jng": {
"source": "nginx",
"extensions": ["jng"]
},
"image/x-mrsid-image": {
"source": "apache",
"extensions": ["sid"]
},
"image/x-ms-bmp": {
"source": "nginx",
"compressible": true,
"extensions": ["bmp"]
},
"image/x-pcx": {
"source": "apache",
"extensions": ["pcx"]
},
"image/x-pict": {
"source": "apache",
"extensions": ["pic","pct"]
},
"image/x-portable-anymap": {
"source": "apache",
"extensions": ["pnm"]
},
"image/x-portable-bitmap": {
"source": "apache",
"extensions": ["pbm"]
},
"image/x-portable-graymap": {
"source": "apache",
"extensions": ["pgm"]
},
"image/x-portable-pixmap": {
"source": "apache",
"extensions": ["ppm"]
},
"image/x-rgb": {
"source": "apache",
"extensions": ["rgb"]
},
"image/x-tga": {
"source": "apache",
"extensions": ["tga"]
},
"image/x-xbitmap": {
"source": "apache",
"extensions": ["xbm"]
},
"image/x-xcf": {
"compressible": false
},
"image/x-xpixmap": {
"source": "apache",
"extensions": ["xpm"]
},
"image/x-xwindowdump": {
"source": "apache",
"extensions": ["xwd"]
},
"message/cpim": {
"source": "iana"
},
"message/delivery-status": {
"source": "iana"
},
"message/disposition-notification": {
"source": "iana"
},
"message/external-body": {
"source": "iana"
},
"message/feedback-report": {
"source": "iana"
},
"message/global": {
"source": "iana"
},
"message/global-delivery-status": {
"source": "iana"
},
"message/global-disposition-notification": {
"source": "iana"
},
"message/global-headers": {
"source": "iana"
},
"message/http": {
"source": "iana",
"compressible": false
},
"message/imdn+xml": {
"source": "iana",
"compressible": true
},
"message/news": {
"source": "iana"
},
"message/partial": {
"source": "iana",
"compressible": false
},
"message/rfc822": {
"source": "iana",
"compressible": true,
"extensions": ["eml","mime"]
},
"message/s-http": {
"source": "iana"
},
"message/sip": {
"source": "iana"
},
"message/sipfrag": {
"source": "iana"
},
"message/tracking-status": {
"source": "iana"
},
"message/vnd.si.simp": {
"source": "iana"
},
"message/vnd.wfa.wsc": {
"source": "iana"
},
"model/iges": {
"source": "iana",
"compressible": false,
"extensions": ["igs","iges"]
},
"model/mesh": {
"source": "iana",
"compressible": false,
"extensions": ["msh","mesh","silo"]
},
"model/vnd.collada+xml": {
"source": "iana",
"extensions": ["dae"]
},
"model/vnd.dwf": {
"source": "iana",
"extensions": ["dwf"]
},
"model/vnd.flatland.3dml": {
"source": "iana"
},
"model/vnd.gdl": {
"source": "iana",
"extensions": ["gdl"]
},
"model/vnd.gs-gdl": {
"source": "apache"
},
"model/vnd.gs.gdl": {
"source": "iana"
},
"model/vnd.gtw": {
"source": "iana",
"extensions": ["gtw"]
},
"model/vnd.moml+xml": {
"source": "iana"
},
"model/vnd.mts": {
"source": "iana",
"extensions": ["mts"]
},
"model/vnd.opengex": {
"source": "iana"
},
"model/vnd.parasolid.transmit.binary": {
"source": "iana"
},
"model/vnd.parasolid.transmit.text": {
"source": "iana"
},
"model/vnd.rosette.annotated-data-model": {
"source": "iana"
},
"model/vnd.valve.source.compiled-map": {
"source": "iana"
},
"model/vnd.vtu": {
"source": "iana",
"extensions": ["vtu"]
},
"model/vrml": {
"source": "iana",
"compressible": false,
"extensions": ["wrl","vrml"]
},
"model/x3d+binary": {
"source": "apache",
"compressible": false,
"extensions": ["x3db","x3dbz"]
},
"model/x3d+fastinfoset": {
"source": "iana"
},
"model/x3d+vrml": {
"source": "apache",
"compressible": false,
"extensions": ["x3dv","x3dvz"]
},
"model/x3d+xml": {
"source": "iana",
"compressible": true,
"extensions": ["x3d","x3dz"]
},
"model/x3d-vrml": {
"source": "iana"
},
"multipart/alternative": {
"source": "iana",
"compressible": false
},
"multipart/appledouble": {
"source": "iana"
},
"multipart/byteranges": {
"source": "iana"
},
"multipart/digest": {
"source": "iana"
},
"multipart/encrypted": {
"source": "iana",
"compressible": false
},
"multipart/form-data": {
"source": "iana",
"compressible": false
},
"multipart/header-set": {
"source": "iana"
},
"multipart/mixed": {
"source": "iana",
"compressible": false
},
"multipart/parallel": {
"source": "iana"
},
"multipart/related": {
"source": "iana",
"compressible": false
},
"multipart/report": {
"source": "iana"
},
"multipart/signed": {
"source": "iana",
"compressible": false
},
"multipart/voice-message": {
"source": "iana"
},
"multipart/x-mixed-replace": {
"source": "iana"
},
"text/1d-interleaved-parityfec": {
"source": "iana"
},
"text/cache-manifest": {
"source": "iana",
"compressible": true,
"extensions": ["appcache","manifest"]
},
"text/calendar": {
"source": "iana",
"extensions": ["ics","ifb"]
},
"text/calender": {
"compressible": true
},
"text/cmd": {
"compressible": true
},
"text/coffeescript": {
"extensions": ["coffee","litcoffee"]
},
"text/css": {
"source": "iana",
"compressible": true,
"extensions": ["css"]
},
"text/csv": {
"source": "iana",
"compressible": true,
"extensions": ["csv"]
},
"text/csv-schema": {
"source": "iana"
},
"text/directory": {
"source": "iana"
},
"text/dns": {
"source": "iana"
},
"text/ecmascript": {
"source": "iana"
},
"text/encaprtp": {
"source": "iana"
},
"text/enriched": {
"source": "iana"
},
"text/fwdred": {
"source": "iana"
},
"text/grammar-ref-list": {
"source": "iana"
},
"text/hjson": {
"extensions": ["hjson"]
},
"text/html": {
"source": "iana",
"compressible": true,
"extensions": ["html","htm","shtml"]
},
"text/jade": {
"extensions": ["jade"]
},
"text/javascript": {
"source": "iana",
"compressible": true
},
"text/jcr-cnd": {
"source": "iana"
},
"text/jsx": {
"compressible": true,
"extensions": ["jsx"]
},
"text/less": {
"extensions": ["less"]
},
"text/markdown": {
"source": "iana"
},
"text/mathml": {
"source": "nginx",
"extensions": ["mml"]
},
"text/mizar": {
"source": "iana"
},
"text/n3": {
"source": "iana",
"compressible": true,
"extensions": ["n3"]
},
"text/parameters": {
"source": "iana"
},
"text/parityfec": {
"source": "iana"
},
"text/plain": {
"source": "iana",
"compressible": true,
"extensions": ["txt","text","conf","def","list","log","in","ini"]
},
"text/provenance-notation": {
"source": "iana"
},
"text/prs.fallenstein.rst": {
"source": "iana"
},
"text/prs.lines.tag": {
"source": "iana",
"extensions": ["dsc"]
},
"text/prs.prop.logic": {
"source": "iana"
},
"text/raptorfec": {
"source": "iana"
},
"text/red": {
"source": "iana"
},
"text/rfc822-headers": {
"source": "iana"
},
"text/richtext": {
"source": "iana",
"compressible": true,
"extensions": ["rtx"]
},
"text/rtf": {
"source": "iana",
"compressible": true,
"extensions": ["rtf"]
},
"text/rtp-enc-aescm128": {
"source": "iana"
},
"text/rtploopback": {
"source": "iana"
},
"text/rtx": {
"source": "iana"
},
"text/sgml": {
"source": "iana",
"extensions": ["sgml","sgm"]
},
"text/slim": {
"extensions": ["slim","slm"]
},
"text/stylus": {
"extensions": ["stylus","styl"]
},
"text/t140": {
"source": "iana"
},
"text/tab-separated-values": {
"source": "iana",
"compressible": true,
"extensions": ["tsv"]
},
"text/troff": {
"source": "iana",
"extensions": ["t","tr","roff","man","me","ms"]
},
"text/turtle": {
"source": "iana",
"extensions": ["ttl"]
},
"text/ulpfec": {
"source": "iana"
},
"text/uri-list": {
"source": "iana",
"compressible": true,
"extensions": ["uri","uris","urls"]
},
"text/vcard": {
"source": "iana",
"compressible": true,
"extensions": ["vcard"]
},
"text/vnd.a": {
"source": "iana"
},
"text/vnd.abc": {
"source": "iana"
},
"text/vnd.curl": {
"source": "iana",
"extensions": ["curl"]
},
"text/vnd.curl.dcurl": {
"source": "apache",
"extensions": ["dcurl"]
},
"text/vnd.curl.mcurl": {
"source": "apache",
"extensions": ["mcurl"]
},
"text/vnd.curl.scurl": {
"source": "apache",
"extensions": ["scurl"]
},
"text/vnd.debian.copyright": {
"source": "iana"
},
"text/vnd.dmclientscript": {
"source": "iana"
},
"text/vnd.dvb.subtitle": {
"source": "iana",
"extensions": ["sub"]
},
"text/vnd.esmertec.theme-descriptor": {
"source": "iana"
},
"text/vnd.fly": {
"source": "iana",
"extensions": ["fly"]
},
"text/vnd.fmi.flexstor": {
"source": "iana",
"extensions": ["flx"]
},
"text/vnd.graphviz": {
"source": "iana",
"extensions": ["gv"]
},
"text/vnd.in3d.3dml": {
"source": "iana",
"extensions": ["3dml"]
},
"text/vnd.in3d.spot": {
"source": "iana",
"extensions": ["spot"]
},
"text/vnd.iptc.newsml": {
"source": "iana"
},
"text/vnd.iptc.nitf": {
"source": "iana"
},
"text/vnd.latex-z": {
"source": "iana"
},
"text/vnd.motorola.reflex": {
"source": "iana"
},
"text/vnd.ms-mediapackage": {
"source": "iana"
},
"text/vnd.net2phone.commcenter.command": {
"source": "iana"
},
"text/vnd.radisys.msml-basic-layout": {
"source": "iana"
},
"text/vnd.si.uricatalogue": {
"source": "iana"
},
"text/vnd.sun.j2me.app-descriptor": {
"source": "iana",
"extensions": ["jad"]
},
"text/vnd.trolltech.linguist": {
"source": "iana"
},
"text/vnd.wap.si": {
"source": "iana"
},
"text/vnd.wap.sl": {
"source": "iana"
},
"text/vnd.wap.wml": {
"source": "iana",
"extensions": ["wml"]
},
"text/vnd.wap.wmlscript": {
"source": "iana",
"extensions": ["wmls"]
},
"text/vtt": {
"charset": "UTF-8",
"compressible": true,
"extensions": ["vtt"]
},
"text/x-asm": {
"source": "apache",
"extensions": ["s","asm"]
},
"text/x-c": {
"source": "apache",
"extensions": ["c","cc","cxx","cpp","h","hh","dic"]
},
"text/x-component": {
"source": "nginx",
"extensions": ["htc"]
},
"text/x-fortran": {
"source": "apache",
"extensions": ["f","for","f77","f90"]
},
"text/x-gwt-rpc": {
"compressible": true
},
"text/x-handlebars-template": {
"extensions": ["hbs"]
},
"text/x-java-source": {
"source": "apache",
"extensions": ["java"]
},
"text/x-jquery-tmpl": {
"compressible": true
},
"text/x-lua": {
"extensions": ["lua"]
},
"text/x-markdown": {
"compressible": true,
"extensions": ["markdown","md","mkd"]
},
"text/x-nfo": {
"source": "apache",
"extensions": ["nfo"]
},
"text/x-opml": {
"source": "apache",
"extensions": ["opml"]
},
"text/x-pascal": {
"source": "apache",
"extensions": ["p","pas"]
},
"text/x-processing": {
"compressible": true,
"extensions": ["pde"]
},
"text/x-sass": {
"extensions": ["sass"]
},
"text/x-scss": {
"extensions": ["scss"]
},
"text/x-setext": {
"source": "apache",
"extensions": ["etx"]
},
"text/x-sfv": {
"source": "apache",
"extensions": ["sfv"]
},
"text/x-suse-ymp": {
"compressible": true,
"extensions": ["ymp"]
},
"text/x-uuencode": {
"source": "apache",
"extensions": ["uu"]
},
"text/x-vcalendar": {
"source": "apache",
"extensions": ["vcs"]
},
"text/x-vcard": {
"source": "apache",
"extensions": ["vcf"]
},
"text/xml": {
"source": "iana",
"compressible": true,
"extensions": ["xml"]
},
"text/xml-external-parsed-entity": {
"source": "iana"
},
"text/yaml": {
"extensions": ["yaml","yml"]
},
"video/1d-interleaved-parityfec": {
"source": "apache"
},
"video/3gpp": {
"source": "apache",
"extensions": ["3gp","3gpp"]
},
"video/3gpp-tt": {
"source": "apache"
},
"video/3gpp2": {
"source": "apache",
"extensions": ["3g2"]
},
"video/bmpeg": {
"source": "apache"
},
"video/bt656": {
"source": "apache"
},
"video/celb": {
"source": "apache"
},
"video/dv": {
"source": "apache"
},
"video/encaprtp": {
"source": "apache"
},
"video/h261": {
"source": "apache",
"extensions": ["h261"]
},
"video/h263": {
"source": "apache",
"extensions": ["h263"]
},
"video/h263-1998": {
"source": "apache"
},
"video/h263-2000": {
"source": "apache"
},
"video/h264": {
"source": "apache",
"extensions": ["h264"]
},
"video/h264-rcdo": {
"source": "apache"
},
"video/h264-svc": {
"source": "apache"
},
"video/h265": {
"source": "apache"
},
"video/iso.segment": {
"source": "apache"
},
"video/jpeg": {
"source": "apache",
"extensions": ["jpgv"]
},
"video/jpeg2000": {
"source": "apache"
},
"video/jpm": {
"source": "apache",
"extensions": ["jpm","jpgm"]
},
"video/mj2": {
"source": "apache",
"extensions": ["mj2","mjp2"]
},
"video/mp1s": {
"source": "apache"
},
"video/mp2p": {
"source": "apache"
},
"video/mp2t": {
"source": "apache",
"extensions": ["ts"]
},
"video/mp4": {
"source": "apache",
"compressible": false,
"extensions": ["mp4","mp4v","mpg4"]
},
"video/mp4v-es": {
"source": "apache"
},
"video/mpeg": {
"source": "apache",
"compressible": false,
"extensions": ["mpeg","mpg","mpe","m1v","m2v"]
},
"video/mpeg4-generic": {
"source": "apache"
},
"video/mpv": {
"source": "apache"
},
"video/nv": {
"source": "apache"
},
"video/ogg": {
"source": "apache",
"compressible": false,
"extensions": ["ogv"]
},
"video/parityfec": {
"source": "apache"
},
"video/pointer": {
"source": "apache"
},
"video/quicktime": {
"source": "apache",
"compressible": false,
"extensions": ["qt","mov"]
},
"video/raptorfec": {
"source": "apache"
},
"video/raw": {
"source": "apache"
},
"video/rtp-enc-aescm128": {
"source": "apache"
},
"video/rtploopback": {
"source": "apache"
},
"video/rtx": {
"source": "apache"
},
"video/smpte292m": {
"source": "apache"
},
"video/ulpfec": {
"source": "apache"
},
"video/vc1": {
"source": "apache"
},
"video/vnd.cctv": {
"source": "apache"
},
"video/vnd.dece.hd": {
"source": "apache",
"extensions": ["uvh","uvvh"]
},
"video/vnd.dece.mobile": {
"source": "apache",
"extensions": ["uvm","uvvm"]
},
"video/vnd.dece.mp4": {
"source": "apache"
},
"video/vnd.dece.pd": {
"source": "apache",
"extensions": ["uvp","uvvp"]
},
"video/vnd.dece.sd": {
"source": "apache",
"extensions": ["uvs","uvvs"]
},
"video/vnd.dece.video": {
"source": "apache",
"extensions": ["uvv","uvvv"]
},
"video/vnd.directv.mpeg": {
"source": "apache"
},
"video/vnd.directv.mpeg-tts": {
"source": "apache"
},
"video/vnd.dlna.mpeg-tts": {
"source": "apache"
},
"video/vnd.dvb.file": {
"source": "apache",
"extensions": ["dvb"]
},
"video/vnd.fvt": {
"source": "apache",
"extensions": ["fvt"]
},
"video/vnd.hns.video": {
"source": "apache"
},
"video/vnd.iptvforum.1dparityfec-1010": {
"source": "apache"
},
"video/vnd.iptvforum.1dparityfec-2005": {
"source": "apache"
},
"video/vnd.iptvforum.2dparityfec-1010": {
"source": "apache"
},
"video/vnd.iptvforum.2dparityfec-2005": {
"source": "apache"
},
"video/vnd.iptvforum.ttsavc": {
"source": "apache"
},
"video/vnd.iptvforum.ttsmpeg2": {
"source": "apache"
},
"video/vnd.motorola.video": {
"source": "apache"
},
"video/vnd.motorola.videop": {
"source": "apache"
},
"video/vnd.mpegurl": {
"source": "apache",
"extensions": ["mxu","m4u"]
},
"video/vnd.ms-playready.media.pyv": {
"source": "apache",
"extensions": ["pyv"]
},
"video/vnd.nokia.interleaved-multimedia": {
"source": "apache"
},
"video/vnd.nokia.videovoip": {
"source": "apache"
},
"video/vnd.objectvideo": {
"source": "apache"
},
"video/vnd.radgamettools.bink": {
"source": "apache"
},
"video/vnd.radgamettools.smacker": {
"source": "apache"
},
"video/vnd.sealed.mpeg1": {
"source": "apache"
},
"video/vnd.sealed.mpeg4": {
"source": "apache"
},
"video/vnd.sealed.swf": {
"source": "apache"
},
"video/vnd.sealedmedia.softseal.mov": {
"source": "apache"
},
"video/vnd.uvvu.mp4": {
"source": "apache",
"extensions": ["uvu","uvvu"]
},
"video/vnd.vivo": {
"source": "apache",
"extensions": ["viv"]
},
"video/vp8": {
"source": "apache"
},
"video/webm": {
"source": "apache",
"compressible": false,
"extensions": ["webm"]
},
"video/x-f4v": {
"source": "apache",
"extensions": ["f4v"]
},
"video/x-fli": {
"source": "apache",
"extensions": ["fli"]
},
"video/x-flv": {
"source": "apache",
"compressible": false,
"extensions": ["flv"]
},
"video/x-m4v": {
"source": "apache",
"extensions": ["m4v"]
},
"video/x-matroska": {
"source": "apache",
"compressible": false,
"extensions": ["mkv","mk3d","mks"]
},
"video/x-mng": {
"source": "apache",
"extensions": ["mng"]
},
"video/x-ms-asf": {
"source": "apache",
"extensions": ["asf","asx"]
},
"video/x-ms-vob": {
"source": "apache",
"extensions": ["vob"]
},
"video/x-ms-wm": {
"source": "apache",
"extensions": ["wm"]
},
"video/x-ms-wmv": {
"source": "apache",
"compressible": false,
"extensions": ["wmv"]
},
"video/x-ms-wmx": {
"source": "apache",
"extensions": ["wmx"]
},
"video/x-ms-wvx": {
"source": "apache",
"extensions": ["wvx"]
},
"video/x-msvideo": {
"source": "apache",
"extensions": ["avi"]
},
"video/x-sgi-movie": {
"source": "apache",
"extensions": ["movie"]
},
"video/x-smv": {
"source": "apache",
"extensions": ["smv"]
},
"x-conference/x-cooltalk": {
"source": "apache",
"extensions": ["ice"]
},
"x-shader/x-fragment": {
"compressible": true
},
"x-shader/x-vertex": {
"compressible": true
}
}
},{}],54:[function(require,module,exports){
/*!
* mime-db
* Copyright(c) 2014 Jonathan Ong
* MIT Licensed
*/
/**
* Module exports.
*/
module.exports = require('./db.json')
},{"./db.json":53}],55:[function(require,module,exports){
/**
* Create an event emitter with namespaces
* @name createNamespaceEmitter
* @example
* var emitter = require('./index')()
*
* emitter.on('*', function () {
* console.log('all events emitted', this.event)
* })
*
* emitter.on('example', function () {
* console.log('example event emitted')
* })
*/
module.exports = function createNamespaceEmitter () {
var emitter = { _fns: {} }
/**
* Emit an event. Optionally namespace the event. Separate the namespace and event with a `:`
* @name emit
* @param {String} event – the name of the event, with optional namespace
* @param {...*} data – data variables that will be passed as arguments to the event listener
* @example
* emitter.emit('example')
* emitter.emit('demo:test')
* emitter.emit('data', { example: true}, 'a string', 1)
*/
emitter.emit = function emit (event) {
var args = [].slice.call(arguments, 1)
var namespaced = namespaces(event)
if (this._fns[event]) emitAll(event, this._fns[event], args)
if (namespaced) emitAll(event, namespaced, args)
}
/**
* Create en event listener.
* @name on
* @param {String} event
* @param {Function} fn
* @example
* emitter.on('example', function () {})
* emitter.on('demo', function () {})
*/
emitter.on = function on (event, fn) {
if (typeof fn !== 'function') { throw new Error('callback required') }
(this._fns[event] = this._fns[event] || []).push(fn)
}
/**
* Create en event listener that fires once.
* @name once
* @param {String} event
* @param {Function} fn
* @example
* emitter.once('example', function () {})
* emitter.once('demo', function () {})
*/
emitter.once = function once (event, fn) {
function one () {
fn.apply(this, arguments)
emitter.off(event, one)
}
this.on(event, one)
}
/**
* Stop listening to an event. Stop all listeners on an event by only passing the event name. Stop a single listener by passing that event handler as a callback.
* You must be explicit about what will be unsubscribed: `emitter.off('demo')` will unsubscribe an `emitter.on('demo')` listener,
* `emitter.off('demo:example')` will unsubscribe an `emitter.on('demo:example')` listener
* @name off
* @param {String} event
* @param {Function} [fn] – the specific handler
* @example
* emitter.off('example')
* emitter.off('demo', function () {})
*/
emitter.off = function off (event, fn) {
var keep = []
if (event && fn) {
for (var i = 0; i < this._fns.length; i++) {
if (this._fns[i] !== fn) {
keep.push(this._fns[i])
}
}
}
keep.length ? this._fns[event] = keep : delete this._fns[event]
}
function namespaces (e) {
var out = []
var args = e.split(':')
var fns = emitter._fns
Object.keys(fns).forEach(function (key) {
if (key === '*') out = out.concat(fns[key])
if (args.length === 2 && args[0] === key) out = out.concat(fns[key])
})
return out
}
function emitAll (e, fns, args) {
for (var i = 0; i < fns.length; i++) {
if (!fns[i]) break
fns[i].event = e
fns[i].apply(fns[i], args)
}
}
return emitter
}
},{}],56:[function(require,module,exports){
'use strict';
var numberIsNan = require('number-is-nan');
module.exports = function (num) {
if (typeof num !== 'number' || numberIsNan(num)) {
throw new TypeError('Expected a number, got ' + typeof num);
}
var exponent;
var unit;
var neg = num < 0;
var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
if (neg) {
num = -num;
}
if (num < 1) {
return (neg ? '-' : '') + num + ' B';
}
exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1);
num = Number((num / Math.pow(1000, exponent)).toFixed(2));
unit = units[exponent];
return (neg ? '-' : '') + num + ' ' + unit;
};
},{"number-is-nan":57}],57:[function(require,module,exports){
'use strict';
module.exports = Number.isNaN || function (x) {
return x !== x;
};
},{}],58:[function(require,module,exports){
// Generated by Babel
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.encode = encode;
/* global: window */
var _window = window;
var btoa = _window.btoa;
function encode(data) {
return btoa(unescape(encodeURIComponent(data)));
}
var isSupported = exports.isSupported = "btoa" in window;
},{}],59:[function(require,module,exports){
// Generated by Babel
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.newRequest = newRequest;
/* global window */
function newRequest() {
return new window.XMLHttpRequest();
}
},{}],60:[function(require,module,exports){
// Generated by Babel
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getSource = getSource;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var FileSource = function () {
function FileSource(file) {
_classCallCheck(this, FileSource);
this._file = file;
this.size = file.size;
}
_createClass(FileSource, [{
key: "slice",
value: function slice(start, end) {
return this._file.slice(start, end);
}
}, {
key: "close",
value: function close() {}
}]);
return FileSource;
}();
function getSource(input) {
// Since we emulate the Blob type in our tests (not all target browsers
// support it), we cannot use `instanceof` for testing whether the input value
// can be handled. Instead, we simply check is the slice() function and the
// size property are available.
if (typeof input.slice === "function" && typeof input.size !== "undefined") {
return new FileSource(input);
}
throw new Error("source object may only be an instance of File or Blob in this environment");
}
},{}],61:[function(require,module,exports){
// Generated by Babel
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setItem = setItem;
exports.getItem = getItem;
exports.removeItem = removeItem;
/* global window, localStorage */
var hasStorage = false;
try {
hasStorage = "localStorage" in window;
// Attempt to access localStorage
localStorage.length;
} catch (e) {
// If we try to access localStorage inside a sandboxed iframe, a SecurityError
// is thrown.
if (e.code === e.SECURITY_ERR) {
hasStorage = false;
} else {
throw e;
}
}
var canStoreURLs = exports.canStoreURLs = hasStorage;
function setItem(key, value) {
if (!hasStorage) return;
return localStorage.setItem(key, value);
}
function getItem(key) {
if (!hasStorage) return;
return localStorage.getItem(key);
}
function removeItem(key) {
if (!hasStorage) return;
return localStorage.removeItem(key);
}
},{}],62:[function(require,module,exports){
// Generated by Babel
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = fingerprint;
/**
* Generate a fingerprint for a file which will be used the store the endpoint
*
* @param {File} file
* @return {String}
*/
function fingerprint(file) {
return ["tus", file.name, file.type, file.size, file.lastModified].join("-");
}
},{}],63:[function(require,module,exports){
// Generated by Babel
"use strict";
var _upload = require("./upload");
var _upload2 = _interopRequireDefault(_upload);
var _storage = require("./node/storage");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* global window */
var defaultOptions = _upload2.default.defaultOptions;
if (typeof window !== "undefined") {
// Browser environment using XMLHttpRequest
var _window = window;
var XMLHttpRequest = _window.XMLHttpRequest;
var Blob = _window.Blob;
var isSupported = XMLHttpRequest && Blob && typeof Blob.prototype.slice === "function";
} else {
// Node.js environment using http module
var isSupported = true;
}
// The usage of the commonjs exporting syntax instead of the new ECMAScript
// one is actually inteded and prevents weird behaviour if we are trying to
// import this module in another module using Babel.
module.exports = {
Upload: _upload2.default,
isSupported: isSupported,
canStoreURLs: _storage.canStoreURLs,
defaultOptions: defaultOptions
};
},{"./node/storage":61,"./upload":64}],64:[function(require,module,exports){
// Generated by Babel
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* global window */
// We import the files used inside the Node environment which are rewritten
// for browsers using the rules defined in the package.json
Object.defineProperty(exports, "__esModule", {
value: true
});
var _fingerprint = require("./fingerprint");
var _fingerprint2 = _interopRequireDefault(_fingerprint);
var _extend = require("extend");
var _extend2 = _interopRequireDefault(_extend);
var _request = require("./node/request");
var _source = require("./node/source");
var _base = require("./node/base64");
var Base64 = _interopRequireWildcard(_base);
var _storage = require("./node/storage");
var Storage = _interopRequireWildcard(_storage);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var defaultOptions = {
endpoint: "",
fingerprint: _fingerprint2.default,
resume: true,
onProgress: null,
onChunkComplete: null,
onSuccess: null,
onError: null,
headers: {},
chunkSize: Infinity,
withCredentials: false,
uploadUrl: null,
uploadSize: null,
overridePatchMethod: false
};
var Upload = function () {
function Upload(file, options) {
_classCallCheck(this, Upload);
this.options = (0, _extend2.default)(true, {}, defaultOptions, options);
// The underlying File/Blob object
this.file = file;
// The URL against which the file will be uploaded
this.url = null;
// The underlying XHR object for the current PATCH request
this._xhr = null;
// The fingerpinrt for the current file (set after start())
this._fingerprint = null;
// The offset used in the current PATCH request
this._offset = null;
// True if the current PATCH request has been aborted
this._aborted = false;
// The file's size in bytes
this._size = null;
// The Source object which will wrap around the given file and provides us
// with a unified interface for getting its size and slice chunks from its
// content allowing us to easily handle Files, Blobs, Buffers and Streams.
this._source = null;
}
_createClass(Upload, [{
key: "start",
value: function start() {
var file = this.file;
if (!file) {
this._emitError(new Error("tus: no file or stream to upload provided"));
return;
}
if (!this.options.endpoint) {
this._emitError(new Error("tus: no endpoint provided"));
return;
}
var source = this._source = (0, _source.getSource)(file, this.options.chunkSize);
// Firstly, check if the caller has supplied a manual upload size or else
// we will use the calculated size by the source object.
if (this.options.uploadSize != null) {
var size = +this.options.uploadSize;
if (isNaN(size)) {
throw new Error("tus: cannot convert `uploadSize` option into a number");
}
this._size = size;
} else {
var size = source.size;
// The size property will be null if we cannot calculate the file's size,
// for example if you handle a stream.
if (size == null) {
throw new Error("tus: cannot automatically derive upload's size from input and must be specified manually using the `uploadSize` option");
}
this._size = size;
}
// A URL has manually been specified, so we try to resume
if (this.options.uploadUrl != null) {
this.url = this.options.uploadUrl;
this._resumeUpload();
return;
}
// Try to find the endpoint for the file in the storage
if (this.options.resume) {
this._fingerprint = this.options.fingerprint(file);
var resumedUrl = Storage.getItem(this._fingerprint);
if (resumedUrl != null) {
this.url = resumedUrl;
this._resumeUpload();
return;
}
}
// An upload has not started for the file yet, so we start a new one
this._createUpload();
}
}, {
key: "abort",
value: function abort() {
if (this._xhr !== null) {
this._xhr.abort();
this._source.close();
this._aborted = true;
}
}
}, {
key: "_emitXhrError",
value: function _emitXhrError(xhr, err) {
err.originalRequest = xhr;
this._emitError(err);
}
}, {
key: "_emitError",
value: function _emitError(err) {
if (typeof this.options.onError === "function") {
this.options.onError(err);
} else {
throw err;
}
}
}, {
key: "_emitSuccess",
value: function _emitSuccess() {
if (typeof this.options.onSuccess === "function") {
this.options.onSuccess();
}
}
/**
* Publishes notification when data has been sent to the server. This
* data may not have been accepted by the server yet.
* @param {number} bytesSent Number of bytes sent to the server.
* @param {number} bytesTotal Total number of bytes to be sent to the server.
*/
}, {
key: "_emitProgress",
value: function _emitProgress(bytesSent, bytesTotal) {
if (typeof this.options.onProgress === "function") {
this.options.onProgress(bytesSent, bytesTotal);
}
}
/**
* Publishes notification when a chunk of data has been sent to the server
* and accepted by the server.
* @param {number} chunkSize Size of the chunk that was accepted by the
* server.
* @param {number} bytesAccepted Total number of bytes that have been
* accepted by the server.
* @param {number} bytesTotal Total number of bytes to be sent to the server.
*/
}, {
key: "_emitChunkComplete",
value: function _emitChunkComplete(chunkSize, bytesAccepted, bytesTotal) {
if (typeof this.options.onChunkComplete === "function") {
this.options.onChunkComplete(chunkSize, bytesAccepted, bytesTotal);
}
}
/**
* Set the headers used in the request and the withCredentials property
* as defined in the options
*
* @param {XMLHttpRequest} xhr
*/
}, {
key: "_setupXHR",
value: function _setupXHR(xhr) {
xhr.setRequestHeader("Tus-Resumable", "1.0.0");
var headers = this.options.headers;
for (var name in headers) {
xhr.setRequestHeader(name, headers[name]);
}
xhr.withCredentials = this.options.withCredentials;
}
/**
* Create a new upload using the creation extension by sending a POST
* request to the endpoint. After successful creation the file will be
* uploaded
*
* @api private
*/
}, {
key: "_createUpload",
value: function _createUpload() {
var _this = this;
var xhr = (0, _request.newRequest)();
xhr.open("POST", this.options.endpoint, true);
xhr.onload = function () {
if (!(xhr.status >= 200 && xhr.status < 300)) {
_this._emitXhrError(xhr, new Error("tus: unexpected response while creating upload"));
return;
}
_this.url = xhr.getResponseHeader("Location");
if (_this.options.resume) {
Storage.setItem(_this._fingerprint, _this.url);
}
_this._offset = 0;
_this._startUpload();
};
xhr.onerror = function () {
_this._emitXhrError(xhr, new Error("tus: failed to create upload"));
};
this._setupXHR(xhr);
xhr.setRequestHeader("Upload-Length", this._size);
// Add metadata if values have been added
var metadata = encodeMetadata(this.options.metadata);
if (metadata !== "") {
xhr.setRequestHeader("Upload-Metadata", metadata);
}
xhr.send(null);
}
/*
* Try to resume an existing upload. First a HEAD request will be sent
* to retrieve the offset. If the request fails a new upload will be
* created. In the case of a successful response the file will be uploaded.
*
* @api private
*/
}, {
key: "_resumeUpload",
value: function _resumeUpload() {
var _this2 = this;
var xhr = (0, _request.newRequest)();
xhr.open("HEAD", this.url, true);
xhr.onload = function () {
if (!(xhr.status >= 200 && xhr.status < 300)) {
if (_this2.options.resume) {
// Remove stored fingerprint and corresponding endpoint,
// since the file can not be found
Storage.removeItem(_this2._fingerprint);
}
// Try to create a new upload
_this2.url = null;
_this2._createUpload();
return;
}
var offset = parseInt(xhr.getResponseHeader("Upload-Offset"), 10);
if (isNaN(offset)) {
_this2._emitXhrError(xhr, new Error("tus: invalid or missing offset value"));
return;
}
var length = parseInt(xhr.getResponseHeader("Upload-Length"), 10);
if (isNaN(length)) {
_this2._emitXhrError(xhr, new Error("tus: invalid or missing length value"));
return;
}
// Upload has already been completed and we do not need to send additional
// data to the server
if (offset === length) {
_this2._emitProgress(length, length);
_this2._emitSuccess();
return;
}
_this2._offset = offset;
_this2._startUpload();
};
xhr.onerror = function () {
_this2._emitXhrError(xhr, new Error("tus: failed to resume upload"));
};
this._setupXHR(xhr);
xhr.send(null);
}
/**
* Start uploading the file using PATCH requests. The file will be divided
* into chunks as specified in the chunkSize option. During the upload
* the onProgress event handler may be invoked multiple times.
*
* @api private
*/
}, {
key: "_startUpload",
value: function _startUpload() {
var _this3 = this;
var xhr = this._xhr = (0, _request.newRequest)();
// Some browser and servers may not support the PATCH method. For those
// cases, you can tell tus-js-client to use a POST request with the
// X-HTTP-Method-Override header for simulating a PATCH request.
if (this.options.overridePatchMethod) {
xhr.open("POST", this.url, true);
xhr.setRequestHeader("X-HTTP-Method-Override", "PATCH");
} else {
xhr.open("PATCH", this.url, true);
}
xhr.onload = function () {
if (!(xhr.status >= 200 && xhr.status < 300)) {
_this3._emitXhrError(xhr, new Error("tus: unexpected response while uploading chunk"));
return;
}
var offset = parseInt(xhr.getResponseHeader("Upload-Offset"), 10);
if (isNaN(offset)) {
_this3._emitXhrError(xhr, new Error("tus: invalid or missing offset value"));
return;
}
_this3._emitProgress(offset, _this3._size);
_this3._emitChunkComplete(offset - _this3._offset, offset, _this3._size);
_this3._offset = offset;
if (offset == _this3._size) {
// Yay, finally done :)
_this3._emitSuccess();
_this3._source.close();
return;
}
_this3._startUpload();
};
xhr.onerror = function () {
// Don't emit an error if the upload was aborted manually
if (_this3._aborted) {
return;
}
_this3._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + _this3._offset));
};
// Test support for progress events before attaching an event listener
if ("upload" in xhr) {
xhr.upload.onprogress = function (e) {
if (!e.lengthComputable) {
return;
}
_this3._emitProgress(start + e.loaded, _this3._size);
};
}
this._setupXHR(xhr);
xhr.setRequestHeader("Upload-Offset", this._offset);
xhr.setRequestHeader("Content-Type", "application/offset+octet-stream");
var start = this._offset;
var end = this._offset + this.options.chunkSize;
// The specified chunkSize may be Infinity or the calcluated end position
// may exceed the file's size. In both cases, we limit the end position to
// the input's total size for simpler calculations and correctness.
if (end === Infinity || end > this._size) {
end = this._size;
}
xhr.send(this._source.slice(start, end));
}
}]);
return Upload;
}();
function encodeMetadata(metadata) {
if (!Base64.isSupported) {
return "";
}
var encoded = [];
for (var key in metadata) {
encoded.push(key + " " + Base64.encode(metadata[key]));
}
return encoded.join(",");
}
Upload.defaultOptions = defaultOptions;
exports.default = Upload;
},{"./fingerprint":62,"./node/base64":58,"./node/request":59,"./node/source":60,"./node/storage":61,"extend":65}],65:[function(require,module,exports){
'use strict';
var hasOwn = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var isArray = function isArray(arr) {
if (typeof Array.isArray === 'function') {
return Array.isArray(arr);
}
return toStr.call(arr) === '[object Array]';
};
var isPlainObject = function isPlainObject(obj) {
if (!obj || toStr.call(obj) !== '[object Object]') {
return false;
}
var hasOwnConstructor = hasOwn.call(obj, 'constructor');
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
// Not own constructor property must be Object
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for (key in obj) {/**/}
return typeof key === 'undefined' || hasOwn.call(obj, key);
};
module.exports = function extend() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0],
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if (typeof target === 'boolean') {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
} else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {
target = {};
}
for (; i < length; ++i) {
options = arguments[i];
// Only deal with non-null/undefined values
if (options != null) {
// Extend the base object
for (name in options) {
src = target[name];
copy = options[name];
// Prevent never-ending loop
if (target !== copy) {
// Recurse if we're merging plain objects or arrays
if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && isArray(src) ? src : [];
} else {
clone = src && isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
target[name] = extend(deep, clone, copy);
// Don't bring in undefined values
} else if (typeof copy !== 'undefined') {
target[name] = copy;
}
}
}
}
}
// Return the modified object
return target;
};
},{}],66:[function(require,module,exports){
(function(self) {
'use strict';
if (self.fetch) {
return
}
var support = {
searchParams: 'URLSearchParams' in self,
iterable: 'Symbol' in self && 'iterator' in Symbol,
blob: 'FileReader' in self && 'Blob' in self && (function() {
try {
new Blob()
return true
} catch(e) {
return false
}
})(),
formData: 'FormData' in self,
arrayBuffer: 'ArrayBuffer' in self
}
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name)
}
if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
throw new TypeError('Invalid character in header field name')
}
return name.toLowerCase()
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value)
}
return value
}
// Build a destructive iterator for the value list
function iteratorFor(items) {
var iterator = {
next: function() {
var value = items.shift()
return {done: value === undefined, value: value}
}
}
if (support.iterable) {
iterator[Symbol.iterator] = function() {
return iterator
}
}
return iterator
}
function Headers(headers) {
this.map = {}
if (headers instanceof Headers) {
headers.forEach(function(value, name) {
this.append(name, value)
}, this)
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function(name) {
this.append(name, headers[name])
}, this)
}
}
Headers.prototype.append = function(name, value) {
name = normalizeName(name)
value = normalizeValue(value)
var list = this.map[name]
if (!list) {
list = []
this.map[name] = list
}
list.push(value)
}
Headers.prototype['delete'] = function(name) {
delete this.map[normalizeName(name)]
}
Headers.prototype.get = function(name) {
var values = this.map[normalizeName(name)]
return values ? values[0] : null
}
Headers.prototype.getAll = function(name) {
return this.map[normalizeName(name)] || []
}
Headers.prototype.has = function(name) {
return this.map.hasOwnProperty(normalizeName(name))
}
Headers.prototype.set = function(name, value) {
this.map[normalizeName(name)] = [normalizeValue(value)]
}
Headers.prototype.forEach = function(callback, thisArg) {
Object.getOwnPropertyNames(this.map).forEach(function(name) {
this.map[name].forEach(function(value) {
callback.call(thisArg, value, name, this)
}, this)
}, this)
}
Headers.prototype.keys = function() {
var items = []
this.forEach(function(value, name) { items.push(name) })
return iteratorFor(items)
}
Headers.prototype.values = function() {
var items = []
this.forEach(function(value) { items.push(value) })
return iteratorFor(items)
}
Headers.prototype.entries = function() {
var items = []
this.forEach(function(value, name) { items.push([name, value]) })
return iteratorFor(items)
}
if (support.iterable) {
Headers.prototype[Symbol.iterator] = Headers.prototype.entries
}
function consumed(body) {
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'))
}
body.bodyUsed = true
}
function fileReaderReady(reader) {
return new Promise(function(resolve, reject) {
reader.onload = function() {
resolve(reader.result)
}
reader.onerror = function() {
reject(reader.error)
}
})
}
function readBlobAsArrayBuffer(blob) {
var reader = new FileReader()
reader.readAsArrayBuffer(blob)
return fileReaderReady(reader)
}
function readBlobAsText(blob) {
var reader = new FileReader()
reader.readAsText(blob)
return fileReaderReady(reader)
}
function Body() {
this.bodyUsed = false
this._initBody = function(body) {
this._bodyInit = body
if (typeof body === 'string') {
this._bodyText = body
} else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
this._bodyBlob = body
} else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
this._bodyFormData = body
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this._bodyText = body.toString()
} else if (!body) {
this._bodyText = ''
} else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {
// Only support ArrayBuffers for POST method.
// Receiving ArrayBuffers happens via Blobs, instead.
} else {
throw new Error('unsupported BodyInit type')
}
if (!this.headers.get('content-type')) {
if (typeof body === 'string') {
this.headers.set('content-type', 'text/plain;charset=UTF-8')
} else if (this._bodyBlob && this._bodyBlob.type) {
this.headers.set('content-type', this._bodyBlob.type)
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
}
}
}
if (support.blob) {
this.blob = function() {
var rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return Promise.resolve(this._bodyBlob)
} else if (this._bodyFormData) {
throw new Error('could not read FormData body as blob')
} else {
return Promise.resolve(new Blob([this._bodyText]))
}
}
this.arrayBuffer = function() {
return this.blob().then(readBlobAsArrayBuffer)
}
this.text = function() {
var rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return readBlobAsText(this._bodyBlob)
} else if (this._bodyFormData) {
throw new Error('could not read FormData body as text')
} else {
return Promise.resolve(this._bodyText)
}
}
} else {
this.text = function() {
var rejected = consumed(this)
return rejected ? rejected : Promise.resolve(this._bodyText)
}
}
if (support.formData) {
this.formData = function() {
return this.text().then(decode)
}
}
this.json = function() {
return this.text().then(JSON.parse)
}
return this
}
// HTTP methods whose capitalization should be normalized
var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
function normalizeMethod(method) {
var upcased = method.toUpperCase()
return (methods.indexOf(upcased) > -1) ? upcased : method
}
function Request(input, options) {
options = options || {}
var body = options.body
if (Request.prototype.isPrototypeOf(input)) {
if (input.bodyUsed) {
throw new TypeError('Already read')
}
this.url = input.url
this.credentials = input.credentials
if (!options.headers) {
this.headers = new Headers(input.headers)
}
this.method = input.method
this.mode = input.mode
if (!body) {
body = input._bodyInit
input.bodyUsed = true
}
} else {
this.url = input
}
this.credentials = options.credentials || this.credentials || 'omit'
if (options.headers || !this.headers) {
this.headers = new Headers(options.headers)
}
this.method = normalizeMethod(options.method || this.method || 'GET')
this.mode = options.mode || this.mode || null
this.referrer = null
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
throw new TypeError('Body not allowed for GET or HEAD requests')
}
this._initBody(body)
}
Request.prototype.clone = function() {
return new Request(this)
}
function decode(body) {
var form = new FormData()
body.trim().split('&').forEach(function(bytes) {
if (bytes) {
var split = bytes.split('=')
var name = split.shift().replace(/\+/g, ' ')
var value = split.join('=').replace(/\+/g, ' ')
form.append(decodeURIComponent(name), decodeURIComponent(value))
}
})
return form
}
function headers(xhr) {
var head = new Headers()
var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\n')
pairs.forEach(function(header) {
var split = header.trim().split(':')
var key = split.shift().trim()
var value = split.join(':').trim()
head.append(key, value)
})
return head
}
Body.call(Request.prototype)
function Response(bodyInit, options) {
if (!options) {
options = {}
}
this.type = 'default'
this.status = options.status
this.ok = this.status >= 200 && this.status < 300
this.statusText = options.statusText
this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)
this.url = options.url || ''
this._initBody(bodyInit)
}
Body.call(Response.prototype)
Response.prototype.clone = function() {
return new Response(this._bodyInit, {
status: this.status,
statusText: this.statusText,
headers: new Headers(this.headers),
url: this.url
})
}
Response.error = function() {
var response = new Response(null, {status: 0, statusText: ''})
response.type = 'error'
return response
}
var redirectStatuses = [301, 302, 303, 307, 308]
Response.redirect = function(url, status) {
if (redirectStatuses.indexOf(status) === -1) {
throw new RangeError('Invalid status code')
}
return new Response(null, {status: status, headers: {location: url}})
}
self.Headers = Headers
self.Request = Request
self.Response = Response
self.fetch = function(input, init) {
return new Promise(function(resolve, reject) {
var request
if (Request.prototype.isPrototypeOf(input) && !init) {
request = input
} else {
request = new Request(input, init)
}
var xhr = new XMLHttpRequest()
function responseURL() {
if ('responseURL' in xhr) {
return xhr.responseURL
}
// Avoid security warnings on getResponseHeader when not allowed by CORS
if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
return xhr.getResponseHeader('X-Request-URL')
}
return
}
xhr.onload = function() {
var options = {
status: xhr.status,
statusText: xhr.statusText,
headers: headers(xhr),
url: responseURL()
}
var body = 'response' in xhr ? xhr.response : xhr.responseText
resolve(new Response(body, options))
}
xhr.onerror = function() {
reject(new TypeError('Network request failed'))
}
xhr.ontimeout = function() {
reject(new TypeError('Network request failed'))
}
xhr.open(request.method, request.url, true)
if (request.credentials === 'include') {
xhr.withCredentials = true
}
if ('responseType' in xhr && support.blob) {
xhr.responseType = 'blob'
}
request.headers.forEach(function(value, name) {
xhr.setRequestHeader(name, value)
})
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
})
}
self.fetch.polyfill = true
})(typeof self !== 'undefined' ? self : this);
},{}],67:[function(require,module,exports){
var bel = require('bel') // turns template tag into DOM elements
var morphdom = require('morphdom') // efficiently diffs + morphs two DOM elements
var defaultEvents = require('./update-events.js') // default events to be copied when dom elements update
module.exports = bel
// TODO move this + defaultEvents to a new module once we receive more feedback
module.exports.update = function (fromNode, toNode, opts) {
if (!opts) opts = {}
if (opts.events !== false) {
if (!opts.onBeforeMorphEl) opts.onBeforeMorphEl = copier
}
return morphdom(fromNode, toNode, opts)
// morphdom only copies attributes. we decided we also wanted to copy events
// that can be set via attributes
function copier (f, t) {
// copy events:
var events = opts.events || defaultEvents
for (var i = 0; i < events.length; i++) {
var ev = events[i]
if (t[ev]) { // if new element has a whitelisted attribute
f[ev] = t[ev] // update existing element
} else if (f[ev]) { // if existing element has it and new one doesnt
f[ev] = undefined // remove it from existing element
}
}
// copy values for form elements
if ((f.nodeName === 'INPUT' && f.type !== 'file') || f.nodeName === 'TEXTAREA' || f.nodeName === 'SELECT') {
if (t.getAttribute('value') === null) t.value = f.value
}
}
}
},{"./update-events.js":75,"bel":68,"morphdom":74}],68:[function(require,module,exports){
var document = require('global/document')
var hyperx = require('hyperx')
var onload = require('on-load')
var SVGNS = 'http://www.w3.org/2000/svg'
var BOOL_PROPS = {
autofocus: 1,
checked: 1,
defaultchecked: 1,
disabled: 1,
formnovalidate: 1,
indeterminate: 1,
readonly: 1,
required: 1,
selected: 1,
willvalidate: 1
}
var SVG_TAGS = [
'svg',
'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor',
'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color-profile',
'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix',
'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting',
'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB',
'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode',
'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting',
'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'font', 'font-face',
'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri',
'foreignObject', 'g', 'glyph', 'glyphRef', 'hkern', 'image', 'line',
'linearGradient', 'marker', 'mask', 'metadata', 'missing-glyph', 'mpath',
'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect',
'set', 'stop', 'switch', 'symbol', 'text', 'textPath', 'title', 'tref',
'tspan', 'use', 'view', 'vkern'
]
function belCreateElement (tag, props, children) {
var el
// If an svg tag, it needs a namespace
if (SVG_TAGS.indexOf(tag) !== -1) {
props.namespace = SVGNS
}
// If we are using a namespace
var ns = false
if (props.namespace) {
ns = props.namespace
delete props.namespace
}
// Create the element
if (ns) {
el = document.createElementNS(ns, tag)
} else {
el = document.createElement(tag)
}
// If adding onload events
if (props.onload || props.onunload) {
var load = props.onload || function () {}
var unload = props.onunload || function () {}
onload(el, function bel_onload () {
load(el)
}, function bel_onunload () {
unload(el)
},
// We have to use non-standard `caller` to find who invokes `belCreateElement`
belCreateElement.caller.caller.caller)
delete props.onload
delete props.onunload
}
// Create the properties
for (var p in props) {
if (props.hasOwnProperty(p)) {
var key = p.toLowerCase()
var val = props[p]
// Normalize className
if (key === 'classname') {
key = 'class'
p = 'class'
}
// The for attribute gets transformed to htmlFor, but we just set as for
if (p === 'htmlFor') {
p = 'for'
}
// If a property is boolean, set itself to the key
if (BOOL_PROPS[key]) {
if (val === 'true') val = key
else if (val === 'false') continue
}
// If a property prefers being set directly vs setAttribute
if (key.slice(0, 2) === 'on') {
el[p] = val
} else {
if (ns) {
el.setAttributeNS(null, p, val)
} else {
el.setAttribute(p, val)
}
}
}
}
function appendChild (childs) {
if (!Array.isArray(childs)) return
for (var i = 0; i < childs.length; i++) {
var node = childs[i]
if (Array.isArray(node)) {
appendChild(node)
continue
}
if (typeof node === 'number' ||
typeof node === 'boolean' ||
node instanceof Date ||
node instanceof RegExp) {
node = node.toString()
}
if (typeof node === 'string') {
if (el.lastChild && el.lastChild.nodeName === '#text') {
el.lastChild.nodeValue += node
continue
}
node = document.createTextNode(node)
}
if (node && node.nodeType) {
el.appendChild(node)
}
}
}
appendChild(children)
return el
}
module.exports = hyperx(belCreateElement)
module.exports.createElement = belCreateElement
},{"global/document":69,"hyperx":71,"on-load":73}],69:[function(require,module,exports){
(function (global){
var topLevel = typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window : {}
var minDoc = require('min-document');
if (typeof document !== 'undefined') {
module.exports = document;
} else {
var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
if (!doccy) {
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
}
module.exports = doccy;
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19
},{"min-document":1}],70:[function(require,module,exports){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else if (typeof self !== "undefined"){
module.exports = self;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIl19
},{}],71:[function(require,module,exports){
var attrToProp = require('hyperscript-attribute-to-property')
var VAR = 0, TEXT = 1, OPEN = 2, CLOSE = 3, ATTR = 4
var ATTR_KEY = 5, ATTR_KEY_W = 6
var ATTR_VALUE_W = 7, ATTR_VALUE = 8
var ATTR_VALUE_SQ = 9, ATTR_VALUE_DQ = 10
var ATTR_EQ = 11, ATTR_BREAK = 12
module.exports = function (h, opts) {
h = attrToProp(h)
if (!opts) opts = {}
var concat = opts.concat || function (a, b) {
return String(a) + String(b)
}
return function (strings) {
var state = TEXT, reg = ''
var arglen = arguments.length
var parts = []
for (var i = 0; i < strings.length; i++) {
if (i < arglen - 1) {
var arg = arguments[i+1]
var p = parse(strings[i])
var xstate = state
if (xstate === ATTR_VALUE_DQ) xstate = ATTR_VALUE
if (xstate === ATTR_VALUE_SQ) xstate = ATTR_VALUE
if (xstate === ATTR_VALUE_W) xstate = ATTR_VALUE
if (xstate === ATTR) xstate = ATTR_KEY
p.push([ VAR, xstate, arg ])
parts.push.apply(parts, p)
} else parts.push.apply(parts, parse(strings[i]))
}
var tree = [null,{},[]]
var stack = [[tree,-1]]
for (var i = 0; i < parts.length; i++) {
var cur = stack[stack.length-1][0]
var p = parts[i], s = p[0]
if (s === OPEN && /^\//.test(p[1])) {
var ix = stack[stack.length-1][1]
if (stack.length > 1) {
stack.pop()
stack[stack.length-1][0][2][ix] = h(
cur[0], cur[1], cur[2].length ? cur[2] : undefined
)
}
} else if (s === OPEN) {
var c = [p[1],{},[]]
cur[2].push(c)
stack.push([c,cur[2].length-1])
} else if (s === ATTR_KEY || (s === VAR && p[1] === ATTR_KEY)) {
var key = ''
var copyKey
for (; i < parts.length; i++) {
if (parts[i][0] === ATTR_KEY) {
key = concat(key, parts[i][1])
} else if (parts[i][0] === VAR && parts[i][1] === ATTR_KEY) {
if (typeof parts[i][2] === 'object' && !key) {
for (copyKey in parts[i][2]) {
if (parts[i][2].hasOwnProperty(copyKey) && !cur[1][copyKey]) {
cur[1][copyKey] = parts[i][2][copyKey]
}
}
} else {
key = concat(key, parts[i][2])
}
} else break
}
if (parts[i][0] === ATTR_EQ) i++
var j = i
for (; i < parts.length; i++) {
if (parts[i][0] === ATTR_VALUE || parts[i][0] === ATTR_KEY) {
if (!cur[1][key]) cur[1][key] = strfn(parts[i][1])
else cur[1][key] = concat(cur[1][key], parts[i][1])
} else if (parts[i][0] === VAR
&& (parts[i][1] === ATTR_VALUE || parts[i][1] === ATTR_KEY)) {
if (!cur[1][key]) cur[1][key] = strfn(parts[i][2])
else cur[1][key] = concat(cur[1][key], parts[i][2])
} else {
if (key.length && !cur[1][key] && i === j
&& (parts[i][0] === CLOSE || parts[i][0] === ATTR_BREAK)) {
// https://html.spec.whatwg.org/multipage/infrastructure.html#boolean-attributes
// empty string is falsy, not well behaved value in browser
cur[1][key] = key.toLowerCase()
}
break
}
}
} else if (s === ATTR_KEY) {
cur[1][p[1]] = true
} else if (s === VAR && p[1] === ATTR_KEY) {
cur[1][p[2]] = true
} else if (s === CLOSE) {
if (selfClosing(cur[0]) && stack.length) {
var ix = stack[stack.length-1][1]
stack.pop()
stack[stack.length-1][0][2][ix] = h(
cur[0], cur[1], cur[2].length ? cur[2] : undefined
)
}
} else if (s === VAR && p[1] === TEXT) {
if (p[2] === undefined || p[2] === null) p[2] = ''
else if (!p[2]) p[2] = concat('', p[2])
if (Array.isArray(p[2][0])) {
cur[2].push.apply(cur[2], p[2])
} else {
cur[2].push(p[2])
}
} else if (s === TEXT) {
cur[2].push(p[1])
} else if (s === ATTR_EQ || s === ATTR_BREAK) {
// no-op
} else {
throw new Error('unhandled: ' + s)
}
}
if (tree[2].length > 1 && /^\s*$/.test(tree[2][0])) {
tree[2].shift()
}
if (tree[2].length > 2
|| (tree[2].length === 2 && /\S/.test(tree[2][1]))) {
throw new Error(
'multiple root elements must be wrapped in an enclosing tag'
)
}
if (Array.isArray(tree[2][0]) && typeof tree[2][0][0] === 'string'
&& Array.isArray(tree[2][0][2])) {
tree[2][0] = h(tree[2][0][0], tree[2][0][1], tree[2][0][2])
}
return tree[2][0]
function parse (str) {
var res = []
if (state === ATTR_VALUE_W) state = ATTR
for (var i = 0; i < str.length; i++) {
var c = str.charAt(i)
if (state === TEXT && c === '<') {
if (reg.length) res.push([TEXT, reg])
reg = ''
state = OPEN
} else if (c === '>' && !quot(state)) {
if (state === OPEN) {
res.push([OPEN,reg])
} else if (state === ATTR_KEY) {
res.push([ATTR_KEY,reg])
} else if (state === ATTR_VALUE && reg.length) {
res.push([ATTR_VALUE,reg])
}
res.push([CLOSE])
reg = ''
state = TEXT
} else if (state === TEXT) {
reg += c
} else if (state === OPEN && /\s/.test(c)) {
res.push([OPEN, reg])
reg = ''
state = ATTR
} else if (state === OPEN) {
reg += c
} else if (state === ATTR && /[\w-]/.test(c)) {
state = ATTR_KEY
reg = c
} else if (state === ATTR && /\s/.test(c)) {
if (reg.length) res.push([ATTR_KEY,reg])
res.push([ATTR_BREAK])
} else if (state === ATTR_KEY && /\s/.test(c)) {
res.push([ATTR_KEY,reg])
reg = ''
state = ATTR_KEY_W
} else if (state === ATTR_KEY && c === '=') {
res.push([ATTR_KEY,reg],[ATTR_EQ])
reg = ''
state = ATTR_VALUE_W
} else if (state === ATTR_KEY) {
reg += c
} else if ((state === ATTR_KEY_W || state === ATTR) && c === '=') {
res.push([ATTR_EQ])
state = ATTR_VALUE_W
} else if ((state === ATTR_KEY_W || state === ATTR) && !/\s/.test(c)) {
res.push([ATTR_BREAK])
if (/[\w-]/.test(c)) {
reg += c
state = ATTR_KEY
} else state = ATTR
} else if (state === ATTR_VALUE_W && c === '"') {
state = ATTR_VALUE_DQ
} else if (state === ATTR_VALUE_W && c === "'") {
state = ATTR_VALUE_SQ
} else if (state === ATTR_VALUE_DQ && c === '"') {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE_SQ && c === "'") {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE_W && !/\s/.test(c)) {
state = ATTR_VALUE
i--
} else if (state === ATTR_VALUE && /\s/.test(c)) {
res.push([ATTR_VALUE,reg],[ATTR_BREAK])
reg = ''
state = ATTR
} else if (state === ATTR_VALUE || state === ATTR_VALUE_SQ
|| state === ATTR_VALUE_DQ) {
reg += c
}
}
if (state === TEXT && reg.length) {
res.push([TEXT,reg])
reg = ''
} else if (state === ATTR_VALUE && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_VALUE_DQ && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_VALUE_SQ && reg.length) {
res.push([ATTR_VALUE,reg])
reg = ''
} else if (state === ATTR_KEY) {
res.push([ATTR_KEY,reg])
reg = ''
}
return res
}
}
function strfn (x) {
if (typeof x === 'function') return x
else if (typeof x === 'string') return x
else if (x && typeof x === 'object') return x
else return concat('', x)
}
}
function quot (state) {
return state === ATTR_VALUE_SQ || state === ATTR_VALUE_DQ
}
var hasOwn = Object.prototype.hasOwnProperty
function has (obj, key) { return hasOwn.call(obj, key) }
var closeRE = RegExp('^(' + [
'area', 'base', 'basefont', 'bgsound', 'br', 'col', 'command', 'embed',
'frame', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param',
'source', 'track', 'wbr',
// SVG TAGS
'animate', 'animateTransform', 'circle', 'cursor', 'desc', 'ellipse',
'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',
'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',
'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR',
'feGaussianBlur', 'feImage', 'feMergeNode', 'feMorphology',
'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',
'feTurbulence', 'font-face-format', 'font-face-name', 'font-face-uri',
'glyph', 'glyphRef', 'hkern', 'image', 'line', 'missing-glyph', 'mpath',
'path', 'polygon', 'polyline', 'rect', 'set', 'stop', 'tref', 'use', 'view',
'vkern'
].join('|') + ')(?:[\.#][a-zA-Z0-9\u007F-\uFFFF_:-]+)*$')
function selfClosing (tag) { return closeRE.test(tag) }
},{"hyperscript-attribute-to-property":72}],72:[function(require,module,exports){
module.exports = attributeToProperty
var transform = {
'class': 'className',
'for': 'htmlFor',
'http-equiv': 'httpEquiv'
}
function attributeToProperty (h) {
return function (tagName, attrs, children) {
for (var attr in attrs) {
if (attr in transform) {
attrs[transform[attr]] = attrs[attr]
delete attrs[attr]
}
}
return h(tagName, attrs, children)
}
}
},{}],73:[function(require,module,exports){
/* global MutationObserver */
var document = require('global/document')
var window = require('global/window')
var watch = Object.create(null)
var KEY_ID = 'onloadid' + (new Date() % 9e6).toString(36)
var KEY_ATTR = 'data-' + KEY_ID
var INDEX = 0
if (window && window.MutationObserver) {
var observer = new MutationObserver(function (mutations) {
if (Object.keys(watch).length < 1) return
for (var i = 0; i < mutations.length; i++) {
if (mutations[i].attributeName === KEY_ATTR) {
eachAttr(mutations[i], turnon, turnoff)
continue
}
eachMutation(mutations[i].removedNodes, turnoff)
eachMutation(mutations[i].addedNodes, turnon)
}
})
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeOldValue: true,
attributeFilter: [KEY_ATTR]
})
}
module.exports = function onload (el, on, off, caller) {
on = on || function () {}
off = off || function () {}
el.setAttribute(KEY_ATTR, 'o' + INDEX)
watch['o' + INDEX] = [on, off, 0, caller || onload.caller]
INDEX += 1
return el
}
function turnon (index, el) {
if (watch[index][0] && watch[index][2] === 0) {
watch[index][0](el)
watch[index][2] = 1
}
}
function turnoff (index, el) {
if (watch[index][1] && watch[index][2] === 1) {
watch[index][1](el)
watch[index][2] = 0
}
}
function eachAttr (mutation, on, off) {
var newValue = mutation.target.getAttribute(KEY_ATTR)
if (sameOrigin(mutation.oldValue, newValue)) {
watch[newValue] = watch[mutation.oldValue]
return
}
if (watch[mutation.oldValue]) {
off(mutation.oldValue, mutation.target)
}
if (watch[newValue]) {
on(newValue, mutation.target)
}
}
function sameOrigin (oldValue, newValue) {
if (!oldValue || !newValue) return false
return watch[oldValue][3] === watch[newValue][3]
}
function eachMutation (nodes, fn) {
var keys = Object.keys(watch)
for (var i = 0; i < nodes.length; i++) {
if (nodes[i] && nodes[i].getAttribute && nodes[i].getAttribute(KEY_ATTR)) {
var onloadid = nodes[i].getAttribute(KEY_ATTR)
keys.forEach(function (k) {
if (onloadid === k) {
fn(k, nodes[i])
}
})
}
if (nodes[i].childNodes.length > 0) {
eachMutation(nodes[i].childNodes, fn)
}
}
}
},{"global/document":69,"global/window":70}],74:[function(require,module,exports){
// Create a range object for efficently rendering strings to elements.
var range;
var testEl = (typeof document !== 'undefined') ?
document.body || document.createElement('div') :
{};
var XHTML = 'http://www.w3.org/1999/xhtml';
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
// Fixes <https://github.com/patrick-steele-idem/morphdom/issues/32>
// (IE7+ support) <=IE7 does not support el.hasAttribute(name)
var hasAttributeNS;
if (testEl.hasAttributeNS) {
hasAttributeNS = function(el, namespaceURI, name) {
return el.hasAttributeNS(namespaceURI, name);
};
} else if (testEl.hasAttribute) {
hasAttributeNS = function(el, namespaceURI, name) {
return el.hasAttribute(name);
};
} else {
hasAttributeNS = function(el, namespaceURI, name) {
return !!el.getAttributeNode(name);
};
}
function empty(o) {
for (var k in o) {
if (o.hasOwnProperty(k)) {
return false;
}
}
return true;
}
function toElement(str) {
if (!range && document.createRange) {
range = document.createRange();
range.selectNode(document.body);
}
var fragment;
if (range && range.createContextualFragment) {
fragment = range.createContextualFragment(str);
} else {
fragment = document.createElement('body');
fragment.innerHTML = str;
}
return fragment.childNodes[0];
}
var specialElHandlers = {
/**
* Needed for IE. Apparently IE doesn't think that "selected" is an
* attribute when reading over the attributes using selectEl.attributes
*/
OPTION: function(fromEl, toEl) {
fromEl.selected = toEl.selected;
if (fromEl.selected) {
fromEl.setAttribute('selected', '');
} else {
fromEl.removeAttribute('selected', '');
}
},
/**
* The "value" attribute is special for the <input> element since it sets
* the initial value. Changing the "value" attribute without changing the
* "value" property will have no effect since it is only used to the set the
* initial value. Similar for the "checked" attribute, and "disabled".
*/
INPUT: function(fromEl, toEl) {
fromEl.checked = toEl.checked;
if (fromEl.checked) {
fromEl.setAttribute('checked', '');
} else {
fromEl.removeAttribute('checked');
}
if (fromEl.value !== toEl.value) {
fromEl.value = toEl.value;
}
if (!hasAttributeNS(toEl, null, 'value')) {
fromEl.removeAttribute('value');
}
fromEl.disabled = toEl.disabled;
if (fromEl.disabled) {
fromEl.setAttribute('disabled', '');
} else {
fromEl.removeAttribute('disabled');
}
},
TEXTAREA: function(fromEl, toEl) {
var newValue = toEl.value;
if (fromEl.value !== newValue) {
fromEl.value = newValue;
}
if (fromEl.firstChild) {
fromEl.firstChild.nodeValue = newValue;
}
}
};
function noop() {}
/**
* Returns true if two node's names and namespace URIs are the same.
*
* @param {Element} a
* @param {Element} b
* @return {boolean}
*/
var compareNodeNames = function(a, b) {
return a.nodeName === b.nodeName &&
a.namespaceURI === b.namespaceURI;
};
/**
* Create an element, optionally with a known namespace URI.
*
* @param {string} name the element name, e.g. 'div' or 'svg'
* @param {string} [namespaceURI] the element's namespace URI, i.e. the value of
* its `xmlns` attribute or its inferred namespace.
*
* @return {Element}
*/
function createElementNS(name, namespaceURI) {
return !namespaceURI || namespaceURI === XHTML ?
document.createElement(name) :
document.createElementNS(namespaceURI, name);
}
/**
* Loop over all of the attributes on the target node and make sure the original
* DOM node has the same attributes. If an attribute found on the original node
* is not on the new node then remove it from the original node.
*
* @param {Element} fromNode
* @param {Element} toNode
*/
function morphAttrs(fromNode, toNode) {
var attrs = toNode.attributes;
var i;
var attr;
var attrName;
var attrNamespaceURI;
var attrValue;
var fromValue;
for (i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
attrName = attr.name;
attrValue = attr.value;
attrNamespaceURI = attr.namespaceURI;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);
} else {
fromValue = fromNode.getAttribute(attrName);
}
if (fromValue !== attrValue) {
if (attrNamespaceURI) {
fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);
} else {
fromNode.setAttribute(attrName, attrValue);
}
}
}
// Remove any extra attributes found on the original DOM element that
// weren't found on the target element.
attrs = fromNode.attributes;
for (i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
if (!hasAttributeNS(toNode, attrNamespaceURI, attrNamespaceURI ? attrName = attr.localName || attrName : attrName)) {
if (attrNamespaceURI) {
fromNode.removeAttributeNS(attrNamespaceURI, attr.localName);
} else {
fromNode.removeAttribute(attrName);
}
}
}
}
}
/**
* Copies the children of one DOM element to another DOM element
*/
function moveChildren(fromEl, toEl) {
var curChild = fromEl.firstChild;
while (curChild) {
var nextChild = curChild.nextSibling;
toEl.appendChild(curChild);
curChild = nextChild;
}
return toEl;
}
function defaultGetNodeKey(node) {
return node.id;
}
function morphdom(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === 'string') {
if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML') {
var toNodeHtml = toNode;
toNode = document.createElement('html');
toNode.innerHTML = toNodeHtml;
} else {
toNode = toElement(toNode);
}
}
// XXX optimization: if the nodes are equal, don't morph them
/*
if (fromNode.isEqualNode(toNode)) {
return fromNode;
}
*/
var savedEls = {}; // Used to save off DOM elements with IDs
var unmatchedEls = {};
var getNodeKey = options.getNodeKey || defaultGetNodeKey;
var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;
var onNodeAdded = options.onNodeAdded || noop;
var onBeforeElUpdated = options.onBeforeElUpdated || options.onBeforeMorphEl || noop;
var onElUpdated = options.onElUpdated || noop;
var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;
var onNodeDiscarded = options.onNodeDiscarded || noop;
var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || options.onBeforeMorphElChildren || noop;
var childrenOnly = options.childrenOnly === true;
var movedEls = [];
function removeNodeHelper(node, nestedInSavedEl) {
var id = getNodeKey(node);
// If the node has an ID then save it off since we will want
// to reuse it in case the target DOM tree has a DOM element
// with the same ID
if (id) {
savedEls[id] = node;
} else if (!nestedInSavedEl) {
// If we are not nested in a saved element then we know that this node has been
// completely discarded and will not exist in the final DOM.
onNodeDiscarded(node);
}
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
removeNodeHelper(curChild, nestedInSavedEl || id);
curChild = curChild.nextSibling;
}
}
}
function walkDiscardedChildNodes(node) {
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
if (!getNodeKey(curChild)) {
// We only want to handle nodes that don't have an ID to avoid double
// walking the same saved element.
onNodeDiscarded(curChild);
// Walk recursively
walkDiscardedChildNodes(curChild);
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, alreadyVisited) {
if (onBeforeNodeDiscarded(node) === false) {
return;
}
parentNode.removeChild(node);
if (alreadyVisited) {
if (!getNodeKey(node)) {
onNodeDiscarded(node);
walkDiscardedChildNodes(node);
}
} else {
removeNodeHelper(node);
}
}
function morphEl(fromEl, toEl, alreadyVisited, childrenOnly) {
var toElKey = getNodeKey(toEl);
if (toElKey) {
// If an element with an ID is being morphed then it is will be in the final
// DOM so clear it out of the saved elements collection
delete savedEls[toElKey];
}
if (!childrenOnly) {
if (onBeforeElUpdated(fromEl, toEl) === false) {
return;
}
morphAttrs(fromEl, toEl);
onElUpdated(fromEl);
if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {
return;
}
}
if (fromEl.nodeName !== 'TEXTAREA') {
var curToNodeChild = toEl.firstChild;
var curFromNodeChild = fromEl.firstChild;
var curToNodeId;
var fromNextSibling;
var toNextSibling;
var savedEl;
var unmatchedEl;
outer: while (curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeId = getNodeKey(curToNodeChild);
while (curFromNodeChild) {
var curFromNodeId = getNodeKey(curFromNodeChild);
fromNextSibling = curFromNodeChild.nextSibling;
if (!alreadyVisited) {
if (curFromNodeId && (unmatchedEl = unmatchedEls[curFromNodeId])) {
unmatchedEl.parentNode.replaceChild(curFromNodeChild, unmatchedEl);
morphEl(curFromNodeChild, unmatchedEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
continue;
}
}
var curFromNodeType = curFromNodeChild.nodeType;
if (curFromNodeType === curToNodeChild.nodeType) {
var isCompatible = false;
// Both nodes being compared are Element nodes
if (curFromNodeType === ELEMENT_NODE) {
if (compareNodeNames(curFromNodeChild, curToNodeChild)) {
// We have compatible DOM elements
if (curFromNodeId || curToNodeId) {
// If either DOM element has an ID then we
// handle those differently since we want to
// match up by ID
if (curToNodeId === curFromNodeId) {
isCompatible = true;
}
} else {
isCompatible = true;
}
}
if (isCompatible) {
// We found compatible DOM elements so transform
// the current "from" node to match the current
// target DOM node.
morphEl(curFromNodeChild, curToNodeChild, alreadyVisited);
}
// Both nodes being compared are Text or Comment nodes
} else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {
isCompatible = true;
// Simply update nodeValue on the original node to
// change the text value
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
}
// No compatible match so remove the old node from the DOM
// and continue trying to find a match in the original DOM
removeNode(curFromNodeChild, fromEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
if (curToNodeId) {
if ((savedEl = savedEls[curToNodeId])) {
if (compareNodeNames(savedEl, curToNodeChild)) {
morphEl(savedEl, curToNodeChild, true);
// We want to append the saved element instead
curToNodeChild = savedEl;
} else {
delete savedEls[curToNodeId];
onNodeDiscarded(savedEl);
}
} else {
// The current DOM element in the target tree has an ID
// but we did not find a match in any of the
// corresponding siblings. We just put the target
// element in the old DOM tree but if we later find an
// element in the old DOM tree that has a matching ID
// then we will replace the target element with the
// corresponding old element and morph the old element
unmatchedEls[curToNodeId] = curToNodeChild;
}
}
// If we got this far then we did not find a candidate match for
// our "to node" and we exhausted all of the children "from"
// nodes. Therefore, we will just append the current "to node"
// to the end
if (onBeforeNodeAdded(curToNodeChild) !== false) {
fromEl.appendChild(curToNodeChild);
onNodeAdded(curToNodeChild);
}
if (curToNodeChild.nodeType === ELEMENT_NODE &&
(curToNodeId || curToNodeChild.firstChild)) {
// The element that was just added to the original DOM may
// have some nested elements with a key/ID that needs to be
// matched up with other elements. We'll add the element to
// a list so that we can later process the nested elements
// if there are any unmatched keyed elements that were
// discarded
movedEls.push(curToNodeChild);
}
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
// We have processed all of the "to nodes". If curFromNodeChild is
// non-null then we still have some from nodes left over that need
// to be removed
while (curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
removeNode(curFromNodeChild, fromEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
}
var specialElHandler = specialElHandlers[fromEl.nodeName];
if (specialElHandler) {
specialElHandler(fromEl, toEl);
}
} // END: morphEl(...)
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
if (!childrenOnly) {
// Handle the case where we are given two DOM nodes that are not
// compatible (e.g. <div> --> <span> or <div> --> TEXT)
if (morphedNodeType === ELEMENT_NODE) {
if (toNodeType === ELEMENT_NODE) {
if (!compareNodeNames(fromNode, toNode)) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));
}
} else {
// Going from an element node to a text node
morphedNode = toNode;
}
} else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node
if (toNodeType === morphedNodeType) {
morphedNode.nodeValue = toNode.nodeValue;
return morphedNode;
} else {
// Text node to something else
morphedNode = toNode;
}
}
}
if (morphedNode === toNode) {
// The "to node" was not compatible with the "from node" so we had to
// toss out the "from node" and use the "to node"
onNodeDiscarded(fromNode);
} else {
morphEl(morphedNode, toNode, false, childrenOnly);
/**
* What we will do here is walk the tree for the DOM element that was
* moved from the target DOM tree to the original DOM tree and we will
* look for keyed elements that could be matched to keyed elements that
* were earlier discarded. If we find a match then we will move the
* saved element into the final DOM tree.
*/
var handleMovedEl = function(el) {
var curChild = el.firstChild;
while (curChild) {
var nextSibling = curChild.nextSibling;
var key = getNodeKey(curChild);
if (key) {
var savedEl = savedEls[key];
if (savedEl && compareNodeNames(curChild, savedEl)) {
curChild.parentNode.replaceChild(savedEl, curChild);
// true: already visited the saved el tree
morphEl(savedEl, curChild, true);
curChild = nextSibling;
if (empty(savedEls)) {
return false;
}
continue;
}
}
if (curChild.nodeType === ELEMENT_NODE) {
handleMovedEl(curChild);
}
curChild = nextSibling;
}
};
// The loop below is used to possibly match up any discarded
// elements in the original DOM tree with elemenets from the
// target tree that were moved over without visiting their
// children
if (!empty(savedEls)) {
handleMovedElsLoop:
while (movedEls.length) {
var movedElsTemp = movedEls;
movedEls = [];
for (var i=0; i<movedElsTemp.length; i++) {
if (handleMovedEl(movedElsTemp[i]) === false) {
// There are no more unmatched elements so completely end
// the loop
break handleMovedElsLoop;
}
}
}
}
// Fire the "onNodeDiscarded" event for any saved elements
// that never found a new home in the morphed DOM
for (var savedElId in savedEls) {
if (savedEls.hasOwnProperty(savedElId)) {
var savedEl = savedEls[savedElId];
onNodeDiscarded(savedEl);
walkDiscardedChildNodes(savedEl);
}
}
}
if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {
// If we had to swap out the from node with a new node because the old
// node was not compatible with the target node then we need to
// replace the old DOM node in the original DOM tree. This is only
// possible if the original DOM node was part of a DOM tree which
// we know is the case if it has a parent node.
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
}
module.exports = morphdom;
},{}],75:[function(require,module,exports){
module.exports = [
// attribute events (can be set with attributes)
'onclick',
'ondblclick',
'onmousedown',
'onmouseup',
'onmouseover',
'onmousemove',
'onmouseout',
'ondragstart',
'ondrag',
'ondragenter',
'ondragleave',
'ondragover',
'ondrop',
'ondragend',
'onkeydown',
'onkeypress',
'onkeyup',
'onunload',
'onabort',
'onerror',
'onresize',
'onscroll',
'onselect',
'onchange',
'onsubmit',
'onreset',
'onfocus',
'onblur',
'oninput',
// other common events
'oncontextmenu',
'onfocusin',
'onfocusout'
]
},{}],"uppy":[function(require,module,exports){
'use strict';
exports.__esModule = true;
exports.Webcam = exports.MetaData = exports.Dashboard = exports.Multipart = exports.Tus10 = exports.Formtag = exports.GoogleDrive = exports.DragDrop = exports.Informer = exports.ProgressBar = exports.Dummy = exports.locales = exports.Plugin = exports.Core = undefined;
var _index = require('./core/index.js');
var _index2 = _interopRequireDefault(_index);
var _Plugin = require('./plugins/Plugin');
var _Plugin2 = _interopRequireDefault(_Plugin);
var _index3 = require('./plugins/Dashboard/index.js');
var _index4 = _interopRequireDefault(_index3);
var _Dummy = require('./plugins/Dummy');
var _Dummy2 = _interopRequireDefault(_Dummy);
var _index5 = require('./plugins/DragDrop/index.js');
var _index6 = _interopRequireDefault(_index5);
var _Formtag = require('./plugins/Formtag');
var _Formtag2 = _interopRequireDefault(_Formtag);
var _index7 = require('./plugins/GoogleDrive/index.js');
var _index8 = _interopRequireDefault(_index7);
var _index9 = require('./plugins/Webcam/index.js');
var _index10 = _interopRequireDefault(_index9);
var _ProgressBar = require('./plugins/ProgressBar.js');
var _ProgressBar2 = _interopRequireDefault(_ProgressBar);
var _Informer = require('./plugins/Informer.js');
var _Informer2 = _interopRequireDefault(_Informer);
var _MetaData = require('./plugins/MetaData.js');
var _MetaData2 = _interopRequireDefault(_MetaData);
var _Tus = require('./plugins/Tus10');
var _Tus2 = _interopRequireDefault(_Tus);
var _Multipart = require('./plugins/Multipart');
var _Multipart2 = _interopRequireDefault(_Multipart);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var locales = {};
// Orchestrators
// Parent
// Acquirers
// Progressindicators
// Modifiers
// Uploaders
exports.default = {
Core: _index2.default,
Plugin: _Plugin2.default,
locales: locales,
Dummy: _Dummy2.default,
ProgressBar: _ProgressBar2.default,
Informer: _Informer2.default,
DragDrop: _index6.default,
GoogleDrive: _index8.default,
Formtag: _Formtag2.default,
Tus10: _Tus2.default,
Multipart: _Multipart2.default,
Dashboard: _index4.default,
MetaData: _MetaData2.default,
Webcam: _index10.default
};
exports.Core = _index2.default;
exports.Plugin = _Plugin2.default;
exports.locales = locales;
exports.Dummy = _Dummy2.default;
exports.ProgressBar = _ProgressBar2.default;
exports.Informer = _Informer2.default;
exports.DragDrop = _index6.default;
exports.GoogleDrive = _index8.default;
exports.Formtag = _Formtag2.default;
exports.Tus10 = _Tus2.default;
exports.Multipart = _Multipart2.default;
exports.Dashboard = _index4.default;
exports.MetaData = _MetaData2.default;
exports.Webcam = _index10.default;
// import Core from './core/index.js'
// import plugins from './plugins/index.js'
//
// const locales = {}
//
// export {
// Core,
// plugins,
// locales
// }
//# sourceMappingURL=index.js.map
},{"./core/index.js":9,"./plugins/Dashboard/index.js":21,"./plugins/DragDrop/index.js":22,"./plugins/Dummy":23,"./plugins/Formtag":24,"./plugins/GoogleDrive/index.js":27,"./plugins/Informer.js":34,"./plugins/MetaData.js":35,"./plugins/Multipart":36,"./plugins/Plugin":37,"./plugins/ProgressBar.js":38,"./plugins/Tus10":39,"./plugins/Webcam/index.js":44}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImxpYi9jb3JlL0NvcmUuanMiLCJsaWIvY29yZS9UcmFuc2xhdG9yLmpzIiwibGliL2NvcmUvVXBweVNvY2tldC5qcyIsImxpYi9jb3JlL1V0aWxzLmpzIiwibGliL2NvcmUvaHRtbC5qcyIsImxpYi9jb3JlL2luZGV4LmpzIiwibGliL2xvY2FsZXMvZW5fVVMuanMiLCJsaWIvcGx1Z2lucy9EYXNoYm9hcmQvRGFzaGJvYXJkLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL0ZpbGVDYXJkLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL0ZpbGVJdGVtLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL0ZpbGVJdGVtUHJvZ3Jlc3MuanMiLCJsaWIvcGx1Z2lucy9EYXNoYm9hcmQvRmlsZUxpc3QuanMiLCJsaWIvcGx1Z2lucy9EYXNoYm9hcmQvUHJvZ3Jlc3NDaXJjbGUuanMiLCJsaWIvcGx1Z2lucy9EYXNoYm9hcmQvU3RhdHVzQmFyLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL1RhYnMuanMiLCJsaWIvcGx1Z2lucy9EYXNoYm9hcmQvVXBsb2FkQnRuLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL2ljb25zLmpzIiwibGliL3BsdWdpbnMvRGFzaGJvYXJkL2luZGV4LmpzIiwibGliL3BsdWdpbnMvRHJhZ0Ryb3AvaW5kZXguanMiLCJsaWIvcGx1Z2lucy9EdW1teS5qcyIsImxpYi9wbHVnaW5zL0Zvcm10YWcuanMiLCJsaWIvcGx1Z2lucy9Hb29nbGVEcml2ZS9BdXRoVmlldy5qcyIsImxpYi9wbHVnaW5zL0dvb2dsZURyaXZlL0Vycm9yLmpzIiwibGliL3BsdWdpbnMvR29vZ2xlRHJpdmUvaW5kZXguanMiLCJsaWIvcGx1Z2lucy9Hb29nbGVEcml2ZS9uZXcvQnJlYWRjcnVtYi5qcyIsImxpYi9wbHVnaW5zL0dvb2dsZURyaXZlL25ldy9CcmVhZGNydW1icy5qcyIsImxpYi9wbHVnaW5zL0dvb2dsZURyaXZlL25ldy9Ccm93c2VyLmpzIiwibGliL3BsdWdpbnMvR29vZ2xlRHJpdmUvbmV3L1RhYmxlLmpzIiwibGliL3BsdWdpbnMvR29vZ2xlRHJpdmUvbmV3L1RhYmxlQ29sdW1uLmpzIiwibGliL3BsdWdpbnMvR29vZ2xlRHJpdmUvbmV3L1RhYmxlUm93LmpzIiwibGliL3BsdWdpbnMvSW5mb3JtZXIuanMiLCJsaWIvcGx1Z2lucy9NZXRhRGF0YS5qcyIsImxpYi9wbHVnaW5zL011bHRpcGFydC5qcyIsImxpYi9wbHVnaW5zL1BsdWdpbi5qcyIsImxpYi9wbHVnaW5zL1Byb2dyZXNzQmFyLmpzIiwibGliL3BsdWdpbnMvVHVzMTAuanMiLCJsaWIvcGx1Z2lucy9XZWJjYW0vQ2FtZXJhSWNvbi5qcyIsImxpYi9wbHVnaW5zL1dlYmNhbS9DYW1lcmFTY3JlZW4uanMiLCJsaWIvcGx1Z2lucy9XZWJjYW0vUGVybWlzc2lvbnNTY3JlZW4uanMiLCJsaWIvcGx1Z2lucy9XZWJjYW0vV2ViY2FtSWNvbi5qcyIsImxpYi9wbHVnaW5zL1dlYmNhbS9pbmRleC5qcyIsImxpYi91cHB5LWJhc2Uvc3JjL3BsdWdpbnMvUHJvdmlkZXIuanMiLCJsaWIvdXBweS1iYXNlL3NyYy9wbHVnaW5zL1dlYmNhbS5qcyIsImxpYi91cHB5LWJhc2Uvc3JjL3V0aWxzL2RhdGFVUkl0b0ZpbGUuanMiLCJub2RlX21vZHVsZXMvZHJhZy1kcm9wL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RyYWctZHJvcC9ub2RlX21vZHVsZXMvZmxhdHRlbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kcmFnLWRyb3Avbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWltZS10eXBlcy9ub2RlX21vZHVsZXMvbWltZS1kYi9kYi5qc29uIiwibm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvbm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmFtZXNwYWNlLWVtaXR0ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJldHR5LWJ5dGVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ByZXR0eS1ieXRlcy9ub2RlX21vZHVsZXMvbnVtYmVyLWlzLW5hbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90dXMtanMtY2xpZW50L2xpYi5lczUvYnJvd3Nlci9iYXNlNjQuanMiLCJub2RlX21vZHVsZXMvdHVzLWpzLWNsaWVudC9saWIuZXM1L2Jyb3dzZXIvcmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy90dXMtanMtY2xpZW50L2xpYi5lczUvYnJvd3Nlci9zb3VyY2UuanMiLCJub2RlX21vZHVsZXMvdHVzLWpzLWNsaWVudC9saWIuZXM1L2Jyb3dzZXIvc3RvcmFnZS5qcyIsIm5vZGVfbW9kdWxlcy90dXMtanMtY2xpZW50L2xpYi5lczUvZmluZ2VycHJpbnQuanMiLCJub2RlX21vZHVsZXMvdHVzLWpzLWNsaWVudC9saWIuZXM1L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3R1cy1qcy1jbGllbnQvbGliLmVzNS91cGxvYWQuanMiLCJub2RlX21vZHVsZXMvdHVzLWpzLWNsaWVudC9ub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIsIm5vZGVfbW9kdWxlcy95by15by9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3lvLXlvL25vZGVfbW9kdWxlcy9iZWwvbm9kZV9tb2R1bGVzL2dsb2JhbC9kb2N1bWVudC5qcyIsIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIiwibm9kZV9tb2R1bGVzL3lvLXlvL25vZGVfbW9kdWxlcy9iZWwvbm9kZV9tb2R1bGVzL2h5cGVyeC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9oeXBlcngvbm9kZV9tb2R1bGVzL2h5cGVyc2NyaXB0LWF0dHJpYnV0ZS10by1wcm9wZXJ0eS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy95by15by9ub2RlX21vZHVsZXMvYmVsL25vZGVfbW9kdWxlcy9vbi1sb2FkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3lvLXlvL25vZGVfbW9kdWxlcy9tb3JwaGRvbS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMveW8teW8vdXBkYXRlLWV2ZW50cy5qcyIsImxpYi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6WUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbDhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ24rTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2piQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLG51bGwsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJodmJXVXZZV1J0YVc0dlluSnZkM05sY21sbWVTMWpaRzR2Ym05a1pWOXRiMlIxYkdWekwySnliM2R6WlhKcFpua3ZibTlrWlY5dGIyUjFiR1Z6TDNCaGRHZ3RZbkp2ZDNObGNtbG1lUzlwYm1SbGVDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdkx5QkRiM0I1Y21sbmFIUWdTbTk1Wlc1MExDQkpibU11SUdGdVpDQnZkR2hsY2lCT2IyUmxJR052Ym5SeWFXSjFkRzl5Y3k1Y2JpOHZYRzR2THlCUVpYSnRhWE56YVc5dUlHbHpJR2hsY21WaWVTQm5jbUZ1ZEdWa0xDQm1jbVZsSUc5bUlHTm9ZWEpuWlN3Z2RHOGdZVzU1SUhCbGNuTnZiaUJ2WW5SaGFXNXBibWNnWVZ4dUx5OGdZMjl3ZVNCdlppQjBhR2x6SUhOdlpuUjNZWEpsSUdGdVpDQmhjM052WTJsaGRHVmtJR1J2WTNWdFpXNTBZWFJwYjI0Z1ptbHNaWE1nS0hSb1pWeHVMeThnWENKVGIyWjBkMkZ5WlZ3aUtTd2dkRzhnWkdWaGJDQnBiaUIwYUdVZ1UyOW1kSGRoY21VZ2QybDBhRzkxZENCeVpYTjBjbWxqZEdsdmJpd2dhVzVqYkhWa2FXNW5YRzR2THlCM2FYUm9iM1YwSUd4cGJXbDBZWFJwYjI0Z2RHaGxJSEpwWjJoMGN5QjBieUIxYzJVc0lHTnZjSGtzSUcxdlpHbG1lU3dnYldWeVoyVXNJSEIxWW14cGMyZ3NYRzR2THlCa2FYTjBjbWxpZFhSbExDQnpkV0pzYVdObGJuTmxMQ0JoYm1RdmIzSWdjMlZzYkNCamIzQnBaWE1nYjJZZ2RHaGxJRk52Wm5SM1lYSmxMQ0JoYm1RZ2RHOGdjR1Z5YldsMFhHNHZMeUJ3WlhKemIyNXpJSFJ2SUhkb2IyMGdkR2hsSUZOdlpuUjNZWEpsSUdseklHWjFjbTVwYzJobFpDQjBieUJrYnlCemJ5d2djM1ZpYW1WamRDQjBieUIwYUdWY2JpOHZJR1p2Ykd4dmQybHVaeUJqYjI1a2FYUnBiMjV6T2x4dUx5OWNiaTh2SUZSb1pTQmhZbTkyWlNCamIzQjVjbWxuYUhRZ2JtOTBhV05sSUdGdVpDQjBhR2x6SUhCbGNtMXBjM05wYjI0Z2JtOTBhV05sSUhOb1lXeHNJR0psSUdsdVkyeDFaR1ZrWEc0dkx5QnBiaUJoYkd3Z1kyOXdhV1Z6SUc5eUlITjFZbk4wWVc1MGFXRnNJSEJ2Y25ScGIyNXpJRzltSUhSb1pTQlRiMlowZDJGeVpTNWNiaTh2WEc0dkx5QlVTRVVnVTA5R1ZGZEJVa1VnU1ZNZ1VGSlBWa2xFUlVRZ1hDSkJVeUJKVTF3aUxDQlhTVlJJVDFWVUlGZEJVbEpCVGxSWklFOUdJRUZPV1NCTFNVNUVMQ0JGV0ZCU1JWTlRYRzR2THlCUFVpQkpUVkJNU1VWRUxDQkpUa05NVlVSSlRrY2dRbFZVSUU1UFZDQk1TVTFKVkVWRUlGUlBJRlJJUlNCWFFWSlNRVTVVU1VWVElFOUdYRzR2THlCTlJWSkRTRUZPVkVGQ1NVeEpWRmtzSUVaSlZFNUZVMU1nUms5U0lFRWdVRUZTVkVsRFZVeEJVaUJRVlZKUVQxTkZJRUZPUkNCT1QwNUpUa1pTU1U1SFJVMUZUbFF1SUVsT1hHNHZMeUJPVHlCRlZrVk9WQ0JUU0VGTVRDQlVTRVVnUVZWVVNFOVNVeUJQVWlCRFQxQlpVa2xIU0ZRZ1NFOU1SRVZTVXlCQ1JTQk1TVUZDVEVVZ1JrOVNJRUZPV1NCRFRFRkpUU3hjYmk4dklFUkJUVUZIUlZNZ1QxSWdUMVJJUlZJZ1RFbEJRa2xNU1ZSWkxDQlhTRVZVU0VWU0lFbE9JRUZPSUVGRFZFbFBUaUJQUmlCRFQwNVVVa0ZEVkN3Z1ZFOVNWQ0JQVWx4dUx5OGdUMVJJUlZKWFNWTkZMQ0JCVWtsVFNVNUhJRVpTVDAwc0lFOVZWQ0JQUmlCUFVpQkpUaUJEVDA1T1JVTlVTVTlPSUZkSlZFZ2dWRWhGSUZOUFJsUlhRVkpGSUU5U0lGUklSVnh1THk4Z1ZWTkZJRTlTSUU5VVNFVlNJRVJGUVV4SlRrZFRJRWxPSUZSSVJTQlRUMFpVVjBGU1JTNWNibHh1THk4Z2NtVnpiMngyWlhNZ0xpQmhibVFnTGk0Z1pXeGxiV1Z1ZEhNZ2FXNGdZU0J3WVhSb0lHRnljbUY1SUhkcGRHZ2daR2x5WldOMGIzSjVJRzVoYldWeklIUm9aWEpsWEc0dkx5QnRkWE4wSUdKbElHNXZJSE5zWVhOb1pYTXNJR1Z0Y0hSNUlHVnNaVzFsYm5SekxDQnZjaUJrWlhacFkyVWdibUZ0WlhNZ0tHTTZYRndwSUdsdUlIUm9aU0JoY25KaGVWeHVMeThnS0hOdklHRnNjMjhnYm04Z2JHVmhaR2x1WnlCaGJtUWdkSEpoYVd4cGJtY2djMnhoYzJobGN5QXRJR2wwSUdSdlpYTWdibTkwSUdScGMzUnBibWQxYVhOb1hHNHZMeUJ5Wld4aGRHbDJaU0JoYm1RZ1lXSnpiMngxZEdVZ2NHRjBhSE1wWEc1bWRXNWpkR2x2YmlCdWIzSnRZV3hwZW1WQmNuSmhlU2h3WVhKMGN5d2dZV3hzYjNkQlltOTJaVkp2YjNRcElIdGNiaUFnTHk4Z2FXWWdkR2hsSUhCaGRHZ2dkSEpwWlhNZ2RHOGdaMjhnWVdKdmRtVWdkR2hsSUhKdmIzUXNJR0IxY0dBZ1pXNWtjeUIxY0NBK0lEQmNiaUFnZG1GeUlIVndJRDBnTUR0Y2JpQWdabTl5SUNoMllYSWdhU0E5SUhCaGNuUnpMbXhsYm1kMGFDQXRJREU3SUdrZ1BqMGdNRHNnYVMwdEtTQjdYRzRnSUNBZ2RtRnlJR3hoYzNRZ1BTQndZWEowYzF0cFhUdGNiaUFnSUNCcFppQW9iR0Z6ZENBOVBUMGdKeTRuS1NCN1hHNGdJQ0FnSUNCd1lYSjBjeTV6Y0d4cFkyVW9hU3dnTVNrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoc1lYTjBJRDA5UFNBbkxpNG5LU0I3WEc0Z0lDQWdJQ0J3WVhKMGN5NXpjR3hwWTJVb2FTd2dNU2s3WEc0Z0lDQWdJQ0IxY0Nzck8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RYQXBJSHRjYmlBZ0lDQWdJSEJoY25SekxuTndiR2xqWlNocExDQXhLVHRjYmlBZ0lDQWdJSFZ3TFMwN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdhV1lnZEdobElIQmhkR2dnYVhNZ1lXeHNiM2RsWkNCMGJ5Qm5ieUJoWW05MlpTQjBhR1VnY205dmRDd2djbVZ6ZEc5eVpTQnNaV0ZrYVc1bklDNHVjMXh1SUNCcFppQW9ZV3hzYjNkQlltOTJaVkp2YjNRcElIdGNiaUFnSUNCbWIzSWdLRHNnZFhBdExUc2dkWEFwSUh0Y2JpQWdJQ0FnSUhCaGNuUnpMblZ1YzJocFpuUW9KeTR1SnlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhCaGNuUnpPMXh1ZlZ4dVhHNHZMeUJUY0d4cGRDQmhJR1pwYkdWdVlXMWxJR2x1ZEc4Z1czSnZiM1FzSUdScGNpd2dZbUZ6Wlc1aGJXVXNJR1Y0ZEYwc0lIVnVhWGdnZG1WeWMybHZibHh1THk4Z0ozSnZiM1FuSUdseklHcDFjM1FnWVNCemJHRnphQ3dnYjNJZ2JtOTBhR2x1Wnk1Y2JuWmhjaUJ6Y0d4cGRGQmhkR2hTWlNBOVhHNGdJQ0FnTDE0b1hGd3ZQM3dwS0Z0Y1hITmNYRk5kS2o4cEtDZy9PbHhjTG5zeExESjlmRnRlWEZ3dlhTcy9mQ2tvWEZ3dVcxNHVYRnd2WFNwOEtTa29QenBiWEZ3dlhTb3BKQzg3WEc1MllYSWdjM0JzYVhSUVlYUm9JRDBnWm5WdVkzUnBiMjRvWm1sc1pXNWhiV1VwSUh0Y2JpQWdjbVYwZFhKdUlITndiR2wwVUdGMGFGSmxMbVY0WldNb1ptbHNaVzVoYldVcExuTnNhV05sS0RFcE8xeHVmVHRjYmx4dUx5OGdjR0YwYUM1eVpYTnZiSFpsS0Z0bWNtOXRJQzR1TGwwc0lIUnZLVnh1THk4Z2NHOXphWGdnZG1WeWMybHZibHh1Wlhod2IzSjBjeTV5WlhOdmJIWmxJRDBnWm5WdVkzUnBiMjRvS1NCN1hHNGdJSFpoY2lCeVpYTnZiSFpsWkZCaGRHZ2dQU0FuSnl4Y2JpQWdJQ0FnSUhKbGMyOXNkbVZrUVdKemIyeDFkR1VnUFNCbVlXeHpaVHRjYmx4dUlDQm1iM0lnS0haaGNpQnBJRDBnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0F0SURFN0lHa2dQajBnTFRFZ0ppWWdJWEpsYzI5c2RtVmtRV0p6YjJ4MWRHVTdJR2t0TFNrZ2UxeHVJQ0FnSUhaaGNpQndZWFJvSUQwZ0tHa2dQajBnTUNrZ1B5QmhjbWQxYldWdWRITmJhVjBnT2lCd2NtOWpaWE56TG1OM1pDZ3BPMXh1WEc0Z0lDQWdMeThnVTJ0cGNDQmxiWEIwZVNCaGJtUWdhVzUyWVd4cFpDQmxiblJ5YVdWelhHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCd1lYUm9JQ0U5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpZ25RWEpuZFcxbGJuUnpJSFJ2SUhCaGRHZ3VjbVZ6YjJ4MlpTQnRkWE4wSUdKbElITjBjbWx1WjNNbktUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tDRndZWFJvS1NCN1hHNGdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhOdmJIWmxaRkJoZEdnZ1BTQndZWFJvSUNzZ0p5OG5JQ3NnY21WemIyeDJaV1JRWVhSb08xeHVJQ0FnSUhKbGMyOXNkbVZrUVdKemIyeDFkR1VnUFNCd1lYUm9MbU5vWVhKQmRDZ3dLU0E5UFQwZ0p5OG5PMXh1SUNCOVhHNWNiaUFnTHk4Z1FYUWdkR2hwY3lCd2IybHVkQ0IwYUdVZ2NHRjBhQ0J6YUc5MWJHUWdZbVVnY21WemIyeDJaV1FnZEc4Z1lTQm1kV3hzSUdGaWMyOXNkWFJsSUhCaGRHZ3NJR0oxZEZ4dUlDQXZMeUJvWVc1a2JHVWdjbVZzWVhScGRtVWdjR0YwYUhNZ2RHOGdZbVVnYzJGbVpTQW9iV2xuYUhRZ2FHRndjR1Z1SUhkb1pXNGdjSEp2WTJWemN5NWpkMlFvS1NCbVlXbHNjeWxjYmx4dUlDQXZMeUJPYjNKdFlXeHBlbVVnZEdobElIQmhkR2hjYmlBZ2NtVnpiMngyWldSUVlYUm9JRDBnYm05eWJXRnNhWHBsUVhKeVlYa29abWxzZEdWeUtISmxjMjlzZG1Wa1VHRjBhQzV6Y0d4cGRDZ25MeWNwTENCbWRXNWpkR2x2Ymlod0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUNFaGNEdGNiaUFnZlNrc0lDRnlaWE52YkhabFpFRmljMjlzZFhSbEtTNXFiMmx1S0Njdkp5azdYRzVjYmlBZ2NtVjBkWEp1SUNnb2NtVnpiMngyWldSQlluTnZiSFYwWlNBL0lDY3ZKeUE2SUNjbktTQXJJSEpsYzI5c2RtVmtVR0YwYUNrZ2ZId2dKeTRuTzF4dWZUdGNibHh1THk4Z2NHRjBhQzV1YjNKdFlXeHBlbVVvY0dGMGFDbGNiaTh2SUhCdmMybDRJSFpsY25OcGIyNWNibVY0Y0c5eWRITXVibTl5YldGc2FYcGxJRDBnWm5WdVkzUnBiMjRvY0dGMGFDa2dlMXh1SUNCMllYSWdhWE5CWW5OdmJIVjBaU0E5SUdWNGNHOXlkSE11YVhOQlluTnZiSFYwWlNod1lYUm9LU3hjYmlBZ0lDQWdJSFJ5WVdsc2FXNW5VMnhoYzJnZ1BTQnpkV0p6ZEhJb2NHRjBhQ3dnTFRFcElEMDlQU0FuTHljN1hHNWNiaUFnTHk4Z1RtOXliV0ZzYVhwbElIUm9aU0J3WVhSb1hHNGdJSEJoZEdnZ1BTQnViM0p0WVd4cGVtVkJjbkpoZVNobWFXeDBaWElvY0dGMGFDNXpjR3hwZENnbkx5Y3BMQ0JtZFc1amRHbHZiaWh3S1NCN1hHNGdJQ0FnY21WMGRYSnVJQ0VoY0R0Y2JpQWdmU2tzSUNGcGMwRmljMjlzZFhSbEtTNXFiMmx1S0Njdkp5azdYRzVjYmlBZ2FXWWdLQ0Z3WVhSb0lDWW1JQ0ZwYzBGaWMyOXNkWFJsS1NCN1hHNGdJQ0FnY0dGMGFDQTlJQ2N1Snp0Y2JpQWdmVnh1SUNCcFppQW9jR0YwYUNBbUppQjBjbUZwYkdsdVoxTnNZWE5vS1NCN1hHNGdJQ0FnY0dGMGFDQXJQU0FuTHljN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z0tHbHpRV0p6YjJ4MWRHVWdQeUFuTHljZ09pQW5KeWtnS3lCd1lYUm9PMXh1ZlR0Y2JseHVMeThnY0c5emFYZ2dkbVZ5YzJsdmJseHVaWGh3YjNKMGN5NXBjMEZpYzI5c2RYUmxJRDBnWm5WdVkzUnBiMjRvY0dGMGFDa2dlMXh1SUNCeVpYUjFjbTRnY0dGMGFDNWphR0Z5UVhRb01Da2dQVDA5SUNjdkp6dGNibjA3WEc1Y2JpOHZJSEJ2YzJsNElIWmxjbk5wYjI1Y2JtVjRjRzl5ZEhNdWFtOXBiaUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0IyWVhJZ2NHRjBhSE1nUFNCQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNoaGNtZDFiV1Z1ZEhNc0lEQXBPMXh1SUNCeVpYUjFjbTRnWlhod2IzSjBjeTV1YjNKdFlXeHBlbVVvWm1sc2RHVnlLSEJoZEdoekxDQm1kVzVqZEdsdmJpaHdMQ0JwYm1SbGVDa2dlMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdjQ0FoUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEZ5WjNWdFpXNTBjeUIwYnlCd1lYUm9MbXB2YVc0Z2JYVnpkQ0JpWlNCemRISnBibWR6SnlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQndPMXh1SUNCOUtTNXFiMmx1S0Njdkp5a3BPMXh1ZlR0Y2JseHVYRzR2THlCd1lYUm9MbkpsYkdGMGFYWmxLR1p5YjIwc0lIUnZLVnh1THk4Z2NHOXphWGdnZG1WeWMybHZibHh1Wlhod2IzSjBjeTV5Wld4aGRHbDJaU0E5SUdaMWJtTjBhVzl1S0daeWIyMHNJSFJ2S1NCN1hHNGdJR1p5YjIwZ1BTQmxlSEJ2Y25SekxuSmxjMjlzZG1Vb1puSnZiU2t1YzNWaWMzUnlLREVwTzF4dUlDQjBieUE5SUdWNGNHOXlkSE11Y21WemIyeDJaU2gwYnlrdWMzVmljM1J5S0RFcE8xeHVYRzRnSUdaMWJtTjBhVzl1SUhSeWFXMG9ZWEp5S1NCN1hHNGdJQ0FnZG1GeUlITjBZWEowSUQwZ01EdGNiaUFnSUNCbWIzSWdLRHNnYzNSaGNuUWdQQ0JoY25JdWJHVnVaM1JvT3lCemRHRnlkQ3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9ZWEp5VzNOMFlYSjBYU0FoUFQwZ0p5Y3BJR0p5WldGck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQmxibVFnUFNCaGNuSXViR1Z1WjNSb0lDMGdNVHRjYmlBZ0lDQm1iM0lnS0RzZ1pXNWtJRDQ5SURBN0lHVnVaQzB0S1NCN1hHNGdJQ0FnSUNCcFppQW9ZWEp5VzJWdVpGMGdJVDA5SUNjbktTQmljbVZoYXp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2MzUmhjblFnUGlCbGJtUXBJSEpsZEhWeWJpQmJYVHRjYmlBZ0lDQnlaWFIxY200Z1lYSnlMbk5zYVdObEtITjBZWEowTENCbGJtUWdMU0J6ZEdGeWRDQXJJREVwTzF4dUlDQjlYRzVjYmlBZ2RtRnlJR1p5YjIxUVlYSjBjeUE5SUhSeWFXMG9abkp2YlM1emNHeHBkQ2duTHljcEtUdGNiaUFnZG1GeUlIUnZVR0Z5ZEhNZ1BTQjBjbWx0S0hSdkxuTndiR2wwS0Njdkp5a3BPMXh1WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0JOWVhSb0xtMXBiaWhtY205dFVHRnlkSE11YkdWdVozUm9MQ0IwYjFCaGNuUnpMbXhsYm1kMGFDazdYRzRnSUhaaGNpQnpZVzFsVUdGeWRITk1aVzVuZEdnZ1BTQnNaVzVuZEdnN1hHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnYkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCcFppQW9abkp2YlZCaGNuUnpXMmxkSUNFOVBTQjBiMUJoY25SelcybGRLU0I3WEc0Z0lDQWdJQ0J6WVcxbFVHRnlkSE5NWlc1bmRHZ2dQU0JwTzF4dUlDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdkbUZ5SUc5MWRIQjFkRkJoY25SeklEMGdXMTA3WEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0J6WVcxbFVHRnlkSE5NWlc1bmRHZzdJR2tnUENCbWNtOXRVR0Z5ZEhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnZkWFJ3ZFhSUVlYSjBjeTV3ZFhOb0tDY3VMaWNwTzF4dUlDQjlYRzVjYmlBZ2IzVjBjSFYwVUdGeWRITWdQU0J2ZFhSd2RYUlFZWEowY3k1amIyNWpZWFFvZEc5UVlYSjBjeTV6YkdsalpTaHpZVzFsVUdGeWRITk1aVzVuZEdncEtUdGNibHh1SUNCeVpYUjFjbTRnYjNWMGNIVjBVR0Z5ZEhNdWFtOXBiaWduTHljcE8xeHVmVHRjYmx4dVpYaHdiM0owY3k1elpYQWdQU0FuTHljN1hHNWxlSEJ2Y25SekxtUmxiR2x0YVhSbGNpQTlJQ2M2Snp0Y2JseHVaWGh3YjNKMGN5NWthWEp1WVcxbElEMGdablZ1WTNScGIyNG9jR0YwYUNrZ2UxeHVJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2MzQnNhWFJRWVhSb0tIQmhkR2dwTEZ4dUlDQWdJQ0FnY205dmRDQTlJSEpsYzNWc2RGc3dYU3hjYmlBZ0lDQWdJR1JwY2lBOUlISmxjM1ZzZEZzeFhUdGNibHh1SUNCcFppQW9JWEp2YjNRZ0ppWWdJV1JwY2lrZ2UxeHVJQ0FnSUM4dklFNXZJR1JwY201aGJXVWdkMmhoZEhOdlpYWmxjbHh1SUNBZ0lISmxkSFZ5YmlBbkxpYzdYRzRnSUgxY2JseHVJQ0JwWmlBb1pHbHlLU0I3WEc0Z0lDQWdMeThnU1hRZ2FHRnpJR0VnWkdseWJtRnRaU3dnYzNSeWFYQWdkSEpoYVd4cGJtY2djMnhoYzJoY2JpQWdJQ0JrYVhJZ1BTQmthWEl1YzNWaWMzUnlLREFzSUdScGNpNXNaVzVuZEdnZ0xTQXhLVHRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ5YjI5MElDc2daR2x5TzF4dWZUdGNibHh1WEc1bGVIQnZjblJ6TG1KaGMyVnVZVzFsSUQwZ1puVnVZM1JwYjI0b2NHRjBhQ3dnWlhoMEtTQjdYRzRnSUhaaGNpQm1JRDBnYzNCc2FYUlFZWFJvS0hCaGRHZ3BXekpkTzF4dUlDQXZMeUJVVDBSUE9pQnRZV3RsSUhSb2FYTWdZMjl0Y0dGeWFYTnZiaUJqWVhObExXbHVjMlZ1YzJsMGFYWmxJRzl1SUhkcGJtUnZkM00vWEc0Z0lHbG1JQ2hsZUhRZ0ppWWdaaTV6ZFdKemRISW9MVEVnS2lCbGVIUXViR1Z1WjNSb0tTQTlQVDBnWlhoMEtTQjdYRzRnSUNBZ1ppQTlJR1l1YzNWaWMzUnlLREFzSUdZdWJHVnVaM1JvSUMwZ1pYaDBMbXhsYm1kMGFDazdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHWTdYRzU5TzF4dVhHNWNibVY0Y0c5eWRITXVaWGgwYm1GdFpTQTlJR1oxYm1OMGFXOXVLSEJoZEdncElIdGNiaUFnY21WMGRYSnVJSE53YkdsMFVHRjBhQ2h3WVhSb0tWc3pYVHRjYm4wN1hHNWNibVoxYm1OMGFXOXVJR1pwYkhSbGNpQW9lSE1zSUdZcElIdGNiaUFnSUNCcFppQW9lSE11Wm1sc2RHVnlLU0J5WlhSMWNtNGdlSE11Wm1sc2RHVnlLR1lwTzF4dUlDQWdJSFpoY2lCeVpYTWdQU0JiWFR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUhoekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaG1LSGh6VzJsZExDQnBMQ0I0Y3lrcElISmxjeTV3ZFhOb0tIaHpXMmxkS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlISmxjenRjYm4xY2JseHVMeThnVTNSeWFXNW5MbkJ5YjNSdmRIbHdaUzV6ZFdKemRISWdMU0J1WldkaGRHbDJaU0JwYm1SbGVDQmtiMjRuZENCM2IzSnJJR2x1SUVsRk9GeHVkbUZ5SUhOMVluTjBjaUE5SUNkaFlpY3VjM1ZpYzNSeUtDMHhLU0E5UFQwZ0oySW5YRzRnSUNBZ1B5Qm1kVzVqZEdsdmJpQW9jM1J5TENCemRHRnlkQ3dnYkdWdUtTQjdJSEpsZEhWeWJpQnpkSEl1YzNWaWMzUnlLSE4wWVhKMExDQnNaVzRwSUgxY2JpQWdJQ0E2SUdaMWJtTjBhVzl1SUNoemRISXNJSE4wWVhKMExDQnNaVzRwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSE4wWVhKMElEd2dNQ2tnYzNSaGNuUWdQU0J6ZEhJdWJHVnVaM1JvSUNzZ2MzUmhjblE3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ6ZEhJdWMzVmljM1J5S0hOMFlYSjBMQ0JzWlc0cE8xeHVJQ0FnSUgxY2JqdGNiaUpkZlE9PSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhbk11dGF0aW9uT2JzZXJ2ZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXJcbiAgICA7XG5cbiAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZikgeyByZXR1cm4gd2luZG93LnNldEltbWVkaWF0ZShmKSB9O1xuICAgIH1cblxuICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGNhbk11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFyIGhpZGRlbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWV1ZUxpc3QgPSBxdWV1ZS5zbGljZSgpO1xuICAgICAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHF1ZXVlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShoaWRkZW5EaXYsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaGlkZGVuRGl2LnNldEF0dHJpYnV0ZSgneWVzJywgJ25vJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FuUG9zdCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGV2LnNvdXJjZTtcbiAgICAgICAgICAgIGlmICgoc291cmNlID09PSB3aW5kb3cgfHwgc291cmNlID09PSBudWxsKSAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfVXRpbHMgPSByZXF1aXJlKCcuLi9jb3JlL1V0aWxzJyk7XG5cbnZhciBfVXRpbHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVXRpbHMpO1xuXG52YXIgX1RyYW5zbGF0b3IgPSByZXF1aXJlKCcuLi9jb3JlL1RyYW5zbGF0b3InKTtcblxudmFyIF9UcmFuc2xhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zbGF0b3IpO1xuXG52YXIgX25hbWVzcGFjZUVtaXR0ZXIgPSByZXF1aXJlKCduYW1lc3BhY2UtZW1pdHRlcicpO1xuXG52YXIgX25hbWVzcGFjZUVtaXR0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbmFtZXNwYWNlRW1pdHRlcik7XG5cbnZhciBfVXBweVNvY2tldCA9IHJlcXVpcmUoJy4vVXBweVNvY2tldCcpO1xuXG52YXIgX1VwcHlTb2NrZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVXBweVNvY2tldCk7XG5cbnZhciBfZW5fVVMgPSByZXF1aXJlKCcuLi9sb2NhbGVzL2VuX1VTJyk7XG5cbnZhciBfZW5fVVMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW5fVVMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuLy8gaW1wb3J0IGRlZXBGcmVlemUgZnJvbSAnZGVlcC1mcmVlemUtc3RyaWN0J1xuXG5cbi8qKlxuICogTWFpbiBVcHB5IGNvcmVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBnZW5lcmFsIG9wdGlvbnMsIGxpa2UgbG9jYWxlcywgdG8gc2hvdyBtb2RhbCBvciBub3QgdG8gc2hvd1xuICovXG52YXIgQ29yZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29yZShvcHRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvcmUpO1xuXG4gICAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgIC8vIGxvYWQgRW5nbGlzaCBhcyB0aGUgZGVmYXVsdCBsb2NhbGVzXG4gICAgICBsb2NhbGVzOiBfZW5fVVMyLmRlZmF1bHQsXG4gICAgICBhdXRvUHJvY2VlZDogdHJ1ZSxcbiAgICAgIGRlYnVnOiBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBNZXJnZSBkZWZhdWx0IG9wdGlvbnMgd2l0aCB0aGUgb25lcyBzZXQgYnkgdXNlclxuICAgIHRoaXMub3B0cyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0cyk7XG5cbiAgICAvLyBEaWN0YXRlcyBpbiB3aGF0IG9yZGVyIGRpZmZlcmVudCBwbHVnaW4gdHlwZXMgYXJlIHJhbjpcbiAgICB0aGlzLnR5cGVzID0gWydwcmVzZXR0ZXInLCAnb3JjaGVzdHJhdG9yJywgJ3Byb2dyZXNzaW5kaWNhdG9yJywgJ2FjcXVpcmVyJywgJ21vZGlmaWVyJywgJ3VwbG9hZGVyJywgJ3ByZXNlbnRlcicsICdkZWJ1Z2dlciddO1xuXG4gICAgdGhpcy50eXBlID0gJ2NvcmUnO1xuXG4gICAgLy8gQ29udGFpbmVyIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcGx1Z2luc1xuICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuXG4gICAgdGhpcy50cmFuc2xhdG9yID0gbmV3IF9UcmFuc2xhdG9yMi5kZWZhdWx0KHsgbG9jYWxlczogdGhpcy5vcHRzLmxvY2FsZXMgfSk7XG4gICAgdGhpcy5pMThuID0gdGhpcy50cmFuc2xhdG9yLnRyYW5zbGF0ZS5iaW5kKHRoaXMudHJhbnNsYXRvcik7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEgPSB0aGlzLnVwZGF0ZU1ldGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmluaXRTb2NrZXQgPSB0aGlzLmluaXRTb2NrZXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmxvZyA9IHRoaXMubG9nLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRGaWxlID0gdGhpcy5hZGRGaWxlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmJ1cyA9IHRoaXMuZW1pdHRlciA9ICgwLCBfbmFtZXNwYWNlRW1pdHRlcjIuZGVmYXVsdCkoKTtcbiAgICB0aGlzLm9uID0gdGhpcy5idXMub24uYmluZCh0aGlzLmJ1cyk7XG4gICAgdGhpcy5lbWl0ID0gdGhpcy5idXMuZW1pdC5iaW5kKHRoaXMuYnVzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBmaWxlczoge30sXG4gICAgICBjYXBhYmlsaXRpZXM6IHt9LFxuICAgICAgdG90YWxQcm9ncmVzczogMFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRzLmRlYnVnKSB7XG4gICAgICAvLyBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nXG4gICAgICBnbG9iYWwuVXBweVN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgIGdsb2JhbC51cHB5TG9nID0gJyc7XG4gICAgICBnbG9iYWwuVXBweUFkZEZpbGUgPSB0aGlzLmFkZEZpbGUuYmluZCh0aGlzKTtcbiAgICAgIGdsb2JhbC5fVXBweSA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb24gYWxsIHBsdWdpbnMgYW5kIHJ1biBgdXBkYXRlYCBvbiB0aGVtLiBDYWxsZWQgZWFjaCB0aW1lIHdoZW4gc3RhdGUgY2hhbmdlc1xuICAgKlxuICAgKi9cblxuXG4gIENvcmUucHJvdG90eXBlLnVwZGF0ZUFsbCA9IGZ1bmN0aW9uIHVwZGF0ZUFsbChzdGF0ZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpblR5cGUpIHtcbiAgICAgIF90aGlzLnBsdWdpbnNbcGx1Z2luVHlwZV0uZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICAgIHBsdWdpbi51cGRhdGUoc3RhdGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgc3RhdGVcbiAgICpcbiAgICogQHBhcmFtIHtuZXdTdGF0ZX0gb2JqZWN0XG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZVVwZGF0ZSkge1xuICAgIHZhciBuZXdTdGF0ZSA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLCBzdGF0ZVVwZGF0ZSk7XG4gICAgdGhpcy5idXMuZW1pdCgnY29yZTpzdGF0ZS11cGRhdGUnLCB0aGlzLnN0YXRlLCBuZXdTdGF0ZSwgc3RhdGVVcGRhdGUpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgIHRoaXMudXBkYXRlQWxsKHRoaXMuc3RhdGUpO1xuXG4gICAgLy8gdGhpcy5sb2coJ1VwZGF0aW5nIHN0YXRlIHdpdGg6ICcpXG4gICAgLy8gdGhpcy5sb2cobmV3U3RhdGUpXG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgY3VycmVudCBzdGF0ZSwgbWFraW5nIHN1cmUgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHN0YXRlIG9iamVjdCBhbmQgcGFzcyB0aGF0LFxuICAgKiBpbnN0ZWFkIG9mIGFuIGFjdHVhbCByZWZlcmVuY2UgdG8gYHRoaXMuc3RhdGVgXG4gICAqXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICAvLyByZXR1cm4gZGVlcEZyZWV6ZSh0aGlzLnN0YXRlKVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLnVwZGF0ZU1ldGEgPSBmdW5jdGlvbiB1cGRhdGVNZXRhKGRhdGEsIGZpbGVJRCkge1xuICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5nZXRTdGF0ZSgpLmZpbGVzKTtcbiAgICB2YXIgbmV3TWV0YSA9IF9leHRlbmRzKHt9LCB1cGRhdGVkRmlsZXNbZmlsZUlEXS5tZXRhLCBkYXRhKTtcbiAgICB1cGRhdGVkRmlsZXNbZmlsZUlEXSA9IF9leHRlbmRzKHt9LCB1cGRhdGVkRmlsZXNbZmlsZUlEXSwge1xuICAgICAgbWV0YTogbmV3TWV0YVxuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlczogdXBkYXRlZEZpbGVzIH0pO1xuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLmFkZEZpbGUgPSBmdW5jdGlvbiBhZGRGaWxlKGZpbGUpIHtcbiAgICB2YXIgdXBkYXRlZEZpbGVzID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUuZmlsZXMpO1xuXG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICdub25hbWUnO1xuICAgIHZhciBmaWxlVHlwZSA9IF9VdGlsczIuZGVmYXVsdC5nZXRGaWxlVHlwZShmaWxlKSA/IF9VdGlsczIuZGVmYXVsdC5nZXRGaWxlVHlwZShmaWxlKS5zcGxpdCgnLycpIDogWycnLCAnJ107XG4gICAgdmFyIGZpbGVUeXBlR2VuZXJhbCA9IGZpbGVUeXBlWzBdO1xuICAgIHZhciBmaWxlVHlwZVNwZWNpZmljID0gZmlsZVR5cGVbMV07XG4gICAgdmFyIGZpbGVFeHRlbnNpb24gPSBfVXRpbHMyLmRlZmF1bHQuZ2V0RmlsZU5hbWVBbmRFeHRlbnNpb24oZmlsZU5hbWUpWzFdO1xuICAgIHZhciBpc1JlbW90ZSA9IGZpbGUuaXNSZW1vdGUgfHwgZmFsc2U7XG5cbiAgICB2YXIgZmlsZUlEID0gX1V0aWxzMi5kZWZhdWx0LmdlbmVyYXRlRmlsZUlEKGZpbGVOYW1lKTtcblxuICAgIHZhciBuZXdGaWxlID0ge1xuICAgICAgc291cmNlOiBmaWxlLnNvdXJjZSB8fCAnJyxcbiAgICAgIGlkOiBmaWxlSUQsXG4gICAgICBuYW1lOiBmaWxlTmFtZSxcbiAgICAgIGV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiB8fCAnJyxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgbmFtZTogZmlsZU5hbWVcbiAgICAgIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGdlbmVyYWw6IGZpbGVUeXBlR2VuZXJhbCxcbiAgICAgICAgc3BlY2lmaWM6IGZpbGVUeXBlU3BlY2lmaWNcbiAgICAgIH0sXG4gICAgICBkYXRhOiBmaWxlLmRhdGEsXG4gICAgICBwcm9ncmVzczoge1xuICAgICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgICB1cGxvYWRDb21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHVwbG9hZFN0YXJ0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgc2l6ZTogZmlsZS5kYXRhLnNpemUgfHwgMCxcbiAgICAgIGlzUmVtb3RlOiBpc1JlbW90ZSxcbiAgICAgIHJlbW90ZTogZmlsZS5yZW1vdGUgfHwgJydcbiAgICB9O1xuXG4gICAgdXBkYXRlZEZpbGVzW2ZpbGVJRF0gPSBuZXdGaWxlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlczogdXBkYXRlZEZpbGVzIH0pO1xuXG4gICAgdGhpcy5idXMuZW1pdCgnZmlsZS1hZGRlZCcsIGZpbGVJRCk7XG4gICAgdGhpcy5sb2coJ0FkZGVkIGZpbGU6ICcgKyBmaWxlTmFtZSArICcsICcgKyBmaWxlSUQpO1xuXG4gICAgaWYgKGZpbGVUeXBlR2VuZXJhbCA9PT0gJ2ltYWdlJyAmJiAhaXNSZW1vdGUpIHtcbiAgICAgIHRoaXMuYWRkVGh1bWJuYWlsKG5ld0ZpbGUuaWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXV0b1Byb2NlZWQpIHtcbiAgICAgIHRoaXMuYnVzLmVtaXQoJ2NvcmU6dXBsb2FkJyk7XG4gICAgfVxuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLnJlbW92ZUZpbGUgPSBmdW5jdGlvbiByZW1vdmVGaWxlKGZpbGVJRCkge1xuICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5nZXRTdGF0ZSgpLmZpbGVzKTtcbiAgICBkZWxldGUgdXBkYXRlZEZpbGVzW2ZpbGVJRF07XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVzOiB1cGRhdGVkRmlsZXMgfSk7XG4gIH07XG5cbiAgQ29yZS5wcm90b3R5cGUuYWRkVGh1bWJuYWlsID0gZnVuY3Rpb24gYWRkVGh1bWJuYWlsKGZpbGVJRCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGZpbGUgPSB0aGlzLmdldFN0YXRlKCkuZmlsZXNbZmlsZUlEXTtcblxuICAgIF9VdGlsczIuZGVmYXVsdC5yZWFkRmlsZShmaWxlLmRhdGEpLnRoZW4oZnVuY3Rpb24gKGltZ0RhdGFVUkkpIHtcbiAgICAgIHJldHVybiBfVXRpbHMyLmRlZmF1bHQuY3JlYXRlSW1hZ2VUaHVtYm5haWwoaW1nRGF0YVVSSSwgMjAwKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh0aHVtYm5haWwpIHtcbiAgICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgX3RoaXMyLmdldFN0YXRlKCkuZmlsZXMpO1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLCB7XG4gICAgICAgIHByZXZpZXc6IHRodW1ibmFpbFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVkRmlsZXNbZmlsZUlEXSA9IHVwZGF0ZWRGaWxlO1xuICAgICAgX3RoaXMyLnNldFN0YXRlKHsgZmlsZXM6IHVwZGF0ZWRGaWxlcyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGxpc3RlbmVycyBmb3IgYWxsIGdsb2JhbCBhY3Rpb25zLCBsaWtlOlxuICAgKiBgZmlsZS1hZGRgLCBgZmlsZS1yZW1vdmVgLCBgdXBsb2FkLXByb2dyZXNzYCwgYHJlc2V0YFxuICAgKlxuICAgKi9cblxuXG4gIENvcmUucHJvdG90eXBlLmFjdGlvbnMgPSBmdW5jdGlvbiBhY3Rpb25zKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgLy8gdGhpcy5idXMub24oJyonLCAocGF5bG9hZCkgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coJ2VtaXR0ZWQ6ICcsIHRoaXMuZXZlbnQpXG4gICAgLy8gICBjb25zb2xlLmxvZygnd2l0aCBwYXlsb2FkOiAnLCBwYXlsb2FkKVxuICAgIC8vIH0pXG5cbiAgICAvLyBjb25zdCBidXMgPSB0aGlzLmJ1c1xuXG4gICAgdGhpcy5vbignY29yZTpmaWxlLWFkZCcsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBfdGhpczMuYWRkRmlsZShkYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIGByZW1vdmUtZmlsZWAgcmVtb3ZlcyBhIGZpbGUgZnJvbSBgc3RhdGUuZmlsZXNgLCBmb3IgZXhhbXBsZSB3aGVuXG4gICAgLy8gYSB1c2VyIGRlY2lkZXMgbm90IHRvIHVwbG9hZCBwYXJ0aWN1bGFyIGZpbGUgYW5kIGNsaWNrcyBhIGJ1dHRvbiB0byByZW1vdmUgaXRcbiAgICB0aGlzLm9uKCdjb3JlOmZpbGUtcmVtb3ZlJywgZnVuY3Rpb24gKGZpbGVJRCkge1xuICAgICAgX3RoaXMzLnJlbW92ZUZpbGUoZmlsZUlEKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2NvcmU6dXBsb2FkLXN0YXJ0ZWQnLCBmdW5jdGlvbiAoZmlsZUlELCB1cGxvYWQpIHtcbiAgICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgX3RoaXMzLmdldFN0YXRlKCkuZmlsZXMpO1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLCBfZXh0ZW5kcyh7fSwge1xuICAgICAgICBwcm9ncmVzczogX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLnByb2dyZXNzLCB7XG4gICAgICAgICAgdXBsb2FkU3RhcnRlZDogRGF0ZS5ub3coKVxuICAgICAgICB9KVxuICAgICAgfSkpO1xuICAgICAgdXBkYXRlZEZpbGVzW2ZpbGVJRF0gPSB1cGRhdGVkRmlsZTtcblxuICAgICAgX3RoaXMzLnNldFN0YXRlKHsgZmlsZXM6IHVwZGF0ZWRGaWxlcyB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2NvcmU6dXBsb2FkLXByb2dyZXNzJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBmaWxlSUQgPSBkYXRhLmlkO1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlcyA9IF9leHRlbmRzKHt9LCBfdGhpczMuZ2V0U3RhdGUoKS5maWxlcyk7XG4gICAgICBpZiAoIXVwZGF0ZWRGaWxlc1tmaWxlSURdKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyeWluZyB0byBzZXQgcHJvZ3Jlc3MgZm9yIGEgZmlsZSB0aGF04oCZcyBub3Qgd2l0aCB1cyBhbnltb3JlOiAnLCBmaWxlSUQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB1cGRhdGVkRmlsZSA9IF9leHRlbmRzKHt9LCB1cGRhdGVkRmlsZXNbZmlsZUlEXSwgX2V4dGVuZHMoe30sIHtcbiAgICAgICAgcHJvZ3Jlc3M6IF9leHRlbmRzKHt9LCB1cGRhdGVkRmlsZXNbZmlsZUlEXS5wcm9ncmVzcywge1xuICAgICAgICAgIGJ5dGVzVXBsb2FkZWQ6IGRhdGEuYnl0ZXNVcGxvYWRlZCxcbiAgICAgICAgICBieXRlc1RvdGFsOiBkYXRhLmJ5dGVzVG90YWwsXG4gICAgICAgICAgcGVyY2VudGFnZTogTWF0aC5yb3VuZCgoZGF0YS5ieXRlc1VwbG9hZGVkIC8gZGF0YS5ieXRlc1RvdGFsICogMTAwKS50b0ZpeGVkKDIpKVxuICAgICAgICB9KVxuICAgICAgfSkpO1xuICAgICAgdXBkYXRlZEZpbGVzW2RhdGEuaWRdID0gdXBkYXRlZEZpbGU7XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBwcm9ncmVzcywgdXNpbmcgdGhlIG51bWJlciBvZiBmaWxlcyBjdXJyZW50bHkgdXBsb2FkaW5nLFxuICAgICAgLy8gbXVsdGlwbGllZCBieSAxMDAgYW5kIHRoZSBzdW1tIG9mIGluZGl2aWR1YWwgcHJvZ3Jlc3Mgb2YgZWFjaCBmaWxlXG4gICAgICB2YXIgaW5Qcm9ncmVzcyA9IE9iamVjdC5rZXlzKHVwZGF0ZWRGaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVkRmlsZXNbZmlsZV0ucHJvZ3Jlc3MudXBsb2FkU3RhcnRlZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIHByb2dyZXNzTWF4ID0gaW5Qcm9ncmVzcy5sZW5ndGggKiAxMDA7XG4gICAgICB2YXIgcHJvZ3Jlc3NBbGwgPSAwO1xuICAgICAgaW5Qcm9ncmVzcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHByb2dyZXNzQWxsID0gcHJvZ3Jlc3NBbGwgKyB1cGRhdGVkRmlsZXNbZmlsZV0ucHJvZ3Jlc3MucGVyY2VudGFnZTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdG90YWxQcm9ncmVzcyA9IE1hdGgucm91bmQoKHByb2dyZXNzQWxsICogMTAwIC8gcHJvZ3Jlc3NNYXgpLnRvRml4ZWQoMikpO1xuXG4gICAgICBpZiAodG90YWxQcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgIHZhciBjb21wbGV0ZUZpbGVzID0gT2JqZWN0LmtleXModXBkYXRlZEZpbGVzKS5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSBgdXBsb2FkQ29tcGxldGVgXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRGaWxlc1tmaWxlXS5wcm9ncmVzcy5wZXJjZW50YWdlID09PSAxMDA7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpczMuZW1pdCgnY29yZTpzdWNjZXNzJywgY29tcGxldGVGaWxlcy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczMuc2V0U3RhdGUoe1xuICAgICAgICB0b3RhbFByb2dyZXNzOiB0b3RhbFByb2dyZXNzLFxuICAgICAgICBmaWxlczogdXBkYXRlZEZpbGVzXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2NvcmU6dXBsb2FkLXN1Y2Nlc3MnLCBmdW5jdGlvbiAoZmlsZUlELCB1cGxvYWRVUkwpIHtcbiAgICAgIHZhciB1cGRhdGVkRmlsZXMgPSBfZXh0ZW5kcyh7fSwgX3RoaXMzLmdldFN0YXRlKCkuZmlsZXMpO1xuICAgICAgdmFyIHVwZGF0ZWRGaWxlID0gX2V4dGVuZHMoe30sIHVwZGF0ZWRGaWxlc1tmaWxlSURdLCB7XG4gICAgICAgIHByb2dyZXNzOiBfZXh0ZW5kcyh7fSwgdXBkYXRlZEZpbGVzW2ZpbGVJRF0ucHJvZ3Jlc3MsIHtcbiAgICAgICAgICB1cGxvYWRDb21wbGV0ZTogdHJ1ZVxuICAgICAgICB9KSxcbiAgICAgICAgdXBsb2FkVVJMOiB1cGxvYWRVUkxcbiAgICAgIH0pO1xuICAgICAgdXBkYXRlZEZpbGVzW2ZpbGVJRF0gPSB1cGRhdGVkRmlsZTtcblxuICAgICAgX3RoaXMzLnNldFN0YXRlKHtcbiAgICAgICAgZmlsZXM6IHVwZGF0ZWRGaWxlc1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdjb3JlOnVwZGF0ZS1tZXRhJywgZnVuY3Rpb24gKGRhdGEsIGZpbGVJRCkge1xuICAgICAgX3RoaXMzLnVwZGF0ZU1ldGEoZGF0YSwgZmlsZUlEKTtcbiAgICB9KTtcblxuICAgIC8vIHNob3cgaW5mb3JtZXIgaWYgb2ZmbGluZVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5pc09ubGluZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczMuaXNPbmxpbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5pc09ubGluZSgpO1xuICAgICAgfSwgMzAwMCk7XG4gICAgfVxuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLmlzT25saW5lID0gZnVuY3Rpb24gaXNPbmxpbmUoc3RhdHVzKSB7XG4gICAgdmFyIG9ubGluZSA9IHN0YXR1cyB8fCB3aW5kb3cubmF2aWdhdG9yLm9uTGluZTtcbiAgICBpZiAoIW9ubGluZSkge1xuICAgICAgdGhpcy5lbWl0KCdpcy1vZmZsaW5lJyk7XG4gICAgICB0aGlzLmVtaXQoJ2luZm9ybWVyJywgJ05vIGludGVybmV0IGNvbm5lY3Rpb24nLCAnZXJyb3InLCAwKTtcbiAgICAgIHRoaXMud2FzT2ZmbGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnaXMtb25saW5lJyk7XG4gICAgICBpZiAodGhpcy53YXNPZmZsaW5lKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnaW5mb3JtZXInLCAnQ29ubmVjdGVkIScsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIHRoaXMud2FzT2ZmbGluZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcGx1Z2luIHdpdGggQ29yZVxuICAgKlxuICAgKiBAcGFyYW0ge0NsYXNzfSBQbHVnaW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFBsdWdpbiBsYXRlclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHNlbGYgZm9yIGNoYWluaW5nXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKFBsdWdpbiwgb3B0cykge1xuICAgIC8vIFByZXBhcmUgcHJvcHMgdG8gcGFzcyB0byBwbHVnaW5zXG4gICAgdmFyIHByb3BzID0ge1xuICAgICAgZ2V0U3RhdGU6IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKSxcbiAgICAgIHNldFN0YXRlOiB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB1cGRhdGVNZXRhOiB0aGlzLnVwZGF0ZU1ldGEuYmluZCh0aGlzKSxcbiAgICAgIGFkZEZpbGU6IHRoaXMuYWRkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgaTE4bjogdGhpcy5pMThuLmJpbmQodGhpcyksXG4gICAgICBidXM6IHRoaXMuZWUsXG4gICAgICBsb2c6IHRoaXMubG9nLmJpbmQodGhpcylcbiAgICB9O1xuICAgIC8vIEluc3RhbnRpYXRlXG4gICAgdmFyIHBsdWdpbiA9IG5ldyBQbHVnaW4odGhpcywgb3B0cywgcHJvcHMpO1xuICAgIHZhciBwbHVnaW5OYW1lID0gcGx1Z2luLmlkO1xuICAgIHRoaXMucGx1Z2luc1twbHVnaW4udHlwZV0gPSB0aGlzLnBsdWdpbnNbcGx1Z2luLnR5cGVdIHx8IFtdO1xuXG4gICAgaWYgKCFwbHVnaW5OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgcGx1Z2luIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBsdWdpbi50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgcGx1Z2luIG11c3QgaGF2ZSBhIHR5cGUnKTtcbiAgICB9XG5cbiAgICB2YXIgZXhpc3RzUGx1Z2luQWxyZWFkeSA9IHRoaXMuZ2V0UGx1Z2luKHBsdWdpbk5hbWUpO1xuICAgIGlmIChleGlzdHNQbHVnaW5BbHJlYWR5KSB7XG4gICAgICB2YXIgbXNnID0gJ0FscmVhZHkgZm91bmQgYSBwbHVnaW4gbmFtZWQgXFwnJyArIGV4aXN0c1BsdWdpbkFscmVhZHkubmFtZSArICdcXCcuXFxuICAgICAgICBUcmllZCB0byB1c2U6IFxcJycgKyBwbHVnaW5OYW1lICsgJ1xcJy5cXG4gICAgICAgIFVwcHkgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gcnVubmluZyBvbmUgb2YgZXZlcnkgcGx1Z2luLlxcbiAgICAgICAgU2hhcmUgeW91ciB1c2UgY2FzZSB3aXRoIHVzIG92ZXIgYXRcXG4gICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90cmFuc2xvYWRpdC91cHB5L2lzc3Vlcy9cXG4gICAgICAgIGlmIHlvdSB3YW50IHVzIHRvIHJlY29uc2lkZXIuJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cblxuICAgIHRoaXMucGx1Z2luc1twbHVnaW4udHlwZV0ucHVzaChwbHVnaW4pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmQgb25lIFBsdWdpbiBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmcgbmFtZSBkZXNjcmlwdGlvblxuICAgKi9cblxuXG4gIENvcmUucHJvdG90eXBlLmdldFBsdWdpbiA9IGZ1bmN0aW9uIGdldFBsdWdpbihuYW1lKSB7XG4gICAgdmFyIGZvdW5kUGx1Z2luID0gZmFsc2U7XG4gICAgdGhpcy5pdGVyYXRlUGx1Z2lucyhmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5pZDtcbiAgICAgIGlmIChwbHVnaW5OYW1lID09PSBuYW1lKSB7XG4gICAgICAgIGZvdW5kUGx1Z2luID0gcGx1Z2luO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvdW5kUGx1Z2luO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggYWxsIGB1c2VgZCBwbHVnaW5zXG4gICAqXG4gICAqIEBwYXJhbSBmdW5jdGlvbiBtZXRob2QgZGVzY3JpcHRpb25cbiAgICovXG5cblxuICBDb3JlLnByb3RvdHlwZS5pdGVyYXRlUGx1Z2lucyA9IGZ1bmN0aW9uIGl0ZXJhdGVQbHVnaW5zKG1ldGhvZCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW5UeXBlKSB7XG4gICAgICBfdGhpczQucGx1Z2luc1twbHVnaW5UeXBlXS5mb3JFYWNoKG1ldGhvZCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvZ3Mgc3R1ZmYgdG8gY29uc29sZSwgb25seSBpZiBgZGVidWdgIGlzIHNldCB0byB0cnVlLiBTaWxlbnQgaW4gcHJvZHVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfE9iamVjdH0gdG8gbG9nXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gbG9nKG1zZykge1xuICAgIGlmICghdGhpcy5vcHRzLmRlYnVnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtc2cgPT09ICcnICsgbXNnKSB7XG4gICAgICBjb25zb2xlLmxvZygnTE9HOiAnICsgbXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5kaXIobXNnKTtcbiAgICB9XG4gICAgZ2xvYmFsLnVwcHlMb2cgPSBnbG9iYWwudXBweUxvZyArICdcXG4nICsgJ0RFQlVHIExPRzogJyArIG1zZztcbiAgfTtcblxuICBDb3JlLnByb3RvdHlwZS5pbml0U29ja2V0ID0gZnVuY3Rpb24gaW5pdFNvY2tldChvcHRzKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgX1VwcHlTb2NrZXQyLmRlZmF1bHQob3B0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc29ja2V0O1xuICB9O1xuXG4gIENvcmUucHJvdG90eXBlLmluc3RhbGxBbGwgPSBmdW5jdGlvbiBpbnN0YWxsQWxsKCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW5UeXBlKSB7XG4gICAgICBfdGhpczUucGx1Z2luc1twbHVnaW5UeXBlXS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcGx1Z2luLmluc3RhbGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhY3Rpb25zLCBpbnN0YWxscyBhbGwgcGx1Z2lucyAoYnkgaXRlcmF0aW5nIG9uIHRoZW0gYW5kIGNhbGxpbmcgYGluc3RhbGxgKSwgc2V0cyBvcHRpb25zXG4gICAqXG4gICAqIChJbiB0aGUgcGFzdCB3YXMgdXNlZCB0byBydW4gYSB3YXRlcmZhbGwgb2YgcnVuVHlwZSBwbHVnaW4gcGFja3MsIGxpa2Ugc286XG4gICAqIEFsbCBwcmVzZXRlcnMoZGF0YSkgLS0+IEFsbCBhY3F1aXJlcnMoZGF0YSkgLS0+IEFsbCB1cGxvYWRlcnMoZGF0YSkgLS0+IGRvbmUpXG4gICAqL1xuXG5cbiAgQ29yZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuKCkge1xuICAgIHRoaXMubG9nKCdDb3JlIGlzIHJ1biwgaW5pdGlhbGl6aW5nIGFjdGlvbnMsIGluc3RhbGxpbmcgcGx1Z2lucy4uLicpO1xuXG4gICAgLy8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vICAgdGhpcy51cGRhdGVBbGwodGhpcy5zdGF0ZSlcbiAgICAvLyB9LCAxMDAwKVxuXG4gICAgdGhpcy5hY3Rpb25zKCk7XG5cbiAgICAvLyBGb3JzZSBzZXQgYGF1dG9Qcm9jZWVkYCBvcHRpb24gdG8gZmFsc2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNlbGVjdG9yIFBsdWdpbnMgYWN0aXZlXG4gICAgaWYgKHRoaXMucGx1Z2lucy5hY3F1aXJlciAmJiB0aGlzLnBsdWdpbnMuYWNxdWlyZXIubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5vcHRzLmF1dG9Qcm9jZWVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbGwgcGx1Z2luc1xuICAgIHRoaXMuaW5zdGFsbEFsbCgpO1xuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIHJldHVybiBDb3JlO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb3JlO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTlqYjNKbEwwTnZjbVV1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNibHh1Wlhod2IzSjBjeTVmWDJWelRXOWtkV3hsSUQwZ2RISjFaVHRjYmx4dWRtRnlJRjlsZUhSbGJtUnpJRDBnVDJKcVpXTjBMbUZ6YzJsbmJpQjhmQ0JtZFc1amRHbHZiaUFvZEdGeVoyVjBLU0I3SUdadmNpQW9kbUZ5SUdrZ1BTQXhPeUJwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ2FTc3JLU0I3SUhaaGNpQnpiM1Z5WTJVZ1BTQmhjbWQxYldWdWRITmJhVjA3SUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ6YjNWeVkyVXBJSHNnYVdZZ0tFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWFHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaHpiM1Z5WTJVc0lHdGxlU2twSUhzZ2RHRnlaMlYwVzJ0bGVWMGdQU0J6YjNWeVkyVmJhMlY1WFRzZ2ZTQjlJSDBnY21WMGRYSnVJSFJoY21kbGREc2dmVHRjYmx4dWRtRnlJRjlWZEdsc2N5QTlJSEpsY1hWcGNtVW9KeTR1TDJOdmNtVXZWWFJwYkhNbktUdGNibHh1ZG1GeUlGOVZkR2xzY3pJZ1BTQmZhVzUwWlhKdmNGSmxjWFZwY21WRVpXWmhkV3gwS0Y5VmRHbHNjeWs3WEc1Y2JuWmhjaUJmVkhKaGJuTnNZWFJ2Y2lBOUlISmxjWFZwY21Vb0p5NHVMMk52Y21VdlZISmhibk5zWVhSdmNpY3BPMXh1WEc1MllYSWdYMVJ5WVc1emJHRjBiM0l5SUQwZ1gybHVkR1Z5YjNCU1pYRjFhWEpsUkdWbVlYVnNkQ2hmVkhKaGJuTnNZWFJ2Y2lrN1hHNWNiblpoY2lCZmJtRnRaWE53WVdObFJXMXBkSFJsY2lBOUlISmxjWFZwY21Vb0oyNWhiV1Z6Y0dGalpTMWxiV2wwZEdWeUp5azdYRzVjYm5aaGNpQmZibUZ0WlhOd1lXTmxSVzFwZEhSbGNqSWdQU0JmYVc1MFpYSnZjRkpsY1hWcGNtVkVaV1poZFd4MEtGOXVZVzFsYzNCaFkyVkZiV2wwZEdWeUtUdGNibHh1ZG1GeUlGOVZjSEI1VTI5amEyVjBJRDBnY21WeGRXbHlaU2duTGk5VmNIQjVVMjlqYTJWMEp5azdYRzVjYm5aaGNpQmZWWEJ3ZVZOdlkydGxkRElnUFNCZmFXNTBaWEp2Y0ZKbGNYVnBjbVZFWldaaGRXeDBLRjlWY0hCNVUyOWphMlYwS1R0Y2JseHVkbUZ5SUY5bGJsOVZVeUE5SUhKbGNYVnBjbVVvSnk0dUwyeHZZMkZzWlhNdlpXNWZWVk1uS1R0Y2JseHVkbUZ5SUY5bGJsOVZVeklnUFNCZmFXNTBaWEp2Y0ZKbGNYVnBjbVZFWldaaGRXeDBLRjlsYmw5VlV5azdYRzVjYm1aMWJtTjBhVzl1SUY5cGJuUmxjbTl3VW1WeGRXbHlaVVJsWm1GMWJIUW9iMkpxS1NCN0lISmxkSFZ5YmlCdlltb2dKaVlnYjJKcUxsOWZaWE5OYjJSMWJHVWdQeUJ2WW1vZ09pQjdJR1JsWm1GMWJIUTZJRzlpYWlCOU95QjlYRzVjYm1aMWJtTjBhVzl1SUY5amJHRnpjME5oYkd4RGFHVmpheWhwYm5OMFlXNWpaU3dnUTI5dWMzUnlkV04wYjNJcElIc2dhV1lnS0NFb2FXNXpkR0Z1WTJVZ2FXNXpkR0Z1WTJWdlppQkRiMjV6ZEhKMVkzUnZjaWtwSUhzZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpaGNJa05oYm01dmRDQmpZV3hzSUdFZ1kyeGhjM01nWVhNZ1lTQm1kVzVqZEdsdmJsd2lLVHNnZlNCOVhHNHZMeUJwYlhCdmNuUWdaR1ZsY0VaeVpXVjZaU0JtY205dElDZGtaV1Z3TFdaeVpXVjZaUzF6ZEhKcFkzUW5YRzVjYmx4dUx5b3FYRzRnS2lCTllXbHVJRlZ3Y0hrZ1kyOXlaVnh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdiMkpxWldOMGZTQnZjSFJ6SUdkbGJtVnlZV3dnYjNCMGFXOXVjeXdnYkdsclpTQnNiMk5oYkdWekxDQjBieUJ6YUc5M0lHMXZaR0ZzSUc5eUlHNXZkQ0IwYnlCemFHOTNYRzRnS2k5Y2JuWmhjaUJEYjNKbElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQm1kVzVqZEdsdmJpQkRiM0psS0c5d2RITXBJSHRjYmlBZ0lDQmZZMnhoYzNORFlXeHNRMmhsWTJzb2RHaHBjeXdnUTI5eVpTazdYRzVjYmlBZ0lDQXZMeUJ6WlhRZ1pHVm1ZWFZzZENCdmNIUnBiMjV6WEc0Z0lDQWdkbUZ5SUdSbFptRjFiSFJQY0hScGIyNXpJRDBnZTF4dUlDQWdJQ0FnTHk4Z2JHOWhaQ0JGYm1kc2FYTm9JR0Z6SUhSb1pTQmtaV1poZFd4MElHeHZZMkZzWlhOY2JpQWdJQ0FnSUd4dlkyRnNaWE02SUY5bGJsOVZVekl1WkdWbVlYVnNkQ3hjYmlBZ0lDQWdJR0YxZEc5UWNtOWpaV1ZrT2lCMGNuVmxMRnh1SUNBZ0lDQWdaR1ZpZFdjNklHWmhiSE5sWEc0Z0lDQWdmVHRjYmx4dUlDQWdJQzh2SUUxbGNtZGxJR1JsWm1GMWJIUWdiM0IwYVc5dWN5QjNhWFJvSUhSb1pTQnZibVZ6SUhObGRDQmllU0IxYzJWeVhHNGdJQ0FnZEdocGN5NXZjSFJ6SUQwZ1gyVjRkR1Z1WkhNb2UzMHNJR1JsWm1GMWJIUlBjSFJwYjI1ekxDQnZjSFJ6S1R0Y2JseHVJQ0FnSUM4dklFUnBZM1JoZEdWeklHbHVJSGRvWVhRZ2IzSmtaWElnWkdsbVptVnlaVzUwSUhCc2RXZHBiaUIwZVhCbGN5QmhjbVVnY21GdU9seHVJQ0FnSUhSb2FYTXVkSGx3WlhNZ1BTQmJKM0J5WlhObGRIUmxjaWNzSUNkdmNtTm9aWE4wY21GMGIzSW5MQ0FuY0hKdlozSmxjM05wYm1ScFkyRjBiM0luTENBbllXTnhkV2x5WlhJbkxDQW5iVzlrYVdacFpYSW5MQ0FuZFhCc2IyRmtaWEluTENBbmNISmxjMlZ1ZEdWeUp5d2dKMlJsWW5WbloyVnlKMTA3WEc1Y2JpQWdJQ0IwYUdsekxuUjVjR1VnUFNBblkyOXlaU2M3WEc1Y2JpQWdJQ0F2THlCRGIyNTBZV2x1WlhJZ1ptOXlJR1JwWm1abGNtVnVkQ0IwZVhCbGN5QnZaaUJ3YkhWbmFXNXpYRzRnSUNBZ2RHaHBjeTV3YkhWbmFXNXpJRDBnZTMwN1hHNWNiaUFnSUNCMGFHbHpMblJ5WVc1emJHRjBiM0lnUFNCdVpYY2dYMVJ5WVc1emJHRjBiM0l5TG1SbFptRjFiSFFvZXlCc2IyTmhiR1Z6T2lCMGFHbHpMbTl3ZEhNdWJHOWpZV3hsY3lCOUtUdGNiaUFnSUNCMGFHbHpMbWt4T0c0Z1BTQjBhR2x6TG5SeVlXNXpiR0YwYjNJdWRISmhibk5zWVhSbExtSnBibVFvZEdocGN5NTBjbUZ1YzJ4aGRHOXlLVHRjYmlBZ0lDQjBhR2x6TG1kbGRGTjBZWFJsSUQwZ2RHaHBjeTVuWlhSVGRHRjBaUzVpYVc1a0tIUm9hWE1wTzF4dUlDQWdJSFJvYVhNdWRYQmtZWFJsVFdWMFlTQTlJSFJvYVhNdWRYQmtZWFJsVFdWMFlTNWlhVzVrS0hSb2FYTXBPMXh1SUNBZ0lIUm9hWE11YVc1cGRGTnZZMnRsZENBOUlIUm9hWE11YVc1cGRGTnZZMnRsZEM1aWFXNWtLSFJvYVhNcE8xeHVJQ0FnSUhSb2FYTXViRzluSUQwZ2RHaHBjeTVzYjJjdVltbHVaQ2gwYUdsektUdGNiaUFnSUNCMGFHbHpMbUZrWkVacGJHVWdQU0IwYUdsekxtRmtaRVpwYkdVdVltbHVaQ2gwYUdsektUdGNibHh1SUNBZ0lIUm9hWE11WW5WeklEMGdkR2hwY3k1bGJXbDBkR1Z5SUQwZ0tEQXNJRjl1WVcxbGMzQmhZMlZGYldsMGRHVnlNaTVrWldaaGRXeDBLU2dwTzF4dUlDQWdJSFJvYVhNdWIyNGdQU0IwYUdsekxtSjFjeTV2Ymk1aWFXNWtLSFJvYVhNdVluVnpLVHRjYmlBZ0lDQjBhR2x6TG1WdGFYUWdQU0IwYUdsekxtSjFjeTVsYldsMExtSnBibVFvZEdocGN5NWlkWE1wTzF4dVhHNGdJQ0FnZEdocGN5NXpkR0YwWlNBOUlIdGNiaUFnSUNBZ0lHWnBiR1Z6T2lCN2ZTeGNiaUFnSUNBZ0lHTmhjR0ZpYVd4cGRHbGxjem9nZTMwc1hHNGdJQ0FnSUNCMGIzUmhiRkJ5YjJkeVpYTnpPaUF3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVpHVmlkV2NwSUh0Y2JpQWdJQ0FnSUM4dklHWnZjaUJrWldKMVoyZHBibWNnWVc1a0lIUmxjM1JwYm1kY2JpQWdJQ0FnSUdkc2IySmhiQzVWY0hCNVUzUmhkR1VnUFNCMGFHbHpMbk4wWVhSbE8xeHVJQ0FnSUNBZ1oyeHZZbUZzTG5Wd2NIbE1iMmNnUFNBbkp6dGNiaUFnSUNBZ0lHZHNiMkpoYkM1VmNIQjVRV1JrUm1sc1pTQTlJSFJvYVhNdVlXUmtSbWxzWlM1aWFXNWtLSFJvYVhNcE8xeHVJQ0FnSUNBZ1oyeHZZbUZzTGw5VmNIQjVJRDBnZEdocGN6dGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dTWFJsY21GMFpTQnZiaUJoYkd3Z2NHeDFaMmx1Y3lCaGJtUWdjblZ1SUdCMWNHUmhkR1ZnSUc5dUlIUm9aVzB1SUVOaGJHeGxaQ0JsWVdOb0lIUnBiV1VnZDJobGJpQnpkR0YwWlNCamFHRnVaMlZ6WEc0Z0lDQXFYRzRnSUNBcUwxeHVYRzVjYmlBZ1EyOXlaUzV3Y205MGIzUjVjR1V1ZFhCa1lYUmxRV3hzSUQwZ1puVnVZM1JwYjI0Z2RYQmtZWFJsUVd4c0tITjBZWFJsS1NCN1hHNGdJQ0FnZG1GeUlGOTBhR2x6SUQwZ2RHaHBjenRjYmx4dUlDQWdJRTlpYW1WamRDNXJaWGx6S0hSb2FYTXVjR3gxWjJsdWN5a3VabTl5UldGamFDaG1kVzVqZEdsdmJpQW9jR3gxWjJsdVZIbHdaU2tnZTF4dUlDQWdJQ0FnWDNSb2FYTXVjR3gxWjJsdWMxdHdiSFZuYVc1VWVYQmxYUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVJQ2h3YkhWbmFXNHBJSHRjYmlBZ0lDQWdJQ0FnY0d4MVoybHVMblZ3WkdGMFpTaHpkR0YwWlNrN1hHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOUtUdGNiaUFnZlR0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVlhCa1lYUmxjeUJ6ZEdGMFpWeHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMjVsZDFOMFlYUmxmU0J2WW1wbFkzUmNiaUFnSUNvdlhHNWNibHh1SUNCRGIzSmxMbkJ5YjNSdmRIbHdaUzV6WlhSVGRHRjBaU0E5SUdaMWJtTjBhVzl1SUhObGRGTjBZWFJsS0hOMFlYUmxWWEJrWVhSbEtTQjdYRzRnSUNBZ2RtRnlJRzVsZDFOMFlYUmxJRDBnWDJWNGRHVnVaSE1vZTMwc0lIUm9hWE11YzNSaGRHVXNJSE4wWVhSbFZYQmtZWFJsS1R0Y2JpQWdJQ0IwYUdsekxtSjFjeTVsYldsMEtDZGpiM0psT25OMFlYUmxMWFZ3WkdGMFpTY3NJSFJvYVhNdWMzUmhkR1VzSUc1bGQxTjBZWFJsTENCemRHRjBaVlZ3WkdGMFpTazdYRzVjYmlBZ0lDQjBhR2x6TG5OMFlYUmxJRDBnYm1WM1UzUmhkR1U3WEc0Z0lDQWdkR2hwY3k1MWNHUmhkR1ZCYkd3b2RHaHBjeTV6ZEdGMFpTazdYRzVjYmlBZ0lDQXZMeUIwYUdsekxteHZaeWduVlhCa1lYUnBibWNnYzNSaGRHVWdkMmwwYURvZ0p5bGNiaUFnSUNBdkx5QjBhR2x6TG14dlp5aHVaWGRUZEdGMFpTbGNiaUFnZlR0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nUjJWMGN5QmpkWEp5Wlc1MElITjBZWFJsTENCdFlXdHBibWNnYzNWeVpTQjBieUJ0WVd0bElHRWdZMjl3ZVNCdlppQjBhR1VnYzNSaGRHVWdiMkpxWldOMElHRnVaQ0J3WVhOeklIUm9ZWFFzWEc0Z0lDQXFJR2x1YzNSbFlXUWdiMllnWVc0Z1lXTjBkV0ZzSUhKbFptVnlaVzVqWlNCMGJ5QmdkR2hwY3k1emRHRjBaV0JjYmlBZ0lDcGNiaUFnSUNvdlhHNWNibHh1SUNCRGIzSmxMbkJ5YjNSdmRIbHdaUzVuWlhSVGRHRjBaU0E5SUdaMWJtTjBhVzl1SUdkbGRGTjBZWFJsS0NrZ2UxeHVJQ0FnSUM4dklISmxkSFZ5YmlCa1pXVndSbkpsWlhwbEtIUm9hWE11YzNSaGRHVXBYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjM1JoZEdVN1hHNGdJSDA3WEc1Y2JpQWdRMjl5WlM1d2NtOTBiM1I1Y0dVdWRYQmtZWFJsVFdWMFlTQTlJR1oxYm1OMGFXOXVJSFZ3WkdGMFpVMWxkR0VvWkdGMFlTd2dabWxzWlVsRUtTQjdYRzRnSUNBZ2RtRnlJSFZ3WkdGMFpXUkdhV3hsY3lBOUlGOWxlSFJsYm1SektIdDlMQ0IwYUdsekxtZGxkRk4wWVhSbEtDa3VabWxzWlhNcE8xeHVJQ0FnSUhaaGNpQnVaWGROWlhSaElEMGdYMlY0ZEdWdVpITW9lMzBzSUhWd1pHRjBaV1JHYVd4bGMxdG1hV3hsU1VSZExtMWxkR0VzSUdSaGRHRXBPMXh1SUNBZ0lIVndaR0YwWldSR2FXeGxjMXRtYVd4bFNVUmRJRDBnWDJWNGRHVnVaSE1vZTMwc0lIVndaR0YwWldSR2FXeGxjMXRtYVd4bFNVUmRMQ0I3WEc0Z0lDQWdJQ0J0WlhSaE9pQnVaWGROWlhSaFhHNGdJQ0FnZlNrN1hHNGdJQ0FnZEdocGN5NXpaWFJUZEdGMFpTaDdJR1pwYkdWek9pQjFjR1JoZEdWa1JtbHNaWE1nZlNrN1hHNGdJSDA3WEc1Y2JpQWdRMjl5WlM1d2NtOTBiM1I1Y0dVdVlXUmtSbWxzWlNBOUlHWjFibU4wYVc5dUlHRmtaRVpwYkdVb1ptbHNaU2tnZTF4dUlDQWdJSFpoY2lCMWNHUmhkR1ZrUm1sc1pYTWdQU0JmWlhoMFpXNWtjeWg3ZlN3Z2RHaHBjeTV6ZEdGMFpTNW1hV3hsY3lrN1hHNWNiaUFnSUNCMllYSWdabWxzWlU1aGJXVWdQU0JtYVd4bExtNWhiV1VnZkh3Z0oyNXZibUZ0WlNjN1hHNGdJQ0FnZG1GeUlHWnBiR1ZVZVhCbElEMGdYMVYwYVd4ek1pNWtaV1poZFd4MExtZGxkRVpwYkdWVWVYQmxLR1pwYkdVcElEOGdYMVYwYVd4ek1pNWtaV1poZFd4MExtZGxkRVpwYkdWVWVYQmxLR1pwYkdVcExuTndiR2wwS0Njdkp5a2dPaUJiSnljc0lDY25YVHRjYmlBZ0lDQjJZWElnWm1sc1pWUjVjR1ZIWlc1bGNtRnNJRDBnWm1sc1pWUjVjR1ZiTUYwN1hHNGdJQ0FnZG1GeUlHWnBiR1ZVZVhCbFUzQmxZMmxtYVdNZ1BTQm1hV3hsVkhsd1pWc3hYVHRjYmlBZ0lDQjJZWElnWm1sc1pVVjRkR1Z1YzJsdmJpQTlJRjlWZEdsc2N6SXVaR1ZtWVhWc2RDNW5aWFJHYVd4bFRtRnRaVUZ1WkVWNGRHVnVjMmx2YmlobWFXeGxUbUZ0WlNsYk1WMDdYRzRnSUNBZ2RtRnlJR2x6VW1WdGIzUmxJRDBnWm1sc1pTNXBjMUpsYlc5MFpTQjhmQ0JtWVd4elpUdGNibHh1SUNBZ0lIWmhjaUJtYVd4bFNVUWdQU0JmVlhScGJITXlMbVJsWm1GMWJIUXVaMlZ1WlhKaGRHVkdhV3hsU1VRb1ptbHNaVTVoYldVcE8xeHVYRzRnSUNBZ2RtRnlJRzVsZDBacGJHVWdQU0I3WEc0Z0lDQWdJQ0J6YjNWeVkyVTZJR1pwYkdVdWMyOTFjbU5sSUh4OElDY25MRnh1SUNBZ0lDQWdhV1E2SUdacGJHVkpSQ3hjYmlBZ0lDQWdJRzVoYldVNklHWnBiR1ZPWVcxbExGeHVJQ0FnSUNBZ1pYaDBaVzV6YVc5dU9pQm1hV3hsUlhoMFpXNXphVzl1SUh4OElDY25MRnh1SUNBZ0lDQWdiV1YwWVRvZ2UxeHVJQ0FnSUNBZ0lDQnVZVzFsT2lCbWFXeGxUbUZ0WlZ4dUlDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUhSNWNHVTZJSHRjYmlBZ0lDQWdJQ0FnWjJWdVpYSmhiRG9nWm1sc1pWUjVjR1ZIWlc1bGNtRnNMRnh1SUNBZ0lDQWdJQ0J6Y0dWamFXWnBZem9nWm1sc1pWUjVjR1ZUY0dWamFXWnBZMXh1SUNBZ0lDQWdmU3hjYmlBZ0lDQWdJR1JoZEdFNklHWnBiR1V1WkdGMFlTeGNiaUFnSUNBZ0lIQnliMmR5WlhOek9pQjdYRzRnSUNBZ0lDQWdJSEJsY21ObGJuUmhaMlU2SURBc1hHNGdJQ0FnSUNBZ0lIVndiRzloWkVOdmJYQnNaWFJsT2lCbVlXeHpaU3hjYmlBZ0lDQWdJQ0FnZFhCc2IyRmtVM1JoY25SbFpEb2dabUZzYzJWY2JpQWdJQ0FnSUgwc1hHNGdJQ0FnSUNCemFYcGxPaUJtYVd4bExtUmhkR0V1YzJsNlpTQjhmQ0F3TEZ4dUlDQWdJQ0FnYVhOU1pXMXZkR1U2SUdselVtVnRiM1JsTEZ4dUlDQWdJQ0FnY21WdGIzUmxPaUJtYVd4bExuSmxiVzkwWlNCOGZDQW5KMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQjFjR1JoZEdWa1JtbHNaWE5iWm1sc1pVbEVYU0E5SUc1bGQwWnBiR1U3WEc0Z0lDQWdkR2hwY3k1elpYUlRkR0YwWlNoN0lHWnBiR1Z6T2lCMWNHUmhkR1ZrUm1sc1pYTWdmU2s3WEc1Y2JpQWdJQ0IwYUdsekxtSjFjeTVsYldsMEtDZG1hV3hsTFdGa1pHVmtKeXdnWm1sc1pVbEVLVHRjYmlBZ0lDQjBhR2x6TG14dlp5Z25RV1JrWldRZ1ptbHNaVG9nSnlBcklHWnBiR1ZPWVcxbElDc2dKeXdnSnlBcklHWnBiR1ZKUkNrN1hHNWNiaUFnSUNCcFppQW9abWxzWlZSNWNHVkhaVzVsY21Gc0lEMDlQU0FuYVcxaFoyVW5JQ1ltSUNGcGMxSmxiVzkwWlNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVoWkdSVWFIVnRZbTVoYVd3b2JtVjNSbWxzWlM1cFpDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdWIzQjBjeTVoZFhSdlVISnZZMlZsWkNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVpZFhNdVpXMXBkQ2duWTI5eVpUcDFjR3h2WVdRbktUdGNiaUFnSUNCOVhHNGdJSDA3WEc1Y2JpQWdRMjl5WlM1d2NtOTBiM1I1Y0dVdWNtVnRiM1psUm1sc1pTQTlJR1oxYm1OMGFXOXVJSEpsYlc5MlpVWnBiR1VvWm1sc1pVbEVLU0I3WEc0Z0lDQWdkbUZ5SUhWd1pHRjBaV1JHYVd4bGN5QTlJRjlsZUhSbGJtUnpLSHQ5TENCMGFHbHpMbWRsZEZOMFlYUmxLQ2t1Wm1sc1pYTXBPMXh1SUNBZ0lHUmxiR1YwWlNCMWNHUmhkR1ZrUm1sc1pYTmJabWxzWlVsRVhUdGNiaUFnSUNCMGFHbHpMbk5sZEZOMFlYUmxLSHNnWm1sc1pYTTZJSFZ3WkdGMFpXUkdhV3hsY3lCOUtUdGNiaUFnZlR0Y2JseHVJQ0JEYjNKbExuQnliM1J2ZEhsd1pTNWhaR1JVYUhWdFltNWhhV3dnUFNCbWRXNWpkR2x2YmlCaFpHUlVhSFZ0WW01aGFXd29abWxzWlVsRUtTQjdYRzRnSUNBZ2RtRnlJRjkwYUdsek1pQTlJSFJvYVhNN1hHNWNiaUFnSUNCMllYSWdabWxzWlNBOUlIUm9hWE11WjJWMFUzUmhkR1VvS1M1bWFXeGxjMXRtYVd4bFNVUmRPMXh1WEc0Z0lDQWdYMVYwYVd4ek1pNWtaV1poZFd4MExuSmxZV1JHYVd4bEtHWnBiR1V1WkdGMFlTa3VkR2hsYmlobWRXNWpkR2x2YmlBb2FXMW5SR0YwWVZWU1NTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlGOVZkR2xzY3pJdVpHVm1ZWFZzZEM1amNtVmhkR1ZKYldGblpWUm9kVzFpYm1GcGJDaHBiV2RFWVhSaFZWSkpMQ0F5TURBcE8xeHVJQ0FnSUgwcExuUm9aVzRvWm5WdVkzUnBiMjRnS0hSb2RXMWlibUZwYkNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFZ3WkdGMFpXUkdhV3hsY3lBOUlGOWxlSFJsYm1SektIdDlMQ0JmZEdocGN6SXVaMlYwVTNSaGRHVW9LUzVtYVd4bGN5azdYRzRnSUNBZ0lDQjJZWElnZFhCa1lYUmxaRVpwYkdVZ1BTQmZaWGgwWlc1a2N5aDdmU3dnZFhCa1lYUmxaRVpwYkdWelcyWnBiR1ZKUkYwc0lIdGNiaUFnSUNBZ0lDQWdjSEpsZG1sbGR6b2dkR2gxYldKdVlXbHNYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSFZ3WkdGMFpXUkdhV3hsYzF0bWFXeGxTVVJkSUQwZ2RYQmtZWFJsWkVacGJHVTdYRzRnSUNBZ0lDQmZkR2hwY3pJdWMyVjBVM1JoZEdVb2V5Qm1hV3hsY3pvZ2RYQmtZWFJsWkVacGJHVnpJSDBwTzF4dUlDQWdJSDBwTzF4dUlDQjlPMXh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlNaV2RwYzNSbGNuTWdiR2x6ZEdWdVpYSnpJR1p2Y2lCaGJHd2daMnh2WW1Gc0lHRmpkR2x2Ym5Nc0lHeHBhMlU2WEc0Z0lDQXFJR0JtYVd4bExXRmtaR0FzSUdCbWFXeGxMWEpsYlc5MlpXQXNJR0IxY0d4dllXUXRjSEp2WjNKbGMzTmdMQ0JnY21WelpYUmdYRzRnSUNBcVhHNGdJQ0FxTDF4dVhHNWNiaUFnUTI5eVpTNXdjbTkwYjNSNWNHVXVZV04wYVc5dWN5QTlJR1oxYm1OMGFXOXVJR0ZqZEdsdmJuTW9LU0I3WEc0Z0lDQWdkbUZ5SUY5MGFHbHpNeUE5SUhSb2FYTTdYRzVjYmlBZ0lDQXZMeUIwYUdsekxtSjFjeTV2YmlnbktpY3NJQ2h3WVhsc2IyRmtLU0E5UGlCN1hHNGdJQ0FnTHk4Z0lDQmpiMjV6YjJ4bExteHZaeWduWlcxcGRIUmxaRG9nSnl3Z2RHaHBjeTVsZG1WdWRDbGNiaUFnSUNBdkx5QWdJR052Ym5OdmJHVXViRzluS0NkM2FYUm9JSEJoZVd4dllXUTZJQ2NzSUhCaGVXeHZZV1FwWEc0Z0lDQWdMeThnZlNsY2JseHVJQ0FnSUM4dklHTnZibk4wSUdKMWN5QTlJSFJvYVhNdVluVnpYRzVjYmlBZ0lDQjBhR2x6TG05dUtDZGpiM0psT21acGJHVXRZV1JrSnl3Z1puVnVZM1JwYjI0Z0tHUmhkR0VwSUh0Y2JpQWdJQ0FnSUY5MGFHbHpNeTVoWkdSR2FXeGxLR1JoZEdFcE8xeHVJQ0FnSUgwcE8xeHVYRzRnSUNBZ0x5OGdZSEpsYlc5MlpTMW1hV3hsWUNCeVpXMXZkbVZ6SUdFZ1ptbHNaU0JtY205dElHQnpkR0YwWlM1bWFXeGxjMkFzSUdadmNpQmxlR0Z0Y0d4bElIZG9aVzVjYmlBZ0lDQXZMeUJoSUhWelpYSWdaR1ZqYVdSbGN5QnViM1FnZEc4Z2RYQnNiMkZrSUhCaGNuUnBZM1ZzWVhJZ1ptbHNaU0JoYm1RZ1kyeHBZMnR6SUdFZ1luVjBkRzl1SUhSdklISmxiVzkyWlNCcGRGeHVJQ0FnSUhSb2FYTXViMjRvSjJOdmNtVTZabWxzWlMxeVpXMXZkbVVuTENCbWRXNWpkR2x2YmlBb1ptbHNaVWxFS1NCN1hHNGdJQ0FnSUNCZmRHaHBjek11Y21WdGIzWmxSbWxzWlNobWFXeGxTVVFwTzF4dUlDQWdJSDBwTzF4dVhHNGdJQ0FnZEdocGN5NXZiaWduWTI5eVpUcDFjR3h2WVdRdGMzUmhjblJsWkNjc0lHWjFibU4wYVc5dUlDaG1hV3hsU1VRc0lIVndiRzloWkNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFZ3WkdGMFpXUkdhV3hsY3lBOUlGOWxlSFJsYm1SektIdDlMQ0JmZEdocGN6TXVaMlYwVTNSaGRHVW9LUzVtYVd4bGN5azdYRzRnSUNBZ0lDQjJZWElnZFhCa1lYUmxaRVpwYkdVZ1BTQmZaWGgwWlc1a2N5aDdmU3dnZFhCa1lYUmxaRVpwYkdWelcyWnBiR1ZKUkYwc0lGOWxlSFJsYm1SektIdDlMQ0I3WEc0Z0lDQWdJQ0FnSUhCeWIyZHlaWE56T2lCZlpYaDBaVzVrY3loN2ZTd2dkWEJrWVhSbFpFWnBiR1Z6VzJacGJHVkpSRjB1Y0hKdlozSmxjM01zSUh0Y2JpQWdJQ0FnSUNBZ0lDQjFjR3h2WVdSVGRHRnlkR1ZrT2lCRVlYUmxMbTV2ZHlncFhHNGdJQ0FnSUNBZ0lIMHBYRzRnSUNBZ0lDQjlLU2s3WEc0Z0lDQWdJQ0IxY0dSaGRHVmtSbWxzWlhOYlptbHNaVWxFWFNBOUlIVndaR0YwWldSR2FXeGxPMXh1WEc0Z0lDQWdJQ0JmZEdocGN6TXVjMlYwVTNSaGRHVW9leUJtYVd4bGN6b2dkWEJrWVhSbFpFWnBiR1Z6SUgwcE8xeHVJQ0FnSUgwcE8xeHVYRzRnSUNBZ2RHaHBjeTV2YmlnblkyOXlaVHAxY0d4dllXUXRjSEp2WjNKbGMzTW5MQ0JtZFc1amRHbHZiaUFvWkdGMFlTa2dlMXh1SUNBZ0lDQWdkbUZ5SUdacGJHVkpSQ0E5SUdSaGRHRXVhV1E3WEc0Z0lDQWdJQ0IyWVhJZ2RYQmtZWFJsWkVacGJHVnpJRDBnWDJWNGRHVnVaSE1vZTMwc0lGOTBhR2x6TXk1blpYUlRkR0YwWlNncExtWnBiR1Z6S1R0Y2JpQWdJQ0FnSUdsbUlDZ2hkWEJrWVhSbFpFWnBiR1Z6VzJacGJHVkpSRjBwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWduVkhKNWFXNW5JSFJ2SUhObGRDQndjbTluY21WemN5Qm1iM0lnWVNCbWFXeGxJSFJvWVhUaWdKbHpJRzV2ZENCM2FYUm9JSFZ6SUdGdWVXMXZjbVU2SUNjc0lHWnBiR1ZKUkNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2RtRnlJSFZ3WkdGMFpXUkdhV3hsSUQwZ1gyVjRkR1Z1WkhNb2UzMHNJSFZ3WkdGMFpXUkdhV3hsYzF0bWFXeGxTVVJkTENCZlpYaDBaVzVrY3loN2ZTd2dlMXh1SUNBZ0lDQWdJQ0J3Y205bmNtVnpjem9nWDJWNGRHVnVaSE1vZTMwc0lIVndaR0YwWldSR2FXeGxjMXRtYVd4bFNVUmRMbkJ5YjJkeVpYTnpMQ0I3WEc0Z0lDQWdJQ0FnSUNBZ1lubDBaWE5WY0d4dllXUmxaRG9nWkdGMFlTNWllWFJsYzFWd2JHOWhaR1ZrTEZ4dUlDQWdJQ0FnSUNBZ0lHSjVkR1Z6Vkc5MFlXdzZJR1JoZEdFdVlubDBaWE5VYjNSaGJDeGNiaUFnSUNBZ0lDQWdJQ0J3WlhKalpXNTBZV2RsT2lCTllYUm9Mbkp2ZFc1a0tDaGtZWFJoTG1KNWRHVnpWWEJzYjJGa1pXUWdMeUJrWVhSaExtSjVkR1Z6Vkc5MFlXd2dLaUF4TURBcExuUnZSbWw0WldRb01pa3BYRzRnSUNBZ0lDQWdJSDBwWEc0Z0lDQWdJQ0I5S1NrN1hHNGdJQ0FnSUNCMWNHUmhkR1ZrUm1sc1pYTmJaR0YwWVM1cFpGMGdQU0IxY0dSaGRHVmtSbWxzWlR0Y2JseHVJQ0FnSUNBZ0x5OGdZMkZzWTNWc1lYUmxJSFJ2ZEdGc0lIQnliMmR5WlhOekxDQjFjMmx1WnlCMGFHVWdiblZ0WW1WeUlHOW1JR1pwYkdWeklHTjFjbkpsYm5Sc2VTQjFjR3h2WVdScGJtY3NYRzRnSUNBZ0lDQXZMeUJ0ZFd4MGFYQnNhV1ZrSUdKNUlERXdNQ0JoYm1RZ2RHaGxJSE4xYlcwZ2IyWWdhVzVrYVhacFpIVmhiQ0J3Y205bmNtVnpjeUJ2WmlCbFlXTm9JR1pwYkdWY2JpQWdJQ0FnSUhaaGNpQnBibEJ5YjJkeVpYTnpJRDBnVDJKcVpXTjBMbXRsZVhNb2RYQmtZWFJsWkVacGJHVnpLUzVtYVd4MFpYSW9ablZ1WTNScGIyNGdLR1pwYkdVcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVndaR0YwWldSR2FXeGxjMXRtYVd4bFhTNXdjbTluY21WemN5NTFjR3h2WVdSVGRHRnlkR1ZrTzF4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCMllYSWdjSEp2WjNKbGMzTk5ZWGdnUFNCcGJsQnliMmR5WlhOekxteGxibWQwYUNBcUlERXdNRHRjYmlBZ0lDQWdJSFpoY2lCd2NtOW5jbVZ6YzBGc2JDQTlJREE3WEc0Z0lDQWdJQ0JwYmxCeWIyZHlaWE56TG1admNrVmhZMmdvWm5WdVkzUnBiMjRnS0dacGJHVXBJSHRjYmlBZ0lDQWdJQ0FnY0hKdlozSmxjM05CYkd3Z1BTQndjbTluY21WemMwRnNiQ0FySUhWd1pHRjBaV1JHYVd4bGMxdG1hV3hsWFM1d2NtOW5jbVZ6Y3k1d1pYSmpaVzUwWVdkbE8xeHVJQ0FnSUNBZ2ZTazdYRzVjYmlBZ0lDQWdJSFpoY2lCMGIzUmhiRkJ5YjJkeVpYTnpJRDBnVFdGMGFDNXliM1Z1WkNnb2NISnZaM0psYzNOQmJHd2dLaUF4TURBZ0x5QndjbTluY21WemMwMWhlQ2t1ZEc5R2FYaGxaQ2d5S1NrN1hHNWNiaUFnSUNBZ0lHbG1JQ2gwYjNSaGJGQnliMmR5WlhOeklEMDlQU0F4TURBcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdOdmJYQnNaWFJsUm1sc1pYTWdQU0JQWW1wbFkzUXVhMlY1Y3loMWNHUmhkR1ZrUm1sc1pYTXBMbVpwYkhSbGNpaG1kVzVqZEdsdmJpQW9abWxzWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQzh2SUhSb2FYTWdjMmh2ZFd4a0lHSmxJR0IxY0d4dllXUkRiMjF3YkdWMFpXQmNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkWEJrWVhSbFpFWnBiR1Z6VzJacGJHVmRMbkJ5YjJkeVpYTnpMbkJsY21ObGJuUmhaMlVnUFQwOUlERXdNRHRjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lGOTBhR2x6TXk1bGJXbDBLQ2RqYjNKbE9uTjFZMk5sYzNNbkxDQmpiMjF3YkdWMFpVWnBiR1Z6TG14bGJtZDBhQ2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUY5MGFHbHpNeTV6WlhSVGRHRjBaU2g3WEc0Z0lDQWdJQ0FnSUhSdmRHRnNVSEp2WjNKbGMzTTZJSFJ2ZEdGc1VISnZaM0psYzNNc1hHNGdJQ0FnSUNBZ0lHWnBiR1Z6T2lCMWNHUmhkR1ZrUm1sc1pYTmNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMHBPMXh1WEc0Z0lDQWdkR2hwY3k1dmJpZ25ZMjl5WlRwMWNHeHZZV1F0YzNWalkyVnpjeWNzSUdaMWJtTjBhVzl1SUNobWFXeGxTVVFzSUhWd2JHOWhaRlZTVENrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFZ3WkdGMFpXUkdhV3hsY3lBOUlGOWxlSFJsYm1SektIdDlMQ0JmZEdocGN6TXVaMlYwVTNSaGRHVW9LUzVtYVd4bGN5azdYRzRnSUNBZ0lDQjJZWElnZFhCa1lYUmxaRVpwYkdVZ1BTQmZaWGgwWlc1a2N5aDdmU3dnZFhCa1lYUmxaRVpwYkdWelcyWnBiR1ZKUkYwc0lIdGNiaUFnSUNBZ0lDQWdjSEp2WjNKbGMzTTZJRjlsZUhSbGJtUnpLSHQ5TENCMWNHUmhkR1ZrUm1sc1pYTmJabWxzWlVsRVhTNXdjbTluY21WemN5d2dlMXh1SUNBZ0lDQWdJQ0FnSUhWd2JHOWhaRU52YlhCc1pYUmxPaUIwY25WbFhHNGdJQ0FnSUNBZ0lIMHBMRnh1SUNBZ0lDQWdJQ0IxY0d4dllXUlZVa3c2SUhWd2JHOWhaRlZTVEZ4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCMWNHUmhkR1ZrUm1sc1pYTmJabWxzWlVsRVhTQTlJSFZ3WkdGMFpXUkdhV3hsTzF4dVhHNGdJQ0FnSUNCZmRHaHBjek11YzJWMFUzUmhkR1VvZTF4dUlDQWdJQ0FnSUNCbWFXeGxjem9nZFhCa1lYUmxaRVpwYkdWelhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOUtUdGNibHh1SUNBZ0lIUm9hWE11YjI0b0oyTnZjbVU2ZFhCa1lYUmxMVzFsZEdFbkxDQm1kVzVqZEdsdmJpQW9aR0YwWVN3Z1ptbHNaVWxFS1NCN1hHNGdJQ0FnSUNCZmRHaHBjek11ZFhCa1lYUmxUV1YwWVNoa1lYUmhMQ0JtYVd4bFNVUXBPMXh1SUNBZ0lIMHBPMXh1WEc0Z0lDQWdMeThnYzJodmR5QnBibVp2Y20xbGNpQnBaaUJ2Wm1ac2FXNWxYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQjNhVzVrYjNjZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNGdJQ0FnSUNCM2FXNWtiM2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduYjI1c2FXNWxKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1gzUm9hWE16TG1selQyNXNhVzVsS0hSeWRXVXBPMXh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0IzYVc1a2IzY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ25iMlptYkdsdVpTY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUY5MGFHbHpNeTVwYzA5dWJHbHVaU2htWVd4elpTazdYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1gzUm9hWE16TG1selQyNXNhVzVsS0NrN1hHNGdJQ0FnSUNCOUxDQXpNREF3S1R0Y2JpQWdJQ0I5WEc0Z0lIMDdYRzVjYmlBZ1EyOXlaUzV3Y205MGIzUjVjR1V1YVhOUGJteHBibVVnUFNCbWRXNWpkR2x2YmlCcGMwOXViR2x1WlNoemRHRjBkWE1wSUh0Y2JpQWdJQ0IyWVhJZ2IyNXNhVzVsSUQwZ2MzUmhkSFZ6SUh4OElIZHBibVJ2ZHk1dVlYWnBaMkYwYjNJdWIyNU1hVzVsTzF4dUlDQWdJR2xtSUNnaGIyNXNhVzVsS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVZ0YVhRb0oybHpMVzltWm14cGJtVW5LVHRjYmlBZ0lDQWdJSFJvYVhNdVpXMXBkQ2duYVc1bWIzSnRaWEluTENBblRtOGdhVzUwWlhKdVpYUWdZMjl1Ym1WamRHbHZiaWNzSUNkbGNuSnZjaWNzSURBcE8xeHVJQ0FnSUNBZ2RHaHBjeTUzWVhOUFptWnNhVzVsSUQwZ2RISjFaVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZHBjeTF2Ym14cGJtVW5LVHRjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbmRoYzA5bVpteHBibVVwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZHBibVp2Y20xbGNpY3NJQ2REYjI1dVpXTjBaV1FoSnl3Z0ozTjFZMk5sYzNNbkxDQXpNREF3S1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUzWVhOUFptWnNhVzVsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOU8xeHVYRzRnSUM4cUtseHVJQ0FnS2lCU1pXZHBjM1JsY25NZ1lTQndiSFZuYVc0Z2QybDBhQ0JEYjNKbFhHNGdJQ0FxWEc0Z0lDQXFJRUJ3WVhKaGJTQjdRMnhoYzNOOUlGQnNkV2RwYmlCdlltcGxZM1JjYmlBZ0lDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NZ2IySnFaV04wSUhSb1lYUWdkMmxzYkNCaVpTQndZWE56WldRZ2RHOGdVR3gxWjJsdUlHeGhkR1Z5WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMGdjMlZzWmlCbWIzSWdZMmhoYVc1cGJtZGNiaUFnSUNvdlhHNWNibHh1SUNCRGIzSmxMbkJ5YjNSdmRIbHdaUzUxYzJVZ1BTQm1kVzVqZEdsdmJpQjFjMlVvVUd4MVoybHVMQ0J2Y0hSektTQjdYRzRnSUNBZ0x5OGdVSEpsY0dGeVpTQndjbTl3Y3lCMGJ5QndZWE56SUhSdklIQnNkV2RwYm5OY2JpQWdJQ0IyWVhJZ2NISnZjSE1nUFNCN1hHNGdJQ0FnSUNCblpYUlRkR0YwWlRvZ2RHaHBjeTVuWlhSVGRHRjBaUzVpYVc1a0tIUm9hWE1wTEZ4dUlDQWdJQ0FnYzJWMFUzUmhkR1U2SUhSb2FYTXVjMlYwVTNSaGRHVXVZbWx1WkNoMGFHbHpLU3hjYmlBZ0lDQWdJSFZ3WkdGMFpVMWxkR0U2SUhSb2FYTXVkWEJrWVhSbFRXVjBZUzVpYVc1a0tIUm9hWE1wTEZ4dUlDQWdJQ0FnWVdSa1JtbHNaVG9nZEdocGN5NWhaR1JHYVd4bExtSnBibVFvZEdocGN5a3NYRzRnSUNBZ0lDQnBNVGh1T2lCMGFHbHpMbWt4T0c0dVltbHVaQ2gwYUdsektTeGNiaUFnSUNBZ0lHSjFjem9nZEdocGN5NWxaU3hjYmlBZ0lDQWdJR3h2WnpvZ2RHaHBjeTVzYjJjdVltbHVaQ2gwYUdsektWeHVJQ0FnSUgwN1hHNGdJQ0FnTHk4Z1NXNXpkR0Z1ZEdsaGRHVmNiaUFnSUNCMllYSWdjR3gxWjJsdUlEMGdibVYzSUZCc2RXZHBiaWgwYUdsekxDQnZjSFJ6TENCd2NtOXdjeWs3WEc0Z0lDQWdkbUZ5SUhCc2RXZHBiazVoYldVZ1BTQndiSFZuYVc0dWFXUTdYRzRnSUNBZ2RHaHBjeTV3YkhWbmFXNXpXM0JzZFdkcGJpNTBlWEJsWFNBOUlIUm9hWE11Y0d4MVoybHVjMXR3YkhWbmFXNHVkSGx3WlYwZ2ZId2dXMTA3WEc1Y2JpQWdJQ0JwWmlBb0lYQnNkV2RwYms1aGJXVXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25XVzkxY2lCd2JIVm5hVzRnYlhWemRDQm9ZWFpsSUdFZ2JtRnRaU2NwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR2xtSUNnaGNHeDFaMmx1TG5SNWNHVXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25XVzkxY2lCd2JIVm5hVzRnYlhWemRDQm9ZWFpsSUdFZ2RIbHdaU2NwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCbGVHbHpkSE5RYkhWbmFXNUJiSEpsWVdSNUlEMGdkR2hwY3k1blpYUlFiSFZuYVc0b2NHeDFaMmx1VG1GdFpTazdYRzRnSUNBZ2FXWWdLR1Y0YVhOMGMxQnNkV2RwYmtGc2NtVmhaSGtwSUh0Y2JpQWdJQ0FnSUhaaGNpQnRjMmNnUFNBblFXeHlaV0ZrZVNCbWIzVnVaQ0JoSUhCc2RXZHBiaUJ1WVcxbFpDQmNYQ2NuSUNzZ1pYaHBjM1J6VUd4MVoybHVRV3h5WldGa2VTNXVZVzFsSUNzZ0oxeGNKeTVjWEc0Z0lDQWdJQ0FnSUZSeWFXVmtJSFJ2SUhWelpUb2dYRnduSnlBcklIQnNkV2RwYms1aGJXVWdLeUFuWEZ3bkxseGNiaUFnSUNBZ0lDQWdWWEJ3ZVNCcGN5QmpkWEp5Wlc1MGJIa2diR2x0YVhSbFpDQjBieUJ5ZFc1dWFXNW5JRzl1WlNCdlppQmxkbVZ5ZVNCd2JIVm5hVzR1WEZ4dUlDQWdJQ0FnSUNCVGFHRnlaU0I1YjNWeUlIVnpaU0JqWVhObElIZHBkR2dnZFhNZ2IzWmxjaUJoZEZ4Y2JpQWdJQ0FnSUNBZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwzUnlZVzV6Ykc5aFpHbDBMM1Z3Y0hrdmFYTnpkV1Z6TDF4Y2JpQWdJQ0FnSUNBZ2FXWWdlVzkxSUhkaGJuUWdkWE1nZEc4Z2NtVmpiMjV6YVdSbGNpNG5PMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHMXpaeWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkR2hwY3k1d2JIVm5hVzV6VzNCc2RXZHBiaTUwZVhCbFhTNXdkWE5vS0hCc2RXZHBiaWs3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmVHRjYmx4dUlDQXZLaXBjYmlBZ0lDb2dSbWx1WkNCdmJtVWdVR3gxWjJsdUlHSjVJRzVoYldWY2JpQWdJQ3BjYmlBZ0lDb2dRSEJoY21GdElITjBjbWx1WnlCdVlXMWxJR1JsYzJOeWFYQjBhVzl1WEc0Z0lDQXFMMXh1WEc1Y2JpQWdRMjl5WlM1d2NtOTBiM1I1Y0dVdVoyVjBVR3gxWjJsdUlEMGdablZ1WTNScGIyNGdaMlYwVUd4MVoybHVLRzVoYldVcElIdGNiaUFnSUNCMllYSWdabTkxYm1SUWJIVm5hVzRnUFNCbVlXeHpaVHRjYmlBZ0lDQjBhR2x6TG1sMFpYSmhkR1ZRYkhWbmFXNXpLR1oxYm1OMGFXOXVJQ2h3YkhWbmFXNHBJSHRjYmlBZ0lDQWdJSFpoY2lCd2JIVm5hVzVPWVcxbElEMGdjR3gxWjJsdUxtbGtPMXh1SUNBZ0lDQWdhV1lnS0hCc2RXZHBiazVoYldVZ1BUMDlJRzVoYldVcElIdGNiaUFnSUNBZ0lDQWdabTkxYm1SUWJIVm5hVzRnUFNCd2JIVm5hVzQ3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUtUdGNiaUFnSUNCeVpYUjFjbTRnWm05MWJtUlFiSFZuYVc0N1hHNGdJSDA3WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRWwwWlhKaGRHVWdkR2h5YjNWbmFDQmhiR3dnWUhWelpXQmtJSEJzZFdkcGJuTmNiaUFnSUNwY2JpQWdJQ29nUUhCaGNtRnRJR1oxYm1OMGFXOXVJRzFsZEdodlpDQmtaWE5qY21sd2RHbHZibHh1SUNBZ0tpOWNibHh1WEc0Z0lFTnZjbVV1Y0hKdmRHOTBlWEJsTG1sMFpYSmhkR1ZRYkhWbmFXNXpJRDBnWm5WdVkzUnBiMjRnYVhSbGNtRjBaVkJzZFdkcGJuTW9iV1YwYUc5a0tTQjdYRzRnSUNBZ2RtRnlJRjkwYUdsek5DQTlJSFJvYVhNN1hHNWNiaUFnSUNCUFltcGxZM1F1YTJWNWN5aDBhR2x6TG5Cc2RXZHBibk1wTG1admNrVmhZMmdvWm5WdVkzUnBiMjRnS0hCc2RXZHBibFI1Y0dVcElIdGNiaUFnSUNBZ0lGOTBhR2x6TkM1d2JIVm5hVzV6VzNCc2RXZHBibFI1Y0dWZExtWnZja1ZoWTJnb2JXVjBhRzlrS1R0Y2JpQWdJQ0I5S1R0Y2JpQWdmVHRjYmx4dUlDQXZLaXBjYmlBZ0lDb2dURzluY3lCemRIVm1aaUIwYnlCamIyNXpiMnhsTENCdmJteDVJR2xtSUdCa1pXSjFaMkFnYVhNZ2MyVjBJSFJ2SUhSeWRXVXVJRk5wYkdWdWRDQnBiaUJ3Y205a2RXTjBhVzl1TGx4dUlDQWdLbHh1SUNBZ0tpQkFjbVYwZFhKdUlIdFRkSEpwYm1kOFQySnFaV04wZlNCMGJ5QnNiMmRjYmlBZ0lDb3ZYRzVjYmx4dUlDQkRiM0psTG5CeWIzUnZkSGx3WlM1c2IyY2dQU0JtZFc1amRHbHZiaUJzYjJjb2JYTm5LU0I3WEc0Z0lDQWdhV1lnS0NGMGFHbHpMbTl3ZEhNdVpHVmlkV2NwSUh0Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLRzF6WnlBOVBUMGdKeWNnS3lCdGMyY3BJSHRjYmlBZ0lDQWdJR052Ym5OdmJHVXViRzluS0NkTVQwYzZJQ2NnS3lCdGMyY3BPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCamIyNXpiMnhsTG1ScGNpaHRjMmNwTzF4dUlDQWdJSDFjYmlBZ0lDQm5iRzlpWVd3dWRYQndlVXh2WnlBOUlHZHNiMkpoYkM1MWNIQjVURzluSUNzZ0oxeGNiaWNnS3lBblJFVkNWVWNnVEU5SE9pQW5JQ3NnYlhObk8xeHVJQ0I5TzF4dVhHNGdJRU52Y21VdWNISnZkRzkwZVhCbExtbHVhWFJUYjJOclpYUWdQU0JtZFc1amRHbHZiaUJwYm1sMFUyOWphMlYwS0c5d2RITXBJSHRjYmlBZ0lDQnBaaUFvSVhSb2FYTXVjMjlqYTJWMEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG5OdlkydGxkQ0E5SUc1bGR5QmZWWEJ3ZVZOdlkydGxkREl1WkdWbVlYVnNkQ2h2Y0hSektUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXpiMk5yWlhRN1hHNGdJSDA3WEc1Y2JpQWdRMjl5WlM1d2NtOTBiM1I1Y0dVdWFXNXpkR0ZzYkVGc2JDQTlJR1oxYm1OMGFXOXVJR2x1YzNSaGJHeEJiR3dvS1NCN1hHNGdJQ0FnZG1GeUlGOTBhR2x6TlNBOUlIUm9hWE03WEc1Y2JpQWdJQ0JQWW1wbFkzUXVhMlY1Y3loMGFHbHpMbkJzZFdkcGJuTXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLSEJzZFdkcGJsUjVjR1VwSUh0Y2JpQWdJQ0FnSUY5MGFHbHpOUzV3YkhWbmFXNXpXM0JzZFdkcGJsUjVjR1ZkTG1admNrVmhZMmdvWm5WdVkzUnBiMjRnS0hCc2RXZHBiaWtnZTF4dUlDQWdJQ0FnSUNCd2JIVm5hVzR1YVc1emRHRnNiQ2dwTzF4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnZlNrN1hHNGdJSDA3WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRWx1YVhScFlXeHBlbVZ6SUdGamRHbHZibk1zSUdsdWMzUmhiR3h6SUdGc2JDQndiSFZuYVc1eklDaGllU0JwZEdWeVlYUnBibWNnYjI0Z2RHaGxiU0JoYm1RZ1kyRnNiR2x1WnlCZ2FXNXpkR0ZzYkdBcExDQnpaWFJ6SUc5d2RHbHZibk5jYmlBZ0lDcGNiaUFnSUNvZ0tFbHVJSFJvWlNCd1lYTjBJSGRoY3lCMWMyVmtJSFJ2SUhKMWJpQmhJSGRoZEdWeVptRnNiQ0J2WmlCeWRXNVVlWEJsSUhCc2RXZHBiaUJ3WVdOcmN5d2diR2xyWlNCemJ6cGNiaUFnSUNvZ1FXeHNJSEJ5WlhObGRHVnljeWhrWVhSaEtTQXRMVDRnUVd4c0lHRmpjWFZwY21WeWN5aGtZWFJoS1NBdExUNGdRV3hzSUhWd2JHOWhaR1Z5Y3loa1lYUmhLU0F0TFQ0Z1pHOXVaU2xjYmlBZ0lDb3ZYRzVjYmx4dUlDQkRiM0psTG5CeWIzUnZkSGx3WlM1eWRXNGdQU0JtZFc1amRHbHZiaUJ5ZFc0b0tTQjdYRzRnSUNBZ2RHaHBjeTVzYjJjb0owTnZjbVVnYVhNZ2NuVnVMQ0JwYm1sMGFXRnNhWHBwYm1jZ1lXTjBhVzl1Y3l3Z2FXNXpkR0ZzYkdsdVp5QndiSFZuYVc1ekxpNHVKeWs3WEc1Y2JpQWdJQ0F2THlCelpYUkpiblJsY25aaGJDZ29LU0E5UGlCN1hHNGdJQ0FnTHk4Z0lDQjBhR2x6TG5Wd1pHRjBaVUZzYkNoMGFHbHpMbk4wWVhSbEtWeHVJQ0FnSUM4dklIMHNJREV3TURBcFhHNWNiaUFnSUNCMGFHbHpMbUZqZEdsdmJuTW9LVHRjYmx4dUlDQWdJQzh2SUVadmNuTmxJSE5sZENCZ1lYVjBiMUJ5YjJObFpXUmdJRzl3ZEdsdmJpQjBieUJtWVd4elpTQnBaaUIwYUdWeVpTQmhjbVVnYlhWc2RHbHdiR1VnYzJWc1pXTjBiM0lnVUd4MVoybHVjeUJoWTNScGRtVmNiaUFnSUNCcFppQW9kR2hwY3k1d2JIVm5hVzV6TG1GamNYVnBjbVZ5SUNZbUlIUm9hWE11Y0d4MVoybHVjeTVoWTNGMWFYSmxjaTVzWlc1bmRHZ2dQaUF4S1NCN1hHNGdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVlYVjBiMUJ5YjJObFpXUWdQU0JtWVd4elpUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5Qkpibk4wWVd4c0lHRnNiQ0J3YkhWbmFXNXpYRzRnSUNBZ2RHaHBjeTVwYm5OMFlXeHNRV3hzS0NrN1hHNWNiaUFnSUNCeVpYUjFjbTQ3WEc0Z0lIMDdYRzVjYmlBZ2NtVjBkWEp1SUVOdmNtVTdYRzU5S0NrN1hHNWNibVY0Y0c5eWRITXVaR1ZtWVhWc2RDQTlJRU52Y21VN1hHNHZMeU1nYzI5MWNtTmxUV0Z3Y0dsdVoxVlNURDFEYjNKbExtcHpMbTFoY0NKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfZW5fVVMgPSByZXF1aXJlKCcuLi9sb2NhbGVzL2VuX1VTJyk7XG5cbnZhciBfZW5fVVMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW5fVVMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIFRyYW5zbGF0ZXMgc3RyaW5ncyB3aXRoIGludGVycG9sYXRpb24gJiBwbHVyYWxpemF0aW9uIHN1cHBvcnQuRXh0ZW5zaWJsZSB3aXRoIGN1c3RvbSBkaWN0aW9uYXJpZXNcbiAqIGFuZCBwbHVyYWxpemF0aW9uIGZ1bmN0aW9ucy5cbiAqXG4gKiBCb3Jyb3dzIGhlYXZpbHkgZnJvbSBhbmQgaW5zcGlyZWQgYnkgUG9seWdsb3QgaHR0cHM6Ly9naXRodWIuY29tL2FpcmJuYi9wb2x5Z2xvdC5qcyxcbiAqIGJhc2ljYWxseSBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBpdC4gRGlmZmVyZW5jZXM6IHBsdXJhbGl6YXRpb24gZnVuY3Rpb25zIGFyZSBub3QgaGFyZGNvZGVkXG4gKiBhbmQgY2FuIGJlIGVhc2lseSBhZGRlZCBhbW9uZyB3aXRoIGRpY3Rpb25hcmllcywgbmVzdGVkIG9iamVjdHMgYXJlIHVzZWQgZm9yIHBsdXJhbGl6YXRpb25cbiAqIGFzIG9wcG9zZWQgdG8gYHx8fHxgIGRlbGltZXRlclxuICpcbiAqIFVzYWdlIGV4YW1wbGU6IGB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgnZmlsZXNfY2hvc2VuJywge3NtYXJ0X2NvdW50OiAzfSlgXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqL1xudmFyIFRyYW5zbGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRyYW5zbGF0b3Iob3B0cykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2xhdG9yKTtcblxuICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZXM6IF9lbl9VUzIuZGVmYXVsdFxuICAgIH07XG4gICAgdGhpcy5vcHRzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRzKTtcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLm9wdHMubG9jYWxlcztcbiAgICB0aGlzLmxvY2FsZXMuc3RyaW5ncyA9IF9leHRlbmRzKHt9LCBfZW5fVVMyLmRlZmF1bHQuc3RyaW5ncywgdGhpcy5vcHRzLmxvY2FsZXMuc3RyaW5ncyk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlciB2YXJpYWJsZXMgbGlrZSBgJXtzbWFydF9jb3VudH0gZmlsZSBzZWxlY3RlZGBcbiAgICogYW5kIHJlcGxhY2VzIGl0IHdpdGggdmFsdWVzIGZyb20gb3B0aW9ucyBge3NtYXJ0X2NvdW50OiA1fWBcbiAgICpcbiAgICogQGxpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL2FpcmJuYi9wb2x5Z2xvdC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gICAqIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FpcmJuYi9wb2x5Z2xvdC5qcy9ibG9iL21hc3Rlci9saWIvcG9seWdsb3QuanMjTDI5OVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGhyYXNlIHRoYXQgbmVlZHMgaW50ZXJwb2xhdGlvbiwgd2l0aCBwbGFjZWhvbGRlcnNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSBwbGFjZWhvbGRlcnNcbiAgICogQHJldHVybiB7c3RyaW5nfSBpbnRlcnBvbGF0ZWRcbiAgICovXG5cblxuICBUcmFuc2xhdG9yLnByb3RvdHlwZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGludGVycG9sYXRlKHBocmFzZSwgb3B0aW9ucykge1xuICAgIHZhciByZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuICAgIHZhciBkb2xsYXJSZWdleCA9IC9cXCQvZztcbiAgICB2YXIgZG9sbGFyQmlsbHNZYWxsID0gJyQkJCQnO1xuXG4gICAgZm9yICh2YXIgYXJnIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChhcmcgIT09ICdfJyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KGFyZykpIHtcbiAgICAgICAgLy8gRW5zdXJlIHJlcGxhY2VtZW50IHZhbHVlIGlzIGVzY2FwZWQgdG8gcHJldmVudCBzcGVjaWFsICQtcHJlZml4ZWRcbiAgICAgICAgLy8gcmVnZXggcmVwbGFjZSB0b2tlbnMuIHRoZSBcIiQkJCRcIiBpcyBuZWVkZWQgYmVjYXVzZSBlYWNoIFwiJFwiIG5lZWRzIHRvXG4gICAgICAgIC8vIGJlIGVzY2FwZWQgd2l0aCBcIiRcIiBpdHNlbGYsIGFuZCB3ZSBuZWVkIHR3byBpbiB0aGUgcmVzdWx0aW5nIG91dHB1dC5cbiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gb3B0aW9uc1thcmddO1xuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZS5jYWxsKG9wdGlvbnNbYXJnXSwgZG9sbGFyUmVnZXgsIGRvbGxhckJpbGxzWWFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgY3JlYXRlIGEgbmV3IGBSZWdFeHBgIGVhY2ggdGltZSBpbnN0ZWFkIG9mIHVzaW5nIGEgbW9yZS1lZmZpY2llbnRcbiAgICAgICAgLy8gc3RyaW5nIHJlcGxhY2Ugc28gdGhhdCB0aGUgc2FtZSBhcmd1bWVudCBjYW4gYmUgcmVwbGFjZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgLy8gaW4gdGhlIHNhbWUgcGhyYXNlLlxuICAgICAgICBwaHJhc2UgPSByZXBsYWNlLmNhbGwocGhyYXNlLCBuZXcgUmVnRXhwKCclXFxcXHsnICsgYXJnICsgJ1xcXFx9JywgJ2cnKSwgcmVwbGFjZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGhyYXNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgdHJhbnNsYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIHdpdGggdmFsdWVzIHRoYXQgd2lsbCBiZSB1c2VkIGxhdGVyIHRvIHJlcGxhY2UgcGxhY2Vob2xkZXJzIGluIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRyYW5zbGF0ZWQgKGFuZCBpbnRlcnBvbGF0ZWQpXG4gICAqL1xuXG5cbiAgVHJhbnNsYXRvci5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gdHJhbnNsYXRlKGtleSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc21hcnRfY291bnQpIHtcbiAgICAgIHZhciBwbHVyYWwgPSB0aGlzLmxvY2FsZXMucGx1cmFsaXplKG9wdGlvbnMuc21hcnRfY291bnQpO1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGUodGhpcy5vcHRzLmxvY2FsZXMuc3RyaW5nc1trZXldW3BsdXJhbF0sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlKHRoaXMub3B0cy5sb2NhbGVzLnN0cmluZ3Nba2V5XSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIFRyYW5zbGF0b3I7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFRyYW5zbGF0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2xhdG9yLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9uYW1lc3BhY2VFbWl0dGVyID0gcmVxdWlyZSgnbmFtZXNwYWNlLWVtaXR0ZXInKTtcblxudmFyIF9uYW1lc3BhY2VFbWl0dGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX25hbWVzcGFjZUVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgVXBweVNvY2tldCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVXBweVNvY2tldChvcHRzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVcHB5U29ja2V0KTtcblxuICAgIHRoaXMucXVldWVkID0gW107XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQob3B0cy50YXJnZXQpO1xuICAgIHRoaXMuZW1pdHRlciA9ICgwLCBfbmFtZXNwYWNlRW1pdHRlcjIuZGVmYXVsdCkoKTtcblxuICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgICB3aGlsZSAoX3RoaXMucXVldWVkLmxlbmd0aCA+IDAgJiYgX3RoaXMuaXNPcGVuKSB7XG4gICAgICAgIHZhciBmaXJzdCA9IF90aGlzLnF1ZXVlZFswXTtcbiAgICAgICAgX3RoaXMuc2VuZChmaXJzdC5hY3Rpb24sIGZpcnN0LnBheWxvYWQpO1xuICAgICAgICBfdGhpcy5xdWV1ZWQgPSBfdGhpcy5xdWV1ZWQuc2xpY2UoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UgPSB0aGlzLl9oYW5kbGVNZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9oYW5kbGVNZXNzYWdlO1xuXG4gICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmVtaXQgPSB0aGlzLmVtaXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uID0gdGhpcy5vbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25jZSA9IHRoaXMub25jZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2VuZCA9IHRoaXMuc2VuZC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgVXBweVNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgfTtcblxuICBVcHB5U29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gc2VuZChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAvLyBhdHRhY2ggdXVpZFxuXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5xdWV1ZWQucHVzaCh7IGFjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkXG4gICAgfSkpO1xuICB9O1xuXG4gIFVwcHlTb2NrZXQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oYWN0aW9uLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5lbWl0dGVyLm9uKGFjdGlvbiwgaGFuZGxlcik7XG4gIH07XG5cbiAgVXBweVNvY2tldC5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgdGhpcy5lbWl0dGVyLmVtaXQoYWN0aW9uLCBwYXlsb2FkKTtcbiAgfTtcblxuICBVcHB5U29ja2V0LnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShhY3Rpb24sIGhhbmRsZXIpIHtcbiAgICB0aGlzLmVtaXR0ZXIub25jZShhY3Rpb24sIGhhbmRsZXIpO1xuICB9O1xuXG4gIFVwcHlTb2NrZXQucHJvdG90eXBlLl9oYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gX2hhbmRsZU1lc3NhZ2UoZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgbWVzc2FnZSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgIHRoaXMuZW1pdChtZXNzYWdlLmFjdGlvbiwgbWVzc2FnZS5wYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBVcHB5U29ja2V0O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBVcHB5U29ja2V0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXBweVNvY2tldC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmZsYXR0ZW4gPSBmbGF0dGVuO1xuZXhwb3J0cy5pc1RvdWNoRGV2aWNlID0gaXNUb3VjaERldmljZTtcbmV4cG9ydHMuJCA9ICQ7XG5leHBvcnRzLiQkID0gJCQ7XG5leHBvcnRzLnRydW5jYXRlU3RyaW5nID0gdHJ1bmNhdGVTdHJpbmc7XG5leHBvcnRzLnNlY29uZHNUb1RpbWUgPSBzZWNvbmRzVG9UaW1lO1xuZXhwb3J0cy5ncm91cEJ5ID0gZ3JvdXBCeTtcbmV4cG9ydHMuZXZlcnkgPSBldmVyeTtcbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5leHBvcnRzLmdlbmVyYXRlRmlsZUlEID0gZ2VuZXJhdGVGaWxlSUQ7XG5leHBvcnRzLmV4dGVuZCA9IGV4dGVuZDtcbmV4cG9ydHMuZ2V0UHJvcG9ydGlvbmFsSW1hZ2VIZWlnaHQgPSBnZXRQcm9wb3J0aW9uYWxJbWFnZUhlaWdodDtcbmV4cG9ydHMuZ2V0RmlsZVR5cGUgPSBnZXRGaWxlVHlwZTtcbmV4cG9ydHMuZ2V0RmlsZU5hbWVBbmRFeHRlbnNpb24gPSBnZXRGaWxlTmFtZUFuZEV4dGVuc2lvbjtcbmV4cG9ydHMucmVhZEZpbGUgPSByZWFkRmlsZTtcbmV4cG9ydHMuY3JlYXRlSW1hZ2VUaHVtYm5haWwgPSBjcmVhdGVJbWFnZVRodW1ibmFpbDtcbmV4cG9ydHMuZGF0YVVSSXRvQmxvYiA9IGRhdGFVUkl0b0Jsb2I7XG5leHBvcnRzLmRhdGFVUkl0b0ZpbGUgPSBkYXRhVVJJdG9GaWxlO1xuZXhwb3J0cy5jb3B5VG9DbGlwYm9hcmQgPSBjb3B5VG9DbGlwYm9hcmQ7XG5leHBvcnRzLm1ha2VXb3JrZXIgPSBtYWtlV29ya2VyO1xuZXhwb3J0cy5nZXRTcGVlZCA9IGdldFNwZWVkO1xuZXhwb3J0cy5nZXRFVEEgPSBnZXRFVEE7XG5leHBvcnRzLnByZXR0eUVUQSA9IHByZXR0eUVUQTtcblxudmFyIF9taW1lVHlwZXMgPSByZXF1aXJlKCdtaW1lLXR5cGVzJyk7XG5cbnZhciBfbWltZVR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21pbWVUeXBlcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBfUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZSA6IFByb21pc2U7XG5cbi8vIGltcG9ydCBwaWNhIGZyb20gJ3BpY2EnXG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNtYWxsIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgaGVscCB3aXRoIGRvbSBtYW5pcHVsYXRpb24sIGFkZGluZyBsaXN0ZW5lcnMsXG4gKiBwcm9taXNlcyBhbmQgb3RoZXIgZ29vZCB0aGluZ3MuXG4gKlxuICogQG1vZHVsZSBVdGlsc1xuICovXG5cbi8qKlxuICogU2hhbGxvdyBmbGF0dGVuIG5lc3RlZCBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyKSB7XG4gIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGFycik7XG59XG5cbmZ1bmN0aW9uIGlzVG91Y2hEZXZpY2UoKSB7XG4gIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgLy8gd29ya3Mgb24gbW9zdCBicm93c2Vyc1xuICBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM7IC8vIHdvcmtzIG9uIElFMTAvMTEgYW5kIFN1cmZhY2Vcbn1cblxuLyoqXG4gKiBTaG9ydGVyIGFuZCBmYXN0IHdheSB0byBzZWxlY3QgYSBzaW5nbGUgbm9kZSBpbiB0aGUgRE9NXG4gKiBAcGFyYW0gICB7IFN0cmluZyB9IHNlbGVjdG9yIC0gdW5pcXVlIGRvbSBzZWxlY3RvclxuICogQHBhcmFtICAgeyBPYmplY3QgfSBjdHggLSBET00gbm9kZSB3aGVyZSB0aGUgdGFyZ2V0IG9mIG91ciBzZWFyY2ggd2lsbCBpcyBsb2NhdGVkXG4gKiBAcmV0dXJucyB7IE9iamVjdCB9IGRvbSBub2RlIGZvdW5kXG4gKi9cbmZ1bmN0aW9uICQoc2VsZWN0b3IsIGN0eCkge1xuICByZXR1cm4gKGN0eCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG59XG5cbi8qKlxuICogU2hvcnRlciBhbmQgZmFzdCB3YXkgdG8gc2VsZWN0IG11bHRpcGxlIG5vZGVzIGluIHRoZSBET01cbiAqIEBwYXJhbSAgIHsgU3RyaW5nfEFycmF5IH0gc2VsZWN0b3IgLSBET00gc2VsZWN0b3Igb3Igbm9kZXMgbGlzdFxuICogQHBhcmFtICAgeyBPYmplY3QgfSBjdHggLSBET00gbm9kZSB3aGVyZSB0aGUgdGFyZ2V0cyBvZiBvdXIgc2VhcmNoIHdpbGwgaXMgbG9jYXRlZFxuICogQHJldHVybnMgeyBPYmplY3QgfSBkb20gbm9kZXMgZm91bmRcbiAqL1xuZnVuY3Rpb24gJCQoc2VsZWN0b3IsIGN0eCkge1xuICB2YXIgZWxzO1xuICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgIGVscyA9IChjdHggfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIGVscyA9IHNlbGVjdG9yO1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRydW5jYXRlU3RyaW5nKHN0ciwgbGVuZ3RoKSB7XG4gIGlmIChzdHIubGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbGVuZ3RoIC8gMikgKyAnLi4uJyArIHN0ci5zdWJzdHIoc3RyLmxlbmd0aCAtIGxlbmd0aCAvIDQsIHN0ci5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBzdHI7XG5cbiAgLy8gbW9yZSBwcmVjaXNlIHZlcnNpb24gaWYgbmVlZGVkXG4gIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzgzMTU4M1xufVxuXG5mdW5jdGlvbiBzZWNvbmRzVG9UaW1lKHJhd1NlY29uZHMpIHtcbiAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihyYXdTZWNvbmRzIC8gMzYwMCkgJSAyNDtcbiAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKHJhd1NlY29uZHMgLyA2MCkgJSA2MDtcbiAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKHJhd1NlY29uZHMgJSA2MCk7XG5cbiAgcmV0dXJuIHsgaG91cnM6IGhvdXJzLCBtaW51dGVzOiBtaW51dGVzLCBzZWNvbmRzOiBzZWNvbmRzIH07XG59XG5cbi8qKlxuICogUGFydGl0aW9uIGFycmF5IGJ5IGEgZ3JvdXBpbmcgZnVuY3Rpb24uXG4gKiBAcGFyYW0gIHtbdHlwZV19IGFycmF5ICAgICAgSW5wdXQgYXJyYXlcbiAqIEBwYXJhbSAge1t0eXBlXX0gZ3JvdXBpbmdGbiBHcm91cGluZyBmdW5jdGlvblxuICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgIEFycmF5IG9mIGFycmF5c1xuICovXG5mdW5jdGlvbiBncm91cEJ5KGFycmF5LCBncm91cGluZ0ZuKSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgaXRlbSkge1xuICAgIHZhciBrZXkgPSBncm91cGluZ0ZuKGl0ZW0pO1xuICAgIHZhciB4cyA9IHJlc3VsdC5nZXQoa2V5KSB8fCBbXTtcbiAgICB4cy5wdXNoKGl0ZW0pO1xuICAgIHJlc3VsdC5zZXQoa2V5LCB4cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgbmV3IE1hcCgpKTtcbn1cblxuLyoqXG4gKiBUZXN0cyBpZiBldmVyeSBhcnJheSBlbGVtZW50IHBhc3NlcyBwcmVkaWNhdGVcbiAqIEBwYXJhbSAge0FycmF5fSAgYXJyYXkgICAgICAgSW5wdXQgYXJyYXlcbiAqIEBwYXJhbSAge09iamVjdH0gcHJlZGljYXRlRm4gUHJlZGljYXRlXG4gKiBAcmV0dXJuIHtib29sfSAgICAgICAgICAgICAgIEV2ZXJ5IGVsZW1lbnQgcGFzc1xuICovXG5mdW5jdGlvbiBldmVyeShhcnJheSwgcHJlZGljYXRlRm4pIHtcbiAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBpdGVtKSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZGljYXRlRm4oaXRlbSk7XG4gIH0sIHRydWUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGxpc3QgaW50byBhcnJheVxuKi9cbmZ1bmN0aW9uIHRvQXJyYXkobGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCB8fCBbXSwgMCk7XG59XG5cbi8qKlxuICogVGFrZXMgYSBmaWxlTmFtZSBhbmQgdHVybnMgaXQgaW50byBmaWxlSUQsIGJ5IGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlLFxuICogcmVtb3ZpbmcgZXh0cmEgY2hhcmFjdGVycyBhbmQgYWRkaW5nIHVuaXggdGltZXN0YW1wXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVOYW1lXG4gKlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUZpbGVJRChmaWxlTmFtZSkge1xuICB2YXIgZmlsZUlEID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgZmlsZUlEID0gZmlsZUlELnJlcGxhY2UoL1teQS1aMC05XS9pZywgJycpO1xuICBmaWxlSUQgPSBmaWxlSUQgKyBEYXRlLm5vdygpO1xuICByZXR1cm4gZmlsZUlEO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvYmpzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgb2Jqc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KHRoaXMsIFt7fV0uY29uY2F0KG9ianMpKTtcbn1cblxuLyoqXG4gKiBUYWtlcyBmdW5jdGlvbiBvciBjbGFzcywgcmV0dXJucyBpdHMgbmFtZS5cbiAqIEJlY2F1c2UgSUUgZG9lc27igJl0IHN1cHBvcnQgYGNvbnN0cnVjdG9yLm5hbWVgLlxuICogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZGZrYXllLzYzODQ0MzksIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1NzE0NDQ1XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGZuIOKAlCBmdW5jdGlvblxuICpcbiAqL1xuLy8gZnVuY3Rpb24gZ2V0Rm5OYW1lIChmbikge1xuLy8gICB2YXIgZiA9IHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJ1xuLy8gICB2YXIgcyA9IGYgJiYgKChmbi5uYW1lICYmIFsnJywgZm4ubmFtZV0pIHx8IGZuLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uIChbXlxcKF0rKS8pKVxuLy8gICByZXR1cm4gKCFmICYmICdub3QgYSBmdW5jdGlvbicpIHx8IChzICYmIHNbMV0gfHwgJ2Fub255bW91cycpXG4vLyB9XG5cbmZ1bmN0aW9uIGdldFByb3BvcnRpb25hbEltYWdlSGVpZ2h0KGltZywgbmV3V2lkdGgpIHtcbiAgdmFyIGFzcGVjdCA9IGltZy53aWR0aCAvIGltZy5oZWlnaHQ7XG4gIHZhciBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKG5ld1dpZHRoIC8gYXNwZWN0KTtcbiAgcmV0dXJuIG5ld0hlaWdodDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZVR5cGUoZmlsZSkge1xuICBpZiAoZmlsZS50eXBlKSB7XG4gICAgcmV0dXJuIGZpbGUudHlwZTtcbiAgfVxuICByZXR1cm4gX21pbWVUeXBlczIuZGVmYXVsdC5sb29rdXAoZmlsZS5uYW1lKTtcbn1cblxuLy8gcmV0dXJucyBbZmlsZU5hbWUsIGZpbGVFeHRdXG5mdW5jdGlvbiBnZXRGaWxlTmFtZUFuZEV4dGVuc2lvbihmdWxsRmlsZU5hbWUpIHtcbiAgdmFyIHJlID0gLyg/OlxcLihbXi5dKykpPyQvO1xuICB2YXIgZmlsZUV4dCA9IHJlLmV4ZWMoZnVsbEZpbGVOYW1lKVsxXTtcbiAgdmFyIGZpbGVOYW1lID0gZnVsbEZpbGVOYW1lLnJlcGxhY2UoJy4nICsgZmlsZUV4dCwgJycpO1xuICByZXR1cm4gW2ZpbGVOYW1lLCBmaWxlRXh0XTtcbn1cblxuLyoqXG4gKiBSZWFkcyBmaWxlIGFzIGRhdGEgVVJJIGZyb20gZmlsZSBvYmplY3QsXG4gKiB0aGUgb25lIHlvdSBnZXQgZnJvbSBpbnB1dFt0eXBlPWZpbGVdIG9yIGRyYWcgJiBkcm9wLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlIG9iamVjdFxuICogQHJldHVybiB7UHJvbWlzZX0gZGF0YVVSTCBvZiB0aGUgZmlsZVxuICpcbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUoZmlsZU9iaikge1xuICByZXR1cm4gbmV3IF9Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uIChldikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZXYudGFyZ2V0LnJlc3VsdCk7XG4gICAgfSk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZU9iaik7XG5cbiAgICAvLyBmdW5jdGlvbiB3b3JrZXJTY3JpcHQgKCkge1xuICAgIC8vICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHtcbiAgICAvLyAgICAgY29uc3QgZmlsZSA9IGUuZGF0YS5maWxlXG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXJTeW5jKClcbiAgICAvLyAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgLy8gICAgICAgICBmaWxlOiByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKVxuICAgIC8vICAgICAgIH0pXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycikge1xuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSlcbiAgICAvLyB9XG4gICAgLy9cbiAgICAvLyBjb25zdCB3b3JrZXIgPSBtYWtlV29ya2VyKHdvcmtlclNjcmlwdClcbiAgICAvLyB3b3JrZXIucG9zdE1lc3NhZ2Uoe2ZpbGU6IGZpbGVPYmp9KVxuICAgIC8vIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHtcbiAgICAvLyAgIGNvbnN0IGZpbGVEYXRhVVJMID0gZS5kYXRhLmZpbGVcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdGSUxFIF8gREFUQSBfIFVSTCcpXG4gICAgLy8gICByZXR1cm4gcmVzb2x2ZShmaWxlRGF0YVVSTClcbiAgICAvLyB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNpemVzIGFuIGltYWdlIHRvIHNwZWNpZmllZCB3aWR0aCBhbmQgcHJvcG9ydGlvbmFsIGhlaWdodCwgdXNpbmcgY2FudmFzXG4gKiBTZWUgaHR0cHM6Ly9kYXZpZHdhbHNoLm5hbWUvcmVzaXplLWltYWdlLWNhbnZhcyxcbiAqIGh0dHA6Ly9iYWJhbGFuLmNvbS9yZXNpemluZy1pbWFnZXMtd2l0aC1qYXZhc2NyaXB0L1xuICogQFRPRE8gc2VlIGlmIHdlIG5lZWQgaHR0cHM6Ly9naXRodWIuY29tL3N0b21pdGEvaW9zLWltYWdlZmlsZS1tZWdhcGl4ZWwgZm9yIGlPU1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBEYXRhIFVSSSBvZiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB3aWR0aCBvZiB0aGUgcmVzdWx0aW5nIGltYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IERhdGEgVVJJIG9mIHRoZSByZXNpemVkIGltYWdlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlVGh1bWJuYWlsKGltZ0RhdGFVUkksIG5ld1dpZHRoKSB7XG4gIHJldHVybiBuZXcgX1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdJbWFnZVdpZHRoID0gbmV3V2lkdGg7XG4gICAgICB2YXIgbmV3SW1hZ2VIZWlnaHQgPSBnZXRQcm9wb3J0aW9uYWxJbWFnZUhlaWdodChpbWcsIG5ld0ltYWdlV2lkdGgpO1xuXG4gICAgICAvLyBjcmVhdGUgYW4gb2ZmLXNjcmVlbiBjYW52YXNcbiAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgLy8gc2V0IGl0cyBkaW1lbnNpb24gdG8gdGFyZ2V0IHNpemVcbiAgICAgIGNhbnZhcy53aWR0aCA9IG5ld0ltYWdlV2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SW1hZ2VIZWlnaHQ7XG5cbiAgICAgIC8vIGRyYXcgc291cmNlIGltYWdlIGludG8gdGhlIG9mZi1zY3JlZW4gY2FudmFzOlxuICAgICAgLy8gY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KVxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld0ltYWdlV2lkdGgsIG5ld0ltYWdlSGVpZ2h0KTtcblxuICAgICAgLy8gcGljYS5yZXNpemVDYW52YXMoaW1nLCBjYW52YXMsIChlcnIpID0+IHtcbiAgICAgIC8vICAgaWYgKGVycikgY29uc29sZS5sb2coZXJyKVxuICAgICAgLy8gICBjb25zdCB0aHVtYm5haWwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKVxuICAgICAgLy8gICByZXR1cm4gcmVzb2x2ZSh0aHVtYm5haWwpXG4gICAgICAvLyB9KVxuXG4gICAgICAvLyBlbmNvZGUgaW1hZ2UgdG8gZGF0YS11cmkgd2l0aCBiYXNlNjQgdmVyc2lvbiBvZiBjb21wcmVzc2VkIGltYWdlXG4gICAgICAvLyBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgcXVhbGl0eSk7ICAvLyBxdWFsaXR5ID0gWzAuMCwgMS4wXVxuICAgICAgdmFyIHRodW1ibmFpbCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xuICAgICAgcmV0dXJuIHJlc29sdmUodGh1bWJuYWlsKTtcbiAgICB9KTtcbiAgICBpbWcuc3JjID0gaW1nRGF0YVVSSTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRhdGFVUkl0b0Jsb2IoZGF0YVVSSSwgb3B0cywgdG9GaWxlKSB7XG4gIC8vIGdldCB0aGUgYmFzZTY0IGRhdGFcbiAgdmFyIGRhdGEgPSBkYXRhVVJJLnNwbGl0KCcsJylbMV07XG5cbiAgLy8gdXNlciBtYXkgcHJvdmlkZSBtaW1lIHR5cGUsIGlmIG5vdCBnZXQgaXQgZnJvbSBkYXRhIFVSSVxuICB2YXIgbWltZVR5cGUgPSBvcHRzLm1pbWVUeXBlIHx8IGRhdGFVUkkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XG5cbiAgLy8gZGVmYXVsdCB0byBwbGFpbi90ZXh0IGlmIGRhdGEgVVJJIGhhcyBubyBtaW1lVHlwZVxuICBpZiAobWltZVR5cGUgPT0gbnVsbCkge1xuICAgIG1pbWVUeXBlID0gJ3BsYWluL3RleHQnO1xuICB9XG5cbiAgdmFyIGJpbmFyeSA9IGF0b2IoZGF0YSk7XG4gIHZhciBhcnJheSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgIGFycmF5LnB1c2goYmluYXJ5LmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgLy8gQ29udmVydCB0byBhIEZpbGU/XG4gIGlmICh0b0ZpbGUpIHtcbiAgICByZXR1cm4gbmV3IEZpbGUoW25ldyBVaW50OEFycmF5KGFycmF5KV0sIG9wdHMubmFtZSB8fCAnJywgeyB0eXBlOiBtaW1lVHlwZSB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXSwgeyB0eXBlOiBtaW1lVHlwZSB9KTtcbn1cblxuZnVuY3Rpb24gZGF0YVVSSXRvRmlsZShkYXRhVVJJLCBvcHRzKSB7XG4gIHJldHVybiBkYXRhVVJJdG9CbG9iKGRhdGFVUkksIG9wdHMsIHRydWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0ZXh0IHRvIGNsaXBib2FyZCBieSBjcmVhdGluZyBhbiBhbG1vc3QgaW52aXNpYmxlIHRleHRhcmVhLFxuICogYWRkaW5nIHRleHQgdGhlcmUsIHRoZW4gcnVubmluZyBleGVjQ29tbWFuZCgnY29weScpLlxuICogRmFsbHMgYmFjayB0byBwcm9tcHQoKSB3aGVuIHRoZSBlYXN5IHdheSBmYWlscyAoaGVsbG8sIFNhZmFyaSEpXG4gKiBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMwODEwMzIyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRleHRUb0NvcHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWxsYmFja1N0cmluZ1xuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gY29weVRvQ2xpcGJvYXJkKHRleHRUb0NvcHksIGZhbGxiYWNrU3RyaW5nKSB7XG4gIGZhbGxiYWNrU3RyaW5nID0gZmFsbGJhY2tTdHJpbmcgfHwgJ0NvcHkgdGhlIFVSTCBiZWxvdyc7XG5cbiAgcmV0dXJuIG5ldyBfUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICB0ZXh0QXJlYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgd2lkdGg6ICcyZW0nLFxuICAgICAgaGVpZ2h0OiAnMmVtJyxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuICAgIH0pO1xuXG4gICAgdGV4dEFyZWEudmFsdWUgPSB0ZXh0VG9Db3B5O1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpO1xuICAgIHRleHRBcmVhLnNlbGVjdCgpO1xuXG4gICAgdmFyIG1hZ2ljQ29weUZhaWxlZCA9IGZ1bmN0aW9uIG1hZ2ljQ29weUZhaWxlZChlcnIpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xuICAgICAgd2luZG93LnByb21wdChmYWxsYmFja1N0cmluZywgdGV4dFRvQ29weSk7XG4gICAgICByZXR1cm4gcmVqZWN0KCdPb3BzLCB1bmFibGUgdG8gY29weSBkaXNwbGF5ZWQgZmFsbGJhY2sgcHJvbXB0OiAnICsgZXJyKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdWNjZXNzZnVsID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIGlmICghc3VjY2Vzc2Z1bCkge1xuICAgICAgICByZXR1cm4gbWFnaWNDb3B5RmFpbGVkKCdjb3B5IGNvbW1hbmQgdW5hdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xuICAgICAgcmV0dXJuIG1hZ2ljQ29weUZhaWxlZChlcnIpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmxpbmVXb3JrZXIgKHdvcmtlckZ1bmN0aW9uKSB7XG4vLyAgIGxldCBjb2RlID0gd29ya2VyRnVuY3Rpb24udG9TdHJpbmcoKVxuLy8gICBjb2RlID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCd7JykgKyAxLCBjb2RlLmxhc3RJbmRleE9mKCd9JykpXG4vL1xuLy8gICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvZGVdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnfSlcbi8vICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKVxuLy9cbi8vICAgcmV0dXJuIHdvcmtlclxuLy8gfVxuXG5mdW5jdGlvbiBtYWtlV29ya2VyKHNjcmlwdCkge1xuICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuICB2YXIgQmxvYiA9IHdpbmRvdy5CbG9iO1xuICB2YXIgV29ya2VyID0gd2luZG93LldvcmtlcjtcblxuICBpZiAoIVVSTCB8fCAhQmxvYiB8fCAhV29ya2VyIHx8ICFzY3JpcHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjb2RlID0gc2NyaXB0LnRvU3RyaW5nKCk7XG4gIGNvZGUgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoJ3snKSArIDEsIGNvZGUubGFzdEluZGV4T2YoJ30nKSk7XG5cbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihbY29kZV0pO1xuICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKTtcbiAgcmV0dXJuIHdvcmtlcjtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlZWQoZmlsZVByb2dyZXNzKSB7XG4gIGlmICghZmlsZVByb2dyZXNzLmJ5dGVzVXBsb2FkZWQpIHJldHVybiAwO1xuXG4gIHZhciB0aW1lRWxhcHNlZCA9IG5ldyBEYXRlKCkgLSBmaWxlUHJvZ3Jlc3MudXBsb2FkU3RhcnRlZDtcbiAgdmFyIHVwbG9hZFNwZWVkID0gZmlsZVByb2dyZXNzLmJ5dGVzVXBsb2FkZWQgLyAodGltZUVsYXBzZWQgLyAxMDAwKTtcbiAgcmV0dXJuIHVwbG9hZFNwZWVkO1xufVxuXG5mdW5jdGlvbiBnZXRFVEEoZmlsZVByb2dyZXNzKSB7XG4gIGlmICghZmlsZVByb2dyZXNzLmJ5dGVzVXBsb2FkZWQpIHJldHVybiAwO1xuXG4gIHZhciB1cGxvYWRTcGVlZCA9IGdldFNwZWVkKGZpbGVQcm9ncmVzcyk7XG4gIHZhciBieXRlc1JlbWFpbmluZyA9IGZpbGVQcm9ncmVzcy5ieXRlc1RvdGFsIC0gZmlsZVByb2dyZXNzLmJ5dGVzVXBsb2FkZWQ7XG4gIHZhciBzZWNvbmRzUmVtYWluaW5nID0gTWF0aC5yb3VuZChieXRlc1JlbWFpbmluZyAvIHVwbG9hZFNwZWVkICogMTApIC8gMTA7XG5cbiAgcmV0dXJuIHNlY29uZHNSZW1haW5pbmc7XG59XG5cbmZ1bmN0aW9uIHByZXR0eUVUQShzZWNvbmRzKSB7XG4gIHZhciB0aW1lID0gc2Vjb25kc1RvVGltZShzZWNvbmRzKTtcblxuICAvLyBPbmx5IGRpc3BsYXkgaG91cnMgYW5kIG1pbnV0ZXMgaWYgdGhleSBhcmUgZ3JlYXRlciB0aGFuIDAgYnV0IGFsd2F5c1xuICAvLyBkaXNwbGF5IG1pbnV0ZXMgaWYgaG91cnMgaXMgYmVpbmcgZGlzcGxheWVkXG4gIHZhciBob3Vyc1N0ciA9IHRpbWUuaG91cnMgPyB0aW1lLmhvdXJzICsgJ2gnIDogJyc7XG4gIHZhciBtaW51dGVzU3RyID0gdGltZS5ob3VycyB8fCB0aW1lLm1pbnV0ZXMgPyB0aW1lLm1pbnV0ZXMgKyAnbScgOiAnJztcbiAgdmFyIHNlY29uZHNTdHIgPSB0aW1lLnNlY29uZHMgKyAncyc7XG5cbiAgcmV0dXJuIGhvdXJzU3RyICsgJyAnICsgbWludXRlc1N0ciArICcgJyArIHNlY29uZHNTdHI7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgZ2VuZXJhdGVGaWxlSUQ6IGdlbmVyYXRlRmlsZUlELFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBldmVyeTogZXZlcnksXG4gIGZsYXR0ZW46IGZsYXR0ZW4sXG4gIGdyb3VwQnk6IGdyb3VwQnksXG4gICQ6ICQsXG4gICQkOiAkJCxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHJlYWRGaWxlOiByZWFkRmlsZSxcbiAgY3JlYXRlSW1hZ2VUaHVtYm5haWw6IGNyZWF0ZUltYWdlVGh1bWJuYWlsLFxuICBnZXRQcm9wb3J0aW9uYWxJbWFnZUhlaWdodDogZ2V0UHJvcG9ydGlvbmFsSW1hZ2VIZWlnaHQsXG4gIGlzVG91Y2hEZXZpY2U6IGlzVG91Y2hEZXZpY2UsXG4gIGdldEZpbGVOYW1lQW5kRXh0ZW5zaW9uOiBnZXRGaWxlTmFtZUFuZEV4dGVuc2lvbixcbiAgdHJ1bmNhdGVTdHJpbmc6IHRydW5jYXRlU3RyaW5nLFxuICBnZXRGaWxlVHlwZTogZ2V0RmlsZVR5cGUsXG4gIHNlY29uZHNUb1RpbWU6IHNlY29uZHNUb1RpbWUsXG4gIGRhdGFVUkl0b0Jsb2I6IGRhdGFVUkl0b0Jsb2IsXG4gIGRhdGFVUkl0b0ZpbGU6IGRhdGFVUkl0b0ZpbGUsXG4gIGdldFNwZWVkOiBnZXRTcGVlZCxcbiAgZ2V0RVRBOiBnZXRFVEEsXG4gIG1ha2VXb3JrZXI6IG1ha2VXb3JrZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VdGlscy5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfeW9ZbyA9IHJlcXVpcmUoJ3lvLXlvJyk7XG5cbnZhciBfeW9ZbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF95b1lvKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gX3lvWW8yLmRlZmF1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odG1sLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9Db3JlID0gcmVxdWlyZSgnLi9Db3JlJyk7XG5cbnZhciBfQ29yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db3JlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gX0NvcmUyLmRlZmF1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgZW5fVVMgPSB7fTtcblxuZW5fVVMuc3RyaW5ncyA9IHtcbiAgY2hvb3NlRmlsZTogJ0Nob29zZSBhIGZpbGUnLFxuICB5b3VIYXZlQ2hvc2VuOiAnWW91IGhhdmUgY2hvc2VuOiAle2ZpbGVOYW1lfScsXG4gIG9yRHJhZ0Ryb3A6ICdvciBkcmFnIGl0IGhlcmUnLFxuICBmaWxlc0Nob3Nlbjoge1xuICAgIDA6ICcle3NtYXJ0X2NvdW50fSBmaWxlIHNlbGVjdGVkJyxcbiAgICAxOiAnJXtzbWFydF9jb3VudH0gZmlsZXMgc2VsZWN0ZWQnXG4gIH0sXG4gIGZpbGVzVXBsb2FkZWQ6IHtcbiAgICAwOiAnJXtzbWFydF9jb3VudH0gZmlsZSB1cGxvYWRlZCcsXG4gICAgMTogJyV7c21hcnRfY291bnR9IGZpbGVzIHVwbG9hZGVkJ1xuICB9LFxuICBmaWxlczoge1xuICAgIDA6ICcle3NtYXJ0X2NvdW50fSBmaWxlJyxcbiAgICAxOiAnJXtzbWFydF9jb3VudH0gZmlsZXMnXG4gIH0sXG4gIHVwbG9hZEZpbGVzOiB7XG4gICAgMDogJ1VwbG9hZCAle3NtYXJ0X2NvdW50fSBmaWxlJyxcbiAgICAxOiAnVXBsb2FkICV7c21hcnRfY291bnR9IGZpbGVzJ1xuICB9LFxuICBzZWxlY3RUb1VwbG9hZDogJ1NlbGVjdCBmaWxlcyB0byB1cGxvYWQnLFxuICBjbG9zZU1vZGFsOiAnQ2xvc2UgTW9kYWwnLFxuICB1cGxvYWQ6ICdVcGxvYWQnLFxuICBpbXBvcnRGcm9tOiAnSW1wb3J0IGZpbGVzIGZyb20nLFxuICBkYXNoYm9hcmRXaW5kb3dUaXRsZTogJ1VwcHkgRGFzaGJvYXJkIFdpbmRvdyAoUHJlc3MgZXNjYXBlIHRvIGNsb3NlKScsXG4gIGRhc2hib2FyZFRpdGxlOiAnVXBweSBEYXNoYm9hcmQnLFxuICBjb3B5TGlua1RvQ2xpcGJvYXJkU3VjY2VzczogJ0xpbmsgY29waWVkIHRvIGNsaXBib2FyZC4nLFxuICBjb3B5TGlua1RvQ2xpcGJvYXJkRmFsbGJhY2s6ICdDb3B5IHRoZSBVUkwgYmVsb3cnLFxuICBkb25lOiAnRG9uZScsXG4gIGxvY2FsRGlzazogJ0xvY2FsIERpc2snLFxuICBkcm9wUGFzdGVJbXBvcnQ6ICdEcm9wIGZpbGVzIGhlcmUsIHBhc3RlIG9yIGltcG9ydCBmcm9tOicsXG4gIGZpbGVQcm9ncmVzczogJ0ZpbGUgcHJvZ3Jlc3M6IHVwbG9hZCBzcGVlZCBhbmQgRVRBJyxcbiAgbnVtYmVyT2ZTZWxlY3RlZEZpbGVzOiAnTnVtYmVyIG9mIHNlbGVjdGVkIGZpbGVzJyxcbiAgdXBsb2FkQWxsTmV3RmlsZXM6ICdVcGxvYWQgYWxsIG5ldyBmaWxlcydcbn07XG5cbmVuX1VTLnBsdXJhbGl6ZSA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmIChuID09PSAxKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIDE7XG59O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5VcHB5ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuVXBweS5sb2NhbGVzLmVuX1VTID0gZW5fVVM7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGVuX1VTO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5fVVMuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPGRpdiBjbGFzcz1cIlVwcHkgVXBweVRoZW1lLS1kZWZhdWx0IFVwcHlEYXNoYm9hcmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcIlxcbiAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxcbiAgICAgICAgICAgICAgICAgICBvbnBhc3RlPScsICc+XFxuXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLW92ZXJsYXlcIlxcbiAgICAgICAgIG9uY2xpY2s9JywgJz48L2Rpdj5cXG5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtY2xvc2VcIlxcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCInLCAnXCJcXG4gICAgICAgICAgICB0aXRsZT1cIicsICdcIlxcbiAgICAgICAgICAgIG9uY2xpY2s9JywgJz4nLCAnPC9idXR0b24+XFxuXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWlubmVyXCIgdGFiaW5kZXg9XCIwXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtaW5uZXJXcmFwXCI+XFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1hY3Rpb25zXCI+XFxuICAgICAgICAgICcsICdcXG5cXG4gICAgICAgICAgJywgJ1xcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1wcm9ncmVzc2luZGljYXRvcnNcIj5cXG4gICAgICAgICAgJywgJ1xcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+J10sIFsnPGRpdiBjbGFzcz1cIlVwcHkgVXBweVRoZW1lLS1kZWZhdWx0IFVwcHlEYXNoYm9hcmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcIlxcbiAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxcbiAgICAgICAgICAgICAgICAgICBvbnBhc3RlPScsICc+XFxuXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLW92ZXJsYXlcIlxcbiAgICAgICAgIG9uY2xpY2s9JywgJz48L2Rpdj5cXG5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtY2xvc2VcIlxcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCInLCAnXCJcXG4gICAgICAgICAgICB0aXRsZT1cIicsICdcIlxcbiAgICAgICAgICAgIG9uY2xpY2s9JywgJz4nLCAnPC9idXR0b24+XFxuXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWlubmVyXCIgdGFiaW5kZXg9XCIwXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtaW5uZXJXcmFwXCI+XFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1hY3Rpb25zXCI+XFxuICAgICAgICAgICcsICdcXG5cXG4gICAgICAgICAgJywgJ1xcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICAnLCAnXFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1wcm9ncmVzc2luZGljYXRvcnNcIj5cXG4gICAgICAgICAgJywgJ1xcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZENvbnRlbnQtcGFuZWxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiJywgJy0tJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYnBhbmVsXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cIicsICdcIj5cXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRDb250ZW50LWJhclwiPlxcbiAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRDb250ZW50LXRpdGxlXCI+JywgJyAnLCAnPC9oMj5cXG4gICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiVXBweURhc2hib2FyZENvbnRlbnQtYmFja1wiXFxuICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+JywgJzwvYnV0dG9uPlxcbiAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAnLCAnXFxuICAgICAgICAgIDwvZGl2PiddLCBbJzxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC1wYW5lbFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCInLCAnLS0nLCAnXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwidGFicGFuZWxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwiJywgJ1wiPlxcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZENvbnRlbnQtYmFyXCI+XFxuICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwiVXBweURhc2hib2FyZENvbnRlbnQtdGl0bGVcIj4nLCAnICcsICc8L2gyPlxcbiAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC1iYWNrXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz4nLCAnPC9idXR0b24+XFxuICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgPC9kaXY+J10pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBEYXNoYm9hcmQ7XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbnZhciBfRmlsZUxpc3QgPSByZXF1aXJlKCcuL0ZpbGVMaXN0Jyk7XG5cbnZhciBfRmlsZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRmlsZUxpc3QpO1xuXG52YXIgX1RhYnMgPSByZXF1aXJlKCcuL1RhYnMnKTtcblxudmFyIF9UYWJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYnMpO1xuXG52YXIgX0ZpbGVDYXJkID0gcmVxdWlyZSgnLi9GaWxlQ2FyZCcpO1xuXG52YXIgX0ZpbGVDYXJkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZpbGVDYXJkKTtcblxudmFyIF9VcGxvYWRCdG4gPSByZXF1aXJlKCcuL1VwbG9hZEJ0bicpO1xuXG52YXIgX1VwbG9hZEJ0bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VcGxvYWRCdG4pO1xuXG52YXIgX1Byb2dyZXNzQ2lyY2xlID0gcmVxdWlyZSgnLi9Qcm9ncmVzc0NpcmNsZScpO1xuXG52YXIgX1Byb2dyZXNzQ2lyY2xlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Byb2dyZXNzQ2lyY2xlKTtcblxudmFyIF9TdGF0dXNCYXIgPSByZXF1aXJlKCcuL1N0YXR1c0JhcicpO1xuXG52YXIgX1N0YXR1c0JhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TdGF0dXNCYXIpO1xuXG52YXIgX1V0aWxzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9VdGlscycpO1xuXG52YXIgX2ljb25zID0gcmVxdWlyZSgnLi9pY29ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5mdW5jdGlvbiBEYXNoYm9hcmQocHJvcHMpIHtcbiAgLy8gaHR0cDovL2Rldi5lZGVuc3BpZWtlcm1hbm4uY29tLzIwMTYvMDIvMTEvaW50cm9kdWNpbmctYWNjZXNzaWJsZS1tb2RhbC1kaWFsb2dcblxuICAvLyBjb25zdCB1cGxvYWRTdGFydGVkRmlsZXNDb3VudCA9IHVwbG9hZFN0YXJ0ZWRGaWxlcy5sZW5ndGhcbiAgLy8gY29uc3QgY29tcGxldGVGaWxlc0NvdW50ID0gY29tcGxldGVGaWxlcy5sZW5ndGhcbiAgLy8gY29uc3QgaW5Qcm9ncmVzc0ZpbGVzQ291bnQgPSBpblByb2dyZXNzRmlsZXMubGVuZ3RoXG4gIC8vIGNvbnN0IHRvdGFsRmlsZUNvdW50ID0gT2JqZWN0LmtleXMoZmlsZXMpLmxlbmd0aFxuICAvLyBjb25zdCBuZXdGaWxlQ291bnQgPSBuZXdGaWxlcy5sZW5ndGhcblxuICB2YXIgaGFuZGxlSW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVJbnB1dENoYW5nZShldikge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGZpbGVzID0gKDAsIF9VdGlscy50b0FycmF5KShldi50YXJnZXQuZmlsZXMpO1xuXG4gICAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgcHJvcHMuYWRkRmlsZSh7XG4gICAgICAgIHNvdXJjZTogcHJvcHMuaWQsXG4gICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICBkYXRhOiBmaWxlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBAVE9ETyBFeHByaW1lbnRhbCwgd29yayBpbiBwcm9ncmVzc1xuICAvLyBubyBuYW1lcywgd2VpcmQgQVBJLCBDaHJvbWUtb25seSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjk0MDAyMFxuICB2YXIgaGFuZGxlUGFzdGUgPSBmdW5jdGlvbiBoYW5kbGVQYXN0ZShldikge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB2YXIgZmlsZXMgPSAoMCwgX1V0aWxzLnRvQXJyYXkpKGV2LmNsaXBib2FyZERhdGEuaXRlbXMpO1xuICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIGlmIChmaWxlLmtpbmQgIT09ICdmaWxlJykgcmV0dXJuO1xuXG4gICAgICB2YXIgYmxvYiA9IGZpbGUuZ2V0QXNGaWxlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhibG9iKVxuICAgICAgLy8gY29uc29sZS5sb2coYmxvYi5zaXplKVxuICAgICAgcHJvcHMubG9nKCdGaWxlIHBhc3RlZCcpO1xuICAgICAgcHJvcHMuYWRkRmlsZSh7XG4gICAgICAgIHNvdXJjZTogcHJvcHMuaWQsXG4gICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICBkYXRhOiBibG9iXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QsICgwLCBfVXRpbHMuaXNUb3VjaERldmljZSkoKSA/ICdVcHB5LS1pc1RvdWNoRGV2aWNlJyA6ICcnLCBwcm9wcy5zZW1pVHJhbnNwYXJlbnQgPyAnVXBweURhc2hib2FyZC0tc2VtaVRyYW5zcGFyZW50JyA6ICcnLCAhcHJvcHMuaW5saW5lID8gJ1VwcHlEYXNoYm9hcmQtLW1vZGFsJyA6ICcnLCBwcm9wcy5pbmxpbmUgPyAnZmFsc2UnIDogcHJvcHMubW9kYWwuaXNIaWRkZW4sICFwcm9wcy5pbmxpbmUgPyBwcm9wcy5pMThuKCdkYXNoYm9hcmRXaW5kb3dUaXRsZScpIDogcHJvcHMuaTE4bignZGFzaGJvYXJkVGl0bGUnKSwgaGFuZGxlUGFzdGUsIHByb3BzLmhpZGVNb2RhbCwgcHJvcHMuaTE4bignY2xvc2VNb2RhbCcpLCBwcm9wcy5pMThuKCdjbG9zZU1vZGFsJyksIHByb3BzLmhpZGVNb2RhbCwgKDAsIF9pY29ucy5jbG9zZUljb24pKCksICgwLCBfVGFiczIuZGVmYXVsdCkoe1xuICAgIGhhbmRsZUlucHV0Q2hhbmdlOiBoYW5kbGVJbnB1dENoYW5nZSxcbiAgICBhY3F1aXJlcnM6IHByb3BzLmFjcXVpcmVycyxcbiAgICBjb250YWluZXI6IHByb3BzLmNvbnRhaW5lcixcbiAgICBwYW5lbFNlbGVjdG9yUHJlZml4OiBwcm9wcy5wYW5lbFNlbGVjdG9yUHJlZml4LFxuICAgIHNob3dQYW5lbDogcHJvcHMuc2hvd1BhbmVsLFxuICAgIGkxOG46IHByb3BzLmkxOG5cbiAgfSksICgwLCBfRmlsZUNhcmQyLmRlZmF1bHQpKHtcbiAgICBmaWxlczogcHJvcHMuZmlsZXMsXG4gICAgZmlsZUNhcmRGb3I6IHByb3BzLmZpbGVDYXJkRm9yLFxuICAgIGRvbmU6IHByb3BzLmZpbGVDYXJkRG9uZSxcbiAgICBtZXRhRmllbGRzOiBwcm9wcy5tZXRhRmllbGRzLFxuICAgIGxvZzogcHJvcHMubG9nLFxuICAgIGkxOG46IHByb3BzLmkxOG5cbiAgfSksICgwLCBfRmlsZUxpc3QyLmRlZmF1bHQpKHtcbiAgICBmaWxlczogcHJvcHMuZmlsZXMsXG4gICAgc2hvd0ZpbGVDYXJkOiBwcm9wcy5zaG93RmlsZUNhcmQsXG4gICAgc2hvd1Byb2dyZXNzRGV0YWlsczogcHJvcHMuc2hvd1Byb2dyZXNzRGV0YWlscyxcbiAgICB0b3RhbFByb2dyZXNzOiBwcm9wcy50b3RhbFByb2dyZXNzLFxuICAgIHRvdGFsRmlsZUNvdW50OiBwcm9wcy50b3RhbEZpbGVDb3VudCxcbiAgICBpbmZvOiBwcm9wcy5pbmZvLFxuICAgIGkxOG46IHByb3BzLmkxOG4sXG4gICAgbG9nOiBwcm9wcy5sb2csXG4gICAgcmVtb3ZlRmlsZTogcHJvcHMucmVtb3ZlRmlsZSxcbiAgICBwYXVzZUFsbDogcHJvcHMucGF1c2VBbGwsXG4gICAgcmVzdW1lQWxsOiBwcm9wcy5yZXN1bWVBbGwsXG4gICAgcGF1c2VVcGxvYWQ6IHByb3BzLnBhdXNlVXBsb2FkLFxuICAgIHN0YXJ0VXBsb2FkOiBwcm9wcy5zdGFydFVwbG9hZFxuICB9KSwgIXByb3BzLmF1dG9Qcm9jZWVkICYmIHByb3BzLm5ld0ZpbGVzLmxlbmd0aCA+IDAgPyAoMCwgX1VwbG9hZEJ0bjIuZGVmYXVsdCkoe1xuICAgIGkxOG46IHByb3BzLmkxOG4sXG4gICAgc3RhcnRVcGxvYWQ6IHByb3BzLnN0YXJ0VXBsb2FkLFxuICAgIG5ld0ZpbGVDb3VudDogcHJvcHMubmV3RmlsZXMubGVuZ3RoXG4gIH0pIDogbnVsbCwgcHJvcHMudXBsb2FkU3RhcnRlZEZpbGVzLmxlbmd0aCA+IDAgPyAoMCwgX1Byb2dyZXNzQ2lyY2xlMi5kZWZhdWx0KSh7XG4gICAgdG90YWxQcm9ncmVzczogcHJvcHMudG90YWxQcm9ncmVzcyxcbiAgICBpc0FsbFBhdXNlZDogcHJvcHMuaXNBbGxQYXVzZWQsXG4gICAgaXNBbGxDb21wbGV0ZTogcHJvcHMuaXNBbGxDb21wbGV0ZSxcbiAgICBwYXVzZUFsbDogcHJvcHMucGF1c2VBbGwsXG4gICAgcmVzdW1lQWxsOiBwcm9wcy5yZXN1bWVBbGxcbiAgfSkgOiBudWxsLCBwcm9wcy51cGxvYWRTdGFydGVkRmlsZXMubGVuZ3RoID4gMCA/ICgwLCBfU3RhdHVzQmFyMi5kZWZhdWx0KSh7XG4gICAgdG90YWxQcm9ncmVzczogcHJvcHMudG90YWxQcm9ncmVzcyxcbiAgICBpc0FsbENvbXBsZXRlOiBwcm9wcy5pc0FsbENvbXBsZXRlLFxuICAgIGlzQWxsUGF1c2VkOiBwcm9wcy5pc0FsbFBhdXNlZCxcbiAgICBjb21wbGV0ZTogcHJvcHMuY29tcGxldGVGaWxlcy5sZW5ndGgsXG4gICAgaW5Qcm9ncmVzczogcHJvcHMudXBsb2FkU3RhcnRlZEZpbGVzLmxlbmd0aCxcbiAgICB0b3RhbFNwZWVkOiBwcm9wcy50b3RhbFNwZWVkLFxuICAgIHRvdGFsRVRBOiBwcm9wcy50b3RhbEVUQVxuICB9KSA6IG51bGwsIHByb3BzLmFjcXVpcmVycy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDIsIHByb3BzLnBhbmVsU2VsZWN0b3JQcmVmaXgsIHRhcmdldC5pZCwgdGFyZ2V0LmlzSGlkZGVuLCBwcm9wcy5pMThuKCdpbXBvcnRGcm9tJyksIHRhcmdldC5uYW1lLCBwcm9wcy5oaWRlQWxsUGFuZWxzLCBwcm9wcy5pMThuKCdkb25lJyksIHRhcmdldC5yZW5kZXIocHJvcHMuc3RhdGUpKTtcbiAgfSksIHByb3BzLnByb2dyZXNzaW5kaWNhdG9ycy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQucmVuZGVyKHByb3BzLnN0YXRlKTtcbiAgfSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGFzaGJvYXJkLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxmaWVsZHNldCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1maWVsZHNldFwiPlxcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkLWxhYmVsXCI+JywgJzwvbGFiZWw+XFxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtaW5wdXRcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCInLCAnXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCInLCAnXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb25rZXl1cD0nLCAnIC8+PC9maWVsZHNldD4nXSwgWyc8ZmllbGRzZXQgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtZmllbGRzZXRcIj5cXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1sYWJlbFwiPicsICc8L2xhYmVsPlxcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkLWlucHV0XCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG9ua2V5dXA9JywgJyAvPjwvZmllbGRzZXQ+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkXCIgYXJpYS1oaWRkZW49XCInLCAnXCI+XFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC1iYXJcIj5cXG4gICAgICA8aDIgY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC10aXRsZVwiPkVkaXRpbmcgPHNwYW4gY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC10aXRsZUZpbGVcIj4nLCAnPC9zcGFuPjwvaDI+XFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRDb250ZW50LWJhY2tcIiB0aXRsZT1cIkZpbmlzaCBlZGl0aW5nIGZpbGVcIlxcbiAgICAgICAgICAgICAgb25jbGljaz0nLCAnPkRvbmU8L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuICAgICcsICdcXG4gICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlCdXR0b24tLWNpcmN1bGFyIFVwcHlCdXR0b24tLWJsdWUgVXBweUJ1dHRvbi0tc2l6ZU0gVXBweURhc2hib2FyZEZpbGVDYXJkLWRvbmVcIiB0eXBlPVwiYnV0dG9uXCJcXG4gICAgICAgICAgICB0aXRsZT1cIkZpbmlzaCBlZGl0aW5nIGZpbGVcIiBvbmNsaWNrPScsICc+JywgJzwvYnV0dG9uPlxcbiAgICA8L2Rpdj4nXSwgWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkXCIgYXJpYS1oaWRkZW49XCInLCAnXCI+XFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC1iYXJcIj5cXG4gICAgICA8aDIgY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC10aXRsZVwiPkVkaXRpbmcgPHNwYW4gY2xhc3M9XCJVcHB5RGFzaGJvYXJkQ29udGVudC10aXRsZUZpbGVcIj4nLCAnPC9zcGFuPjwvaDI+XFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRDb250ZW50LWJhY2tcIiB0aXRsZT1cIkZpbmlzaCBlZGl0aW5nIGZpbGVcIlxcbiAgICAgICAgICAgICAgb25jbGljaz0nLCAnPkRvbmU8L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuICAgICcsICdcXG4gICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlCdXR0b24tLWNpcmN1bGFyIFVwcHlCdXR0b24tLWJsdWUgVXBweUJ1dHRvbi0tc2l6ZU0gVXBweURhc2hib2FyZEZpbGVDYXJkLWRvbmVcIiB0eXBlPVwiYnV0dG9uXCJcXG4gICAgICAgICAgICB0aXRsZT1cIkZpbmlzaCBlZGl0aW5nIGZpbGVcIiBvbmNsaWNrPScsICc+JywgJzwvYnV0dG9uPlxcbiAgICA8L2Rpdj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtaW5uZXJcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1wcmV2aWV3XCI+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1pbmZvXCI+XFxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkLWZpZWxkc2V0XCI+XFxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtbGFiZWxcIj5OYW1lPC9sYWJlbD5cXG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1pbnB1dFwiIG5hbWU9XCJuYW1lXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICAgIG9ua2V5dXA9JywgJyAvPlxcbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PiddLCBbJzxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtaW5uZXJcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1wcmV2aWV3XCI+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1pbmZvXCI+XFxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiVXBweURhc2hib2FyZEZpbGVDYXJkLWZpZWxkc2V0XCI+XFxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJVcHB5RGFzaGJvYXJkRmlsZUNhcmQtbGFiZWxcIj5OYW1lPC9sYWJlbD5cXG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRGaWxlQ2FyZC1pbnB1dFwiIG5hbWU9XCJuYW1lXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICAgIG9ua2V5dXA9JywgJyAvPlxcbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3Q0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPGltZyBhbHQ9XCInLCAnXCIgc3JjPVwiJywgJ1wiPiddLCBbJzxpbWcgYWx0PVwiJywgJ1wiIHNyYz1cIicsICdcIj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1wcmV2aWV3SWNvblwiPicsICc8L2Rpdj4nXSwgWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tcHJldmlld0ljb25cIj4nLCAnPC9kaXY+J10pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmaWxlQ2FyZDtcblxudmFyIF9odG1sID0gcmVxdWlyZSgnLi4vLi4vY29yZS9odG1sJyk7XG5cbnZhciBfaHRtbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sKTtcblxudmFyIF9pY29ucyA9IHJlcXVpcmUoJy4vaWNvbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykgeyBzdHJpbmdzLnJhdyA9IHJhdzsgcmV0dXJuIHN0cmluZ3M7IH1cblxuZnVuY3Rpb24gZ2V0SWNvbkJ5TWltZShmaWxlVHlwZUdlbmVyYWwpIHtcbiAgc3dpdGNoIChmaWxlVHlwZUdlbmVyYWwpIHtcbiAgICBjYXNlICd0ZXh0JzpcbiAgICAgIHJldHVybiAoMCwgX2ljb25zLmljb25UZXh0KSgpO1xuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIHJldHVybiAoMCwgX2ljb25zLmljb25BdWRpbykoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICgwLCBfaWNvbnMuaWNvbkZpbGUpKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsZUNhcmQocHJvcHMpIHtcbiAgdmFyIGZpbGUgPSBwcm9wcy5maWxlQ2FyZEZvciA/IHByb3BzLmZpbGVzW3Byb3BzLmZpbGVDYXJkRm9yXSA6IGZhbHNlO1xuICB2YXIgbWV0YSA9IHt9O1xuXG4gIGZ1bmN0aW9uIHRlbXBTdG9yZU1ldGEoZXYpIHtcbiAgICB2YXIgdmFsdWUgPSBldi50YXJnZXQudmFsdWU7XG4gICAgdmFyIG5hbWUgPSBldi50YXJnZXQuYXR0cmlidXRlcy5uYW1lLnZhbHVlO1xuICAgIG1ldGFbbmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlck1ldGFGaWVsZHMoZmlsZSkge1xuICAgIHZhciBtZXRhRmllbGRzID0gcHJvcHMubWV0YUZpZWxkcyB8fCBbXTtcbiAgICByZXR1cm4gbWV0YUZpZWxkcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QsIGZpZWxkLm5hbWUsIGZpZWxkLmlkLCBmaWxlLm1ldGFbZmllbGQuaWRdLCBmaWVsZC5wbGFjZWhvbGRlciB8fCAnJywgdGVtcFN0b3JlTWV0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyLCAhcHJvcHMuZmlsZUNhcmRGb3IsIGZpbGUubWV0YSA/IGZpbGUubWV0YS5uYW1lIDogZmlsZS5uYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmRvbmUobWV0YSwgZmlsZS5pZCk7XG4gIH0sIHByb3BzLmZpbGVDYXJkRm9yID8gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QzLCBmaWxlLnByZXZpZXcgPyAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDQsIGZpbGUubmFtZSwgZmlsZS5wcmV2aWV3KSA6ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0NSwgZ2V0SWNvbkJ5TWltZShmaWxlLnR5cGUuZ2VuZXJhbCkpLCBmaWxlLm1ldGEubmFtZSwgdGVtcFN0b3JlTWV0YSwgcmVuZGVyTWV0YUZpZWxkcyhmaWxlKSkgOiBudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmRvbmUobWV0YSwgZmlsZS5pZCk7XG4gIH0sICgwLCBfaWNvbnMuY2hlY2tJY29uKSgpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVDYXJkLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxsaSBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtXFxuICAgICAgICAgICAgICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAnLCAnXCJcXG4gICAgICAgICAgICAgICAgICBpZD1cInVwcHlfJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCInLCAnXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLXByZXZpZXdcIj5cXG4gICAgICAgICcsICdcXG4gICAgICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1wcm9ncmVzc1wiPlxcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tcHJvZ3Jlc3NCdG5cIlxcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgb25jbGljaz0nLCAnPlxcbiAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICcsICdcXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0taW5mb1wiPlxcbiAgICAgIDxoNCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLW5hbWVcIiB0aXRsZT1cIicsICdcIj5cXG4gICAgICAgICcsICdcXG4gICAgICA8L2g0PlxcbiAgICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1zdGF0dXNcIj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tc3RhdHVzU2l6ZVwiPicsICc8L3NwYW4+XFxuICAgICAgPC9kaXY+XFxuICAgICAgJywgJ1xcbiAgICAgICcsICdcXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1hY3Rpb25cIj5cXG4gICAgICAnLCAnXFxuICAgIDwvZGl2PlxcbiAgPC9saT4nXSwgWyc8bGkgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbVxcbiAgICAgICAgICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICAgICAgICAgICAgJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgaWQ9XCJ1cHB5XycsICdcIlxcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiPlxcbiAgICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1wcmV2aWV3XCI+XFxuICAgICAgICAnLCAnXFxuICAgICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tcHJvZ3Jlc3NcIj5cXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLXByb2dyZXNzQnRuXCJcXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgICAnLCAnXFxuICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAnLCAnXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLWluZm9cIj5cXG4gICAgICA8aDQgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1uYW1lXCIgdGl0bGU9XCInLCAnXCI+XFxuICAgICAgICAnLCAnXFxuICAgICAgPC9oND5cXG4gICAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tc3RhdHVzXCI+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLXN0YXR1c1NpemVcIj4nLCAnPC9zcGFuPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgICcsICdcXG4gICAgICAnLCAnXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZEl0ZW0tYWN0aW9uXCI+XFxuICAgICAgJywgJ1xcbiAgICA8L2Rpdj5cXG4gIDwvbGk+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8aW1nIGFsdD1cIicsICdcIiBzcmM9XCInLCAnXCI+J10sIFsnPGltZyBhbHQ9XCInLCAnXCIgc3JjPVwiJywgJ1wiPiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3QzID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLXByb2dyZXNzSW5mb1wiXFxuICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCInLCAnXCI+XFxuICAgICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgIDwvZGl2PiddLCBbJzxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1wcm9ncmVzc0luZm9cIlxcbiAgICAgICAgICAgICAgICAgICB0aXRsZT1cIicsICdcIlxcbiAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiPlxcbiAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICA8L2Rpdj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzcGFuPicsICcg44O7IOKGkSAnLCAnL3M8L3NwYW4+J10sIFsnPHNwYW4+JywgJyDjg7sg4oaRICcsICcvczwvc3Bhbj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxhIGhyZWY9XCInLCAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XFxuICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgPC9hPiddLCBbJzxhIGhyZWY9XCInLCAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XFxuICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgPC9hPiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3Q2ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLWVkaXRcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgZmlsZVwiXFxuICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXQgZmlsZVwiXFxuICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAgICAgICAgICAgJywgJzwvYnV0dG9uPiddLCBbJzxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1lZGl0XCJcXG4gICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGZpbGVcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0IGZpbGVcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0nLCAnPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICcsICc8L2J1dHRvbj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1jb3B5TGlua1wiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29weSBsaW5rXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ29weSBsaW5rXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz4nLCAnPC9idXR0b24+J10sIFsnPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLWNvcHlMaW5rXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3B5IGxpbmtcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb3B5IGxpbmtcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0nLCAnPicsICc8L2J1dHRvbj4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0OCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkSXRlbS1yZW1vdmVcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBmaWxlXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIGZpbGVcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0nLCAnPlxcbiAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE4IDE3XCI+XFxuICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9XCIjMDAwXCIgY3g9XCI4LjYyXCIgY3k9XCI4LjM4M1wiIHJ4PVwiOC42MlwiIHJ5PVwiOC4zODNcIi8+XFxuICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT1cIiNGRkZcIiBmaWxsPVwiI0ZGRlwiIGQ9XCJNMTEgNi4xNDdMMTAuODUgNiA4LjUgOC4yODQgNi4xNSA2IDYgNi4xNDcgOC4zNSA4LjQzIDYgMTAuNzE3bC4xNS4xNDZMOC41IDguNTc4bDIuMzUgMi4yODQuMTUtLjE0Nkw4LjY1IDguNDN6XCIvPlxcbiAgICAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgICAgPC9idXR0b24+J10sIFsnPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRJdGVtLXJlbW92ZVwiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIGZpbGVcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgZmlsZVwiXFxuICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMVwiIHZpZXdCb3g9XCIwIDAgMTggMTdcIj5cXG4gICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD1cIiMwMDBcIiBjeD1cIjguNjJcIiBjeT1cIjguMzgzXCIgcng9XCI4LjYyXCIgcnk9XCI4LjM4M1wiLz5cXG4gICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPVwiI0ZGRlwiIGZpbGw9XCIjRkZGXCIgZD1cIk0xMSA2LjE0N0wxMC44NSA2IDguNSA4LjI4NCA2LjE1IDYgNiA2LjE0NyA4LjM1IDguNDMgNiAxMC43MTdsLjE1LjE0Nkw4LjUgOC41NzhsMi4zNSAyLjI4NC4xNS0uMTQ2TDguNjUgOC40M3pcIi8+XFxuICAgICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICAgICA8L2J1dHRvbj4nXSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbGVJdGVtO1xuXG52YXIgX2h0bWwgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2h0bWwnKTtcblxudmFyIF9odG1sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWwpO1xuXG52YXIgX1V0aWxzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9VdGlscycpO1xuXG52YXIgX3ByZXR0eUJ5dGVzID0gcmVxdWlyZSgncHJldHR5LWJ5dGVzJyk7XG5cbnZhciBfcHJldHR5Qnl0ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJldHR5Qnl0ZXMpO1xuXG52YXIgX0ZpbGVJdGVtUHJvZ3Jlc3MgPSByZXF1aXJlKCcuL0ZpbGVJdGVtUHJvZ3Jlc3MnKTtcblxudmFyIF9GaWxlSXRlbVByb2dyZXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZpbGVJdGVtUHJvZ3Jlc3MpO1xuXG52YXIgX2ljb25zID0gcmVxdWlyZSgnLi9pY29ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5mdW5jdGlvbiBnZXRJY29uQnlNaW1lKGZpbGVUeXBlR2VuZXJhbCkge1xuICBzd2l0Y2ggKGZpbGVUeXBlR2VuZXJhbCkge1xuICAgIGNhc2UgJ3RleHQnOlxuICAgICAgcmV0dXJuICgwLCBfaWNvbnMuaWNvblRleHQpKCk7XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgcmV0dXJuICgwLCBfaWNvbnMuaWNvbkF1ZGlvKSgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKDAsIF9pY29ucy5pY29uRmlsZSkoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWxlSXRlbShwcm9wcykge1xuICB2YXIgZmlsZSA9IHByb3BzLmZpbGU7XG5cbiAgdmFyIGlzVXBsb2FkZWQgPSBmaWxlLnByb2dyZXNzLnVwbG9hZENvbXBsZXRlO1xuICB2YXIgdXBsb2FkSW5Qcm9ncmVzc09yQ29tcGxldGUgPSBmaWxlLnByb2dyZXNzLnVwbG9hZFN0YXJ0ZWQ7XG4gIHZhciB1cGxvYWRJblByb2dyZXNzID0gZmlsZS5wcm9ncmVzcy51cGxvYWRTdGFydGVkICYmICFmaWxlLnByb2dyZXNzLnVwbG9hZENvbXBsZXRlO1xuICB2YXIgaXNQYXVzZWQgPSBmaWxlLmlzUGF1c2VkIHx8IGZhbHNlO1xuXG4gIHZhciBmaWxlTmFtZSA9ICgwLCBfVXRpbHMuZ2V0RmlsZU5hbWVBbmRFeHRlbnNpb24pKGZpbGUubWV0YS5uYW1lKVswXTtcbiAgdmFyIHRydW5jYXRlZEZpbGVOYW1lID0gKDAsIF9VdGlscy50cnVuY2F0ZVN0cmluZykoZmlsZU5hbWUsIDE1KTtcblxuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QsIHVwbG9hZEluUHJvZ3Jlc3MgPyAnaXMtaW5wcm9ncmVzcycgOiAnJywgaXNVcGxvYWRlZCA/ICdpcy1jb21wbGV0ZScgOiAnJywgaXNQYXVzZWQgPyAnaXMtcGF1c2VkJyA6ICcnLCBmaWxlLmlkLCBmaWxlLm1ldGEubmFtZSwgZmlsZS5wcmV2aWV3ID8gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyLCBmaWxlLm5hbWUsIGZpbGUucHJldmlldykgOiBnZXRJY29uQnlNaW1lKGZpbGUudHlwZS5nZW5lcmFsKSwgaXNVcGxvYWRlZCA/ICd1cGxvYWQgY29tcGxldGUnIDogZmlsZS5pc1BhdXNlZCA/ICdyZXN1bWUgdXBsb2FkJyA6ICdwYXVzZSB1cGxvYWQnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBpZiAoaXNVcGxvYWRlZCkgcmV0dXJuO1xuICAgIHByb3BzLnBhdXNlVXBsb2FkKGZpbGUuaWQpO1xuICB9LCAoMCwgX0ZpbGVJdGVtUHJvZ3Jlc3MyLmRlZmF1bHQpKHtcbiAgICBwcm9ncmVzczogZmlsZS5wcm9ncmVzcy5wZXJjZW50YWdlLFxuICAgIGZpbGVJRDogZmlsZS5pZFxuICB9KSwgcHJvcHMuc2hvd1Byb2dyZXNzRGV0YWlscyA/ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0MywgcHJvcHMuaTE4bignbG9jYWxEaXNrJyksIHByb3BzLmkxOG4oJ2xvY2FsRGlzaycpLCAhZmlsZS5pc1BhdXNlZCAmJiAhaXNVcGxvYWRlZCA/ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0NCwgKDAsIF9VdGlscy5wcmV0dHlFVEEpKCgwLCBfVXRpbHMuZ2V0RVRBKShmaWxlLnByb2dyZXNzKSksICgwLCBfcHJldHR5Qnl0ZXMyLmRlZmF1bHQpKCgwLCBfVXRpbHMuZ2V0U3BlZWQpKGZpbGUucHJvZ3Jlc3MpKSkgOiBudWxsKSA6IG51bGwsIGZpbGVOYW1lLCBmaWxlLnVwbG9hZFVSTCA/ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0NSwgZmlsZS51cGxvYWRVUkwsIGZpbGUuZXh0ZW5zaW9uID8gdHJ1bmNhdGVkRmlsZU5hbWUgKyAnLicgKyBmaWxlLmV4dGVuc2lvbiA6IHRydW5jYXRlZEZpbGVOYW1lKSA6IGZpbGUuZXh0ZW5zaW9uID8gdHJ1bmNhdGVkRmlsZU5hbWUgKyAnLicgKyBmaWxlLmV4dGVuc2lvbiA6IHRydW5jYXRlZEZpbGVOYW1lLCBmaWxlLmRhdGEuc2l6ZSA/ICgwLCBfcHJldHR5Qnl0ZXMyLmRlZmF1bHQpKGZpbGUuZGF0YS5zaXplKSA6ICc/JywgIXVwbG9hZEluUHJvZ3Jlc3NPckNvbXBsZXRlID8gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3Q2LCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBwcm9wcy5zaG93RmlsZUNhcmQoZmlsZS5pZCk7XG4gIH0sICgwLCBfaWNvbnMuaWNvbkVkaXQpKCkpIDogbnVsbCwgZmlsZS51cGxvYWRVUkwgPyAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDcsIGZ1bmN0aW9uICgpIHtcbiAgICAoMCwgX1V0aWxzLmNvcHlUb0NsaXBib2FyZCkoZmlsZS51cGxvYWRVUkwsIHByb3BzLmkxOG4oJ2NvcHlMaW5rVG9DbGlwYm9hcmRGYWxsYmFjaycpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb3BzLmxvZygnTGluayBjb3BpZWQgdG8gY2xpcGJvYXJkLicpO1xuICAgICAgcHJvcHMuaW5mbyhwcm9wcy5pMThuKCdjb3B5TGlua1RvQ2xpcGJvYXJkU3VjY2VzcycpLCAnaW5mbycsIDMwMDApO1xuICAgIH0pLmNhdGNoKHByb3BzLmxvZyk7XG4gIH0sICgwLCBfaWNvbnMuaWNvbkNvcHkpKCkpIDogbnVsbCwgIWlzVXBsb2FkZWQgPyAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDgsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvcHMucmVtb3ZlRmlsZShmaWxlLmlkKTtcbiAgfSkgOiBudWxsKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVJdGVtLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJ1xcbiAgICA8c3ZnIHdpZHRoPVwiNzBcIiBoZWlnaHQ9XCI3MFwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBjbGFzcz1cIlVwcHlJY29uIFVwcHlJY29uLXByb2dyZXNzQ2lyY2xlXCI+XFxuICAgICAgPGcgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxcbiAgICAgICAgPGNpcmNsZSByPVwiMTVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwiYmdcIi8+XFxuICAgICAgICA8Y2lyY2xlIHI9XCIxNVwiIGN4PVwiMThcIiBjeT1cIjE4XCIgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMTgsIDE4KVwiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1kYXNoYXJyYXk9XCIxMDBcIiBzdHJva2UtZGFzaG9mZnNldD1cIicsICdcIiBjbGFzcz1cInByb2dyZXNzXCIvPlxcbiAgICAgIDwvZz5cXG4gICAgICA8cG9seWdvbiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMywgMylcIiBwb2ludHM9XCIxMiAyMCAxMiAxMCAyMCAxNVwiIGNsYXNzPVwicGxheVwiLz5cXG4gICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTQuNSwgMTMpXCIgY2xhc3M9XCJwYXVzZVwiPlxcbiAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEwXCIgcng9XCIwXCIgLz5cXG4gICAgICAgIDxyZWN0IHg9XCI1XCIgeT1cIjBcIiB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMFwiIC8+XFxuICAgICAgPC9nPlxcbiAgICAgIDxwb2x5Z29uIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLCAzKVwiIHBvaW50cz1cIjE0IDIyLjUgNyAxNS4yNDU3MDY1IDguOTk5ODU4NTcgMTMuMTczMjgxNSAxNCAxOC4zNTQ3MTA0IDIyLjk3Mjk4ODMgOSAyNSAxMS4xMDA1NjM0XCIgY2xhc3M9XCJjaGVja1wiLz5cXG4gIDwvc3ZnPiddLCBbJ1xcbiAgICA8c3ZnIHdpZHRoPVwiNzBcIiBoZWlnaHQ9XCI3MFwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBjbGFzcz1cIlVwcHlJY29uIFVwcHlJY29uLXByb2dyZXNzQ2lyY2xlXCI+XFxuICAgICAgPGcgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxcbiAgICAgICAgPGNpcmNsZSByPVwiMTVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwiYmdcIi8+XFxuICAgICAgICA8Y2lyY2xlIHI9XCIxNVwiIGN4PVwiMThcIiBjeT1cIjE4XCIgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMTgsIDE4KVwiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1kYXNoYXJyYXk9XCIxMDBcIiBzdHJva2UtZGFzaG9mZnNldD1cIicsICdcIiBjbGFzcz1cInByb2dyZXNzXCIvPlxcbiAgICAgIDwvZz5cXG4gICAgICA8cG9seWdvbiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMywgMylcIiBwb2ludHM9XCIxMiAyMCAxMiAxMCAyMCAxNVwiIGNsYXNzPVwicGxheVwiLz5cXG4gICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTQuNSwgMTMpXCIgY2xhc3M9XCJwYXVzZVwiPlxcbiAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEwXCIgcng9XCIwXCIgLz5cXG4gICAgICAgIDxyZWN0IHg9XCI1XCIgeT1cIjBcIiB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMFwiIC8+XFxuICAgICAgPC9nPlxcbiAgICAgIDxwb2x5Z29uIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLCAzKVwiIHBvaW50cz1cIjE0IDIyLjUgNyAxNS4yNDU3MDY1IDguOTk5ODU4NTcgMTMuMTczMjgxNSAxNCAxOC4zNTQ3MTA0IDIyLjk3Mjk4ODMgOSAyNSAxMS4xMDA1NjM0XCIgY2xhc3M9XCJjaGVja1wiLz5cXG4gIDwvc3ZnPiddKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdCwgMTAwIC0gcHJvcHMucHJvZ3Jlc3MgfHwgMTAwKTtcbn07XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9XG5cbi8vIGh0dHA6Ly9jb2RlcGVuLmlvL0hhcmtrby9wZW4vclZ4dk5NXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lc3dhay9hZDRlYTU3YmNkNWZmN2FhNWQ0MlxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUl0ZW1Qcm9ncmVzcy5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8dWwgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWZpbGVzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcIj5cXG4gICAgICAnLCAnXFxuICAgICAgJywgJ1xcbiAgICA8L3VsPiddLCBbJzx1bCBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtZmlsZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgJywgJ1wiPlxcbiAgICAgICcsICdcXG4gICAgICAnLCAnXFxuICAgIDwvdWw+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1iZ0ljb25cIj5cXG4gICAgICAgICcsICdcXG4gICAgICAgIDxoNCBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtZHJvcEZpbGVzVGl0bGVcIj5Ecm9wIG9yIHBhc3RlIGZpbGVzIGhlcmU8L2g0PlxcbiAgICAgICA8L2Rpdj4nXSwgWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZC1iZ0ljb25cIj5cXG4gICAgICAgICcsICdcXG4gICAgICAgIDxoNCBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtZHJvcEZpbGVzVGl0bGVcIj5Ecm9wIG9yIHBhc3RlIGZpbGVzIGhlcmU8L2g0PlxcbiAgICAgICA8L2Rpdj4nXSk7XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbnZhciBfRmlsZUl0ZW0gPSByZXF1aXJlKCcuL0ZpbGVJdGVtJyk7XG5cbnZhciBfRmlsZUl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRmlsZUl0ZW0pO1xuXG52YXIgX2ljb25zID0gcmVxdWlyZSgnLi9pY29ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0LCBwcm9wcy50b3RhbEZpbGVDb3VudCA9PT0gMCA/ICdVcHB5RGFzaGJvYXJkLWZpbGVzLS1ub0ZpbGVzJyA6ICcnLCBwcm9wcy50b3RhbEZpbGVDb3VudCA9PT0gMCA/ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0MiwgKDAsIF9pY29ucy5kYXNoYm9hcmRCZ0ljb24pKCkpIDogbnVsbCwgT2JqZWN0LmtleXMocHJvcHMuZmlsZXMpLm1hcChmdW5jdGlvbiAoZmlsZUlEKSB7XG4gICAgcmV0dXJuICgwLCBfRmlsZUl0ZW0yLmRlZmF1bHQpKHtcbiAgICAgIGZpbGU6IHByb3BzLmZpbGVzW2ZpbGVJRF0sXG4gICAgICBzaG93RmlsZUNhcmQ6IHByb3BzLnNob3dGaWxlQ2FyZCxcbiAgICAgIHNob3dQcm9ncmVzc0RldGFpbHM6IHByb3BzLnNob3dQcm9ncmVzc0RldGFpbHMsXG4gICAgICBpbmZvOiBwcm9wcy5pbmZvLFxuICAgICAgbG9nOiBwcm9wcy5sb2csXG4gICAgICBpMThuOiBwcm9wcy5pMThuLFxuICAgICAgcmVtb3ZlRmlsZTogcHJvcHMucmVtb3ZlRmlsZSxcbiAgICAgIHBhdXNlVXBsb2FkOiBwcm9wcy5wYXVzZVVwbG9hZFxuICAgIH0pO1xuICB9KSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUxpc3QuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWFjdGlvbnNJdGVtXCI+XFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlUb3RhbFByb2dyZXNzXFxuICAgICAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICAgICAgICAnLCAnXCJcXG4gICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjcwXCIgaGVpZ2h0PVwiNzBcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgY2xhc3M9XCJVcHB5SWNvblwiPlxcbiAgICAgICAgICAgIDxnIGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cXG4gICAgICAgICAgICAgIDxjaXJjbGUgcj1cIjE1XCIgY3g9XCIxOFwiIGN5PVwiMThcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cImJnXCIvPlxcbiAgICAgICAgICAgICAgPGNpcmNsZSByPVwiMTVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAsIDE4LCAxOClcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtZGFzaGFycmF5PVwiMTAwXCIgc3Ryb2tlLWRhc2hvZmZzZXQ9XCInLCAnXCIgY2xhc3M9XCJwcm9ncmVzc1wiLz5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICAgICAgPHBvbHlnb24gdHJhbnNmb3JtPVwidHJhbnNsYXRlKDMsIDMpXCIgcG9pbnRzPVwiMTIgMjAgMTIgMTAgMjAgMTVcIiBjbGFzcz1cInBsYXlcIi8+XFxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE0LjUsIDEzKVwiIGNsYXNzPVwicGF1c2VcIj5cXG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMFwiIC8+XFxuICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIwXCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjBcIiAvPlxcbiAgICAgICAgICAgIDwvZz5cXG4gICAgICAgICAgICA8cG9seWdvbiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMiwgMylcIiBwb2ludHM9XCIxNCAyMi41IDcgMTUuMjQ1NzA2NSA4Ljk5OTg1ODU3IDEzLjE3MzI4MTUgMTQgMTguMzU0NzEwNCAyMi45NzI5ODgzIDkgMjUgMTEuMTAwNTYzNFwiIGNsYXNzPVwiY2hlY2tcIi8+XFxuICAgICAgICA8L3N2Zz5cXG4gICAgICA8L2J1dHRvbj5cXG4gICAgPC9kaXY+J10sIFsnXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWFjdGlvbnNJdGVtXCI+XFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlUb3RhbFByb2dyZXNzXFxuICAgICAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICAgICAgICAnLCAnXCJcXG4gICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjcwXCIgaGVpZ2h0PVwiNzBcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgY2xhc3M9XCJVcHB5SWNvblwiPlxcbiAgICAgICAgICAgIDxnIGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cXG4gICAgICAgICAgICAgIDxjaXJjbGUgcj1cIjE1XCIgY3g9XCIxOFwiIGN5PVwiMThcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cImJnXCIvPlxcbiAgICAgICAgICAgICAgPGNpcmNsZSByPVwiMTVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAsIDE4LCAxOClcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtZGFzaGFycmF5PVwiMTAwXCIgc3Ryb2tlLWRhc2hvZmZzZXQ9XCInLCAnXCIgY2xhc3M9XCJwcm9ncmVzc1wiLz5cXG4gICAgICAgICAgICA8L2c+XFxuICAgICAgICAgICAgPHBvbHlnb24gdHJhbnNmb3JtPVwidHJhbnNsYXRlKDMsIDMpXCIgcG9pbnRzPVwiMTIgMjAgMTIgMTAgMjAgMTVcIiBjbGFzcz1cInBsYXlcIi8+XFxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE0LjUsIDEzKVwiIGNsYXNzPVwicGF1c2VcIj5cXG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMFwiIC8+XFxuICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIwXCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjBcIiAvPlxcbiAgICAgICAgICAgIDwvZz5cXG4gICAgICAgICAgICA8cG9seWdvbiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMiwgMylcIiBwb2ludHM9XCIxNCAyMi41IDcgMTUuMjQ1NzA2NSA4Ljk5OTg1ODU3IDEzLjE3MzI4MTUgMTQgMTguMzU0NzEwNCAyMi45NzI5ODgzIDkgMjUgMTEuMTAwNTYzNFwiIGNsYXNzPVwiY2hlY2tcIi8+XFxuICAgICAgICA8L3N2Zz5cXG4gICAgICA8L2J1dHRvbj5cXG4gICAgPC9kaXY+J10pO1xuXG52YXIgX2h0bWwgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2h0bWwnKTtcblxudmFyIF9odG1sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcHJvcHMgPSBwcm9wcyB8fCB7fTtcblxuICB2YXIgdG9nZ2xlUGF1c2VSZXN1bWUgPSBmdW5jdGlvbiB0b2dnbGVQYXVzZVJlc3VtZSgpIHtcbiAgICBpZiAocHJvcHMuaXNBbGxDb21wbGV0ZSkgcmV0dXJuO1xuXG4gICAgaWYgKHByb3BzLmlzQWxsUGF1c2VkKSB7XG4gICAgICByZXR1cm4gcHJvcHMucmVzdW1lQWxsKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzLnBhdXNlQWxsKCk7XG4gIH07XG5cbiAgcmV0dXJuICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0LCBwcm9wcy5pc0FsbFBhdXNlZCA/ICdVcHB5VG90YWxQcm9ncmVzcy0taXMtcGF1c2VkJyA6ICcnLCBwcm9wcy5pc0FsbENvbXBsZXRlID8gJ1VwcHlUb3RhbFByb2dyZXNzLS1pcy1jb21wbGV0ZScgOiAnJywgdG9nZ2xlUGF1c2VSZXN1bWUsIDEwMCAtIHByb3BzLnRvdGFsUHJvZ3Jlc3MgfHwgMTAwKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9ncmVzc0NpcmNsZS5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWydcXG4gICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtc3RhdHVzQmFyXCI+XFxuICAgICAgJywgJ1xcbiAgICA8L2Rpdj4nXSwgWydcXG4gICAgPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmQtc3RhdHVzQmFyXCI+XFxuICAgICAgJywgJ1xcbiAgICA8L2Rpdj4nXSk7XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuXG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdCwgIXByb3BzLmlzQWxsQ29tcGxldGUgPyAhcHJvcHMuaXNBbGxQYXVzZWQgPyAnVXBsb2FkaW5nLi4uICcgKyBwcm9wcy5jb21wbGV0ZSArICcgLyAnICsgcHJvcHMuaW5Qcm9ncmVzcyArICfjg7snICsgKHByb3BzLnRvdGFsUHJvZ3Jlc3MgfHwgMCkgKyAnJeODuycgKyBwcm9wcy50b3RhbEVUQSArICfjg7vihpEgJyArIHByb3BzLnRvdGFsU3BlZWQgKyAnL3MnIDogJ1BhdXNlZCDjg7snICsgcHJvcHMudG90YWxQcm9ncmVzcyArICclJyA6IG51bGwpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YXR1c0Jhci5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8ZGl2IGNsYXNzPVwiVXBweURhc2hib2FyZFRhYnNcIj5cXG4gICAgPGgzIGNsYXNzPVwiVXBweURhc2hib2FyZFRhYnMtdGl0bGVcIj4nLCAnOjwvaDM+XFxuICAgIDxuYXY+XFxuICAgICAgPHVsIGNsYXNzPVwiVXBweURhc2hib2FyZFRhYnMtbGlzdFwiIHJvbGU9XCJ0YWJsaXN0XCI+XFxuICAgICAgICA8bGkgY2xhc3M9XCJVcHB5RGFzaGJvYXJkVGFiXCI+XFxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkVGFiLWJ0biBVcHB5RGFzaGJvYXJkLWZvY3VzXCJcXG4gICAgICAgICAgICAgICAgICByb2xlPVwidGFiXCJcXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxcbiAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiVXBweURhc2hib2FyZFRhYi1uYW1lXCI+JywgJzwvaDU+XFxuICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLWlucHV0XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNbXVwiIG11bHRpcGxlPVwidHJ1ZVwiXFxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT0nLCAnIC8+XFxuICAgICAgICA8L2xpPlxcbiAgICAgICAgJywgJ1xcbiAgICAgIDwvdWw+XFxuICAgIDwvbmF2PlxcbiAgPC9kaXY+J10sIFsnPGRpdiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWJzXCI+XFxuICAgIDxoMyBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWJzLXRpdGxlXCI+JywgJzo8L2gzPlxcbiAgICA8bmF2PlxcbiAgICAgIDx1bCBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWJzLWxpc3RcIiByb2xlPVwidGFibGlzdFwiPlxcbiAgICAgICAgPGxpIGNsYXNzPVwiVXBweURhc2hib2FyZFRhYlwiPlxcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiVXBweURhc2hib2FyZFRhYi1idG4gVXBweURhc2hib2FyZC1mb2N1c1wiXFxuICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYlwiXFxuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcXG4gICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWItbmFtZVwiPicsICc8L2g1PlxcbiAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiVXBweURhc2hib2FyZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzW11cIiBtdWx0aXBsZT1cInRydWVcIlxcbiAgICAgICAgICAgICAgICAgb25jaGFuZ2U9JywgJyAvPlxcbiAgICAgICAgPC9saT5cXG4gICAgICAgICcsICdcXG4gICAgICA8L3VsPlxcbiAgICA8L25hdj5cXG4gIDwvZGl2PiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3QyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPGxpIGNsYXNzPVwiVXBweURhc2hib2FyZFRhYlwiPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJVcHB5RGFzaGJvYXJkVGFiLWJ0blwiXFxuICAgICAgICAgICAgICAgICAgICByb2xlPVwidGFiXCJcXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXFxuICAgICAgICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiJywgJy0tJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJVcHB5RGFzaGJvYXJkVGFiLW5hbWVcIj4nLCAnPC9oNT5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgPC9saT4nXSwgWyc8bGkgY2xhc3M9XCJVcHB5RGFzaGJvYXJkVGFiXCI+XFxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWItYnRuXCJcXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0YWJcIlxcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCInLCAnLS0nLCAnXCJcXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9XCInLCAnXCJcXG4gICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cIlVwcHlEYXNoYm9hcmRUYWItbmFtZVwiPicsICc8L2g1PlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICA8L2xpPiddKTtcblxudmFyIF9odG1sID0gcmVxdWlyZSgnLi4vLi4vY29yZS9odG1sJyk7XG5cbnZhciBfaHRtbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sKTtcblxudmFyIF9pY29ucyA9IHJlcXVpcmUoJy4vaWNvbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykgeyBzdHJpbmdzLnJhdyA9IHJhdzsgcmV0dXJuIHN0cmluZ3M7IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdCwgcHJvcHMuaTE4bignaW1wb3J0RnJvbScpLCBmdW5jdGlvbiAoZXYpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHByb3BzLmNvbnRhaW5lciArICcgLlVwcHlEYXNoYm9hcmQtaW5wdXQnKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9LCAoMCwgX2ljb25zLmxvY2FsSWNvbikoKSwgcHJvcHMuaTE4bignbG9jYWxEaXNrJyksIHByb3BzLmhhbmRsZUlucHV0Q2hhbmdlLCBwcm9wcy5hY3F1aXJlcnMubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyLCBwcm9wcy5wYW5lbFNlbGVjdG9yUHJlZml4LCB0YXJnZXQuaWQsIHRhcmdldC5pc0hpZGRlbiA/ICdmYWxzZScgOiAndHJ1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcm9wcy5zaG93UGFuZWwodGFyZ2V0LmlkKTtcbiAgICB9LCB0YXJnZXQuaWNvbiwgdGFyZ2V0Lm5hbWUpO1xuICB9KSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFicy5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8YnV0dG9uIGNsYXNzPVwiVXBweUJ1dHRvbi0tY2lyY3VsYXJcXG4gICAgICAgICAgICAgICAgICAgVXBweUJ1dHRvbi0tYmx1ZVxcbiAgICAgICAgICAgICAgICAgICBVcHB5QnV0dG9uLS1zaXplTVxcbiAgICAgICAgICAgICAgICAgICBVcHB5RGFzaGJvYXJkLXVwbG9hZFwiXFxuICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcXG4gICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICAgIDxzdXAgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLXVwbG9hZENvdW50XCJcXG4gICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiPlxcbiAgICAgICAgICAgICAgICAgICcsICc8L3N1cD5cXG4gICAgPC9idXR0b24+XFxuICAnXSwgWyc8YnV0dG9uIGNsYXNzPVwiVXBweUJ1dHRvbi0tY2lyY3VsYXJcXG4gICAgICAgICAgICAgICAgICAgVXBweUJ1dHRvbi0tYmx1ZVxcbiAgICAgICAgICAgICAgICAgICBVcHB5QnV0dG9uLS1zaXplTVxcbiAgICAgICAgICAgICAgICAgICBVcHB5RGFzaGJvYXJkLXVwbG9hZFwiXFxuICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcXG4gICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgJywgJ1xcbiAgICAgICAgICAgIDxzdXAgY2xhc3M9XCJVcHB5RGFzaGJvYXJkLXVwbG9hZENvdW50XCJcXG4gICAgICAgICAgICAgICAgIHRpdGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJywgJ1wiPlxcbiAgICAgICAgICAgICAgICAgICcsICc8L3N1cD5cXG4gICAgPC9idXR0b24+XFxuICAnXSk7XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbnZhciBfaWNvbnMgPSByZXF1aXJlKCcuL2ljb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuXG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdCwgcHJvcHMuaTE4bigndXBsb2FkQWxsTmV3RmlsZXMnKSwgcHJvcHMuaTE4bigndXBsb2FkQWxsTmV3RmlsZXMnKSwgcHJvcHMuc3RhcnRVcGxvYWQsICgwLCBfaWNvbnMudXBsb2FkSWNvbikoKSwgcHJvcHMuaTE4bignbnVtYmVyT2ZTZWxlY3RlZEZpbGVzJyksIHByb3BzLmkxOG4oJ251bWJlck9mU2VsZWN0ZWRGaWxlcycpLCBwcm9wcy5uZXdGaWxlQ291bnQpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVwbG9hZEJ0bi5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiB2aWV3Qm94PVwiMCAwIDMwIDMwXCI+XFxuICAgIDxwYXRoIGQ9XCJNMTUgMzBjOC4yODQgMCAxNS02LjcxNiAxNS0xNSAwLTguMjg0LTYuNzE2LTE1LTE1LTE1QzYuNzE2IDAgMCA2LjcxNiAwIDE1YzAgOC4yODQgNi43MTYgMTUgMTUgMTV6bTQuMjU4LTEyLjY3NnY2Ljg0NmgtOC40MjZ2LTYuODQ2SDUuMjA0bDkuODItMTIuMzY0IDkuODIgMTIuMzY0SDE5LjI2elwiIC8+XFxuICA8L3N2Zz4nXSwgWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiB2aWV3Qm94PVwiMCAwIDMwIDMwXCI+XFxuICAgIDxwYXRoIGQ9XCJNMTUgMzBjOC4yODQgMCAxNS02LjcxNiAxNS0xNSAwLTguMjg0LTYuNzE2LTE1LTE1LTE1QzYuNzE2IDAgMCA2LjcxNiAwIDE1YzAgOC4yODQgNi43MTYgMTUgMTUgMTV6bTQuMjU4LTEyLjY3NnY2Ljg0NmgtOC40MjZ2LTYuODQ2SDUuMjA0bDkuODItMTIuMzY0IDkuODIgMTIuMzY0SDE5LjI2elwiIC8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiNTFcIiBoZWlnaHQ9XCI1MVwiIHZpZXdCb3g9XCIwIDAgNTEgNTFcIj5cXG4gICAgPHBhdGggZD1cIk0xNy4yMSA0NS43NjVhNS4zOTQgNS4zOTQgMCAwIDEtNy42MiAwbC00LjEyLTQuMTIyYTUuMzkzIDUuMzkzIDAgMCAxIDAtNy42MThsNi43NzQtNi43NzUtMi40MDQtMi40MDQtNi43NzUgNi43NzZjLTMuNDI0IDMuNDI3LTMuNDI0IDkgMCAxMi40MjZsNC4xMiA0LjEyM2E4Ljc2NiA4Ljc2NiAwIDAgMCA2LjIxNiAyLjU3YzIuMjUgMCA0LjUtLjg1OCA2LjIxNC0yLjU3bDEzLjU1LTEzLjU1MmE4LjcyIDguNzIgMCAwIDAgMi41NzUtNi4yMTMgOC43MyA4LjczIDAgMCAwLTIuNTc1LTYuMjEzbC00LjEyMy00LjEyLTIuNDA0IDIuNDA0IDQuMTIzIDQuMTJhNS4zNTIgNS4zNTIgMCAwIDEgMS41OCAzLjgxYzAgMS40MzgtLjU2MiAyLjc5LTEuNTggMy44MDhsLTEzLjU1IDEzLjU1elwiLz5cXG4gICAgPHBhdGggZD1cIk00NC4yNTYgMi44NThBOC43MjggOC43MjggMCAwIDAgMzguMDQzLjI4M2gtLjAwMmE4LjczIDguNzMgMCAwIDAtNi4yMTIgMi41NzRsLTEzLjU1IDEzLjU1YTguNzI1IDguNzI1IDAgMCAwLTIuNTc1IDYuMjE0IDguNzMgOC43MyAwIDAgMCAyLjU3NCA2LjIxNmw0LjEyIDQuMTIgMi40MDUtMi40MDMtNC4xMi00LjEyYTUuMzU3IDUuMzU3IDAgMCAxLTEuNTgtMy44MTJjMC0xLjQzNy41NjItMi43OSAxLjU4LTMuODA4bDEzLjU1LTEzLjU1YTUuMzQ4IDUuMzQ4IDAgMCAxIDMuODEtMS41OGMxLjQ0IDAgMi43OTIuNTYyIDMuODEgMS41OGw0LjEyIDQuMTJjMi4xIDIuMSAyLjEgNS41MTggMCA3LjYxN0wzOS4yIDIzLjc3NWwyLjQwNCAyLjQwNCA2Ljc3NS02Ljc3N2MzLjQyNi0zLjQyNyAzLjQyNi05IDAtMTIuNDI2bC00LjEyLTQuMTJ6XCIvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCI1MVwiIGhlaWdodD1cIjUxXCIgdmlld0JveD1cIjAgMCA1MSA1MVwiPlxcbiAgICA8cGF0aCBkPVwiTTE3LjIxIDQ1Ljc2NWE1LjM5NCA1LjM5NCAwIDAgMS03LjYyIDBsLTQuMTItNC4xMjJhNS4zOTMgNS4zOTMgMCAwIDEgMC03LjYxOGw2Ljc3NC02Ljc3NS0yLjQwNC0yLjQwNC02Ljc3NSA2Ljc3NmMtMy40MjQgMy40MjctMy40MjQgOSAwIDEyLjQyNmw0LjEyIDQuMTIzYTguNzY2IDguNzY2IDAgMCAwIDYuMjE2IDIuNTdjMi4yNSAwIDQuNS0uODU4IDYuMjE0LTIuNTdsMTMuNTUtMTMuNTUyYTguNzIgOC43MiAwIDAgMCAyLjU3NS02LjIxMyA4LjczIDguNzMgMCAwIDAtMi41NzUtNi4yMTNsLTQuMTIzLTQuMTItMi40MDQgMi40MDQgNC4xMjMgNC4xMmE1LjM1MiA1LjM1MiAwIDAgMSAxLjU4IDMuODFjMCAxLjQzOC0uNTYyIDIuNzktMS41OCAzLjgwOGwtMTMuNTUgMTMuNTV6XCIvPlxcbiAgICA8cGF0aCBkPVwiTTQ0LjI1NiAyLjg1OEE4LjcyOCA4LjcyOCAwIDAgMCAzOC4wNDMuMjgzaC0uMDAyYTguNzMgOC43MyAwIDAgMC02LjIxMiAyLjU3NGwtMTMuNTUgMTMuNTVhOC43MjUgOC43MjUgMCAwIDAtMi41NzUgNi4yMTQgOC43MyA4LjczIDAgMCAwIDIuNTc0IDYuMjE2bDQuMTIgNC4xMiAyLjQwNS0yLjQwMy00LjEyLTQuMTJhNS4zNTcgNS4zNTcgMCAwIDEtMS41OC0zLjgxMmMwLTEuNDM3LjU2Mi0yLjc5IDEuNTgtMy44MDhsMTMuNTUtMTMuNTVhNS4zNDggNS4zNDggMCAwIDEgMy44MS0xLjU4YzEuNDQgMCAyLjc5Mi41NjIgMy44MSAxLjU4bDQuMTIgNC4xMmMyLjEgMi4xIDIuMSA1LjUxOCAwIDcuNjE3TDM5LjIgMjMuNzc1bDIuNDA0IDIuNDA0IDYuNzc1LTYuNzc3YzMuNDI2LTMuNDI3IDMuNDI2LTkgMC0xMi40MjZsLTQuMTItNC4xMnpcIi8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjVcIiBoZWlnaHQ9XCIyNVwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj5cXG4gICAgPHBvbHlnb24gY2xhc3M9XCJwbGF5XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDYsIDUuNSlcIiBwb2ludHM9XCIxMyAyMS42NjY2NjY3IDEzIDExIDIxIDE2LjMzMzMzMzNcIiAvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiPlxcbiAgICA8cG9seWdvbiBjbGFzcz1cInBsYXlcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiwgNS41KVwiIHBvaW50cz1cIjEzIDIxLjY2NjY2NjcgMTMgMTEgMjEgMTYuMzMzMzMzM1wiIC8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjVweFwiIGhlaWdodD1cIjI1cHhcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCI+XFxuICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxOCwgMTcpXCIgY2xhc3M9XCJwYXVzZVwiPlxcbiAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMFwiIC8+XFxuICAgICAgPHJlY3QgeD1cIjZcIiB5PVwiMFwiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEwXCIgcng9XCIwXCIgLz5cXG4gICAgPC9nPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIyNXB4XCIgaGVpZ2h0PVwiMjVweFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj5cXG4gICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE4LCAxNylcIiBjbGFzcz1cInBhdXNlXCI+XFxuICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEwXCIgcng9XCIwXCIgLz5cXG4gICAgICA8cmVjdCB4PVwiNlwiIHk9XCIwXCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjBcIiAvPlxcbiAgICA8L2c+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjggMjhcIj5cXG4gICAgPHBhdGggZD1cIk0yNS40MzYgMi41NjZhNy45OCA3Ljk4IDAgMCAwLTIuMDc4LTEuNTFDMjIuNjM4LjcwMyAyMS45MDYuNSAyMS4xOTguNWEzIDMgMCAwIDAtMS4wMjMuMTcgMi40MzYgMi40MzYgMCAwIDAtLjg5My41NjJMMi4yOTIgMTguMjE3LjUgMjcuNWw5LjI4LTEuNzk2IDE2Ljk5LTE2Ljk5Yy4yNTUtLjI1NC40NDQtLjU2LjU2Mi0uODg4YTMgMyAwIDAgMCAuMTctMS4wMjNjMC0uNzA4LS4yMDUtMS40NC0uNTU1LTIuMTZhOCA4IDAgMCAwLTEuNTEtMi4wNzd6TTkuMDEgMjQuMjUybC00LjMxMy44MzRjMC0uMDMuMDA4LS4wNi4wMTItLjA5LjAwNy0uOTQ0LS43NC0xLjcxNS0xLjY3LTEuNzIzLS4wNCAwLS4wNzguMDA3LS4xMTguMDFsLjgzLTQuMjlMMTcuNzIgNS4wMjRsNS4yNjQgNS4yNjRMOS4wMSAyNC4yNTJ6bTE2Ljg0LTE2Ljk2YS44MTguODE4IDAgMCAxLS4xOTQuMzFsLTEuNTcgMS41Ny01LjI2LTUuMjYgMS41Ny0xLjU3YS44Mi44MiAwIDAgMSAuMzEtLjE5NCAxLjQ1IDEuNDUgMCAwIDEgLjQ5Mi0uMDc0Yy4zOTcgMCAuOTE3LjEyNiAxLjQ2OC4zOTcuNTUuMjcgMS4xMy42NzggMS42NTYgMS4yMS41My41My45NCAxLjExIDEuMjA4IDEuNjU1LjI3Mi41NS4zOTcgMS4wNy4zOTMgMS40NjguMDA0LjE5My0uMDI3LjM1OC0uMDc0LjQ4OHpcIiAvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjI4XCIgdmlld0JveD1cIjAgMCAyOCAyOFwiPlxcbiAgICA8cGF0aCBkPVwiTTI1LjQzNiAyLjU2NmE3Ljk4IDcuOTggMCAwIDAtMi4wNzgtMS41MUMyMi42MzguNzAzIDIxLjkwNi41IDIxLjE5OC41YTMgMyAwIDAgMC0xLjAyMy4xNyAyLjQzNiAyLjQzNiAwIDAgMC0uODkzLjU2MkwyLjI5MiAxOC4yMTcuNSAyNy41bDkuMjgtMS43OTYgMTYuOTktMTYuOTljLjI1NS0uMjU0LjQ0NC0uNTYuNTYyLS44ODhhMyAzIDAgMCAwIC4xNy0xLjAyM2MwLS43MDgtLjIwNS0xLjQ0LS41NTUtMi4xNmE4IDggMCAwIDAtMS41MS0yLjA3N3pNOS4wMSAyNC4yNTJsLTQuMzEzLjgzNGMwLS4wMy4wMDgtLjA2LjAxMi0uMDkuMDA3LS45NDQtLjc0LTEuNzE1LTEuNjctMS43MjMtLjA0IDAtLjA3OC4wMDctLjExOC4wMWwuODMtNC4yOUwxNy43MiA1LjAyNGw1LjI2NCA1LjI2NEw5LjAxIDI0LjI1MnptMTYuODQtMTYuOTZhLjgxOC44MTggMCAwIDEtLjE5NC4zMWwtMS41NyAxLjU3LTUuMjYtNS4yNiAxLjU3LTEuNTdhLjgyLjgyIDAgMCAxIC4zMS0uMTk0IDEuNDUgMS40NSAwIDAgMSAuNDkyLS4wNzRjLjM5NyAwIC45MTcuMTI2IDEuNDY4LjM5Ny41NS4yNyAxLjEzLjY3OCAxLjY1NiAxLjIxLjUzLjUzLjk0IDEuMTEgMS4yMDggMS42NTUuMjcyLjU1LjM5NyAxLjA3LjM5MyAxLjQ2OC4wMDQuMTkzLS4wMjcuMzU4LS4wNzQuNDg4elwiIC8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0NiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIyNVwiIHZpZXdCb3g9XCIwIDAgMjcgMjVcIj5cXG4gICAgPHBhdGggZD1cIk01LjU4NiA5LjI4OGEuMzEzLjMxMyAwIDAgMCAuMjgyLjE3Nmg0Ljg0djMuOTIyYzAgMS41MTQgMS4yNSAyLjI0IDIuNzkyIDIuMjQgMS41NCAwIDIuNzktLjcyNiAyLjc5LTIuMjRWOS40NjRoNC44NGMuMTIyIDAgLjIzLS4wNjguMjg0LS4xNzZhLjMwNC4zMDQgMCAwIDAtLjA0Ni0uMzI0TDEzLjczNS4xMDZhLjMxNi4zMTYgMCAwIDAtLjQ3MiAwbC03LjYzIDguODU3YS4zMDIuMzAyIDAgMCAwLS4wNDcuMzI1elwiLz5cXG4gICAgPHBhdGggZD1cIk0yNC4zIDUuMDkzYy0uMjE4LS43Ni0uNTQtMS4xODctMS4yMDgtMS4xODdoLTQuODU2bDEuMDE4IDEuMThoMy45NDhsMi4wNDMgMTEuMDM4aC03LjE5M3YyLjcyOEg5LjExNHYtMi43MjVoLTcuMzZsMi42Ni0xMS4wNGgzLjMzbDEuMDE4LTEuMThIMy45MDdjLS42NjggMC0xLjA2LjQ2LTEuMjEgMS4xODZMMCAxNi40NTZ2Ny4wNjJDMCAyNC4zMzguNjc2IDI1IDEuNTEgMjVoMjMuOThjLjgzMyAwIDEuNTEtLjY2MyAxLjUxLTEuNDgydi03LjA2MkwyNC4zIDUuMDkzelwiLz5cXG4gIDwvc3ZnPiddLCBbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIyNVwiIHZpZXdCb3g9XCIwIDAgMjcgMjVcIj5cXG4gICAgPHBhdGggZD1cIk01LjU4NiA5LjI4OGEuMzEzLjMxMyAwIDAgMCAuMjgyLjE3Nmg0Ljg0djMuOTIyYzAgMS41MTQgMS4yNSAyLjI0IDIuNzkyIDIuMjQgMS41NCAwIDIuNzktLjcyNiAyLjc5LTIuMjRWOS40NjRoNC44NGMuMTIyIDAgLjIzLS4wNjguMjg0LS4xNzZhLjMwNC4zMDQgMCAwIDAtLjA0Ni0uMzI0TDEzLjczNS4xMDZhLjMxNi4zMTYgMCAwIDAtLjQ3MiAwbC03LjYzIDguODU3YS4zMDIuMzAyIDAgMCAwLS4wNDcuMzI1elwiLz5cXG4gICAgPHBhdGggZD1cIk0yNC4zIDUuMDkzYy0uMjE4LS43Ni0uNTQtMS4xODctMS4yMDgtMS4xODdoLTQuODU2bDEuMDE4IDEuMThoMy45NDhsMi4wNDMgMTEuMDM4aC03LjE5M3YyLjcyOEg5LjExNHYtMi43MjVoLTcuMzZsMi42Ni0xMS4wNGgzLjMzbDEuMDE4LTEuMThIMy45MDdjLS42NjggMC0xLjA2LjQ2LTEuMjEgMS4xODZMMCAxNi40NTZ2Ny4wNjJDMCAyNC4zMzguNjc2IDI1IDEuNTEgMjVoMjMuOThjLjgzMyAwIDEuNTEtLjY2MyAxLjUxLTEuNDgydi03LjA2MkwyNC4zIDUuMDkzelwiLz5cXG4gIDwvc3ZnPiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3Q3ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIxNHB4XCIgaGVpZ2h0PVwiMTRweFwiIHZpZXdCb3g9XCIwIDAgMTkgMTlcIj5cXG4gICAgPHBvbHlnb24gcG9pbnRzPVwiMTcuMzE4MjUzOSAxNy4yMzI0NDY2IDkuOTM5NTUzMzkgOS44NTM3NDYxMSA5LjU4NiA5LjUwMDE5MjcyIDkuMjMyNDQ2NjEgOS44NTM3NDYxMSAxLjg1Mzc0NjExIDE3LjIzMjQ0NjYgMi41NjA4NTI4OSAxNy4yMzI0NDY2IDEuOTM5NTUzMzkgMTYuNjExMTQ3MSAxLjkzOTU1ODY1IDE3LjMxODI0ODYgOS4zMTgwMzk0NiA5LjkzOTU0ODEzIDkuNjcxNTgyMzIgOS41ODU5OTQ3NCA5LjMxODAzNDE5IDkuMjMyNDQ2NjEgMS45Mzk1NTMzOSAxLjg1Mzk2NTgxIDEuOTM5NjE1ODggMi41NjEwMTAwOCAyLjU2MDkxNTM4IDEuOTM5NDkwODkgMS44NTM3NTEzNyAxLjkzOTU1ODY1IDkuMjMyNDUxODcgOS4zMTgwMzk0NiA5LjU4NiA5LjY3MTU3NzA2IDkuOTM5NTQ4MTMgOS4zMTgwMzk0NiAxNy4zMTgyNDg2IDEuOTM5NTU4NjUgMTYuNjExMTQ3MSAxLjkzOTU1MzM5IDE3LjIzMjQ0NjYgMi41NjA4NTI4OSAxNy4yMzI0NDY2IDEuODUzNzQ2MTEgOS44NTM3NDYxMSA5LjIzMjQ0NjYxIDkuNTAwMTkyNzIgOS41ODYgOS44NTM3NDYxMSA5LjkzOTU1MzM5IDE3LjIzMjQ0NjYgMTcuMzE4MjUzOSAxNy45Mzk1NTM0IDE2LjYxMTE0NzEgMTAuNTYwODUyOSA5LjIzMjQ0NjYxIDEwLjU2MDg1MjkgOS45Mzk1NTMzOSAxNy45Mzk1NTM0IDIuNTYwODUyODkgMTguMjkzMTA2OCAyLjIwNzI5OTUgMTcuOTM5NTUzNCAxLjg1Mzc0NjExIDE3LjMxODI1MzkgMS4yMzI0NDY2MSAxNi45NjQ3MDU4IDAuODc4ODk4NDgyIDE2LjYxMTE1MjQgMS4yMzI0NDEzNSA5LjIzMjQ1MTg3IDguNjEwOTIyMTUgOS45Mzk1NDgxMyA4LjYxMDkyMjE1IDIuNTYwODQ3NjMgMS4yMzI0NDEzNSAyLjIwNzIzMTczIDAuODc4ODM1OTggMS44NTM2ODM2MiAxLjIzMjUwOTExIDEuMjMyMzg0MTIgMS44NTQwMjgzMSAwLjg3ODk1NTcxMiAyLjIwNzU4MTY5IDEuMjMyNDQ2NjEgMi41NjEwNzI1OSA4LjYxMDkyNzQxIDkuOTM5NTUzMzkgOC42MTA5MjIxNSA5LjIzMjQ1MTg3IDEuMjMyNDQxMzUgMTYuNjExMTUyNCAwLjg3ODg5ODQ4MiAxNi45NjQ3MDU4IDEuMjMyNDQ2NjEgMTcuMzE4MjUzOSAxLjg1Mzc0NjExIDE3LjkzOTU1MzQgMi4yMDcyOTk1IDE4LjI5MzEwNjggMi41NjA4NTI4OSAxNy45Mzk1NTM0IDkuOTM5NTUzMzkgMTAuNTYwODUyOSA5LjIzMjQ0NjYxIDEwLjU2MDg1MjkgMTYuNjExMTQ3MSAxNy45Mzk1NTM0XCI+PC9wb2x5Z29uPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIxNHB4XCIgaGVpZ2h0PVwiMTRweFwiIHZpZXdCb3g9XCIwIDAgMTkgMTlcIj5cXG4gICAgPHBvbHlnb24gcG9pbnRzPVwiMTcuMzE4MjUzOSAxNy4yMzI0NDY2IDkuOTM5NTUzMzkgOS44NTM3NDYxMSA5LjU4NiA5LjUwMDE5MjcyIDkuMjMyNDQ2NjEgOS44NTM3NDYxMSAxLjg1Mzc0NjExIDE3LjIzMjQ0NjYgMi41NjA4NTI4OSAxNy4yMzI0NDY2IDEuOTM5NTUzMzkgMTYuNjExMTQ3MSAxLjkzOTU1ODY1IDE3LjMxODI0ODYgOS4zMTgwMzk0NiA5LjkzOTU0ODEzIDkuNjcxNTgyMzIgOS41ODU5OTQ3NCA5LjMxODAzNDE5IDkuMjMyNDQ2NjEgMS45Mzk1NTMzOSAxLjg1Mzk2NTgxIDEuOTM5NjE1ODggMi41NjEwMTAwOCAyLjU2MDkxNTM4IDEuOTM5NDkwODkgMS44NTM3NTEzNyAxLjkzOTU1ODY1IDkuMjMyNDUxODcgOS4zMTgwMzk0NiA5LjU4NiA5LjY3MTU3NzA2IDkuOTM5NTQ4MTMgOS4zMTgwMzk0NiAxNy4zMTgyNDg2IDEuOTM5NTU4NjUgMTYuNjExMTQ3MSAxLjkzOTU1MzM5IDE3LjIzMjQ0NjYgMi41NjA4NTI4OSAxNy4yMzI0NDY2IDEuODUzNzQ2MTEgOS44NTM3NDYxMSA5LjIzMjQ0NjYxIDkuNTAwMTkyNzIgOS41ODYgOS44NTM3NDYxMSA5LjkzOTU1MzM5IDE3LjIzMjQ0NjYgMTcuMzE4MjUzOSAxNy45Mzk1NTM0IDE2LjYxMTE0NzEgMTAuNTYwODUyOSA5LjIzMjQ0NjYxIDEwLjU2MDg1MjkgOS45Mzk1NTMzOSAxNy45Mzk1NTM0IDIuNTYwODUyODkgMTguMjkzMTA2OCAyLjIwNzI5OTUgMTcuOTM5NTUzNCAxLjg1Mzc0NjExIDE3LjMxODI1MzkgMS4yMzI0NDY2MSAxNi45NjQ3MDU4IDAuODc4ODk4NDgyIDE2LjYxMTE1MjQgMS4yMzI0NDEzNSA5LjIzMjQ1MTg3IDguNjEwOTIyMTUgOS45Mzk1NDgxMyA4LjYxMDkyMjE1IDIuNTYwODQ3NjMgMS4yMzI0NDEzNSAyLjIwNzIzMTczIDAuODc4ODM1OTggMS44NTM2ODM2MiAxLjIzMjUwOTExIDEuMjMyMzg0MTIgMS44NTQwMjgzMSAwLjg3ODk1NTcxMiAyLjIwNzU4MTY5IDEuMjMyNDQ2NjEgMi41NjEwNzI1OSA4LjYxMDkyNzQxIDkuOTM5NTUzMzkgOC42MTA5MjIxNSA5LjIzMjQ1MTg3IDEuMjMyNDQxMzUgMTYuNjExMTUyNCAwLjg3ODg5ODQ4MiAxNi45NjQ3MDU4IDEuMjMyNDQ2NjEgMTcuMzE4MjUzOSAxLjg1Mzc0NjExIDE3LjkzOTU1MzQgMi4yMDcyOTk1IDE4LjI5MzEwNjggMi41NjA4NTI4OSAxNy45Mzk1NTM0IDkuOTM5NTUzMzkgMTAuNTYwODUyOSA5LjIzMjQ0NjYxIDEwLjU2MDg1MjkgMTYuNjExMTQ3MSAxNy45Mzk1NTM0XCI+PC9wb2x5Z29uPlxcbiAgPC9zdmc+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDggPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgMCAzMiAzMFwiPlxcbiAgICAgIDxwYXRoIGQ9XCJNNi42MjA5ODk0LDExLjE0NTExNjIgQzYuNjgyMzA1MSwxMS4yNzUxNjY5IDYuODEzNzQyNDgsMTEuMzU3MjE4OCA2Ljk1NDYzODEzLDExLjM1NzIxODggTDEyLjY5MjU0ODIsMTEuMzU3MjE4OCBMMTIuNjkyNTQ4MiwxNi4wNjMwNDI3IEMxMi42OTI1NDgyLDE3Ljg4MDUwOSAxNC4xNzI2MDQ4LDE4Ljc1IDE2LjAwMDAwODMsMTguNzUgQzE3LjgyNjEwNzIsMTguNzUgMTkuMzA3NDY4NCwxNy44ODAxODQ3IDE5LjMwNzQ2ODQsMTYuMDYzMDQyNyBMMTkuMzA3NDY4NCwxMS4zNTcyMTg4IEwyNS4wNDM3NDc4LDExLjM1NzIxODggQzI1LjE4NzU3ODcsMTEuMzU3MjE4OCAyNS4zMTY0MDY5LDExLjI3NTE2NjkgMjUuMzc5MDI3MiwxMS4xNDUxMTYyIEMyNS40MzcwODE0LDExLjAxNzMzNTggMjUuNDE3MTg2NSwxMC44NjQyNTg3IDI1LjMyNTIxMjksMTAuNzU2MjYxNSBMMTYuMjc4MjEyLDAuMTI3MTMxODM3IEMxNi4yMDkzOTQ5LDAuMDQ2Mzc3MTc1MSAxNi4xMDY5ODQ2LDAgMTUuOTk5NjgyMiwwIEMxNS44OTEwNzUxLDAgMTUuNzg4NjY0OCwwLjA0NjM3NzE3NTEgMTUuNzE4MjE3LDAuMTI3MTMxODM3IEw2LjY3NjEwODMsMTAuNzU1OTM3MSBDNi41ODI1MDQwMiwxMC44NjQyNTg3IDYuNTYyOTM1MTgsMTEuMDE3MzM1OCA2LjYyMDk4OTQsMTEuMTQ1MTE2MiBMNi42MjA5ODk0LDExLjE0NTExNjIgWlwiLz5cXG4gICAgICA8cGF0aCBkPVwiTTI4LjgwMDg3MjIsNi4xMTE0MjY0NSBDMjguNTQxNzg5MSw1LjE5ODMxNTU1IDI4LjE1ODMzMzEsNC42ODc1IDI3LjM2ODQ4NDgsNC42ODc1IEwyMS42MTI0NDU0LDQuNjg3NSBMMjIuODE5MDIzNCw2LjEwMzA3ODc0IEwyNy40OTg2NzI1LDYuMTAzMDc4NzQgTDI5LjkxOTU4MTcsMTkuMzQ4NjQ0OSBMMjEuMzk0Mzg5MSwxOS4zNTAyNTAyIEwyMS4zOTQzODkxLDIyLjYyMjU1MiBMMTAuODAyMzQ2MSwyMi42MjI1NTIgTDEwLjgwMjM0NjEsMTkuMzUyNDk3NyBMMi4wNzgxNTcwMiwxOS4zNTM0NjA5IEw1LjIyOTc5Njk5LDYuMTAzMDc4NzQgTDkuMTc4NzE1MjksNi4xMDMwNzg3NCBMMTAuMzg0MDAxMSw0LjY4NzUgTDQuNjMwODY5MSw0LjY4NzUgQzMuODM5NDA1NTksNC42ODc1IDMuMzc0MjE4ODgsNS4yMzkwOTA5IDMuMTk4MTU4NjQsNi4xMTE0MjY0NSBMMCwxOS43NDcwODc0IEwwLDI4LjIyMTI5NTkgQzAsMjkuMjA0Mzk5MiAwLjgwMTQ3NzkzNywzMCAxLjc4ODcwNzUxLDMwIEwzMC4yMDk2NzczLDMwIEMzMS4xOTgxOTksMzAgMzIsMjkuMjA0Mzk5MiAzMiwyOC4yMjEyOTU5IEwzMiwxOS43NDcwODc0IEwyOC44MDA4NzIyLDYuMTExNDI2NDUgTDI4LjgwMDg3MjIsNi4xMTE0MjY0NSBaXCIvPlxcbiAgICA8L3N2Zz4nXSwgWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgMCAzMiAzMFwiPlxcbiAgICAgIDxwYXRoIGQ9XCJNNi42MjA5ODk0LDExLjE0NTExNjIgQzYuNjgyMzA1MSwxMS4yNzUxNjY5IDYuODEzNzQyNDgsMTEuMzU3MjE4OCA2Ljk1NDYzODEzLDExLjM1NzIxODggTDEyLjY5MjU0ODIsMTEuMzU3MjE4OCBMMTIuNjkyNTQ4MiwxNi4wNjMwNDI3IEMxMi42OTI1NDgyLDE3Ljg4MDUwOSAxNC4xNzI2MDQ4LDE4Ljc1IDE2LjAwMDAwODMsMTguNzUgQzE3LjgyNjEwNzIsMTguNzUgMTkuMzA3NDY4NCwxNy44ODAxODQ3IDE5LjMwNzQ2ODQsMTYuMDYzMDQyNyBMMTkuMzA3NDY4NCwxMS4zNTcyMTg4IEwyNS4wNDM3NDc4LDExLjM1NzIxODggQzI1LjE4NzU3ODcsMTEuMzU3MjE4OCAyNS4zMTY0MDY5LDExLjI3NTE2NjkgMjUuMzc5MDI3MiwxMS4xNDUxMTYyIEMyNS40MzcwODE0LDExLjAxNzMzNTggMjUuNDE3MTg2NSwxMC44NjQyNTg3IDI1LjMyNTIxMjksMTAuNzU2MjYxNSBMMTYuMjc4MjEyLDAuMTI3MTMxODM3IEMxNi4yMDkzOTQ5LDAuMDQ2Mzc3MTc1MSAxNi4xMDY5ODQ2LDAgMTUuOTk5NjgyMiwwIEMxNS44OTEwNzUxLDAgMTUuNzg4NjY0OCwwLjA0NjM3NzE3NTEgMTUuNzE4MjE3LDAuMTI3MTMxODM3IEw2LjY3NjEwODMsMTAuNzU1OTM3MSBDNi41ODI1MDQwMiwxMC44NjQyNTg3IDYuNTYyOTM1MTgsMTEuMDE3MzM1OCA2LjYyMDk4OTQsMTEuMTQ1MTE2MiBMNi42MjA5ODk0LDExLjE0NTExNjIgWlwiLz5cXG4gICAgICA8cGF0aCBkPVwiTTI4LjgwMDg3MjIsNi4xMTE0MjY0NSBDMjguNTQxNzg5MSw1LjE5ODMxNTU1IDI4LjE1ODMzMzEsNC42ODc1IDI3LjM2ODQ4NDgsNC42ODc1IEwyMS42MTI0NDU0LDQuNjg3NSBMMjIuODE5MDIzNCw2LjEwMzA3ODc0IEwyNy40OTg2NzI1LDYuMTAzMDc4NzQgTDI5LjkxOTU4MTcsMTkuMzQ4NjQ0OSBMMjEuMzk0Mzg5MSwxOS4zNTAyNTAyIEwyMS4zOTQzODkxLDIyLjYyMjU1MiBMMTAuODAyMzQ2MSwyMi42MjI1NTIgTDEwLjgwMjM0NjEsMTkuMzUyNDk3NyBMMi4wNzgxNTcwMiwxOS4zNTM0NjA5IEw1LjIyOTc5Njk5LDYuMTAzMDc4NzQgTDkuMTc4NzE1MjksNi4xMDMwNzg3NCBMMTAuMzg0MDAxMSw0LjY4NzUgTDQuNjMwODY5MSw0LjY4NzUgQzMuODM5NDA1NTksNC42ODc1IDMuMzc0MjE4ODgsNS4yMzkwOTA5IDMuMTk4MTU4NjQsNi4xMTE0MjY0NSBMMCwxOS43NDcwODc0IEwwLDI4LjIyMTI5NTkgQzAsMjkuMjA0Mzk5MiAwLjgwMTQ3NzkzNywzMCAxLjc4ODcwNzUxLDMwIEwzMC4yMDk2NzczLDMwIEMzMS4xOTgxOTksMzAgMzIsMjkuMjA0Mzk5MiAzMiwyOC4yMjEyOTU5IEwzMiwxOS43NDcwODc0IEwyOC44MDA4NzIyLDYuMTExNDI2NDUgTDI4LjgwMDg3MjIsNi4xMTE0MjY0NSBaXCIvPlxcbiAgICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0OSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvbiBVcHB5SWNvbi1jaGVja1wiIHdpZHRoPVwiMTNweFwiIGhlaWdodD1cIjlweFwiIHZpZXdCb3g9XCIwIDAgMTMgOVwiPlxcbiAgICA8cG9seWdvbiBwb2ludHM9XCI1IDcuMjkzIDEuMzU0IDMuNjQ3IDAuNjQ2IDQuMzU0IDUgOC43MDcgMTIuMzU0IDEuMzU0IDExLjY0NiAwLjY0N1wiPjwvcG9seWdvbj5cXG4gIDwvc3ZnPiddLCBbJzxzdmcgY2xhc3M9XCJVcHB5SWNvbiBVcHB5SWNvbi1jaGVja1wiIHdpZHRoPVwiMTNweFwiIGhlaWdodD1cIjlweFwiIHZpZXdCb3g9XCIwIDAgMTMgOVwiPlxcbiAgICA8cG9seWdvbiBwb2ludHM9XCI1IDcuMjkzIDEuMzU0IDMuNjQ3IDAuNjQ2IDQuMzU0IDUgOC43MDcgMTIuMzU0IDEuMzU0IDExLjY0NiAwLjY0N1wiPjwvcG9seWdvbj5cXG4gIDwvc3ZnPiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3QxMCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMzRcIiBoZWlnaHQ9XCI5MVwiIHZpZXdCb3g9XCIwIDAgMzQgOTFcIj5cXG4gICAgPHBhdGggZD1cIk0yMi4zNjYgNDMuMTM0VjI5LjMzYzUuODkyLTYuNTg4IDEwLjk4Ni0xNC41MDcgMTAuOTg2LTIyLjE4MyAwLTQuMTE0LTIuOTg2LTcuMS03LjEtNy4xLTMuOTE0IDAtNy4xIDMuMTg2LTcuMSA3LjF2MjAuOTM2YTkyLjU2MiA5Mi41NjIgMCAwIDEtNS43MjggNS42NzdsLS4zODQuMzQ4QzQuNjQzIDQxLjc2Mi40MjggNDUuNjA0LjQyOCA1NC44MDJjMCA4Ljg2NiA3LjIxNCAxNi4wOCAxNi4wOCAxNi4wOC45MDIgMCAxLjc4NC0uMDc0IDIuNjQ0LS4yMTZ2MTEuMjZjMCAyLjcwMi0yLjE5OCA0LjktNC45IDQuOWE0Ljg1NSA0Ljg1NSAwIDAgMS0yLjk1LTEuMDE1YzIuMzY0LS4yNCA0LjIyMi0yLjIxOCA0LjIyMi00LjY0M2E0LjY5OCA0LjY5OCAwIDAgMC00LjY5Mi00LjY5MiA0LjczOCA0LjczOCAwIDAgMC00LjIxMyAyLjYyOGMtLjkyMyAxLjg3NC0uNTYgNC4zODYuMjc3IDYuMjI4YTcuODIgNy44MiAwIDAgMCAuOSAxLjUwMiA4LjE3OCA4LjE3OCAwIDAgMCA0LjIzIDIuODk2Yy43MjMuMjA3IDEuNDc0LjMxIDIuMjI2LjMxIDQuNDc0IDAgOC4xMTMtMy42NCA4LjExMy04LjExM1Y2OS43OGM1Ljk4LTIuMzQ1IDEwLjIyNS04LjE3NiAxMC4yMjUtMTQuOTc3IDAtNS45NzUtNC40NjQtMTAuODc2LTEwLjIyNC0xMS42N3ptMC0zNS45ODdhMy44OSAzLjg5IDAgMCAxIDMuODg3LTMuODg1YzEuOTMzIDAgMy44ODUgMS4yMDIgMy44ODUgMy44ODUgMCA0Ljk1LTIuNzAyIDEwLjg2Mi03Ljc3MiAxNy4yMDRWNy4xNDh6TTE2LjUxIDY3LjY3Yy03LjA5NiAwLTEyLjg2Ny01Ljc3LTEyLjg2Ny0xMi44NjcgMC03Ljc4IDMuMzg1LTEwLjg2NSAxMS41NjMtMTguMzJsLjM4NC0uMzVjMS4xNjYtMS4wNjQgMi4zNjUtMi4yIDMuNTYyLTMuNDAydjEwLjQwNGMtNS43NTguNzkzLTEwLjIyMyA1LjY5NS0xMC4yMjMgMTEuNjcgMCAzLjkzNSAxLjk0OCA3LjYwMyA1LjIxMiA5LjgxYTEuNjA1IDEuNjA1IDAgMSAwIDEuOC0yLjY2IDguNjIyIDguNjIyIDAgMCAxLTMuOC03LjE1YzAtNC4yIDMuMDI1LTcuNyA3LjAxLTguNDU2djIxLjA1Yy0uODUzLjE3OC0xLjczNi4yNzItMi42NDIuMjcyem01Ljg1Ni0xLjQxMnYtMTkuOTFjMy45ODUuNzU2IDcuMDEgNC4yNTMgNy4wMSA4LjQ1NSAwIDQuOTg3LTIuODUgOS4zMi03LjAxIDExLjQ1NXpcIiAvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIzNFwiIGhlaWdodD1cIjkxXCIgdmlld0JveD1cIjAgMCAzNCA5MVwiPlxcbiAgICA8cGF0aCBkPVwiTTIyLjM2NiA0My4xMzRWMjkuMzNjNS44OTItNi41ODggMTAuOTg2LTE0LjUwNyAxMC45ODYtMjIuMTgzIDAtNC4xMTQtMi45ODYtNy4xLTcuMS03LjEtMy45MTQgMC03LjEgMy4xODYtNy4xIDcuMXYyMC45MzZhOTIuNTYyIDkyLjU2MiAwIDAgMS01LjcyOCA1LjY3N2wtLjM4NC4zNDhDNC42NDMgNDEuNzYyLjQyOCA0NS42MDQuNDI4IDU0LjgwMmMwIDguODY2IDcuMjE0IDE2LjA4IDE2LjA4IDE2LjA4LjkwMiAwIDEuNzg0LS4wNzQgMi42NDQtLjIxNnYxMS4yNmMwIDIuNzAyLTIuMTk4IDQuOS00LjkgNC45YTQuODU1IDQuODU1IDAgMCAxLTIuOTUtMS4wMTVjMi4zNjQtLjI0IDQuMjIyLTIuMjE4IDQuMjIyLTQuNjQzYTQuNjk4IDQuNjk4IDAgMCAwLTQuNjkyLTQuNjkyIDQuNzM4IDQuNzM4IDAgMCAwLTQuMjEzIDIuNjI4Yy0uOTIzIDEuODc0LS41NiA0LjM4Ni4yNzcgNi4yMjhhNy44MiA3LjgyIDAgMCAwIC45IDEuNTAyIDguMTc4IDguMTc4IDAgMCAwIDQuMjMgMi44OTZjLjcyMy4yMDcgMS40NzQuMzEgMi4yMjYuMzEgNC40NzQgMCA4LjExMy0zLjY0IDguMTEzLTguMTEzVjY5Ljc4YzUuOTgtMi4zNDUgMTAuMjI1LTguMTc2IDEwLjIyNS0xNC45NzcgMC01Ljk3NS00LjQ2NC0xMC44NzYtMTAuMjI0LTExLjY3em0wLTM1Ljk4N2EzLjg5IDMuODkgMCAwIDEgMy44ODctMy44ODVjMS45MzMgMCAzLjg4NSAxLjIwMiAzLjg4NSAzLjg4NSAwIDQuOTUtMi43MDIgMTAuODYyLTcuNzcyIDE3LjIwNFY3LjE0OHpNMTYuNTEgNjcuNjdjLTcuMDk2IDAtMTIuODY3LTUuNzctMTIuODY3LTEyLjg2NyAwLTcuNzggMy4zODUtMTAuODY1IDExLjU2My0xOC4zMmwuMzg0LS4zNWMxLjE2Ni0xLjA2NCAyLjM2NS0yLjIgMy41NjItMy40MDJ2MTAuNDA0Yy01Ljc1OC43OTMtMTAuMjIzIDUuNjk1LTEwLjIyMyAxMS42NyAwIDMuOTM1IDEuOTQ4IDcuNjAzIDUuMjEyIDkuODFhMS42MDUgMS42MDUgMCAxIDAgMS44LTIuNjYgOC42MjIgOC42MjIgMCAwIDEtMy44LTcuMTVjMC00LjIgMy4wMjUtNy43IDcuMDEtOC40NTZ2MjEuMDVjLS44NTMuMTc4LTEuNzM2LjI3Mi0yLjY0Mi4yNzJ6bTUuODU2LTEuNDEydi0xOS45MWMzLjk4NS43NTYgNy4wMSA0LjI1MyA3LjAxIDguNDU1IDAgNC45ODctMi44NSA5LjMyLTcuMDEgMTEuNDU1elwiIC8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MTEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNThcIiB2aWV3Qm94PVwiMCAwIDQ0IDU4XCI+XFxuICAgIDxwYXRoIGQ9XCJNMjcuNDM3LjUxN2ExIDEgMCAwIDAtLjA5NC4wM0g0LjI1QzIuMDM3LjU0OC4yMTcgMi4zNjguMjE3IDQuNTh2NDguNDA1YzAgMi4yMTIgMS44MiA0LjAzIDQuMDMgNC4wM0gzOS4wM2MyLjIxIDAgNC4wMy0xLjgxOCA0LjAzLTQuMDNWMTUuNjFhMSAxIDAgMCAwLS4wMy0uMjggMSAxIDAgMCAwIDAtLjA5MyAxIDEgMCAwIDAtLjAzLS4wMzIgMSAxIDAgMCAwIDAtLjAzIDEgMSAwIDAgMC0uMDMyLS4wNjMgMSAxIDAgMCAwLS4wMy0uMDYzIDEgMSAwIDAgMC0uMDMyIDAgMSAxIDAgMCAwLS4wMy0uMDYzIDEgMSAwIDAgMC0uMDMyLS4wMyAxIDEgMCAwIDAtLjAzLS4wNjMgMSAxIDAgMCAwLS4wNjMtLjA2MmwtMTQuNTkzLTE0YTEgMSAwIDAgMC0uMDYyLS4wNjJBMSAxIDAgMCAwIDI4IC43MDhhMSAxIDAgMCAwLS4zNzQtLjE1NyAxIDEgMCAwIDAtLjE1NiAwIDEgMSAwIDAgMC0uMDMtLjAzbC0uMDAzLS4wMDN6TTQuMjUgMi41NDdoMjIuMjE4djkuOTdjMCAyLjIxIDEuODIgNC4wMyA0LjAzIDQuMDNoMTAuNTY0djM2LjQzOGEyLjAyIDIuMDIgMCAwIDEtMi4wMzIgMi4wMzJINC4yNWMtMS4xMyAwLTIuMDMyLS45LTIuMDMyLTIuMDMyVjQuNThjMC0xLjEzLjkwMi0yLjAzMiAyLjAzLTIuMDMyem0yNC4yMTggMS4zNDVsMTAuMzc1IDkuOTM3Ljc1LjcxOEgzMC41Yy0xLjEzIDAtMi4wMzItLjktMi4wMzItMi4wM1YzLjg5elwiIC8+XFxuICA8L3N2Zz4nXSwgWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNThcIiB2aWV3Qm94PVwiMCAwIDQ0IDU4XCI+XFxuICAgIDxwYXRoIGQ9XCJNMjcuNDM3LjUxN2ExIDEgMCAwIDAtLjA5NC4wM0g0LjI1QzIuMDM3LjU0OC4yMTcgMi4zNjguMjE3IDQuNTh2NDguNDA1YzAgMi4yMTIgMS44MiA0LjAzIDQuMDMgNC4wM0gzOS4wM2MyLjIxIDAgNC4wMy0xLjgxOCA0LjAzLTQuMDNWMTUuNjFhMSAxIDAgMCAwLS4wMy0uMjggMSAxIDAgMCAwIDAtLjA5MyAxIDEgMCAwIDAtLjAzLS4wMzIgMSAxIDAgMCAwIDAtLjAzIDEgMSAwIDAgMC0uMDMyLS4wNjMgMSAxIDAgMCAwLS4wMy0uMDYzIDEgMSAwIDAgMC0uMDMyIDAgMSAxIDAgMCAwLS4wMy0uMDYzIDEgMSAwIDAgMC0uMDMyLS4wMyAxIDEgMCAwIDAtLjAzLS4wNjMgMSAxIDAgMCAwLS4wNjMtLjA2MmwtMTQuNTkzLTE0YTEgMSAwIDAgMC0uMDYyLS4wNjJBMSAxIDAgMCAwIDI4IC43MDhhMSAxIDAgMCAwLS4zNzQtLjE1NyAxIDEgMCAwIDAtLjE1NiAwIDEgMSAwIDAgMC0uMDMtLjAzbC0uMDAzLS4wMDN6TTQuMjUgMi41NDdoMjIuMjE4djkuOTdjMCAyLjIxIDEuODIgNC4wMyA0LjAzIDQuMDNoMTAuNTY0djM2LjQzOGEyLjAyIDIuMDIgMCAwIDEtMi4wMzIgMi4wMzJINC4yNWMtMS4xMyAwLTIuMDMyLS45LTIuMDMyLTIuMDMyVjQuNThjMC0xLjEzLjkwMi0yLjAzMiAyLjAzLTIuMDMyem0yNC4yMTggMS4zNDVsMTAuMzc1IDkuOTM3Ljc1LjcxOEgzMC41Yy0xLjEzIDAtMi4wMzItLjktMi4wMzItMi4wM1YzLjg5elwiIC8+XFxuICA8L3N2Zz4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MTIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8c3ZnIGNsYXNzPVwiVXBweUljb25cIiB3aWR0aD1cIjUwXCIgaGVpZ2h0PVwiNjNcIiB2aWV3Qm94PVwiMCAwIDUwIDYzXCI+XFxuICAgIDxwYXRoIGQ9XCJNMCAuNXYxNS42MTdoNi4yNWwxLjctNS4xYTYuMjQyIDYuMjQyIDAgMCAxIDUuOTMzLTQuMjY3aDhWNTAuNWMwIDMuNDUtMi44IDYuMjUtNi4yNSA2LjI1SDEyLjVWNjNoMjV2LTYuMjVoLTMuMTMzYy0zLjQ1IDAtNi4yNS0yLjgtNi4yNS02LjI1VjYuNzVoOGE2LjI1NyA2LjI1NyAwIDAgMSA1LjkzMyA0LjI2N2wxLjcgNS4xSDUwVi41SDB6XCIgLz5cXG4gIDwvc3ZnPiddLCBbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiNTBcIiBoZWlnaHQ9XCI2M1wiIHZpZXdCb3g9XCIwIDAgNTAgNjNcIj5cXG4gICAgPHBhdGggZD1cIk0wIC41djE1LjYxN2g2LjI1bDEuNy01LjFhNi4yNDIgNi4yNDIgMCAwIDEgNS45MzMtNC4yNjdoOFY1MC41YzAgMy40NS0yLjggNi4yNS02LjI1IDYuMjVIMTIuNVY2M2gyNXYtNi4yNWgtMy4xMzNjLTMuNDUgMC02LjI1LTIuOC02LjI1LTYuMjVWNi43NWg4YTYuMjU3IDYuMjU3IDAgMCAxIDUuOTMzIDQuMjY3bDEuNyA1LjFINTBWLjVIMHpcIiAvPlxcbiAgPC9zdmc+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDEzID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE4IDE3XCI+XFxuICAgIDxlbGxpcHNlIGZpbGw9XCIjMDAwXCIgY3g9XCI4LjYyXCIgY3k9XCI4LjM4M1wiIHJ4PVwiOC42MlwiIHJ5PVwiOC4zODNcIi8+XFxuICAgIDxwYXRoIHN0cm9rZT1cIiNGRkZcIiBmaWxsPVwiI0ZGRlwiIGQ9XCJNMTEgNi4xNDdMMTAuODUgNiA4LjUgOC4yODQgNi4xNSA2IDYgNi4xNDcgOC4zNSA4LjQzIDYgMTAuNzE3bC4xNS4xNDZMOC41IDguNTc4bDIuMzUgMi4yODQuMTUtLjE0Nkw4LjY1IDguNDN6XCIvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE4IDE3XCI+XFxuICAgIDxlbGxpcHNlIGZpbGw9XCIjMDAwXCIgY3g9XCI4LjYyXCIgY3k9XCI4LjM4M1wiIHJ4PVwiOC42MlwiIHJ5PVwiOC4zODNcIi8+XFxuICAgIDxwYXRoIHN0cm9rZT1cIiNGRkZcIiBmaWxsPVwiI0ZGRlwiIGQ9XCJNMTEgNi4xNDdMMTAuODUgNiA4LjUgOC4yODQgNi4xNSA2IDYgNi4xNDcgOC4zNSA4LjQzIDYgMTAuNzE3bC4xNS4xNDZMOC41IDguNTc4bDIuMzUgMi4yODQuMTUtLjE0Nkw4LjY1IDguNDN6XCIvPlxcbiAgPC9zdmc+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDE0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIzN1wiIGhlaWdodD1cIjMzXCIgdmlld0JveD1cIjAgMCAzNyAzM1wiPlxcbiAgICA8cGF0aCBkPVwiTTI5LjEwNyAyNC41YzQuMDcgMCA3LjM5My0zLjM1NSA3LjM5My03LjQ0MiAwLTMuOTk0LTMuMTA1LTcuMzA3LTcuMDEyLTcuNTAybC40NjguNDE1QzI5LjAyIDQuNTIgMjQuMzQuNSAxOC44ODYuNWMtNC4zNDggMC04LjI3IDIuNTIyLTEwLjEzOCA2LjUwNmwuNDQ2LS4yODhDNC4zOTQgNi43ODIuNSAxMC43NTguNSAxNS42MDhjMCA0LjkyNCAzLjkwNiA4Ljg5MiA4Ljc2IDguODkyaDQuODcyYy42MzUgMCAxLjA5NS0uNDY3IDEuMDk1LTEuMTA0IDAtLjYzNi0uNDYtMS4xMDMtMS4wOTUtMS4xMDNIOS4yNmMtMy42NDQgMC02LjYzLTMuMDM1LTYuNjMtNi43NDQgMC0zLjcxIDIuOTI2LTYuNjg1IDYuNTctNi42ODVoLjk2NGwuMTQtLjI4LjE3Ny0uMzYyYzEuNDc3LTMuNCA0Ljc0NC01LjU3NiA4LjM0Ny01LjU3NiA0LjU4IDAgOC40NSAzLjQ1MiA5LjAxIDguMDcybC4wNi41MzYuMDUuNDQ2aDEuMTAxYzIuODcgMCA1LjIwNCAyLjM3IDUuMjA0IDUuMjk1cy0yLjMzMyA1LjI5Ni01LjIwNCA1LjI5NmgtNi4wNjJjLS42MzQgMC0xLjA5NC40NjctMS4wOTQgMS4xMDMgMCAuNjM3LjQ2IDEuMTA0IDEuMDk0IDEuMTA0aDYuMTJ6XCIvPlxcbiAgICA8cGF0aCBkPVwiTTIzLjE5NiAxOC45MmwtNC44MjgtNS4yNTgtLjM2Ni0uNC0uMzY4LjM5OC00LjgyOCA1LjE5NmExLjEzIDEuMTMgMCAwIDAgMCAxLjU0NmMuNDI4LjQ2IDEuMTEuNDYgMS41MzcgMGwzLjQ1LTMuNzEtLjg2OC0uMzR2MTUuMDNjMCAuNjQuNDQ1IDEuMTE4IDEuMDc1IDEuMTE4LjYzIDAgMS4wNzUtLjQ4IDEuMDc1LTEuMTJWMTYuMzVsLS44NjcuMzQgMy40NSAzLjcxMmExIDEgMCAwIDAgLjc2Ny4zNDUgMSAxIDAgMCAwIC43Ny0uMzQ1Yy40MTYtLjMzLjQxNi0xLjAzNiAwLTEuNDg1di4wMDN6XCIvPlxcbiAgPC9zdmc+J10sIFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIzN1wiIGhlaWdodD1cIjMzXCIgdmlld0JveD1cIjAgMCAzNyAzM1wiPlxcbiAgICA8cGF0aCBkPVwiTTI5LjEwNyAyNC41YzQuMDcgMCA3LjM5My0zLjM1NSA3LjM5My03LjQ0MiAwLTMuOTk0LTMuMTA1LTcuMzA3LTcuMDEyLTcuNTAybC40NjguNDE1QzI5LjAyIDQuNTIgMjQuMzQuNSAxOC44ODYuNWMtNC4zNDggMC04LjI3IDIuNTIyLTEwLjEzOCA2LjUwNmwuNDQ2LS4yODhDNC4zOTQgNi43ODIuNSAxMC43NTguNSAxNS42MDhjMCA0LjkyNCAzLjkwNiA4Ljg5MiA4Ljc2IDguODkyaDQuODcyYy42MzUgMCAxLjA5NS0uNDY3IDEuMDk1LTEuMTA0IDAtLjYzNi0uNDYtMS4xMDMtMS4wOTUtMS4xMDNIOS4yNmMtMy42NDQgMC02LjYzLTMuMDM1LTYuNjMtNi43NDQgMC0zLjcxIDIuOTI2LTYuNjg1IDYuNTctNi42ODVoLjk2NGwuMTQtLjI4LjE3Ny0uMzYyYzEuNDc3LTMuNCA0Ljc0NC01LjU3NiA4LjM0Ny01LjU3NiA0LjU4IDAgOC40NSAzLjQ1MiA5LjAxIDguMDcybC4wNi41MzYuMDUuNDQ2aDEuMTAxYzIuODcgMCA1LjIwNCAyLjM3IDUuMjA0IDUuMjk1cy0yLjMzMyA1LjI5Ni01LjIwNCA1LjI5NmgtNi4wNjJjLS42MzQgMC0xLjA5NC40NjctMS4wOTQgMS4xMDMgMCAuNjM3LjQ2IDEuMTA0IDEuMDk0IDEuMTA0aDYuMTJ6XCIvPlxcbiAgICA8cGF0aCBkPVwiTTIzLjE5NiAxOC45MmwtNC44MjgtNS4yNTgtLjM2Ni0uNC0uMzY4LjM5OC00LjgyOCA1LjE5NmExLjEzIDEuMTMgMCAwIDAgMCAxLjU0NmMuNDI4LjQ2IDEuMTEuNDYgMS41MzcgMGwzLjQ1LTMuNzEtLjg2OC0uMzR2MTUuMDNjMCAuNjQuNDQ1IDEuMTE4IDEuMDc1IDEuMTE4LjYzIDAgMS4wNzUtLjQ4IDEuMDc1LTEuMTJWMTYuMzVsLS44NjcuMzQgMy40NSAzLjcxMmExIDEgMCAwIDAgLjc2Ny4zNDUgMSAxIDAgMCAwIC43Ny0uMzQ1Yy40MTYtLjMzLjQxNi0xLjAzNiAwLTEuNDg1di4wMDN6XCIvPlxcbiAgPC9zdmc+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDE1ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIxMDJcIiBoZWlnaHQ9XCIxMjRcIiB2aWV3Qm94PVwiMCAwIDEwMiAxMjRcIj5cXG4gICAgPGc+XFxuICAgICAgPHBhdGggZD1cIk02OS4xMjUgMTI0YzcuMzYzIDAgMTMuMzUzLTUuOTc1IDEzLjM1My0xMy4zMjJ2LTYuMTVoNGM4LjU2IDAgMTUuNTIyLTYuOTQ2IDE1LjUyMi0xNS40ODJ2LTU5LjE2YzAtMi4wMzMtMS4wODctNC42NS0yLjUzLTYuMDg4TDc4LjE0IDIuNTJDNzYuNyAxLjA4NSA3NC4wNzUgMCA3Mi4wMzggMEgzMi44NzNjLTcuMzYgMC0xMy4zNSA2Ljk0Ny0xMy4zNSAxNS40ODN2My45OWgtNi4xNjhDNS45OSAxOS40NzIgMCAyNS40NDUgMCAzMi43OTJ2NzcuODg1QzAgMTE4LjAyNSA1Ljk5IDEyNCAxMy4zNTUgMTI0aDU1Ljc3ek03Ni45MDMgNy40ODhsMTcuNTkgMTcuNTVoLTEzLjEzYy0yLjQ2IDAtNC40Ni0yLTQuNDYtNC40NTRWNy40ODh6bS01Mi45ODUgNy45OTVjMC02LjEyIDQuMDE2LTExLjEgOC45NTUtMTEuMWgzOS4xNjVjLjE0IDAgLjMuMDIyLjQ2Ni4wNXYxNi4xNWMwIDQuODczIDMuOTczIDguODM3IDguODYgOC44MzdoMTYuMTljLjAyOC4xNjUuMDQ4LjMyMy4wNDguNDY3djU5LjE1OGMwIDYuMTE4LTQuOTkgMTEuMDk3LTExLjEyNSAxMS4wOTdIMzUuMDQzYy02LjEzNSAwLTExLjEyNy00Ljk3OC0xMS4xMjctMTEuMDk2VjE1LjQ4M2guMDAyem0tMTkuNTIgOTUuMTk1VjMyLjc5MmMwLTQuOTI4IDQuMDE4LTguOTM0IDguOTU3LTguOTM0aDYuMTY3djY1LjE4OGMwIDguNTM2IDYuOTYzIDE1LjQ4MiAxNS41MiAxNS40ODJINzguMDh2Ni4xNWMwIDQuOTI3LTQuMDE3IDguOTM1LTguOTU1IDguOTM1aC01NS43N2MtNC45NCAwLTguOTU3LTQuMDA4LTguOTU3LTguOTM1elwiLz48cGF0aCBkPVwiTTQwLjIxOCA3Nmg0MC41NjRDODIuMDA3IDc2IDgzIDc1LjEwNiA4MyA3NGMwLTEuMTA2LS45OTMtMi0yLjIxOC0ySDQwLjIxOEMzOC45OTUgNzIgMzggNzIuODk0IDM4IDc0YzAgMS4xMDYuOTk1IDIgMi4yMTggMnpNNDAuMjE4IDU3aDQwLjU2NEM4Mi4wMDcgNTcgODMgNTYuMTA1IDgzIDU1YzAtMS4xMDYtLjk5My0yLTIuMjE4LTJINDAuMjE4QzM4Ljk5NSA1MyAzOCA1My44OTQgMzggNTVjMCAxLjEwNS45OTUgMiAyLjIxOCAyek00MC4yMDggMzdoMjMuNTg0YzEuMjIgMCAyLjIwOC0uODk2IDIuMjA4LTJzLS45ODctMi0yLjIwOC0ySDQwLjIwOEMzOC45OSAzMyAzOCAzMy44OTYgMzggMzVzLjk5IDIgMi4yMDggMnpcIi8+XFxuICAgIDwvZz5cXG4gIDwvc3ZnPiddLCBbJzxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMTAyXCIgaGVpZ2h0PVwiMTI0XCIgdmlld0JveD1cIjAgMCAxMDIgMTI0XCI+XFxuICAgIDxnPlxcbiAgICAgIDxwYXRoIGQ9XCJNNjkuMTI1IDEyNGM3LjM2MyAwIDEzLjM1My01Ljk3NSAxMy4zNTMtMTMuMzIydi02LjE1aDRjOC41NiAwIDE1LjUyMi02Ljk0NiAxNS41MjItMTUuNDgydi01OS4xNmMwLTIuMDMzLTEuMDg3LTQuNjUtMi41My02LjA4OEw3OC4xNCAyLjUyQzc2LjcgMS4wODUgNzQuMDc1IDAgNzIuMDM4IDBIMzIuODczYy03LjM2IDAtMTMuMzUgNi45NDctMTMuMzUgMTUuNDgzdjMuOTloLTYuMTY4QzUuOTkgMTkuNDcyIDAgMjUuNDQ1IDAgMzIuNzkydjc3Ljg4NUMwIDExOC4wMjUgNS45OSAxMjQgMTMuMzU1IDEyNGg1NS43N3pNNzYuOTAzIDcuNDg4bDE3LjU5IDE3LjU1aC0xMy4xM2MtMi40NiAwLTQuNDYtMi00LjQ2LTQuNDU0VjcuNDg4em0tNTIuOTg1IDcuOTk1YzAtNi4xMiA0LjAxNi0xMS4xIDguOTU1LTExLjFoMzkuMTY1Yy4xNCAwIC4zLjAyMi40NjYuMDV2MTYuMTVjMCA0Ljg3MyAzLjk3MyA4LjgzNyA4Ljg2IDguODM3aDE2LjE5Yy4wMjguMTY1LjA0OC4zMjMuMDQ4LjQ2N3Y1OS4xNThjMCA2LjExOC00Ljk5IDExLjA5Ny0xMS4xMjUgMTEuMDk3SDM1LjA0M2MtNi4xMzUgMC0xMS4xMjctNC45NzgtMTEuMTI3LTExLjA5NlYxNS40ODNoLjAwMnptLTE5LjUyIDk1LjE5NVYzMi43OTJjMC00LjkyOCA0LjAxOC04LjkzNCA4Ljk1Ny04LjkzNGg2LjE2N3Y2NS4xODhjMCA4LjUzNiA2Ljk2MyAxNS40ODIgMTUuNTIgMTUuNDgySDc4LjA4djYuMTVjMCA0LjkyNy00LjAxNyA4LjkzNS04Ljk1NSA4LjkzNWgtNTUuNzdjLTQuOTQgMC04Ljk1Ny00LjAwOC04Ljk1Ny04LjkzNXpcIi8+PHBhdGggZD1cIk00MC4yMTggNzZoNDAuNTY0QzgyLjAwNyA3NiA4MyA3NS4xMDYgODMgNzRjMC0xLjEwNi0uOTkzLTItMi4yMTgtMkg0MC4yMThDMzguOTk1IDcyIDM4IDcyLjg5NCAzOCA3NGMwIDEuMTA2Ljk5NSAyIDIuMjE4IDJ6TTQwLjIxOCA1N2g0MC41NjRDODIuMDA3IDU3IDgzIDU2LjEwNSA4MyA1NWMwLTEuMTA2LS45OTMtMi0yLjIxOC0ySDQwLjIxOEMzOC45OTUgNTMgMzggNTMuODk0IDM4IDU1YzAgMS4xMDUuOTk1IDIgMi4yMTggMnpNNDAuMjA4IDM3aDIzLjU4NGMxLjIyIDAgMi4yMDgtLjg5NiAyLjIwOC0ycy0uOTg3LTItMi4yMDgtMkg0MC4yMDhDMzguOTkgMzMgMzggMzMuODk2IDM4IDM1cy45OSAyIDIuMjA4IDJ6XCIvPlxcbiAgICA8L2c+XFxuICA8L3N2Zz4nXSk7XG5cbmV4cG9ydHMuZGVmYXVsdFRhYkljb24gPSBkZWZhdWx0VGFiSWNvbjtcbmV4cG9ydHMuaWNvbkNvcHkgPSBpY29uQ29weTtcbmV4cG9ydHMuaWNvblJlc3VtZSA9IGljb25SZXN1bWU7XG5leHBvcnRzLmljb25QYXVzZSA9IGljb25QYXVzZTtcbmV4cG9ydHMuaWNvbkVkaXQgPSBpY29uRWRpdDtcbmV4cG9ydHMubG9jYWxJY29uID0gbG9jYWxJY29uO1xuZXhwb3J0cy5jbG9zZUljb24gPSBjbG9zZUljb247XG5leHBvcnRzLnBsdWdpbkljb24gPSBwbHVnaW5JY29uO1xuZXhwb3J0cy5jaGVja0ljb24gPSBjaGVja0ljb247XG5leHBvcnRzLmljb25BdWRpbyA9IGljb25BdWRpbztcbmV4cG9ydHMuaWNvbkZpbGUgPSBpY29uRmlsZTtcbmV4cG9ydHMuaWNvblRleHQgPSBpY29uVGV4dDtcbmV4cG9ydHMucmVtb3ZlSWNvbiA9IHJlbW92ZUljb247XG5leHBvcnRzLnVwbG9hZEljb24gPSB1cGxvYWRJY29uO1xuZXhwb3J0cy5kYXNoYm9hcmRCZ0ljb24gPSBkYXNoYm9hcmRCZ0ljb247XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9XG5cbi8vIGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vY3JlYXRpbmctc3ZnLWljb24tc3lzdGVtLXJlYWN0L1xuXG5mdW5jdGlvbiBkZWZhdWx0VGFiSWNvbigpIHtcbiAgcmV0dXJuICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gaWNvbkNvcHkoKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDIpO1xufVxuXG5mdW5jdGlvbiBpY29uUmVzdW1lKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QzKTtcbn1cblxuZnVuY3Rpb24gaWNvblBhdXNlKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3Q0KTtcbn1cblxuZnVuY3Rpb24gaWNvbkVkaXQoKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDUpO1xufVxuXG5mdW5jdGlvbiBsb2NhbEljb24oKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDYpO1xufVxuXG5mdW5jdGlvbiBjbG9zZUljb24oKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDcpO1xufVxuXG5mdW5jdGlvbiBwbHVnaW5JY29uKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3Q4KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJY29uKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3Q5KTtcbn1cblxuZnVuY3Rpb24gaWNvbkF1ZGlvKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QxMCk7XG59XG5cbmZ1bmN0aW9uIGljb25GaWxlKCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QxMSk7XG59XG5cbmZ1bmN0aW9uIGljb25UZXh0KCkge1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QxMik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUljb24oKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDEzKTtcbn1cblxuZnVuY3Rpb24gdXBsb2FkSWNvbigpIHtcbiAgcmV0dXJuICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0MTQpO1xufVxuXG5mdW5jdGlvbiBkYXNoYm9hcmRCZ0ljb24oKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdDE1KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWljb25zLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9QbHVnaW4yID0gcmVxdWlyZSgnLi4vUGx1Z2luJyk7XG5cbnZhciBfUGx1Z2luMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BsdWdpbjIpO1xuXG52YXIgX2RyYWdEcm9wID0gcmVxdWlyZSgnZHJhZy1kcm9wJyk7XG5cbnZhciBfZHJhZ0Ryb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZHJhZ0Ryb3ApO1xuXG52YXIgX0Rhc2hib2FyZCA9IHJlcXVpcmUoJy4vRGFzaGJvYXJkJyk7XG5cbnZhciBfRGFzaGJvYXJkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Rhc2hib2FyZCk7XG5cbnZhciBfVXRpbHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL1V0aWxzJyk7XG5cbnZhciBfcHJldHR5Qnl0ZXMgPSByZXF1aXJlKCdwcmV0dHktYnl0ZXMnKTtcblxudmFyIF9wcmV0dHlCeXRlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcmV0dHlCeXRlcyk7XG5cbnZhciBfaWNvbnMgPSByZXF1aXJlKCcuL2ljb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBNb2RhbCBEaWFsb2cgJiBEYXNoYm9hcmRcbiAqL1xudmFyIERhc2hib2FyZFVJID0gZnVuY3Rpb24gKF9QbHVnaW4pIHtcbiAgX2luaGVyaXRzKERhc2hib2FyZFVJLCBfUGx1Z2luKTtcblxuICBmdW5jdGlvbiBEYXNoYm9hcmRVSShjb3JlLCBvcHRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERhc2hib2FyZFVJKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9QbHVnaW4uY2FsbCh0aGlzLCBjb3JlLCBvcHRzKSk7XG5cbiAgICBfdGhpcy5pZCA9ICdEYXNoYm9hcmRVSSc7XG4gICAgX3RoaXMudGl0bGUgPSAnRGFzaGJvYXJkIFVJJztcbiAgICBfdGhpcy50eXBlID0gJ29yY2hlc3RyYXRvcic7XG5cbiAgICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgdGFyZ2V0OiAnYm9keScsXG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgc2VtaVRyYW5zcGFyZW50OiBmYWxzZSxcbiAgICAgIGRlZmF1bHRUYWJJY29uOiAoMCwgX2ljb25zLmRlZmF1bHRUYWJJY29uKSgpLFxuICAgICAgcGFuZWxTZWxlY3RvclByZWZpeDogJ1VwcHlEYXNoYm9hcmRDb250ZW50LXBhbmVsJyxcbiAgICAgIHNob3dQcm9ncmVzc0RldGFpbHM6IHRydWVcbiAgICB9O1xuXG4gICAgLy8gbWVyZ2UgZGVmYXVsdCBvcHRpb25zIHdpdGggdGhlIG9uZXMgc2V0IGJ5IHVzZXJcbiAgICBfdGhpcy5vcHRzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRzKTtcblxuICAgIF90aGlzLmhpZGVNb2RhbCA9IF90aGlzLmhpZGVNb2RhbC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5zaG93TW9kYWwgPSBfdGhpcy5zaG93TW9kYWwuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5hZGRUYXJnZXQgPSBfdGhpcy5hZGRUYXJnZXQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuYWN0aW9ucyA9IF90aGlzLmFjdGlvbnMuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGlkZUFsbFBhbmVscyA9IF90aGlzLmhpZGVBbGxQYW5lbHMuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuc2hvd1BhbmVsID0gX3RoaXMuc2hvd1BhbmVsLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmluaXRFdmVudHMgPSBfdGhpcy5pbml0RXZlbnRzLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZURyb3AgPSBfdGhpcy5oYW5kbGVEcm9wLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnBhdXNlQWxsID0gX3RoaXMucGF1c2VBbGwuYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVzdW1lQWxsID0gX3RoaXMucmVzdW1lQWxsLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnJlbmRlciA9IF90aGlzLnJlbmRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5pbnN0YWxsID0gX3RoaXMuaW5zdGFsbC5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBEYXNoYm9hcmRVSS5wcm90b3R5cGUuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gYWRkVGFyZ2V0KHBsdWdpbikge1xuICAgIHZhciBjYWxsZXJQbHVnaW5JZCA9IHBsdWdpbi5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHZhciBjYWxsZXJQbHVnaW5OYW1lID0gcGx1Z2luLnRpdGxlIHx8IGNhbGxlclBsdWdpbklkO1xuICAgIHZhciBjYWxsZXJQbHVnaW5JY29uID0gcGx1Z2luLmljb24gfHwgdGhpcy5vcHRzLmRlZmF1bHRUYWJJY29uO1xuICAgIHZhciBjYWxsZXJQbHVnaW5UeXBlID0gcGx1Z2luLnR5cGU7XG5cbiAgICBpZiAoY2FsbGVyUGx1Z2luVHlwZSAhPT0gJ2FjcXVpcmVyJyAmJiBjYWxsZXJQbHVnaW5UeXBlICE9PSAncHJvZ3Jlc3NpbmRpY2F0b3InICYmIGNhbGxlclBsdWdpblR5cGUgIT09ICdwcmVzZW50ZXInKSB7XG4gICAgICB2YXIgbXNnID0gJ0Vycm9yOiBNb2RhbCBjYW4gb25seSBiZSB1c2VkIGJ5IHBsdWdpbnMgb2YgdHlwZXM6IGFjcXVpcmVyLCBwcm9ncmVzc2luZGljYXRvciwgcHJlc2VudGVyJztcbiAgICAgIHRoaXMuY29yZS5sb2cobXNnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0ge1xuICAgICAgaWQ6IGNhbGxlclBsdWdpbklkLFxuICAgICAgbmFtZTogY2FsbGVyUGx1Z2luTmFtZSxcbiAgICAgIGljb246IGNhbGxlclBsdWdpbkljb24sXG4gICAgICB0eXBlOiBjYWxsZXJQbHVnaW5UeXBlLFxuICAgICAgZm9jdXM6IHBsdWdpbi5mb2N1cyxcbiAgICAgIHJlbmRlcjogcGx1Z2luLnJlbmRlcixcbiAgICAgIGlzSGlkZGVuOiB0cnVlXG4gICAgfTtcblxuICAgIHZhciBtb2RhbCA9IHRoaXMuY29yZS5nZXRTdGF0ZSgpLm1vZGFsO1xuICAgIHZhciBuZXdUYXJnZXRzID0gbW9kYWwudGFyZ2V0cy5zbGljZSgpO1xuICAgIG5ld1RhcmdldHMucHVzaCh0YXJnZXQpO1xuXG4gICAgdGhpcy5jb3JlLnNldFN0YXRlKHtcbiAgICAgIG1vZGFsOiBfZXh0ZW5kcyh7fSwgbW9kYWwsIHtcbiAgICAgICAgdGFyZ2V0czogbmV3VGFyZ2V0c1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm9wdHMudGFyZ2V0O1xuICB9O1xuXG4gIERhc2hib2FyZFVJLnByb3RvdHlwZS5oaWRlQWxsUGFuZWxzID0gZnVuY3Rpb24gaGlkZUFsbFBhbmVscygpIHtcbiAgICB2YXIgbW9kYWwgPSB0aGlzLmNvcmUuZ2V0U3RhdGUoKS5tb2RhbDtcblxuICAgIHZhciBuZXdUYXJnZXRzID0gbW9kYWwudGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCB0YXJnZXQsIHtcbiAgICAgICAgaXNIaWRkZW46IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb3JlLnNldFN0YXRlKHsgbW9kYWw6IF9leHRlbmRzKHt9LCBtb2RhbCwge1xuICAgICAgICB0YXJnZXRzOiBuZXdUYXJnZXRzXG4gICAgICB9KSB9KTtcbiAgfTtcblxuICBEYXNoYm9hcmRVSS5wcm90b3R5cGUuc2hvd1BhbmVsID0gZnVuY3Rpb24gc2hvd1BhbmVsKGlkKSB7XG4gICAgdmFyIG1vZGFsID0gdGhpcy5jb3JlLmdldFN0YXRlKCkubW9kYWw7XG5cbiAgICAvLyBoaWRlIGFsbCBwYW5lbHMsIGV4Y2VwdCB0aGUgb25lIHRoYXQgbWF0Y2hlcyBjdXJyZW50IGlkXG4gICAgdmFyIG5ld1RhcmdldHMgPSBtb2RhbC50YXJnZXRzLm1hcChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBpZiAodGFyZ2V0LnR5cGUgPT09ICdhY3F1aXJlcicpIHtcbiAgICAgICAgaWYgKHRhcmdldC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHRhcmdldCwge1xuICAgICAgICAgICAgaXNIaWRkZW46IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCB0YXJnZXQsIHtcbiAgICAgICAgICBpc0hpZGRlbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvcmUuc2V0U3RhdGUoeyBtb2RhbDogX2V4dGVuZHMoe30sIG1vZGFsLCB7XG4gICAgICAgIHRhcmdldHM6IG5ld1RhcmdldHNcbiAgICAgIH0pIH0pO1xuICB9O1xuXG4gIERhc2hib2FyZFVJLnByb3RvdHlwZS5oaWRlTW9kYWwgPSBmdW5jdGlvbiBoaWRlTW9kYWwoKSB7XG4gICAgdmFyIG1vZGFsID0gdGhpcy5jb3JlLmdldFN0YXRlKCkubW9kYWw7XG5cbiAgICB0aGlzLmNvcmUuc2V0U3RhdGUoe1xuICAgICAgbW9kYWw6IF9leHRlbmRzKHt9LCBtb2RhbCwge1xuICAgICAgICBpc0hpZGRlbjogdHJ1ZVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnaXMtVXBweURhc2hib2FyZC1vcGVuJyk7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLnNob3dNb2RhbCA9IGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcbiAgICB2YXIgbW9kYWwgPSB0aGlzLmNvcmUuZ2V0U3RhdGUoKS5tb2RhbDtcblxuICAgIHRoaXMuY29yZS5zZXRTdGF0ZSh7XG4gICAgICBtb2RhbDogX2V4dGVuZHMoe30sIG1vZGFsLCB7XG4gICAgICAgIGlzSGlkZGVuOiBmYWxzZVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIC8vIGFkZCBjbGFzcyB0byBib2R5IHRoYXQgc2V0cyBwb3NpdGlvbiBmaXhlZFxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnaXMtVXBweURhc2hib2FyZC1vcGVuJyk7XG4gICAgLy8gZm9jdXMgb24gbW9kYWwgaW5uZXIgYmxvY2tcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuVXBweURhc2hib2FyZC1pbm5lcicpLmZvY3VzKCk7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLmluaXRFdmVudHMgPSBmdW5jdGlvbiBpbml0RXZlbnRzKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgLy8gY29uc3QgZGFzaGJvYXJkRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAke3RoaXMub3B0cy50YXJnZXR9IC5VcHB5RGFzaGJvYXJkYClcbiAgICAvLyBNb2RhbCBvcGVuIGJ1dHRvblxuICAgIHZhciBzaG93TW9kYWxUcmlnZ2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLm9wdHMudHJpZ2dlcik7XG4gICAgc2hvd01vZGFsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc2hvd01vZGFsKTtcblxuICAgIC8vIENsb3NlIHRoZSBNb2RhbCBvbiBlc2Mga2V5IHByZXNzXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgIF90aGlzMi5oaWRlTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERyYWcgRHJvcFxuICAgICgwLCBfZHJhZ0Ryb3AyLmRlZmF1bHQpKHRoaXMuZWwsIGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgX3RoaXMyLmhhbmRsZURyb3AoZmlsZXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIERhc2hib2FyZFVJLnByb3RvdHlwZS5hY3Rpb25zID0gZnVuY3Rpb24gYWN0aW9ucygpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBidXMgPSB0aGlzLmNvcmUuYnVzO1xuXG4gICAgYnVzLm9uKCdjb3JlOmZpbGUtYWRkJywgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMzLmhpZGVBbGxQYW5lbHMoKTtcbiAgICB9KTtcblxuICAgIGJ1cy5vbignZGFzaGJvYXJkOmZpbGUtY2FyZCcsIGZ1bmN0aW9uIChmaWxlSWQpIHtcbiAgICAgIHZhciBtb2RhbCA9IF90aGlzMy5jb3JlLmdldFN0YXRlKCkubW9kYWw7XG5cbiAgICAgIF90aGlzMy5jb3JlLnNldFN0YXRlKHtcbiAgICAgICAgbW9kYWw6IF9leHRlbmRzKHt9LCBtb2RhbCwge1xuICAgICAgICAgIGZpbGVDYXJkRm9yOiBmaWxlSWQgfHwgZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYnVzLm9uKCdjb3JlOnN1Y2Nlc3MnLCBmdW5jdGlvbiAodXBsb2FkZWRDb3VudCkge1xuICAgICAgYnVzLmVtaXQoJ2luZm9ybWVyJywgX3RoaXMzLmNvcmUuaTE4bignZmlsZXMnLCB7ICdzbWFydF9jb3VudCc6IHVwbG9hZGVkQ291bnQgfSkgKyAnIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCwgU2lyIScsICdpbmZvJywgNjAwMCk7XG4gICAgfSk7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLmhhbmRsZURyb3AgPSBmdW5jdGlvbiBoYW5kbGVEcm9wKGZpbGVzKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB0aGlzLmNvcmUubG9nKCdBbGwgcmlnaHQsIHNvbWVvbmUgZHJvcHBlZCBzb21ldGhpbmcuLi4nKTtcblxuICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIF90aGlzNC5jb3JlLmJ1cy5lbWl0KCdjb3JlOmZpbGUtYWRkJywge1xuICAgICAgICBzb3VyY2U6IF90aGlzNC5pZCxcbiAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgIGRhdGE6IGZpbGVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIERhc2hib2FyZFVJLnByb3RvdHlwZS5wYXVzZUFsbCA9IGZ1bmN0aW9uIHBhdXNlQWxsKCkge1xuICAgIHRoaXMuY29yZS5idXMuZW1pdCgnY29yZTpwYXVzZS1hbGwnKTtcbiAgfTtcblxuICBEYXNoYm9hcmRVSS5wcm90b3R5cGUucmVzdW1lQWxsID0gZnVuY3Rpb24gcmVzdW1lQWxsKCkge1xuICAgIHRoaXMuY29yZS5idXMuZW1pdCgnY29yZTpyZXN1bWUtYWxsJyk7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLmdldFRvdGFsU3BlZWQgPSBmdW5jdGlvbiBnZXRUb3RhbFNwZWVkKGZpbGVzKSB7XG4gICAgdmFyIHRvdGFsU3BlZWQgPSAwO1xuICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIHRvdGFsU3BlZWQgPSB0b3RhbFNwZWVkICsgKDAsIF9VdGlscy5nZXRTcGVlZCkoZmlsZS5wcm9ncmVzcyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdGFsU3BlZWQ7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLmdldFRvdGFsRVRBID0gZnVuY3Rpb24gZ2V0VG90YWxFVEEoZmlsZXMpIHtcbiAgICB2YXIgdG90YWxTZWNvbmRzID0gMDtcblxuICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIHRvdGFsU2Vjb25kcyA9IHRvdGFsU2Vjb25kcyArICgwLCBfVXRpbHMuZ2V0RVRBKShmaWxlLnByb2dyZXNzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0b3RhbFNlY29uZHM7XG4gIH07XG5cbiAgRGFzaGJvYXJkVUkucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihzdGF0ZSkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgdmFyIGZpbGVzID0gc3RhdGUuZmlsZXM7XG5cbiAgICB2YXIgbmV3RmlsZXMgPSBPYmplY3Qua2V5cyhmaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICByZXR1cm4gIWZpbGVzW2ZpbGVdLnByb2dyZXNzLnVwbG9hZFN0YXJ0ZWQ7XG4gICAgfSk7XG4gICAgdmFyIHVwbG9hZFN0YXJ0ZWRGaWxlcyA9IE9iamVjdC5rZXlzKGZpbGVzKS5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIHJldHVybiBmaWxlc1tmaWxlXS5wcm9ncmVzcy51cGxvYWRTdGFydGVkO1xuICAgIH0pO1xuICAgIHZhciBjb21wbGV0ZUZpbGVzID0gT2JqZWN0LmtleXMoZmlsZXMpLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgcmV0dXJuIGZpbGVzW2ZpbGVdLnByb2dyZXNzLnVwbG9hZENvbXBsZXRlO1xuICAgIH0pO1xuICAgIHZhciBpblByb2dyZXNzRmlsZXMgPSBPYmplY3Qua2V5cyhmaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICByZXR1cm4gIWZpbGVzW2ZpbGVdLnByb2dyZXNzLnVwbG9hZENvbXBsZXRlICYmIGZpbGVzW2ZpbGVdLnByb2dyZXNzLnVwbG9hZFN0YXJ0ZWQgJiYgIWZpbGVzW2ZpbGVdLmlzUGF1c2VkO1xuICAgIH0pO1xuXG4gICAgdmFyIGluUHJvZ3Jlc3NGaWxlc0FycmF5ID0gW107XG4gICAgaW5Qcm9ncmVzc0ZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIGluUHJvZ3Jlc3NGaWxlc0FycmF5LnB1c2goZmlsZXNbZmlsZV0pO1xuICAgIH0pO1xuXG4gICAgdmFyIHRvdGFsU3BlZWQgPSAoMCwgX3ByZXR0eUJ5dGVzMi5kZWZhdWx0KSh0aGlzLmdldFRvdGFsU3BlZWQoaW5Qcm9ncmVzc0ZpbGVzQXJyYXkpKTtcbiAgICB2YXIgdG90YWxFVEEgPSAoMCwgX1V0aWxzLnByZXR0eUVUQSkodGhpcy5nZXRUb3RhbEVUQShpblByb2dyZXNzRmlsZXNBcnJheSkpO1xuXG4gICAgdmFyIGlzQWxsQ29tcGxldGUgPSBzdGF0ZS50b3RhbFByb2dyZXNzID09PSAxMDA7XG4gICAgdmFyIGlzQWxsUGF1c2VkID0gaW5Qcm9ncmVzc0ZpbGVzLmxlbmd0aCA9PT0gMCAmJiAhaXNBbGxDb21wbGV0ZTtcblxuICAgIHZhciBhY3F1aXJlcnMgPSBzdGF0ZS5tb2RhbC50YXJnZXRzLmZpbHRlcihmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnR5cGUgPT09ICdhY3F1aXJlcic7XG4gICAgfSk7XG5cbiAgICB2YXIgcHJvZ3Jlc3NpbmRpY2F0b3JzID0gc3RhdGUubW9kYWwudGFyZ2V0cy5maWx0ZXIoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIHRhcmdldC50eXBlID09PSAncHJvZ3Jlc3NpbmRpY2F0b3InO1xuICAgIH0pO1xuXG4gICAgdmFyIGFkZEZpbGUgPSBmdW5jdGlvbiBhZGRGaWxlKGZpbGUpIHtcbiAgICAgIF90aGlzNS5jb3JlLmVtaXR0ZXIuZW1pdCgnY29yZTpmaWxlLWFkZCcsIGZpbGUpO1xuICAgIH07XG5cbiAgICB2YXIgcmVtb3ZlRmlsZSA9IGZ1bmN0aW9uIHJlbW92ZUZpbGUoZmlsZUlEKSB7XG4gICAgICBfdGhpczUuY29yZS5lbWl0dGVyLmVtaXQoJ2NvcmU6ZmlsZS1yZW1vdmUnLCBmaWxlSUQpO1xuICAgIH07XG5cbiAgICB2YXIgc3RhcnRVcGxvYWQgPSBmdW5jdGlvbiBzdGFydFVwbG9hZChldikge1xuICAgICAgX3RoaXM1LmNvcmUuZW1pdHRlci5lbWl0KCdjb3JlOnVwbG9hZCcpO1xuICAgIH07XG5cbiAgICB2YXIgcGF1c2VVcGxvYWQgPSBmdW5jdGlvbiBwYXVzZVVwbG9hZChmaWxlSUQpIHtcbiAgICAgIF90aGlzNS5jb3JlLmVtaXR0ZXIuZW1pdCgnY29yZTp1cGxvYWQtcGF1c2UnLCBmaWxlSUQpO1xuICAgIH07XG5cbiAgICB2YXIgc2hvd0ZpbGVDYXJkID0gZnVuY3Rpb24gc2hvd0ZpbGVDYXJkKGZpbGVJRCkge1xuICAgICAgX3RoaXM1LmNvcmUuZW1pdHRlci5lbWl0KCdkYXNoYm9hcmQ6ZmlsZS1jYXJkJywgZmlsZUlEKTtcbiAgICB9O1xuXG4gICAgdmFyIGZpbGVDYXJkRG9uZSA9IGZ1bmN0aW9uIGZpbGVDYXJkRG9uZShtZXRhLCBmaWxlSUQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKG1ldGEsIGZpbGVJRClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfQpNCQ0JnQmyDQmtCQ0KDQlCDQodCe0KXQoNCQ0J3Qr9CuLCDQndCQ0KXQo9CZJylcbiAgICAgIF90aGlzNS5jb3JlLmVtaXR0ZXIuZW1pdCgnY29yZTp1cGRhdGUtbWV0YScsIG1ldGEsIGZpbGVJRCk7XG4gICAgICBfdGhpczUuY29yZS5lbWl0dGVyLmVtaXQoJ2Rhc2hib2FyZDpmaWxlLWNhcmQnKTtcbiAgICB9O1xuXG4gICAgdmFyIGluZm8gPSBmdW5jdGlvbiBpbmZvKHRleHQsIHR5cGUsIGR1cmF0aW9uKSB7XG4gICAgICBfdGhpczUuY29yZS5lbWl0dGVyLmVtaXQoJ2luZm9ybWVyJywgdGV4dCwgdHlwZSwgZHVyYXRpb24pO1xuICAgIH07XG5cbiAgICByZXR1cm4gKDAsIF9EYXNoYm9hcmQyLmRlZmF1bHQpKHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIG1vZGFsOiBzdGF0ZS5tb2RhbCxcbiAgICAgIG5ld0ZpbGVzOiBuZXdGaWxlcyxcbiAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBPYmplY3Qua2V5cyhmaWxlcykubGVuZ3RoLFxuICAgICAgdXBsb2FkU3RhcnRlZEZpbGVzOiB1cGxvYWRTdGFydGVkRmlsZXMsXG4gICAgICBjb21wbGV0ZUZpbGVzOiBjb21wbGV0ZUZpbGVzLFxuICAgICAgaW5Qcm9ncmVzc0ZpbGVzOiBpblByb2dyZXNzRmlsZXMsXG4gICAgICB0b3RhbFNwZWVkOiB0b3RhbFNwZWVkLFxuICAgICAgdG90YWxFVEE6IHRvdGFsRVRBLFxuICAgICAgdG90YWxQcm9ncmVzczogc3RhdGUudG90YWxQcm9ncmVzcyxcbiAgICAgIGlzQWxsQ29tcGxldGU6IGlzQWxsQ29tcGxldGUsXG4gICAgICBpc0FsbFBhdXNlZDogaXNBbGxQYXVzZWQsXG4gICAgICBhY3F1aXJlcnM6IGFjcXVpcmVycyxcbiAgICAgIHByb2dyZXNzaW5kaWNhdG9yczogcHJvZ3Jlc3NpbmRpY2F0b3JzLFxuICAgICAgYXV0b1Byb2NlZWQ6IHRoaXMuY29yZS5vcHRzLmF1dG9Qcm9jZWVkLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0cy50YXJnZXQsXG4gICAgICBoaWRlTW9kYWw6IHRoaXMuaGlkZU1vZGFsLFxuICAgICAgcGFuZWxTZWxlY3RvclByZWZpeDogdGhpcy5vcHRzLnBhbmVsU2VsZWN0b3JQcmVmaXgsXG4gICAgICBzaG93UHJvZ3Jlc3NEZXRhaWxzOiB0aGlzLm9wdHMuc2hvd1Byb2dyZXNzRGV0YWlscyxcbiAgICAgIGlubGluZTogdGhpcy5vcHRzLmlubGluZSxcbiAgICAgIHNlbWlUcmFuc3BhcmVudDogdGhpcy5vcHRzLnNlbWlUcmFuc3BhcmVudCxcbiAgICAgIG9uUGFzdGU6IHRoaXMuaGFuZGxlUGFzdGUsXG4gICAgICBzaG93UGFuZWw6IHRoaXMuc2hvd1BhbmVsLFxuICAgICAgaGlkZUFsbFBhbmVsczogdGhpcy5oaWRlQWxsUGFuZWxzLFxuICAgICAgbG9nOiB0aGlzLmNvcmUubG9nLFxuICAgICAgYnVzOiB0aGlzLmNvcmUuZW1pdHRlcixcbiAgICAgIGkxOG46IHRoaXMuY29yZS5pMThuLFxuICAgICAgcGF1c2VBbGw6IHRoaXMucGF1c2VBbGwsXG4gICAgICByZXN1bWVBbGw6IHRoaXMucmVzdW1lQWxsLFxuICAgICAgYWRkRmlsZTogYWRkRmlsZSxcbiAgICAgIHJlbW92ZUZpbGU6IHJlbW92ZUZpbGUsXG4gICAgICBpbmZvOiBpbmZvLFxuICAgICAgbWV0YUZpZWxkczogc3RhdGUubWV0YUZpZWxkcyxcbiAgICAgIHN0YXJ0VXBsb2FkOiBzdGFydFVwbG9hZCxcbiAgICAgIHBhdXNlVXBsb2FkOiBwYXVzZVVwbG9hZCxcbiAgICAgIGZpbGVDYXJkRm9yOiBzdGF0ZS5tb2RhbC5maWxlQ2FyZEZvcixcbiAgICAgIHNob3dGaWxlQ2FyZDogc2hvd0ZpbGVDYXJkLFxuICAgICAgZmlsZUNhcmREb25lOiBmaWxlQ2FyZERvbmVcbiAgICB9KTtcbiAgfTtcblxuICBEYXNoYm9hcmRVSS5wcm90b3R5cGUuaW5zdGFsbCA9IGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgLy8gU2V0IGRlZmF1bHQgc3RhdGUgZm9yIE1vZGFsXG4gICAgdGhpcy5jb3JlLnNldFN0YXRlKHsgbW9kYWw6IHtcbiAgICAgICAgaXNIaWRkZW46IHRydWUsXG4gICAgICAgIHNob3dGaWxlQ2FyZDogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6IFtdXG4gICAgICB9IH0pO1xuXG4gICAgdmFyIHRhcmdldCA9IHRoaXMub3B0cy50YXJnZXQ7XG4gICAgdmFyIHBsdWdpbiA9IHRoaXM7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLm1vdW50KHRhcmdldCwgcGx1Z2luKTtcblxuICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICAgIHRoaXMuYWN0aW9ucygpO1xuICB9O1xuXG4gIHJldHVybiBEYXNoYm9hcmRVSTtcbn0oX1BsdWdpbjMuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IERhc2hib2FyZFVJO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgICAgPHN2ZyBjbGFzcz1cIlVwcHlJY29uXCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjI4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxcbiAgICAgICAgPHBhdGggZD1cIk0xNS45ODIgMi45N2MwLS4wMiAwLS4wMi0uMDE4LS4wMzcgMC0uMDE3LS4wMTctLjAzNS0uMDM1LS4wNTMgMCAwIDAtLjAxOC0uMDItLjAxOC0uMDE3LS4wMTgtLjAzNC0uMDUzLS4wNTItLjA3TDEzLjE5LjEyM2MtLjAxNy0uMDE3LS4wMzQtLjAzNS0uMDctLjA1M2gtLjAxOGMtLjAxOC0uMDE3LS4wMzUtLjAxNy0uMDUzLS4wMzRoLS4wMmMtLjAxNyAwLS4wMzQtLjAxOC0uMDUyLS4wMThoLTYuMzFhLjQxNS40MTUgMCAwIDAtLjQ0Ni40MjZWMTEuMTFjMCAuMjUuMTk2LjQ0Ni40NDUuNDQ2aDguODlBLjQ0LjQ0IDAgMCAwIDE2IDExLjExVjMuMDIzYy0uMDE4LS4wMTgtLjAxOC0uMDM1LS4wMTgtLjA1M3ptLTIuNjUtMS40NmwxLjE1NyAxLjE1N2gtMS4xNTdWMS41MXptMS43OCA5LjE1N2gtOFYuODloNS4zMzJ2Mi4yMmMwIC4yNS4xOTYuNDQ2LjQ0NS40NDZoMi4yMnY3LjExelwiLz5cXG4gICAgICAgIDxwYXRoIGQ9XCJNOS43NzggMTIuODlINFYyLjY2NmEuNDQuNDQgMCAwIDAtLjQ0NC0uNDQ1LjQ0LjQ0IDAgMCAwLS40NDUuNDQ1djEwLjY2NmMwIC4yNS4xOTcuNDQ1LjQ0Ni40NDVoNi4yMjJhLjQ0LjQ0IDAgMCAwIC40NDQtLjQ0NS40NC40NCAwIDAgMC0uNDQ0LS40NDR6XCIvPlxcbiAgICAgICAgPHBhdGggZD1cIk0uNDQ0IDE2aDYuMjIzYS40NC40NCAwIDAgMCAuNDQ0LS40NDQuNDQuNDQgMCAwIDAtLjQ0My0uNDQ1SC44OVY0Ljg5YS40NC40NCAwIDAgMC0uNDQ2LS40NDZBLjQ0LjQ0IDAgMCAwIDAgNC44OXYxMC42NjZjMCAuMjQ4LjE5Ni40NDQuNDQ0LjQ0NHpcIi8+XFxuICAgICAgPC9zdmc+XFxuICAgICddLCBbJ1xcbiAgICAgIDxzdmcgY2xhc3M9XCJVcHB5SWNvblwiIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cXG4gICAgICAgIDxwYXRoIGQ9XCJNMTUuOTgyIDIuOTdjMC0uMDIgMC0uMDItLjAxOC0uMDM3IDAtLjAxNy0uMDE3LS4wMzUtLjAzNS0uMDUzIDAgMCAwLS4wMTgtLjAyLS4wMTgtLjAxNy0uMDE4LS4wMzQtLjA1My0uMDUyLS4wN0wxMy4xOS4xMjNjLS4wMTctLjAxNy0uMDM0LS4wMzUtLjA3LS4wNTNoLS4wMThjLS4wMTgtLjAxNy0uMDM1LS4wMTctLjA1My0uMDM0aC0uMDJjLS4wMTcgMC0uMDM0LS4wMTgtLjA1Mi0uMDE4aC02LjMxYS40MTUuNDE1IDAgMCAwLS40NDYuNDI2VjExLjExYzAgLjI1LjE5Ni40NDYuNDQ1LjQ0Nmg4Ljg5QS40NC40NCAwIDAgMCAxNiAxMS4xMVYzLjAyM2MtLjAxOC0uMDE4LS4wMTgtLjAzNS0uMDE4LS4wNTN6bS0yLjY1LTEuNDZsMS4xNTcgMS4xNTdoLTEuMTU3VjEuNTF6bTEuNzggOS4xNTdoLThWLjg5aDUuMzMydjIuMjJjMCAuMjUuMTk2LjQ0Ni40NDUuNDQ2aDIuMjJ2Ny4xMXpcIi8+XFxuICAgICAgICA8cGF0aCBkPVwiTTkuNzc4IDEyLjg5SDRWMi42NjZhLjQ0LjQ0IDAgMCAwLS40NDQtLjQ0NS40NC40NCAwIDAgMC0uNDQ1LjQ0NXYxMC42NjZjMCAuMjUuMTk3LjQ0NS40NDYuNDQ1aDYuMjIyYS40NC40NCAwIDAgMCAuNDQ0LS40NDUuNDQuNDQgMCAwIDAtLjQ0NC0uNDQ0elwiLz5cXG4gICAgICAgIDxwYXRoIGQ9XCJNLjQ0NCAxNmg2LjIyM2EuNDQuNDQgMCAwIDAgLjQ0NC0uNDQ0LjQ0LjQ0IDAgMCAwLS40NDMtLjQ0NUguODlWNC44OWEuNDQuNDQgMCAwIDAtLjQ0Ni0uNDQ2QS40NC40NCAwIDAgMCAwIDQuODl2MTAuNjY2YzAgLjI0OC4xOTYuNDQ0LjQ0NC40NDR6XCIvPlxcbiAgICAgIDwvc3ZnPlxcbiAgICAnXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJ1xcbiAgICAgIDxkaXYgY2xhc3M9XCJVcHB5RHJhZ0Ryb3AtY29udGFpbmVyICcsICdcIj5cXG4gICAgICAgIDxmb3JtIGNsYXNzPVwiVXBweURyYWdEcm9wLWlubmVyXCJcXG4gICAgICAgICAgICAgIG9uc3VibWl0PScsICc+XFxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIlVwcHlEcmFnRHJvcC1pbnB1dCBVcHB5RHJhZ0Ryb3AtZm9jdXNcIlxcbiAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxcbiAgICAgICAgICAgICAgICAgbmFtZT1cImZpbGVzW11cIlxcbiAgICAgICAgICAgICAgICAgbXVsdGlwbGU9XCJ0cnVlXCJcXG4gICAgICAgICAgICAgICAgIHZhbHVlPVwiXCJcXG4gICAgICAgICAgICAgICAgIG9uY2hhbmdlPScsICcgLz5cXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiVXBweURyYWdEcm9wLWxhYmVsXCIgb25jbGljaz0nLCAnPlxcbiAgICAgICAgICAgIDxzdHJvbmc+JywgJzwvc3Ryb25nPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiVXBweURyYWdEcm9wLWRyYWdUZXh0XCI+JywgJzwvc3Bhbj5cXG4gICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgJywgJ1xcbiAgICAgICAgPC9mb3JtPlxcbiAgICAgIDwvZGl2PlxcbiAgICAnXSwgWydcXG4gICAgICA8ZGl2IGNsYXNzPVwiVXBweURyYWdEcm9wLWNvbnRhaW5lciAnLCAnXCI+XFxuICAgICAgICA8Zm9ybSBjbGFzcz1cIlVwcHlEcmFnRHJvcC1pbm5lclwiXFxuICAgICAgICAgICAgICBvbnN1Ym1pdD0nLCAnPlxcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJVcHB5RHJhZ0Ryb3AtaW5wdXQgVXBweURyYWdEcm9wLWZvY3VzXCJcXG4gICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcXG4gICAgICAgICAgICAgICAgIG5hbWU9XCJmaWxlc1tdXCJcXG4gICAgICAgICAgICAgICAgIG11bHRpcGxlPVwidHJ1ZVwiXFxuICAgICAgICAgICAgICAgICB2YWx1ZT1cIlwiXFxuICAgICAgICAgICAgICAgICBvbmNoYW5nZT0nLCAnIC8+XFxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlVwcHlEcmFnRHJvcC1sYWJlbFwiIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgICA8c3Ryb25nPicsICc8L3N0cm9uZz5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIlVwcHlEcmFnRHJvcC1kcmFnVGV4dFwiPicsICc8L3NwYW4+XFxuICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICcsICdcXG4gICAgICAgIDwvZm9ybT5cXG4gICAgICA8L2Rpdj5cXG4gICAgJ10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDMgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8YnV0dG9uIGNsYXNzPVwiVXBweURyYWdEcm9wLXVwbG9hZEJ0biBVcHB5TmV4dEJ0blwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICA8L2J1dHRvbj4nXSwgWyc8YnV0dG9uIGNsYXNzPVwiVXBweURyYWdEcm9wLXVwbG9hZEJ0biBVcHB5TmV4dEJ0blwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgICA8L2J1dHRvbj4nXSk7XG5cbnZhciBfUGx1Z2luMiA9IHJlcXVpcmUoJy4vLi4vUGx1Z2luJyk7XG5cbnZhciBfUGx1Z2luMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BsdWdpbjIpO1xuXG52YXIgX1V0aWxzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9VdGlscycpO1xuXG52YXIgX2RyYWdEcm9wID0gcmVxdWlyZSgnZHJhZy1kcm9wJyk7XG5cbnZhciBfZHJhZ0Ryb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZHJhZ0Ryb3ApO1xuXG52YXIgX2h0bWwgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2h0bWwnKTtcblxudmFyIF9odG1sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbi8qKlxuICogRHJhZyAmIERyb3AgcGx1Z2luXG4gKlxuICovXG52YXIgRHJhZ0Ryb3AgPSBmdW5jdGlvbiAoX1BsdWdpbikge1xuICBfaW5oZXJpdHMoRHJhZ0Ryb3AsIF9QbHVnaW4pO1xuXG4gIGZ1bmN0aW9uIERyYWdEcm9wKGNvcmUsIG9wdHMsIHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyYWdEcm9wKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9QbHVnaW4uY2FsbCh0aGlzLCBjb3JlLCBvcHRzKSk7XG5cbiAgICBfdGhpcy50eXBlID0gJ2FjcXVpcmVyJztcbiAgICBfdGhpcy5pZCA9ICdEcmFnRHJvcCc7XG4gICAgX3RoaXMudGl0bGUgPSAnRHJhZyAmIERyb3AnO1xuICAgIF90aGlzLnByb3BzID0gcHJvcHM7XG4gICAgX3RoaXMuaWNvbiA9ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0KTtcblxuICAgIC8vIERlZmF1bHQgb3B0aW9uc1xuICAgIHZhciBkZWZhdWx0T3B0cyA9IHtcbiAgICAgIHRhcmdldDogJy5VcHB5RHJhZ0Ryb3AnXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBvbmVzIHNldCBieSB1c2VyXG4gICAgX3RoaXMub3B0cyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0T3B0cywgb3B0cyk7XG5cbiAgICAvLyBDaGVjayBmb3IgYnJvd3NlciBkcmFnRHJvcCBzdXBwb3J0XG4gICAgX3RoaXMuaXNEcmFnRHJvcFN1cHBvcnRlZCA9IF90aGlzLmNoZWNrRHJhZ0Ryb3BTdXBwb3J0KCk7XG5cbiAgICAvLyBCaW5kIGB0aGlzYCB0byBjbGFzcyBtZXRob2RzXG4gICAgX3RoaXMuaGFuZGxlRHJvcCA9IF90aGlzLmhhbmRsZURyb3AuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuY2hlY2tEcmFnRHJvcFN1cHBvcnQgPSBfdGhpcy5jaGVja0RyYWdEcm9wU3VwcG9ydC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVJbnB1dENoYW5nZSA9IF90aGlzLmhhbmRsZUlucHV0Q2hhbmdlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnJlbmRlciA9IF90aGlzLnJlbmRlci5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIERyYWcgJiBEcm9wIChub3Qgc3VwcG9ydGVkIG9uIG1vYmlsZSBkZXZpY2VzLCBmb3IgZXhhbXBsZSkuXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG5cblxuICBEcmFnRHJvcC5wcm90b3R5cGUuY2hlY2tEcmFnRHJvcFN1cHBvcnQgPSBmdW5jdGlvbiBjaGVja0RyYWdEcm9wU3VwcG9ydCgpIHtcbiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBpZiAoISgnZHJhZ2dhYmxlJyBpbiBkaXYpIHx8ICEoJ29uZHJhZ3N0YXJ0JyBpbiBkaXYgJiYgJ29uZHJvcCcgaW4gZGl2KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghKCdGb3JtRGF0YScgaW4gd2luZG93KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghKCdGaWxlUmVhZGVyJyBpbiB3aW5kb3cpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgRHJhZ0Ryb3AucHJvdG90eXBlLmhhbmRsZURyb3AgPSBmdW5jdGlvbiBoYW5kbGVEcm9wKGZpbGVzKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLmNvcmUubG9nKCdBbGwgcmlnaHQsIHNvbWVvbmUgZHJvcHBlZCBzb21ldGhpbmcuLi4nKTtcblxuICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIF90aGlzMi5wcm9wcy5hZGRGaWxlKHtcbiAgICAgICAgc291cmNlOiBfdGhpczIuaWQsXG4gICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICBkYXRhOiBmaWxlXG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMuY29yZS5lbWl0dGVyLmVtaXQoJ2ZpbGUtYWRkJywge1xuICAgICAgLy8gICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAvLyAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgIC8vICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgLy8gICBkYXRhOiBmaWxlXG4gICAgICAvLyB9KVxuICAgIH0pO1xuICB9O1xuXG4gIERyYWdEcm9wLnByb3RvdHlwZS5oYW5kbGVJbnB1dENoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUlucHV0Q2hhbmdlKGV2KSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0aGlzLmNvcmUubG9nKCdBbGwgcmlnaHQsIHNvbWV0aGluZyBzZWxlY3RlZCB0aHJvdWdoIGlucHV0Li4uJyk7XG5cbiAgICB2YXIgZmlsZXMgPSAoMCwgX1V0aWxzLnRvQXJyYXkpKGV2LnRhcmdldC5maWxlcyk7XG5cbiAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICBfdGhpczMuY29yZS5lbWl0dGVyLmVtaXQoJ2NvcmU6ZmlsZS1hZGQnLCB7XG4gICAgICAgIHNvdXJjZTogX3RoaXMzLmlkLFxuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgZGF0YTogZmlsZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgRHJhZ0Ryb3AucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgdmFyIGZpcnN0SW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0ICsgJyAuVXBweURyYWdEcm9wLWZvY3VzJyk7XG5cbiAgICAvLyBvbmx5IHdvcmtzIGZvciB0aGUgZmlyc3QgdGltZSBpZiB3cmFwcGVkIGluIHNldFRpbWVvdXQgZm9yIHNvbWUgcmVhc29uXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBmaXJzdElucHV0LmZvY3VzKCk7XG4gICAgfSwgMTApO1xuICB9O1xuXG4gIERyYWdEcm9wLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoc3RhdGUpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIC8vIEFub3RoZXIgd2F5IG5vdCB0byByZW5kZXIgbmV4dC91cGxvYWQgYnV0dG9uIOKAlCBpZiBNb2RhbCBpcyB1c2VkIGFzIGEgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IHRoaXMub3B0cy50YXJnZXQubmFtZTtcblxuICAgIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIG9uU2VsZWN0KGV2KSB7XG4gICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKF90aGlzNC50YXJnZXQgKyAnIC5VcHB5RHJhZ0Ryb3AtaW5wdXQnKTtcbiAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgfTtcblxuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChldikge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgX3RoaXM0LmNvcmUuZW1pdHRlci5lbWl0KCdjb3JlOnVwbG9hZCcpO1xuICAgIH07XG5cbiAgICB2YXIgb25TdWJtaXQgPSBmdW5jdGlvbiBvblN1Ym1pdChldikge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0MiwgdGhpcy5pc0RyYWdEcm9wU3VwcG9ydGVkID8gJ2lzLWRyYWdkcm9wLXN1cHBvcnRlZCcgOiAnJywgb25TdWJtaXQsIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UuYmluZCh0aGlzKSwgb25TZWxlY3QsIHRoaXMuY29yZS5pMThuKCdjaG9vc2VGaWxlJyksIHRoaXMuY29yZS5pMThuKCdvckRyYWdEcm9wJyksICF0aGlzLmNvcmUub3B0cy5hdXRvUHJvY2VlZCAmJiB0YXJnZXQgIT09ICdEYXNoYm9hcmQnID8gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QzLCBuZXh0LCB0aGlzLmNvcmUuaTE4bigndXBsb2FkJykpIDogJycpO1xuICB9O1xuXG4gIERyYWdEcm9wLnByb3RvdHlwZS5pbnN0YWxsID0gZnVuY3Rpb24gaW5zdGFsbCgpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIHZhciB0YXJnZXQgPSB0aGlzLm9wdHMudGFyZ2V0O1xuICAgIHZhciBwbHVnaW4gPSB0aGlzO1xuICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5tb3VudCh0YXJnZXQsIHBsdWdpbik7XG5cbiAgICAoMCwgX2RyYWdEcm9wMi5kZWZhdWx0KSh0aGlzLnRhcmdldCArICcgLlVwcHlEcmFnRHJvcC1jb250YWluZXInLCBmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgIF90aGlzNS5oYW5kbGVEcm9wKGZpbGVzKTtcbiAgICAgIF90aGlzNS5jb3JlLmxvZyhmaWxlcyk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIERyYWdEcm9wO1xufShfUGx1Z2luMy5kZWZhdWx0KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ0Ryb3A7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8aDE+dGhpcyBpcyBzdHJhbmdlIDE8L2gxPiddLCBbJzxoMT50aGlzIGlzIHN0cmFuZ2UgMTwvaDE+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWyc8aDI+dGhpcyBpcyBzdHJhbmdlIDI8L2gyPiddLCBbJzxoMj50aGlzIGlzIHN0cmFuZ2UgMjwvaDI+J10pLFxuICAgIF90ZW1wbGF0ZU9iamVjdDMgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWydcXG4gICAgICA8ZGl2IGNsYXNzPVwid293LXRoaXMtd29ya3NcIj5cXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cIlVwcHlEdW1teS1maXJzdElucHV0XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cImhlbGxvXCI+XFxuICAgICAgICAnLCAnXFxuICAgICAgICAnLCAnXFxuICAgICAgPC9kaXY+XFxuICAgICddLCBbJ1xcbiAgICAgIDxkaXYgY2xhc3M9XCJ3b3ctdGhpcy13b3Jrc1wiPlxcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiVXBweUR1bW15LWZpcnN0SW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiaGVsbG9cIj5cXG4gICAgICAgICcsICdcXG4gICAgICAgICcsICdcXG4gICAgICA8L2Rpdj5cXG4gICAgJ10pO1xuXG52YXIgX1BsdWdpbjIgPSByZXF1aXJlKCcuL1BsdWdpbicpO1xuXG52YXIgX1BsdWdpbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QbHVnaW4yKTtcblxudmFyIF9odG1sID0gcmVxdWlyZSgnLi4vY29yZS9odG1sJyk7XG5cbnZhciBfaHRtbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykgeyBzdHJpbmdzLnJhdyA9IHJhdzsgcmV0dXJuIHN0cmluZ3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vLyBpbXBvcnQgeyBjcmVhdGVJbmxpbmVXb3JrZXIgfSBmcm9tICcuLi9jb3JlL1V0aWxzJ1xuXG4vKipcbiAqIER1bW15XG4gKlxuICovXG52YXIgRHVtbXkgPSBmdW5jdGlvbiAoX1BsdWdpbikge1xuICBfaW5oZXJpdHMoRHVtbXksIF9QbHVnaW4pO1xuXG4gIGZ1bmN0aW9uIER1bW15KGNvcmUsIG9wdHMsIHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIER1bW15KTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9QbHVnaW4uY2FsbCh0aGlzLCBjb3JlLCBvcHRzKSk7XG5cbiAgICBfdGhpcy50eXBlID0gJ2FjcXVpcmVyJztcbiAgICBfdGhpcy5pZCA9ICdEdW1teSc7XG4gICAgX3RoaXMudGl0bGUgPSAnTXIuIFBsdWdpbic7XG4gICAgX3RoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7fTtcblxuICAgIC8vIG1lcmdlIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBvbmVzIHNldCBieSB1c2VyXG4gICAgX3RoaXMub3B0cyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0cyk7XG5cbiAgICBfdGhpcy5zdHJhbmdlID0gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QpO1xuICAgIF90aGlzLnJlbmRlciA9IF90aGlzLnJlbmRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5pbnN0YWxsID0gX3RoaXMuaW5zdGFsbC5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBEdW1teS5wcm90b3R5cGUuYWRkRmFrZUZpbGVKdXN0VG9UZXN0ID0gZnVuY3Rpb24gYWRkRmFrZUZpbGVKdXN0VG9UZXN0KCkge1xuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWydkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIyYVdWM1FtOTRQU0l3SURBZ01USXdJREV5TUNJK0NpQWdQR05wY21Oc1pTQmplRDBpTmpBaUlHTjVQU0kyTUNJZ2NqMGlOVEFpTHo0S1BDOXpkbWMrQ2c9PSddLCB7IHR5cGU6ICdpbWFnZS9zdmcreG1sJyB9KTtcbiAgICB2YXIgZmlsZSA9IHtcbiAgICAgIHNvdXJjZTogJ2FjY2VwdGFuY2UtdGVzdCcsXG4gICAgICBuYW1lOiAndGVzdC1maWxlJyxcbiAgICAgIHR5cGU6ICdpbWFnZS9zdmcreG1sJyxcbiAgICAgIGRhdGE6IGJsb2JcbiAgICB9O1xuICAgIHRoaXMucHJvcHMubG9nKCdBZGRpbmcgZmFrZSBmaWxlIGJsb2InKTtcbiAgICB0aGlzLnByb3BzLmFkZEZpbGUoZmlsZSk7XG4gIH07XG5cbiAgRHVtbXkucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgYmxhID0gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyKTtcbiAgICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QzLCB0aGlzLnN0cmFuZ2UsIGJsYSk7XG4gIH07XG5cbiAgRHVtbXkucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgZmlyc3RJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy50YXJnZXQgKyAnIC5VcHB5RHVtbXktZmlyc3RJbnB1dCcpO1xuXG4gICAgLy8gb25seSB3b3JrcyBmb3IgdGhlIGZpcnN0IHRpbWUgaWYgd3JhcHBlZCBpbiBzZXRUaW1lb3V0IGZvciBzb21lIHJlYXNvblxuICAgIC8vIGZpcnN0SW5wdXQuZm9jdXMoKVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZmlyc3RJbnB1dC5mb2N1cygpO1xuICAgIH0sIDEwKTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLmNvcmUuZW1pdCgnaW5mb3JtZXInLCAnSGVsbG8hIEnigJltIGEgdGVzdCBJbmZvcm1lciBtZXNzYWdlJywgJ2luZm8nLCA0NTAwKTtcbiAgICAgIF90aGlzMi5hZGRGYWtlRmlsZUp1c3RUb1Rlc3QoKTtcbiAgICB9LCAxMDAwKTtcbiAgfTtcblxuICBEdW1teS5wcm90b3R5cGUuaW5zdGFsbCA9IGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXMub3B0cy50YXJnZXQ7XG4gICAgdmFyIHBsdWdpbiA9IHRoaXM7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLm1vdW50KHRhcmdldCwgcGx1Z2luKTtcbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uIHdvcmtlckZ1bmMgKCkge1xuICAgIC8vICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHtcbiAgICAvLyAgICAgY29uc3QgZmlsZSA9IGUuZGF0YS5maWxlXG4gICAgLy8gICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyU3luYygpXG4gICAgLy8gICAgIGNvbnN0IGRhdGFVUkwgPSByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKVxuICAgIC8vICAgICBwb3N0TWVzc2FnZSh7ZmlsZTogZGF0YVVSTH0pXG4gICAgLy8gICB9KVxuICAgIC8vIH1cbiAgICAvL1xuICAgIC8vIGNvbnN0IHdvcmtlciA9IGNyZWF0ZUlubGluZVdvcmtlcih3b3JrZXJGdW5jKVxuICAgIC8vIGNvbnN0IHRlc3RGaWxlQmxvYiA9IG5ldyBCbG9iKFxuICAgIC8vICAgWydkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIyYVdWM1FtOTRQU0l3SURBZ01USXdJREV5TUNJK0NpQWdQR05wY21Oc1pTQmplRDBpTmpBaUlHTjVQU0kyTUNJZ2NqMGlOVEFpTHo0S1BDOXpkbWMrQ2c9PSddLFxuICAgIC8vICAge3R5cGU6ICdpbWFnZS9zdmcreG1sJ31cbiAgICAvLyApXG4gICAgLy8gd29ya2VyLnBvc3RNZXNzYWdlKHtmaWxlOiB0ZXN0RmlsZUJsb2J9KVxuICAgIC8vIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGUpXG4gICAgLy8gfSlcbiAgfTtcblxuICByZXR1cm4gRHVtbXk7XG59KF9QbHVnaW4zLmRlZmF1bHQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBEdW1teTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUR1bW15LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxmb3JtIGNsYXNzPVwiVXBweUZvcm1Db250YWluZXJcIj5cXG4gICAgICA8aW5wdXQgY2xhc3M9XCJVcHB5Rm9ybS1pbnB1dFwiXFxuICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcXG4gICAgICAgICAgICAgbmFtZT1cImZpbGVzW11cIlxcbiAgICAgICAgICAgICBvbmNoYW5nZT0nLCAnXFxuICAgICAgICAgICAgIG11bHRpcGxlPVwiJywgJ1wiXFxuICAgICAgICAgICAgIHZhbHVlPVwiXCI+XFxuICAgICAgJywgJ1xcbiAgICA8L2Zvcm0+J10sIFsnPGZvcm0gY2xhc3M9XCJVcHB5Rm9ybUNvbnRhaW5lclwiPlxcbiAgICAgIDxpbnB1dCBjbGFzcz1cIlVwcHlGb3JtLWlucHV0XCJcXG4gICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxcbiAgICAgICAgICAgICBuYW1lPVwiZmlsZXNbXVwiXFxuICAgICAgICAgICAgIG9uY2hhbmdlPScsICdcXG4gICAgICAgICAgICAgbXVsdGlwbGU9XCInLCAnXCJcXG4gICAgICAgICAgICAgdmFsdWU9XCJcIj5cXG4gICAgICAnLCAnXFxuICAgIDwvZm9ybT4nXSksXG4gICAgX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxidXR0b24gY2xhc3M9XCJVcHB5Rm9ybS11cGxvYWRCdG4gVXBweU5leHRCdG5cIlxcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxcbiAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9JywgJz5cXG4gICAgICAgICAgICAgICcsICdcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXSwgWyc8YnV0dG9uIGNsYXNzPVwiVXBweUZvcm0tdXBsb2FkQnRuIFVwcHlOZXh0QnRuXCJcXG4gICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcXG4gICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPScsICc+XFxuICAgICAgICAgICAgICAnLCAnXFxuICAgICAgICAgICAgPC9idXR0b24+J10pO1xuXG52YXIgX1BsdWdpbjIgPSByZXF1aXJlKCcuL1BsdWdpbicpO1xuXG52YXIgX1BsdWdpbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QbHVnaW4yKTtcblxudmFyIF9VdGlscyA9IHJlcXVpcmUoJy4uL2NvcmUvVXRpbHMnKTtcblxudmFyIF9VdGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VdGlscyk7XG5cbnZhciBfaHRtbCA9IHJlcXVpcmUoJy4uL2NvcmUvaHRtbCcpO1xuXG52YXIgX2h0bWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEZvcm10YWcgPSBmdW5jdGlvbiAoX1BsdWdpbikge1xuICBfaW5oZXJpdHMoRm9ybXRhZywgX1BsdWdpbik7XG5cbiAgZnVuY3Rpb24gRm9ybXRhZyhjb3JlLCBvcHRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm10YWcpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1BsdWdpbi5jYWxsKHRoaXMsIGNvcmUsIG9wdHMpKTtcblxuICAgIF90aGlzLmlkID0gJ0Zvcm10YWcnO1xuICAgIF90aGlzLnRpdGxlID0gJ0Zvcm10YWcnO1xuICAgIF90aGlzLnR5cGUgPSAnYWNxdWlyZXInO1xuXG4gICAgLy8gRGVmYXVsdCBvcHRpb25zXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgdGFyZ2V0OiAnLlVwcHlGb3JtJyxcbiAgICAgIHJlcGxhY2VUYXJnZXRDb250ZW50OiB0cnVlLFxuICAgICAgbXVsdGlwbGVGaWxlczogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBNZXJnZSBkZWZhdWx0IG9wdGlvbnMgd2l0aCB0aGUgb25lcyBzZXQgYnkgdXNlclxuICAgIF90aGlzLm9wdHMgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdHMpO1xuXG4gICAgX3RoaXMucmVuZGVyID0gX3RoaXMucmVuZGVyLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEZvcm10YWcucHJvdG90eXBlLmhhbmRsZUlucHV0Q2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRDaGFuZ2UoZXYpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMuY29yZS5sb2coJ0FsbCByaWdodCwgc29tZXRoaW5nIHNlbGVjdGVkIHRocm91Z2ggaW5wdXQuLi4nKTtcblxuICAgIC8vIHRoaXMgYWRkZWQgcnViYmlzaCBrZXlzIGxpa2Ug4oCcbGVuZ3Ro4oCdIHRvIHRoZSByZXN1bHRpbmcgYXJyYXlcbiAgICAvLyBjb25zdCBmaWxlcyA9IE9iamVjdC5rZXlzKGV2LnRhcmdldC5maWxlcykubWFwKChrZXkpID0+IHtcbiAgICAvLyAgIHJldHVybiBldi50YXJnZXQuZmlsZXNba2V5XVxuICAgIC8vIH0pXG5cbiAgICB2YXIgZmlsZXMgPSBfVXRpbHMyLmRlZmF1bHQudG9BcnJheShldi50YXJnZXQuZmlsZXMpO1xuXG4gICAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgX3RoaXMyLmNvcmUuZW1pdHRlci5lbWl0KCdjb3JlOmZpbGUtYWRkJywge1xuICAgICAgICBzb3VyY2U6IF90aGlzMi5pZCxcbiAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgIGRhdGE6IGZpbGVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIEZvcm10YWcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihzdGF0ZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIHVwbG9hZCA9IGZ1bmN0aW9uIHVwbG9hZChldikge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgX3RoaXMzLmNvcmUuZW1pdHRlci5lbWl0KCdjb3JlOnVwbG9hZCcpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QsIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UuYmluZCh0aGlzKSwgdGhpcy5vcHRzLm11bHRpcGxlRmlsZXMgPyAndHJ1ZScgOiAnZmFsc2UnLCAhdGhpcy5jb3JlLm9wdHMuYXV0b1Byb2NlZWQgJiYgdGhpcy5vcHRzLnRhcmdldC5uYW1lICE9PSAnTW9kYWwnID8gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyLCB1cGxvYWQsIHRoaXMuY29yZS5pMThuKCd1cGxvYWQnKSkgOiAnJyk7XG4gIH07XG5cbiAgRm9ybXRhZy5wcm90b3R5cGUuaW5zdGFsbCA9IGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXMub3B0cy50YXJnZXQ7XG4gICAgdmFyIHBsdWdpbiA9IHRoaXM7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLm1vdW50KHRhcmdldCwgcGx1Z2luKTtcbiAgfTtcblxuICAvLyBydW4gKHJlc3VsdHMpIHtcbiAgLy8gICBjb25zb2xlLmxvZyh7XG4gIC8vICAgICBjbGFzczogJ0Zvcm10YWcnLFxuICAvLyAgICAgbWV0aG9kOiAncnVuJyxcbiAgLy8gICAgIHJlc3VsdHM6IHJlc3VsdHNcbiAgLy8gICB9KVxuICAvL1xuICAvLyAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRzLmRvbmVCdXR0b25TZWxlY3RvcilcbiAgLy8gICB2YXIgc2VsZiA9IHRoaXNcbiAgLy9cbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgLy8gICAgICAgdmFyIGZpZWxkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZi5vcHRzLnNlbGVjdG9yKVxuICAvLyAgICAgICB2YXIgc2VsZWN0ZWQgPSBbXTtcbiAgLy9cbiAgLy8gICAgICAgW10uZm9yRWFjaC5jYWxsKGZpZWxkcywgKGZpZWxkLCBpKSA9PiB7XG4gIC8vICAgICAgICAgc2VsZWN0ZWQucHVzaCh7XG4gIC8vICAgICAgICAgICBmcm9tOiAnRm9ybXRhZycsXG4gIC8vICAgICAgICAgICBmaWxlczogZmllbGQuZmlsZXNcbiAgLy8gICAgICAgICB9KVxuICAvLyAgICAgICB9KVxuICAvLyAgICAgICByZXNvbHZlKHNlbGVjdGVkKVxuICAvLyAgICAgfSlcbiAgLy8gICB9KVxuICAvLyB9XG5cblxuICByZXR1cm4gRm9ybXRhZztcbn0oX1BsdWdpbjMuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEZvcm10YWc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb3JtdGFnLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJzxhIG9uY2xpY2s9JywgJz5Qcm9jZWVkIHdpdGggRGVtbyBBY2NvdW50PC9hPiddLCBbJzxhIG9uY2xpY2s9JywgJz5Qcm9jZWVkIHdpdGggRGVtbyBBY2NvdW50PC9hPiddKSxcbiAgICBfdGVtcGxhdGVPYmplY3QyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5R29vZ2xlRHJpdmUtYXV0aGVudGljYXRlXCI+XFxuICAgICAgPGgxPllvdSBuZWVkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIEdvb2dsZSBiZWZvcmUgc2VsZWN0aW5nIGZpbGVzLjwvaDE+XFxuICAgICAgPGEgaHJlZj0nLCAnPkF1dGhlbnRpY2F0ZTwvYT5cXG4gICAgICAnLCAnXFxuICAgIDwvZGl2PlxcbiAgJ10sIFsnXFxuICAgIDxkaXYgY2xhc3M9XCJVcHB5R29vZ2xlRHJpdmUtYXV0aGVudGljYXRlXCI+XFxuICAgICAgPGgxPllvdSBuZWVkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIEdvb2dsZSBiZWZvcmUgc2VsZWN0aW5nIGZpbGVzLjwvaDE+XFxuICAgICAgPGEgaHJlZj0nLCAnPkF1dGhlbnRpY2F0ZTwvYT5cXG4gICAgICAnLCAnXFxuICAgIDwvZGl2PlxcbiAgJ10pO1xuXG52YXIgX2h0bWwgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2h0bWwnKTtcblxudmFyIF9odG1sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGRlbW9MaW5rID0gcHJvcHMuZGVtbyA/ICgwLCBfaHRtbDIuZGVmYXVsdCkoX3RlbXBsYXRlT2JqZWN0LCBwcm9wcy5oYW5kbGVEZW1vQXV0aCkgOiBudWxsO1xuICByZXR1cm4gKDAsIF9odG1sMi5kZWZhdWx0KShfdGVtcGxhdGVPYmplY3QyLCBwcm9wcy5saW5rLCBkZW1vTGluayk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aFZpZXcuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgIDxkaXY+XFxuICAgICAgPHNwYW4+XFxuICAgICAgICBTb21ldGhpbmcgd2VudCB3cm9uZy4gIFByb2JhYmx5IG91ciBmYXVsdC4gJywgJ1xcbiAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAnXSwgWydcXG4gICAgPGRpdj5cXG4gICAgICA8c3Bhbj5cXG4gICAgICAgIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgUHJvYmFibHkgb3VyIGZhdWx0LiAnLCAnXFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICddKTtcblxudmFyIF9odG1sID0gcmVxdWlyZSgnLi4vLi4vY29yZS9odG1sJyk7XG5cbnZhciBfaHRtbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykgeyBzdHJpbmdzLnJhdyA9IHJhdzsgcmV0dXJuIHN0cmluZ3M7IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAoMCwgX2h0bWwyLmRlZmF1bHQpKF90ZW1wbGF0ZU9iamVjdCwgcHJvcHMuZXJyb3IpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVycm9yLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShbJ1xcbiAgICAgIDxzdmcgY2xhc3M9XCJVcHB5SWNvbiBVcHB5TW9kYWxUYWItaWNvblwiIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cXG4gICAgICAgIDxwYXRoIGQ9XCJNMi45NTUgMTQuOTNsMi42NjctNC42MkgxNmwtMi42NjcgNC42MkgyLjk1NXptMi4zNzgtNC42MmwtMi42NjYgNC42MkwwIDEwLjMxbDUuMTktOC45OSAyLjY2NiA0LjYyLTIuNTIzIDQuMzd6bTEwLjUyMy0uMjVoLTUuMzMzbC01LjE5LTguOTloNS4zMzRsNS4xOSA4Ljk5elwiLz5cXG4gICAgICA8L3N2Zz5cXG4gICAgJ10sIFsnXFxuICAgICAgPHN2ZyBjbGFzcz1cIlVwcHlJY29uIFVwcHlNb2RhbFRhYi1pY29uXCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjI4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxcbiAgICAgICAgPHBhdGggZD1cIk0yLjk1NSAxNC45M2wyLjY2Ny00LjYySDE2bC0yLjY2NyA0LjYySDIuOTU1em0yLjM3OC00LjYybC0yLjY2NiA0LjYyTDAgMTAuMzFsNS4xOS04Ljk5IDIuNjY2IDQuNjItMi41MjMgNC4zN3ptMTAuNTIzLS4yNWgtNS4zMzNsLTUuMTktOC45OWg1LjMzNGw1LjE5IDguOTl6XCIvPlxcbiAgICAgIDwvc3ZnPlxcbiAgICAnXSk7XG5cbnZhciBfVXRpbHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL1V0aWxzJyk7XG5cbnZhciBfVXRpbHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVXRpbHMpO1xuXG52YXIgX1BsdWdpbjIgPSByZXF1aXJlKCcuLi9QbHVnaW4nKTtcblxudmFyIF9QbHVnaW4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGx1Z2luMik7XG5cbnJlcXVpcmUoJ3doYXR3Zy1mZXRjaCcpO1xuXG52YXIgX2h0bWwgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2h0bWwnKTtcblxudmFyIF9odG1sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWwpO1xuXG52YXIgX1Byb3ZpZGVyID0gcmVxdWlyZSgnLi4vLi4vdXBweS1iYXNlL3NyYy9wbHVnaW5zL1Byb3ZpZGVyJyk7XG5cbnZhciBfUHJvdmlkZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUHJvdmlkZXIpO1xuXG52YXIgX0F1dGhWaWV3ID0gcmVxdWlyZSgnLi9BdXRoVmlldycpO1xuXG52YXIgX0F1dGhWaWV3MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0F1dGhWaWV3KTtcblxudmFyIF9Ccm93c2VyID0gcmVxdWlyZSgnLi9uZXcvQnJvd3NlcicpO1xuXG52YXIgX0Jyb3dzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnJvd3Nlcik7XG5cbnZhciBfRXJyb3IgPSByZXF1aXJlKCcuL0Vycm9yJyk7XG5cbnZhciBfRXJyb3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRXJyb3IpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7IHN0cmluZ3MucmF3ID0gcmF3OyByZXR1cm4gc3RyaW5nczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3R
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment